Probleme sur une fonction !! - C - Programmation
Marsh Posté le 18-04-2006 à 20:26:19
précision les smileys sont a remplacer par des ) merci !!
Marsh Posté le 18-04-2006 à 20:38:27
premierement, mets des balises pour formater le code correctement
http://forum.hardware.fr/hardwaref [...] 4-1.htm#t0
Marsh Posté le 18-04-2006 à 20:39:10
Trois choses, rapidement :
1. Utilise fgets() au lieu de scanf() ;
2. Ton tableau de caractères de longueur 17 est trop petit pour contenir une chaîne comme "clermont-ferrand." ;
3. Ta suite de strcmp() c'est très laid. Stocke tes chaînes fixes dans un tableau de constantes que tu parcours séquentiellement.
Marsh Posté le 18-04-2006 à 20:44:30
pour la saisie de données, je me permets de donner le site d'un utilisateur du forum:
http://mapage.noos.fr/emdel/notes.htm#saisie
Marsh Posté le 18-04-2006 à 20:45:11
Code :
|
faut pas etre induit en erreur par ce prototype, c'est équivalent à
Code :
|
donc si nomacad doit etre rensiegné il est impératif de pouvoir controller un éventuelle dépassement de capacité en passant la taille en parametre (par exemple)
Marsh Posté le 18-04-2006 à 22:46:04
sur dev c++ sa donne po ossi moche bref jvé tenté de tout mettre dans un tableau et de comparer ma saisie aux éléments du tableau mais concretement ke faire pour m'assurer kon ne puisse rien rentrer d'autre que les académies proposés ??
Marsh Posté le 18-04-2006 à 22:58:59
superhoho a écrit : sur dev c++ sa donne po ossi moche bref jvé tenté de tout mettre dans un tableau et de comparer ma saisie aux éléments du tableau mais concretement ke faire pour m'assurer kon ne puisse rien rentrer d'autre que les académies proposés ?? |
Je rappelle que la langue de ce forum est le français.
Merci de relire les règles du forum.
Marsh Posté le 19-04-2006 à 10:58:57
superhoho a écrit : sur dev c++ sa donne po ossi moche bref jvé tenté de tout mettre dans un tableau et de comparer ma saisie aux éléments du tableau mais concretement ke faire pour m'assurer kon ne puisse rien rentrer d'autre que les académies proposés ?? |
Si la chaîne entrée n'est pas dans le tableau, c'est qu'on a entré autre chose que tes académies...
Marsh Posté le 23-04-2006 à 21:47:43
Mé jai l'impression que l'on s'éloigne légèrement du sujet principal qui était de savoir comment m'assurer que le programme continue uniquement si une académie a été correctement saisie !!
sur ce code la (la partie en les +++++ est la partie qui pose probleme) :
***************************** Programme ***************************************
int academie (char nomacad[17])
{int j=0;
int zone = 0;
++++++ do{
printf("Quel est votre academie parmi celles-ci :\n"
"- aix-marseille\n- amiens\n- besancon\n- bordeaux\n- caen\n- clermont-ferrand\n- creteil\n- dijon\n"
"- grenoble\n- lille\n- limoges\n- lyon\n- montpellier\n- nancy-metz\n- nantes\n- nice\n- orleans-tours\n"
"- paris\n- poitiers\n- reims\n- rennes\n- rouen\n- strasbourg\n- toulouse\n- versailles\n\n" );
scanf("%s", nomacad);}
while(strcmp(nomacad,"aix-marseille." )!=0 && strcmp(nomacad,"amiens." )!=0 && strcmp(nomacad,"besancon." )!=0 &&
strcmp(nomacad,"bordeaux." )!=0 && strcmp(nomacad,"caen." )!=0 && strcmp(nomacad,"clermont-ferrand." )!=0 &&
strcmp(nomacad,"creteil." )!=0 && strcmp(nomacad,"dijon." )!=0 && strcmp(nomacad,"grenoble." )!=0 &&
strcmp(nomacad,"lille." )!=0 && strcmp(nomacad,"limoges." )!=0 && strcmp(nomacad,"lyon." )!=0 &&
strcmp(nomacad,"montpellier." )!=0 && strcmp(nomacad,"nancy-metz." )!=0 && strcmp(nomacad,"nantes." )!=0 &&
strcmp(nomacad,"nice." )!=0 && strcmp(nomacad,"orleans-tours." )!=0 && strcmp(nomacad,"paris." )!=0 &&
strcmp(nomacad,"poitiers." )!=0 && strcmp(nomacad,"reims." )!=0 && strcmp(nomacad,"rennes." )!=0 &&
strcmp(nomacad,"rouen." )!=0 && strcmp(nomacad,"strasbourg." )!=0 && strcmp(nomacad,"toulouse." )!=0 &&
strcmp(nomacad,"versailles." )!=0);
while(nomacad[j]!='.') ++++++++
{j++;}
printf("\n" );
/* Ici j'ai sécurisé la saisie de l'académie aucune chaîne de caractères ne pourra être
rentrer mis a part celle définie dans le while */
/* Afin de différencier chaque académie pour en retrouver la zone je vais tout
d'abord les distingués par le nombres de lettres ki les compose et si on se
retrouve avec plusieurs académies avec un même nombre de lettres alors la on
fera la différenciation par rapport a la première lettre de l'académie voire la
seconde lettre.
Une fois l'académie en question trouvé on affectera la variable zone d'une valeur
qui permettra par la suite de distinguer a quel zone appartient cette académie */
switch(j)
{case 4 : if (nomacad[0]=='c' || nomacad[0]=='l') {zone=1;}
if (nomacad[0]=='n') {zone=2;}
break;
case 5 : if (nomacad[0]=='r' || nomacad[0]=='d' || nomacad[0]=='l') {zone=2;}
if (nomacad[0]=='p') {zone=3;}
break;
case 6 : if (nomacad[0]=='r' || nomacad[0]=='n') {zone=1;}
if (nomacad[0]=='a') {zone=2;}
break;
case 7 : if (nomacad[0]=='l') {zone=2;}
if (nomacad[0]=='c') {zone=3;}
break;
case 8 : if (nomacad[0]=='g' || nomacad[0]=='t') {zone=1;}
if (nomacad[0]=='p' || (nomacad[0]=='b' && nomacad[1]=='e')) {zone=2;}
if (nomacad[0]=='b' && nomacad[1]=='o') {zone=3;}
break;
case 10 : if (nomacad[0]=='n') {zone=1;}
if (nomacad[0]=='s') {zone=2;}
if (nomacad[0]=='v') {zone=3;}
break;
case 11 : zone=1;
break;
case 13 : zone=2;
break;
case 16 : zone=1;
break;
} /* Fin du switch(j)*/
return zone;} /* Fin de la fonction académie */
Marsh Posté le 23-04-2006 à 21:57:22
superhoho a écrit : |
Balises [code] please.
Marsh Posté le 24-04-2006 à 10:28:29
c'est normal qu'il y ait des points dans les noms d'académie ??
"aix-marseille." , "rouen."
Moi je créérais une structure contenant le nom de l'acadméie et sa zone, ce serait plus simple.
Tu initialises un tableau de cette structure et tu parcours séquentiellement ce tableau, tu n'auras pas toute cette suite de tests qui me parait en plus fausse.
Marsh Posté le 24-04-2006 à 10:54:13
Trap D a écrit : c'est normal qu'il y ait des points dans les noms d'académie ?? |
J'ai l'impression qu'il met des points au bout de ses chaines de caractères pour en marquer la fin et pouvoir compter la longueur des chaines.
superhoho > les chaînes de caractères en C sont terminées par un caractère 0. Le caractère '.' à la fin de tes chaînes est donc redondant. De plus, il existe déjà une fonction strlen qui te permet de compter la longueur d'une chaine de caractères, ce qui t'évitera de le refaire toi même.
Trap D a écrit : Moi je créérais une structure contenant le nom de l'acadméie et sa zone, ce serait plus simple. |
Marsh Posté le 30-04-2006 à 16:37:53
Trap D a écrit : ...tu n'auras pas toute cette suite de tests qui me parait en plus fausse. |
Fausse ou pas (je prends même pas la peine de regarder tellement c'est horrible) de toute façon ce n'est pas évolutif. Si on rajoute une académie ou si on change un nom, faut tout recoder...
superhoho a écrit : Mé jai l'impression que l'on s'éloigne légèrement du sujet principal qui était de savoir comment m'assurer que le programme continue uniquement si une académie a été correctement saisie !! |
On t'a déjà répondu. Un tableau contenant tous tes noms d'académies que tu balayes séquentiellement. Si tu arrives à la fin du tableau sans avoir trouvé le nom que tu cherches, c'est que l'académie n'a pas été correctement saisie. Evidemment faut prendre la peine de bosser un peu le C et notemment les fonctions de manipulation de chaînes (strcmp(), strlen() bien que celle-ci soit inutile dans ton pb). Et si j'étais toi, je séparerais la partie "saisie du nom" (qui n'a rien à faire dans la fonction "academie" ) de la partie "vérification" (qui est le coeur même de cette fonction)
Et Trap D a rajouté un outil permettant de relier les noms avec les zones correspondantes ce qui te simplifiera grandement la vie pour peu que tu prennes la peine de chercher un peu...
Marsh Posté le 18-04-2006 à 20:18:44
Salut tout le monde j'ai un petit soucis jaimerai sécurisé une saisie d'une chaine de caractères je m'explique.
Je demande a l'utilisateur de choisir une académie parmi celles qui lui sont proposé et je désire continué uniquement si la ville a été bien saisie ! J'ai trouvé l'instruction strcmp (string compare) mé lorsque ke je lance le programme il me refuse les bonnes saisies et me l'accepte de manière aléatoire ou bout de plusieurs saisies !!! Je vous laisse la partie de programme ci dessous merci !!
***************************** Programme ***************************************
int academie (char nomacad[17])
{int j=0;
int zone = 0;
do{
printf("Quel est votre academie parmi celles-ci :\n"
"- aix-marseille\n- amiens\n- besancon\n- bordeaux\n- caen\n- clermont-ferrand\n- creteil\n- dijon\n"
"- grenoble\n- lille\n- limoges\n- lyon\n- montpellier\n- nancy-metz\n- nantes\n- nice\n- orleans-tours\n"
"- paris\n- poitiers\n- reims\n- rennes\n- rouen\n- strasbourg\n- toulouse\n- versailles\n\n" );
scanf("%s", nomacad);}
while(strcmp(nomacad,"aix-marseille." )!=0 && strcmp(nomacad,"amiens." )!=0 && strcmp(nomacad,"besancon." )!=0 &&
strcmp(nomacad,"bordeaux." )!=0 && strcmp(nomacad,"caen." )!=0 && strcmp(nomacad,"clermont-ferrand." )!=0 &&
strcmp(nomacad,"creteil." )!=0 && strcmp(nomacad,"dijon." )!=0 && strcmp(nomacad,"grenoble." )!=0 &&
strcmp(nomacad,"lille." )!=0 && strcmp(nomacad,"limoges." )!=0 && strcmp(nomacad,"lyon." )!=0 &&
strcmp(nomacad,"montpellier." )!=0 && strcmp(nomacad,"nancy-metz." )!=0 && strcmp(nomacad,"nantes." )!=0 &&
strcmp(nomacad,"nice." )!=0 && strcmp(nomacad,"orleans-tours." )!=0 && strcmp(nomacad,"paris." )!=0 &&
strcmp(nomacad,"poitiers." )!=0 && strcmp(nomacad,"reims." )!=0 && strcmp(nomacad,"rennes." )!=0 &&
strcmp(nomacad,"rouen." )!=0 && strcmp(nomacad,"strasbourg." )!=0 && strcmp(nomacad,"toulouse." )!=0 &&
strcmp(nomacad,"versailles." )!=0);
while(nomacad[j]!='.')
{j++;}
printf("\n" );
/* Ici j'ai sécurisé la saisie de l'académie aucune chaîne de caractères ne pourra être
rentrer mis a part celle définie dans le while */
/* Afin de différencier chaque académie pour en retrouver la zone je vais tout
d'abord les distingués par le nombres de lettres ki les compose et si on se
retrouve avec plusieurs académies avec un même nombre de lettres alors la on
fera la différenciation par rapport a la première lettre de l'académie voire la
seconde lettre.
Une fois l'académie en question trouvé on affectera la variable zone d'une valeur
qui permettra par la suite de distinguer a quel zone appartient cette académie */
switch(j)
{case 4 : if (nomacad[0]=='c' || nomacad[0]=='l') {zone=1;}
if (nomacad[0]=='n') {zone=2;}
break;
case 5 : if (nomacad[0]=='r' || nomacad[0]=='d' || nomacad[0]=='l') {zone=2;}
if (nomacad[0]=='p') {zone=3;}
break;
case 6 : if (nomacad[0]=='r' || nomacad[0]=='n') {zone=1;}
if (nomacad[0]=='a') {zone=2;}
break;
case 7 : if (nomacad[0]=='l') {zone=2;}
if (nomacad[0]=='c') {zone=3;}
break;
case 8 : if (nomacad[0]=='g' || nomacad[0]=='t') {zone=1;}
if (nomacad[0]=='p' || (nomacad[0]=='b' && nomacad[1]=='e')) {zone=2;}
if (nomacad[0]=='b' && nomacad[1]=='o') {zone=3;}
break;
case 10 : if (nomacad[0]=='n') {zone=1;}
if (nomacad[0]=='s') {zone=2;}
if (nomacad[0]=='v') {zone=3;}
break;
case 11 : zone=1;
break;
case 13 : zone=2;
break;
case 16 : zone=1;
break;
} /* Fin du switch(j)*/
return zone;} /* Fin de la fonction académie */