Probleme sur une fonction !!

Probleme sur une fonction !! - C - Programmation

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 */

Reply

Marsh Posté le 18-04-2006 à 20:18:44   

Reply

Marsh Posté le 18-04-2006 à 20:26:19    

précision les smileys sont a remplacer par des   ) merci !!

Reply

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


Message édité par shockley le 18-04-2006 à 20:38:42
Reply

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.

Reply

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

Reply

Marsh Posté le 18-04-2006 à 20:45:11    

Code :
  1. int academie (char nomacad[17])


faut pas etre induit en erreur par ce prototype, c'est équivalent à

Code :
  1. int academie (char * nomacad)


 
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)

Reply

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 ??

Reply

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.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

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 */

Reply

Marsh Posté le 23-04-2006 à 21:47:43   

Reply

Marsh Posté le 23-04-2006 à 21:57:22    

superhoho a écrit :


int academie (char nomacad[17])
             {int j=0;


Balises [code] please.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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.

Reply

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 ??
"aix-marseille." , "rouen."

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.
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.

[:plusun]


---------------
TriScale innov
Reply

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...


Message édité par Sve@r le 30-04-2006 à 16:56:49

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed