Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1414 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Probleme sur une fonction !!

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme sur une fonction !!

n°1349171
superhoho
Posté le 18-04-2006 à 20:18:44  profilanswer
 

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

mood
Publicité
Posté le 18-04-2006 à 20:18:44  profilanswer
 

n°1349177
superhoho
Posté le 18-04-2006 à 20:26:19  profilanswer
 

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

n°1349186
shockley
Posté le 18-04-2006 à 20:38:27  profilanswer
 

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
n°1349187
Elmoricq
Modérateur
Posté le 18-04-2006 à 20:39:10  profilanswer
 

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.

n°1349192
shockley
Posté le 18-04-2006 à 20:44:30  profilanswer
 

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

n°1349193
skelter
Posté le 18-04-2006 à 20:45:11  profilanswer
 

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)

n°1349238
superhoho
Posté le 18-04-2006 à 22:46:04  profilanswer
 

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

n°1349248
Emmanuel D​elahaye
C is a sharp tool
Posté le 18-04-2006 à 22:58:59  profilanswer
 

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/
n°1349416
Sve@r
Posté le 19-04-2006 à 10:58:57  profilanswer
 

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.
n°1352380
superhoho
Posté le 23-04-2006 à 21:47:43  profilanswer
 

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

mood
Publicité
Posté le 23-04-2006 à 21:47:43  profilanswer
 

n°1352386
Emmanuel D​elahaye
C is a sharp tool
Posté le 23-04-2006 à 21:57:22  profilanswer
 

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/
n°1352532
Trap D
Posté le 24-04-2006 à 10:28:29  profilanswer
 

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.

n°1352555
franceso
Posté le 24-04-2006 à 10:54:13  profilanswer
 

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
n°1356802
Sve@r
Posté le 30-04-2006 à 16:37:53  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Probleme sur une fonction !!

 

Sujets relatifs
probléme avec la fonction rmdirproblème avec la fonction Range
[VBA] Excel : problème avec la fonction Print[résolu]probleme entre fonction et regex
VBA - Probleme Appel de fonctionProblème avec la fonction fopen()
problème avec la fonction onBlurfonction Timer vide, problème ???
Probleme avec la fonction mailproblème pour passer un flux en argument d'une fonction
Plus de sujets relatifs à : Probleme sur une fonction !!


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR