je les ai trouvé conjointement dans un livre sérieux sur le C
Le livre de Mathieu Nebra ?
Je me demande comment tu as trouvé ?
En réalité je les ai pris dans le livre Méthodologie de la programmation en C page 403, en fait je dis une bêtise, il n'y a que le nom des constantes dans ce livre (honte à moi). (Conclusion : je l'ai prises dans le header errno-base.h)
Je vais en profiter pour corriger tout ce que j'ai dit et je vais virer les définitions de constantes.
# include <stdio.h>
# include <stdlib.h>
int main(int argc, char* argv[])
{
int tab[20] = {0}, i = 0, resultat = 0;
printf(« Ecrivez un nombre\n »);
scanf(« %s », tab);
for(i = 0; i < 20; i++)
{
resultat = 0 + tab[i];
}
printf(« La somme de tous ces chiffres est %d », resultat);
return 0;
}
zGame
# include <stdio.h>
# include <stdlib.h>
#include <time.h>
int verifCalcul(int a, int b, int c, int tab, int i);
int correction(int tab);
int aleatoire(int a, int MIN, int MAX);
int main(int argc, char* argv[])
{
int a = 0, b = 0, resultat = 0, MIN = 1, MAX = 10, i = -1;
int tab[10] = {0};
printf(« \t-zGame-: Entrainez votre cerveau\n »);
printf(« \nLe programme va vous soumettre dix multiplications que vous allez devoir resoudre le plus rapidement possible... et de tete !\n »);
printf(« prêt ? »);
system(« PAUSE »);
do
{
aleatoire( a, MIN, MAX);
aleatoire( b, MIN, MAX);
printf(« %d * %d = », a, b);
scanf(« %d », &resultat);
i++;
verifCalcul( a, b, resultat, tab, i);
}
while(i < 9);
correction(tab);
return 0;
}
int verifCalcul(int a, int bn int cn int tabn int i)
{
int resultat = 0;
resultat = a*b;
if( c == (a*b) || c == resultat) // je ne sais pas si ma premiere methode marche
{
tab[i] = 1;
}
else
{
tab[i] = 0;
}
return 1;
}
int correction(int tab)
{
int i, faute = 0;
for(i = 0; i < 10; i++)
{
if(tab[i] == 0)
{
faute++;
}
}
if(faute == 0)
{
printf(« Bravo, tu as fait 0 fautes ! »);
}
else
{
printf(« Tu as fais %d faute(s) », faute);
}
return 1;
}
int aleatoire(int a, int MIN, int MAX)
{
srand(time(NULL));
a = (rand()%(MAX-MIN+1)) + MIN);
return a;
}
J'ai ecris ces programmes a la hate,sur papier, ( car pas d'ordinateur), je vous demande d'excuser la presentation, et les fautes...
Pour faire cette correction, j'ai pris le code de macmist, que j'ai un peu modifié : J'ai utilisé les arguments du main, pour ajouter une autre fonctionnalité, et le programme gère l’exception du 'g'.
Voici le code un peu commenté :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NB_SUJETS 6
#define PRESENT 1
#define IMPARFAIT 2
#define FUTUR 3
#define TOUS 4
#define NB_CHJ 7
#define GROUPE_1 1
#define GROUPE_2 2
void zConjug(char *verbe);
int saisie_verbe(char *verbe);
int lire(char *chaine, int longueur);
void vider_buffer(void);
int get_groupe(char *chaine, int taille);
void conjuguer(const char *verbe, int groupe, int temps, int taille);
char* conjuguer_g1(const char *chaine, char *chaine_copie, int temps, int sujet, int taille);
char *conjuguer_g2(const char *chaine, char *chaine_copie, int temps, int sujet);
void exeption(char *verbe, int taille, char premiere_lettre);
int is_j(const char *verbe);
void afficher(const char *verbe, const char *sujet);
int main(int argc, char *argv[])
{
char verbe[100] = "";
if(argc == 1) /*Si le programme n'a recu aucun argument en ligne de commande*/
zConjug(verbe);
else /*Sinon, envoyer comme argument l'argument de la ligne de commande*/
zConjug(argv[1]);
return EXIT_SUCCESS;
}
/*Fonction principale*/
void zConjug(char *verbe)
{
int groupe = 0;
int taille = 0;
int choix = 0;
int i;
char verbe_copie[100] = "";
char nom_temps[][14] = {"au present", "a l'imparfait", "au futur"};
taille = saisie_verbe(verbe);
printf("\n\n" );
printf("Choisissez le temps auquel vous voulez conjuguer le verbe %s :\n", verbe);
printf("1.Present\n2.Imparfait\n3.Futur\n4.A tous les temps possibles\n");
while(choix < PRESENT || choix > TOUS)
{
printf("Entrer 1, 2, 3 ou 4 : ");
scanf("%d" , &choix);
}
groupe = get_groupe(verbe, taille);
strcpy(verbe_copie, verbe);
verbe_copie[taille-2] = '\0';
if(choix == TOUS)
for(i = 0; i < 3; i++)
{
printf("\nLe verbe %s %s :\n\n", verbe, nom_temps[i]);
conjuguer(verbe_copie, groupe, i + 1, taille);
}
else
{
printf("\nLe verbe %s %s :\n\n", verbe, nom_temps[choix-1]);
conjuguer(verbe_copie, groupe, choix, taille);
}
}
int saisie_verbe(char *verbe)
{
int taille = 0;
if(!(strcmp(verbe, "")) || !(get_groupe(verbe, (int)strlen(verbe))))
do
{
printf("Entrez un verbe a l'infinitif : ");
lire(verbe, 100);
taille = (int)strlen(verbe);
}while(get_groupe(verbe, taille) == 0);
if(!taille)
taille = (int)strlen(verbe);
return taille;
}
/*Voir http://www.siteduzero.com/tutoriel-3-14185-la-saisie-de-texte-securisee.html#ss_part_2*/
int lire(char *chaine, int longueur)
{
char *position_entree = NULL;
if(fgets(chaine, longueur, stdin) != NULL)
{
position_entree = strchr(chaine, '\n');
if(position_entree != NULL)
*position_entree = '\0';
else
vider_buffer();
return 1;
}
else
{
vider_buffer();
return 0;
}
}
/*Voir http://www.siteduzero.com/tutoriel-3-14185-la-saisie-de-texte-securisee.html#ss_part_2*/
void vider_buffer(void)
{
int c = 0;
while(c != '\n' && c != EOF)
c = getchar();
}
int get_groupe(char *chaine, int taille)
{
int i = taille - 2, j = 0;
char copie[3] = "";
/*Copie les 3 dernieres lettres du verbe*/
while(i < taille)
{
copie[j] = chaine[i];
i++;
j++;
}
if(!(strcmp("er", copie)))
return GROUPE_1 ;
else if(!(strcmp("ir", copie)))
return GROUPE_2;
else
return 0;
}
void conjuguer(const char *verbe, int groupe, int temps, int taille)
{
char pronoms[][10] = {"Je", "Tu", "Il/Elle", "Nous", "Vous", "Ils/Elles"};
char *resultat = NULL;
char verbe_copie[100] = "";
int i = 0;
/*On conjugue le verbe a la i personne et on affiche le resultat*/
for(i = 0; i < NB_SUJETS; i++)
{
if(groupe == GROUPE_1)
resultat = conjuguer_g1(verbe, verbe_copie, temps, i, taille);
else
resultat = conjuguer_g2(verbe, verbe_copie, temps, i);
afficher(resultat, pronoms[i]);
verbe_copie[0] = '\0';
}
}
char* conjuguer_g1(const char *chaine, char *chaine_copie, int temps, int sujet, int taille)
{
char term_present[][4] = {"e" , "es" , "e" , "ons" , "ez" , "ent"};
char term_imparfait[][6] = {"ais" , "ais" , "ait" , "ions" , "iez" , "aient"};
char term_futur[][6] = {"erai" , "eras" , "era" , "erons" , "erez" , "eront"};
char verbe_conjugue[100] = "";
strcat(verbe_conjugue, chaine);
/*Concane verbe_conjugue a term_present[sujet] et vérifie pour les deux premiers temps si il n'y a pas l'exeption du 'g'*/
if(temps == PRESENT)
{
exeption(verbe_conjugue, taille, term_present[sujet][0]);
strcat(verbe_conjugue, term_present[sujet]);
}
else if(temps == IMPARFAIT)
{
exeption(verbe_conjugue, taille, term_imparfait[sujet][0]);
strcat(verbe_conjugue, term_imparfait[sujet]);
}
else
strcat(verbe_conjugue, term_futur[sujet]);
strcat(chaine_copie, verbe_conjugue);
return chaine_copie;
}
char *conjuguer_g2(const char *chaine, char *chaine_copie, int temps, int sujet)
{
char term_presant[][7] = {"is", "is", "it", "issons", "issez", "issent"};
char term_imparfait[][9] = {"issais", "issais", "issait", "issions", "issiez", "issaient"};
char term_futur[][6] = {"irai", "iras", "ira", "irons", "irez", "iront"};
char verbe_conjugue[100] = "";
strcat(verbe_conjugue, chaine);
/*Concane verbe_conjugue a term_present[sujet]*/
if(temps == PRESENT)
strcat(verbe_conjugue, term_presant[sujet]);
if(temps == IMPARFAIT)
strcat(verbe_conjugue, term_imparfait[sujet]);
else if(temps == FUTUR)
strcat(verbe_conjugue, term_futur[sujet]);
strcat(chaine_copie, verbe_conjugue);
return chaine_copie;
}
void exeption(char *verbe, int taille, char premiere_lettre)
{
int i;
int continuer = 1;
char lettres[] = {'e', 'i', 'y'};
for(i = 0; i < 3; i++)
if(premiere_lettre == lettres[i]) /*Si l'une des 3 voyelles concorde avec la premiere lettre de la terminaison actuelle*/
continuer = 0;
if(continuer && verbe[taille - 3] == 'g')
sprintf(verbe, "%se", verbe);
}
int is_j(const char *verbe)
{
int i;
char lettres[] = {'a', 'e', 'i', 'o', 'u', 'y', 'h'};
for(i = 0; i < NB_CHJ; i++)
if(verbe[0] == lettres[i]) /*Si l'une des voyelles (plus le 'h') concorde avec la premiere lettre du verbe*/
return 1;
return 0;
}
void afficher(const char *verbe, const char *sujet)
{
if(!(strcmp(sujet, "Je")) && is_j(verbe))
printf("\tJ'%s \n", verbe);
else
printf("\t%s %s \n", sujet, verbe);
}
Il reste très simple, mais si vous voulez d'avantages d'explications, je vous les fournirai.
Je remercie (évidemment Pouet_forever, comme d’habitude et) LeBri@n, qui a décelé un bug avec les verbe du deuxième groupe au présent.
slt a tous ,
je debute en prog et j apprecie l initiative des exercices avec correction mis ici en ligne. je ne suis pas encore tres avance dans la lecture du tutoriel et aimerais savoir ou commencer.
petite suggestion pour les debutants comme moi se serait judicieux de preciser de quelles notions on aura besoin pour resoudre les exercices.
je m excuse pr les fautes d orthographes. merci davance
Oui batigoal, pour les prochains exos que je vais proposer, je préciserai quels éléments du cours officiel les zéros auront besoin pour résoudre mes futurs exercices.
Sinon, essaye d'améliorer un peu ton orthographe (c'est important), tu peux d'aider de bonpatron si t'as vraiment trop de mal.
Je me suis mis à la lecture du livre "Apprenez à programmer en C", et je trouve ce topic très utile et intéressant ! Je me suis donc attelé à la réalisation de quelques exercices.
J'espère que vous pourrez me donner des conseils, corriger mes erreurs, etc...
Exercice n°1 : zReader
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void lireFichier();
void creerFichier();
void ecrireFichier();
int lireClavier(char chaine[], int longueur);
long lireLong();
void viderBuffer();
int main()
{
long choixUtilisateur = 0, continuerProgramme = 1;
printf("Bienvenue dans zReader");
while(continuerProgramme)
{
printf("\n\n=== MENU ===\n\n");
printf("1. Lire un fichier\n");
printf("2. Creer un fichier\n");
printf("3. Ecrire dans un fichier\n");
printf("4. Quitter programme\n\n");
printf("Votre choix ? ");
choixUtilisateur = lireLong();
switch(choixUtilisateur)
{
case 1:
lireFichier();
break;
case 2:
creerFichier();
break;
case 3:
ecrireFichier();
break;
case 4:
continuerProgramme = 0;
break;
default:
printf("Cette commande n'est pas definie. Veuillez entrez un chiffre entre 1 et 4.\n");
}
}
return 0;
}
void lireFichier()
{
FILE *fichier = NULL;
char nomFichier[100] = {0}, chaine[1000] = {0};
printf("\nEntrez le nom du fichier a ouvrir : ");
lireClavier(nomFichier, 100);
fichier = fopen(nomFichier, "r");
if(fichier != NULL)
{
printf("\n");
while(fgets(chaine, 1000, fichier) != NULL)
{
printf("%s", chaine);
}
fclose(fichier);
}
else
{
printf("Ce fichier n'existe pas ou n'a pas pu etre ouvert.\n");
}
}
void creerFichier()
{
FILE *fichier = NULL;
char nomFichier[100] = {0};
printf("\nEntrez le nom du fichier que vous souhaitez creer : ");
scanf("%s", nomFichier);
fichier = fopen(nomFichier, "a");
if(fichier != NULL)
{
printf("Le fichier a bien ete cree !\n");
fclose(fichier);
}
else
{
printf("Impossible de creer le fichier\n");
}
}
void ecrireFichier()
{
FILE *fichier = NULL;
char nomFichier[100] = {0}, chaineAInserer[1000] = {0};
printf("\nEntrez le nom du fichier a editer : ");
lireClavier(nomFichier, 100);
fichier = fopen(nomFichier, "a+");
if(fichier != NULL)
{
printf("Entrez le texte a inserer : ");
lireClavier(chaineAInserer, 1000);
fputs(chaineAInserer, fichier);
fputc('\n', fichier); // On insère un retour à la ligne pour que le prochain texte entré ne soit pas collé à ce qui précède
fclose(fichier);
}
else
{
printf("Impossible d'ouvrir le fichier\n");
}
}
int lireClavier(char chaine[], int longueur)
{
char *positionEntree = NULL;
if(fgets(chaine, longueur, stdin) != NULL)
{
positionEntree = strchr(chaine, '\n');
if(positionEntree != NULL)
{
*positionEntree = '\0';
}
else
{
viderBuffer();
}
return 1;
}
else
{
viderBuffer();
return 0;
}
}
long lireLong()
{
char nombreTexte[100] = {0};
if(lireClavier(nombreTexte, 100))
{
return strtol(nombreTexte, NULL, 10);
}
else
{
return 0;
}
}
void viderBuffer()
{
int c = 0;
while(c != '\n' && c != EOF)
{
c = getchar();
}
}
Exercice n°2 : zBinary
#include <stdio.h>
#include <stdlib.h>
void conversionDecimalBinaire();
int main()
{
int choix = 0, continuerProgramme = 1;
printf("Bienvenue dans zBinary");
while(continuerProgramme)
{
printf("\n\n== MENU ==\n\n");
printf("1. Conversion decimal -> binaire\n");
printf("2. Quitter le programme\n\n");
printf("Votre choix ? ");
scanf("%d", &choix);
switch(choix)
{
case 1:
conversionDecimalBinaire();
break;
case 2:
continuerProgramme = 0;
break;
default:
printf("Une erreur est survenue.\n");
}
}
return EXIT_SUCCESS;
}
void conversionDecimalBinaire()
{
int nombreDecimal = 0, nombreBinaire[100] = {0};
int i = 0, reste = 0;
printf("\nNombre decimal : ");
scanf("%d", &nombreDecimal);
while(nombreDecimal > 0)
{
reste = nombreDecimal % 2;
nombreBinaire[i] = reste;
i++;
nombreDecimal /= 2;
}
printf("Nombre binaire : ");
for(i = i - 1; i >= 0; i--)
{
printf("%d", nombreBinaire[i]);
}
}
Je vais le faire, mais franchement, la présentation est un tout petit peu à revoir, l'idée est bonne mais ça rejoint ce topic : http://www.siteduzero.com/forum-83-591 [...] t-niveau.html .
Aussi, tu devrais mettre plusieurs niveaux de difficulté et/ou plusieurs énoncés car là, c'est un peu rapide...
L'intention est bonne, mais ce serait parfait si la présentation était moins flashy et si tu faisais un topic dédié. De plus, un peu plus de contenu serait le bienvenu car là comme le dit paraze, il n'y a pas grand chose à faire, preuve à l'appui :
#include <stdio.h>
int
main (void) {
int i, j, n;
if (scanf(" %d", &n) != 1)
return !puts("Tcho !!");
for (i=j=0;i<n;putchar(j<n-i-1?' ':'*'),j==n+i-1?putchar('\n'),++i,j=0:++j);
return 0;
}
Ce serait pas mal de lire les règles du forum avant de poster.
Crée un nouveau topic pour ton problème.
Utilise les balises de codes.
Ne pas utiliser le langage sms.
Donner un titre explicite à son topic.
Oh, lui hé ! Copieur ! C'est mon code modifié ça.
Par contre (hé oui ) si j'entre un nombre négatif ça plante, et j'ai quelques warning (hé oui, le size_t c'est %zd en C99 ) :
main.c: In function ‘main’:
main.c:6: warning: format ‘%d’ expects type ‘int’, but argument 6 has type ‘long unsigned int’
main.c:6: warning: format ‘%d’ expects type ‘int’, but argument 7 has type ‘long unsigned int’
J'ai juste repris la gestion des paramètres du main()(d'ailleurs j'ai fais une bourde car j'ai fais !!_ et toi _<0. Sinon, les 2 codes n'ont absolument rien à voir
Je propose une solution avec une contrainte : n'utiliser qu'une seule variable d'itération (au lieu de 2). .
#include <stdio.h>
#include <stdint.h>
/* QUELQUES EXPLICATIONS :
L'écran est modélisé par une "grille", avec 'n' lignes,
numérotées à partir de 0. Par exemple, pour n==4 :
0. ---*... (les tirets représentent ici les espaces blancs,
1. --***.. à afficher, et les points ceux à "sauter")
2. -*****.
3. *******
0123456
Il y a '2n-1' colonnes (un peu de maths), qu'on note 'N' ;
on les numérote à partir de 0.
Dans le programme, on parcourt cette grille pour afficher les caractères
(' ', '*' ou '\n'). On peux bien sûr utiliser 2 variables pour cela
(ligne et colonne) avec 2 boucles imbriquées ; cependant, je me suis
imposé la contrainte de n'utiliser qu'une seule variable et une seule
boucle...
On a au total 'n*(2n-1)' cases, soit '2n²-n'. Il faut donc parcourir la
grille en boucle, en initialisant la variable (appelée 'i') à 0 et tant
que 'i<2n²-n'.
On obtient le n° de la ligne 'L' actuelle en faisant 'i/N' (quotient
de la division entière), et le n° de la colonne actuelle 'C' en faisant
'i%N' (reste de la division entière).
On constate (cf schéma) qu'il y a, pour chaque ligne, 'n-L-1' espaces
à gauche et autant à droite.
La colonne de la 1ère étoile est donc 'n-L-1', (souvenez-vous que la
numérotation commence à 0), et celle du 1er espace de droite 'N - (n-L-1)'.
Les espaces de gauche (représentés par des tirets) doivent être écrits
sur l'écran, tandis que ceux de droite (représentés par des points)
peuvent être omis puisqu'il n'y a rien après.
*/
#define N (2*(uint32_t)n-1) // largeur (nombre de colonnes)
#define L (i/N) // ligne actuelle
#define C (i%N) // colonne actuelle
int main(void) {
uint8_t n; // hauteur (nombre de lignes), fournie par l'utilisateur (0-255)
uint32_t i; // pour parcourir la "grille" d'affichage
printf("n=? ");
if(scanf(" %u",&n)) // si la saisie du l'utilisateur est valide
for(i=0; i<2*n*n-n; ++i) { // on parcourt la grille
if(C == N - (n-L-1)) { /* si on est rendu au 1er espace de droite
(cf explications pour le calcul du test) */
i+= N-C-1; // on va à la fin de la ligne
putchar('\n');
}
else if(C < n-L-1) putchar(' '); /* si on est dans les espaces de gauche
(cf explications pour le calcul du test) */
else putchar('*'); /* sinon, on est dans la pyramide */
}
return 0;
}
Je pense qu'il est possible de se débarrasser de i et n'utiliser qu'une seule variable en tout ('n') ; je posterais mon nouveau code une fois que j'aurais réussi (si je réussis).
ÉDIT: Code revu et commenté suite à la remarque de Fayden (le code "moche" peut toujours être consulté )
Code dégueu :
#include <stdio.h>
#include <stdint.h>
#define N ((signed)(((uint32_t)n<<1)-1))
#define L ((signed)(i/N))
#define C ((signed)(i%N))
int main(void){uint8_t n;uint32_t i;printf("n=? ");if(scanf(" %u",&n))
for(i=0;(n*n<<1)-n-i;putchar(n-N-L+C-1?0<n-L-C-1?' ':'*':(i+=N-C-1,'\n')),++i);
return 0;}
J'ai été gentil, je l'ai mis sur 3 lignes (si le préprocesseur vous dérange, je peux faire du search&replace !)
<secret>Qui peux m'expliquer pourquoi ce code ne donne-t-il pas le même résultat que le précédent ?
int main(void){uint8_t n;uint32_t i=0;printf("n=? ");if(scanf(" %u",&n))
for(;(n*n<<1)-n-i;putchar(n-N-L+C-1?0<n-L-C-1?' ':'*':(i+=N-C-1,'\n')),++i);
return 0;}
La seule différence, c'est l'initialisation de i qui est faite à la déclaration et pas dans le for. J'ai beau chercher, je ne vois pas et ça m'embête , parce qu'avec le 2è code le programme ne fonctionne pas.
J'ai plein d'autres problèmes du style, pour remplacer des expressions a priori équivalentes. Je soupçonne un lien avec le typage et/ou le signe (signed/unsigned), mais là j'ai le cerveau en compote.</secret></span>
@che > J'aime beaucoup ton code Je ne savais même pas que c'est autorisé de nommer ses variables _ et __ Juste, pourquoi n'as-tu pas remplacé la dernière accolade de ton main ?
Ce topic vire au "qui sera capable de poster le code le plus degueulasse" et ce n'etait pas son but a la base..
Et il n'a pas tort. Si vous voulez faire un topic pour les débutants, ce serait dommage de remplir ses pages avec des codes imbuvables qui n'aideront pas les débutants.
J'ai édité mon message (et surtout le code) dans l'optique "topic d'entraînement pour les débutants (ou pas)", et non "most obfuscated code" ; je l'ai présenté convenablement et commenté en détail afin qu'il soit (je l'espère) suffisamment compréhensible.
Je pense en effet qu'il peut être intéressant vu qu'il ne s'agit pas d'une redite des codes précédemment postés (puisqu'il introduit une contrainte).
Ce topic vire au "qui sera capable de poster le code le plus degueulasse" et ce n'etait pas son but a la base..
Et il n'a pas tort. Si vous voulez faire un topic pour les débutants, ce serait dommage de remplir ses pages avec des codes imbuvables qui n'aideront pas les débutants.
Il n'a peut-être pas tord, mais sachant qu'il n'y a quasiment aucun (pour pas dire aucun) débutant qui fait les exos, pourquoi se priver ? Et puis franchement, je me demande même pourquoi on s'emmerde à en proposer. Le seul exercice qui a eu beaucoup de succès (à mon goût), c'est l'exercice zMorp, le reste, je ne vois pas une précipitation accablante...
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles - ♡ Copying is an act of love.
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles - ♡ Copying is an act of love.
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles - ♡ Copying is an act of love.