Prg pour conjugaison en C
tonguim
-
JSS Messages postés 3743 Date d'inscription Statut Contributeur -
JSS Messages postés 3743 Date d'inscription Statut Contributeur -
Bonjour,
cette fois, je suis en train d'ecrire un programme en C qui conjugue au present de l'indicatif un verbe du premier groupe (c'est a dire en 'er') saisi au clavier. Mon but est de manier les fonctions gets, puts, strlen et strcat.
Mon programme ne s'execute pas. Merci de m'aider s'il vous plaît.
Voici mon code:
#include <stdio.h>
#include <string.h>
main ()
{
char mot [26], racine [26];
int i = 0, j = 0, num_pronom;
printf ("Veuillez entrer un mot: ");
gets (mot);
//for (i=0; i <= strlen (mot); i++)
//{
if (mot[strlen(mot)] == 'r' && mot[strlen(mot)-1] == 'e') //si les 2 derniers caracteres du mots sont 'er'
{
for (j=0; j <= strlen(mot)-2; j++) //je laisse tomber la chaine "er"
racine[j] = mot[i]; //et je met le reste dans racine
for (j = 0; j <= strlen (racine); j++)
for (num_pronom = 0; num_pronom <= 5; num_pronom++) // pronom je = num 1; tu = 2; etc.
switch (num_pronom)
{
case 1: printf ("je"); printf ("%s", racine); printf ("e");
break;
case 2: printf ("tu"); printf ("%s", racine); printf ("es");
break;
case 3: printf ("il"); printf ("%s", racine); printf ("e");
break;
case 4: printf ("nous"); printf ("%s", racine); printf ("ons");
break;
case 5: printf ("vous"); printf ("%s", racine); printf ("ez");
break;
case 6: printf ("ils"); printf ("%s", racine); printf ("ent");
break;
}
}
else
printf ("ce mot n'est pas un verbe\n\n");
//}
}
cette fois, je suis en train d'ecrire un programme en C qui conjugue au present de l'indicatif un verbe du premier groupe (c'est a dire en 'er') saisi au clavier. Mon but est de manier les fonctions gets, puts, strlen et strcat.
Mon programme ne s'execute pas. Merci de m'aider s'il vous plaît.
Voici mon code:
#include <stdio.h>
#include <string.h>
main ()
{
char mot [26], racine [26];
int i = 0, j = 0, num_pronom;
printf ("Veuillez entrer un mot: ");
gets (mot);
//for (i=0; i <= strlen (mot); i++)
//{
if (mot[strlen(mot)] == 'r' && mot[strlen(mot)-1] == 'e') //si les 2 derniers caracteres du mots sont 'er'
{
for (j=0; j <= strlen(mot)-2; j++) //je laisse tomber la chaine "er"
racine[j] = mot[i]; //et je met le reste dans racine
for (j = 0; j <= strlen (racine); j++)
for (num_pronom = 0; num_pronom <= 5; num_pronom++) // pronom je = num 1; tu = 2; etc.
switch (num_pronom)
{
case 1: printf ("je"); printf ("%s", racine); printf ("e");
break;
case 2: printf ("tu"); printf ("%s", racine); printf ("es");
break;
case 3: printf ("il"); printf ("%s", racine); printf ("e");
break;
case 4: printf ("nous"); printf ("%s", racine); printf ("ons");
break;
case 5: printf ("vous"); printf ("%s", racine); printf ("ez");
break;
case 6: printf ("ils"); printf ("%s", racine); printf ("ent");
break;
}
}
else
printf ("ce mot n'est pas un verbe\n\n");
//}
}
11 réponses
-
Slt,
tu met jamais les { } pour tes boucles for ? -
bonjour ou bonsoir,
C'est pas la peine lorsqu'il n'y a qu'une instruction de mettre les {}.
JSS -
par contre il me semble que la fonction gets n'est pas top mais je ne suis pas tres sur.
As tu essaye de faire cela avé un scanf ?
JSS -
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
en plus il me semble que tu as un probleme lors de ton affichage.
pourquoi ne pas simplement faire :
printf("je %s",racine); printf("e\n");
printf("tu %s",racine);printf("es\n");
//etc
et ne pas mettre de boucle du tout et de switch ?
JSS -
Par ailleurs lorsque tu recopie la racine de ton verbe n'oublie pas d'ajouter '\0' a la fin de ta chaine de caractere .
Voila je pense cette fois que j'ai plus de remarques.
JSS.si.tu.veux.bien.essayer.tout.ca.et.nous.tenir.au.courant -
j'ai modifié, mais le programme ne donne pas le résultat attendu; lorsque je saisi par exemple le verbe "manger" ou le verbe "jeter", il me dit "ce mot n'est pas un verbe".
#include <stdio.h>
#include <string.h>
main ()
{
char mot [26], racine [26];
int i = 0, j = 0, num_pronom;
printf ("Veuillez entrer un mot: ");
gets (mot);
if (mot[strlen(mot)] == 'r' && mot[strlen(mot)-1] == 'e') //si les 2 derniers caracteres du mots sont 'er'
{
for (j=0; j <= strlen(mot)-2; j++) //je laisse tomber la chaine "er"
racine[j] = mot[i]; //et je met le reste dans racine
racine[strlen(mot)] = '\0';
for (j = 0; j <= strlen(racine)-1; j++)
for (num_pronom = 0; num_pronom <= 5; num_pronom++) // pronom je = num 1; tu = 2; etc.
switch (num_pronom)
{
case 0: printf ( "je %s", racine); printf ("e\n");
break;
case 1: printf ( "tu %s", racine); printf ("es\n");
break;
case 2: printf ( "il %s", racine); printf ("e\n");
break;
case 3: printf ("nous %s", racine); printf ("ons\n");
break;
case 4: printf ("vous %s", racine); printf ("ez\n");
break;
case 5: printf ( "ils %s", racine); printf ("ent\n");
break;
}
}
else
printf ("ce mot n'est pas un verbe\n\n");
} -
Salut tomguim,
je viens de passer quelques minutes a coriger ton code donc voici ci dessous la correction avec les commantaires:
#include <stdio.h> #include <string.h> void main () { char mot [26], racine [26]; int i = 0, j = 0, num_pronom; printf ("Veuillez entrer un mot: "); gets (mot); //attention sur ton test strlen renvoie taille+1 vu qu une chaine commence a chaine[0] //donc pour ton test il le r se trouve a taille-1 et le e a taille -2 //c'est pour cela que ton test ne passe pas //donc if (mot[strlen(mot)] == 'r' && mot[strlen(mot)-1] == 'e') devient if (mot[strlen(mot)-1] == 'r' && mot[strlen(mot)-2] == 'e') //si les 2 derniers caracteres du mots sont 'er' { for (j=0; j <= strlen(mot)-3; j++) //je laisse tomber la chaine "er" { //ici dans ton test il y a un gros probleme vu que i=0 et n evolue pas //on voit bien que tu veux recopeir le mot dans recine en retirant "er" //mais fo incrementer mot[i] et donc par deduction ce bn'est pas mot[i] mais mot[j] //donc on remplace racine[j] = mot[i]; //et je met le reste dans racine par racine[j] = mot[j]; //et je met le reste dans racine //j ai rajouté accolade pour clareté du codemais tu pourra les virer si tu veux } //encore une erreur la tu veux finaliser ta chaine mais la fin n est pas a taille mais a taille -2 //comme vu precedement //donc racine[strlen(mot)] = '\0'; devient racine[strlen(mot)-2] = '\0'; //pourquoi ce test maintenant que tu a la racine c est bon le travail est fini ya plus qu a afficher //for (j = 0; j <= strlen(racine)-1; j++) for (num_pronom = 0; num_pronom <= 5; num_pronom++) // pronom je = num 1; tu = 2; etc. { switch (num_pronom) { //un seul printf suffit pour ecrire sur la ligne donc j ai modifier :p case 0: printf ( "je %se\n", racine); break; case 1: printf ( "tu %ses\n", racine); break; case 2: printf ( "il %se\n", racine); break; case 3: printf ("nous %sons\n", racine); break; case 4: printf ("vous %sez\n", racine); break; case 5: printf ( "ils %sent\n", racine); break; } } } else printf ("ce mot n'est pas un verbe\n\n"); } //voila j ai testé et compilé ca marche..
Cependant pour apprendre au mieux je te conseil d'utiliser au maximum le debugger et de regarder les messages d erreur a la compilation tous ceci fait en general bien avancer les choses...
Bon courage pour la suite-
Bonjour ou Bonsoir,
Je pense qu'avec les explications de canard tu as bien compris comment ca marche ... je me permets Canard cependant d'ajouter 2 réflexions :
1 le gets il me semble qu'il faut le remplacer par un scanf car cette methode a ete source de bug (gets vient de fgets qui a eu des bugs reconnus).
2 tu n'as nullement besoin de faire une boucle for pour afficher tes resultats. Un affichage directe te suffit (for et switch inutile). Ceci ce traduit par remplacer :
for (num_pronom = 0; num_pronom <= 5; num_pronom++) // pronom je = num 1; tu = 2; etc.
{
switch (num_pronom)
{
//un seul printf suffit pour ecrire sur la ligne donc j ai modifier :p
case 0: printf ( "je %se\n", racine);
break;
case 1: printf ( "tu %ses\n", racine);
break;
case 2: printf ( "il %se\n", racine);
break;
case 3: printf ("nous %sons\n", racine);
break;
case 4: printf ("vous %sez\n", racine);
break;
case 5: printf ( "ils %sent\n", racine);
break;
}
}
par :
printf("je%se\n,racine);
printf ( "tu %ses\n", racine);
printf ( "il %se\n", racine);
printf ("nous %sons\n", racine);
printf ("vous %sez\n", racine);
printf ( "ils %sent\n", racine);
Bravo a Canard pour ces explications.
Bon courage.
Regarde la doc sur la fonction scanf et sur la fonction gets
Bon courage.
A +
JSS
-
-
Je vous remercie les amis, le programme donne maintenant les résultats attendus. Si vous pouviez me voir, vous verriez mon laaaaaaaarge sourire. Merci encore
-
L'etape suivante maintenant c'est reussir a trouver ces erreurs tout seul ^^
-
Bonjour ou Bonsoir,
De rien.
L'etape suivante maintenant c'est reussir a trouver ces erreurs tout seul ^^
:-)
JSS