Prg pour conjugaison en C

tonguim -  
JSS Messages postés 3745 Date d'inscription   Statut Contributeur Dernière intervention   -
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");
//}
}
A voir également:

11 réponses

LeSousss Messages postés 149 Date d'inscription   Statut Membre Dernière intervention   15
 
Slt,
tu met jamais les { } pour tes boucles for ?
0
JSS Messages postés 3745 Date d'inscription   Statut Contributeur Dernière intervention   32
 
bonjour ou bonsoir,

C'est pas la peine lorsqu'il n'y a qu'une instruction de mettre les {}.

JSS
0
JSS Messages postés 3745 Date d'inscription   Statut Contributeur Dernière intervention   32
 
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
0
pi€rre Messages postés 76 Date d'inscription   Statut Membre Dernière intervention  
 
ton num_pronom commence à 0 et ton case à 1
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
JSS Messages postés 3745 Date d'inscription   Statut Contributeur Dernière intervention   32
 
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
0
JSS Messages postés 3745 Date d'inscription   Statut Contributeur Dernière intervention   32
 
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
0
tonguim
 
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");
}
0
Canard007 Messages postés 5931 Date d'inscription   Statut Contributeur Dernière intervention   215
 
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
0
JSS Messages postés 3745 Date d'inscription   Statut Contributeur Dernière intervention   32
 
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
0
tonguim
 
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
0
Canard007 Messages postés 5931 Date d'inscription   Statut Contributeur Dernière intervention   215
 
L'etape suivante maintenant c'est reussir a trouver ces erreurs tout seul ^^
0
JSS Messages postés 3745 Date d'inscription   Statut Contributeur Dernière intervention   32
 
Bonjour ou Bonsoir,

De rien.

L'etape suivante maintenant c'est reussir a trouver ces erreurs tout seul ^^

:-)

JSS
0