Correction d'un code (exercice)

Correction d'un code (exercice) - C - Programmation

Marsh Posté le 15-06-2009 à 17:12:27    

Bonjour bonjour,
 
C'est encore moi avec des exercices ^^.
Celui ci il faut juste corriger un code où il y a intentionnellement des erreurs.
 
Je pense avoir corrigé la plupart, mais il me reste deux warnings là ou j'ai marqué "erreurs à corriger"
Je voudrais juste votre avis.
 
Voilà le code de départ:
 

Code :
  1. #include <conio.h>
  2. #include <stdio.h>
  3. char codage (char lettre[], int i,int nb)
  4. {
  5.      char result;
  6.      int signe=1;
  7.      if (i%2==0) signe=-1;
  8.      i=(i/2)+1;
  9.      result=lettre+signe*i*nb;
  10.      return(result);
  11. }
  12. void main (void);
  13. {
  14.      char mot[30], code[30];
  15.      int nombre, erreur, i, chks;
  16.      do
  17.      {
  18.          printf ("Bonjour, veuillez saisir le nombre correspondant à votre choix :\n 1\t pour coder un mot\n 2\tpour decoder un mot\n 3\t pour voir le nombre correspondant à un mot\n" );
  19.          scanf ("%f", &nombre);
  20.          erreur = 0;
  21.          switch(nombre)
  22.          {
  23.                        case 1 : printf("Veuillez saisir votre mot\n" );
  24.                        scanf("%s",&mot);
  25.                        chks=0;
  26.                        for (i=0; i<strlen(mot); i++)
  27.                        {
  28.                            code[i]=codage(mot[i],i,1);
  29.                            chks+=mot[i]-65;}
  30.                            code[strlen(mot)]=0;
  31.                            printf ("Le mot %i se code en %i.\nSon code de validation est : %i\n",mot,code,chks);
  32.                        case 2 : printf("Veuillez saisir votre code\n" );
  33.                            scanf("%s",&code);
  34.                            chks=0;
  35.                            for (i=0; i<strlen(code); i++);
  36.                            {
  37.                                mot[i]=codage(code[i],i,-1);
  38.                                chks+=mot[i]-65;
  39.                                }
  40.                            mot[strlen(code)]=0;
  41.                            printf ("Le code %s se decode en %s.\nSon code de validation est : %i\n",code,mot,chks);
  42.                        case 3 : printf("Veuillez saisir votre mot\n" );
  43.                            scanf("%s",mot);
  44.                            chks=0;
  45.                            for (i=0; i<strlen(mot); i++)
  46.                            {
  47.                                chks+=mot[i]-65;}
  48.                                printf ("Son code de validation est : %i\n",chks);
  49.                            default : erreur=1;
  50.                                printf("Vous avez commis une erreur lors de la saisie.\n Pressez une touche pour recommencer\n" );
  51.                                getch();
  52.                                }
  53.          } while (erreur=1)
  54.                            printf("Le programme est maintenant fini. Appuyez sur une touche\n" );
  55.                            getch();
  56. }


 
Ma correction:

Code :
  1. #include <conio.h>
  2. #include <stdio.h>
  3. /*Erreur corrigée ci-dessous */
  4. #include <stdlib.h>
  5. char codage (char lettre[], int i,int nb)
  6. {
  7.      char result;
  8.      int signe=1;
  9.      if (i%2==0) signe=-1;
  10.      i=(i/2)+1;
  11.      /*Erreur à corrigée  */
  12.      result=lettre+signe*i*nb;
  13.      return(result);
  14. }
  15. /*Erreur corrigée ci-dessous */
  16. /*Erreur corrigée ci-dessous */
  17. int main (void)
  18. {
  19.         char mot[30], code[30];
  20.         int nombre, erreur, i, chks;
  21.         do
  22.         {
  23.             printf ("Bonjour, veuillez saisir le nombre correspondant à votre choix :\n 1\t pour coder un mot\n 2\t pour decoder un mot\n 3\t pour voir le nombre correspondant à un mot\n" );
  24.             /*Erreur corrigée ci-dessous */
  25.             scanf ("%i", &nombre);
  26.              /*Erreur corrigée ci-dessous */
  27.             erreur == 0;
  28.             switch(nombre)
  29.             {
  30.                           case 1 : printf("Veuillez saisir votre mot\n" );
  31.                           scanf("%s",&mot);
  32.                           chks=0;
  33.                           for (i=0; i<strlen(mot); i++)
  34.                           {
  35.                               /*Erreur à corrigée  */
  36.                               code[i]=codage(mot[i],i,1);
  37.                               chks+=mot[i]-65;
  38.                           }
  39.                           code[strlen(mot)]=0;
  40.                           /*Erreur corrigée ci-dessous */
  41.                           printf ("Le mot %i se code en %i.\nSon code de validation est : %i\n",mot,code,chks);break;
  42.                           case 2 : printf("Veuillez saisir votre code\n" );
  43.                           scanf("%s",&code);
  44.                           chks=0;
  45.                           /*Erreur corrigée ci-dessous */
  46.                           for (i=0; i<strlen(code); i++)
  47.                           {
  48.                               /*Erreur à corrigée  */
  49.                               mot[i]=codage(code[i],i,-1);
  50.                               chks+=mot[i]-65;
  51.                           }
  52.                           mot[strlen(code)]=0;
  53.                           /*Erreur corrigée ci-dessous */
  54.                           printf ("Le code %s se decode en %s.\nSon code de validation est : %i\n",code,mot,chks);break;
  55.                           case 3 : printf("Veuillez saisir votre mot\n" );
  56.                           /*Erreur corrigée ci-dessous */
  57.                           scanf("%s",&mot);
  58.                           chks=0;
  59.                           for (i=0; i<strlen(mot); i++)
  60.                           {
  61.                               chks+=mot[i]-65;
  62.                           }
  63.                           /*Erreur corrigée ci-dessous */
  64.                           printf ("Son code de validation est : %i\n",chks);break;
  65.                           default : erreur = 1;
  66.                           printf("Vous avez commis une erreur lors de la saisie.\n Pressez une touche pour recommencer\n" );
  67.                           /*Erreur corrigée ci-dessous */
  68.                           getch();break;
  69.             }
  70.              /*Erreur corrigée ci-dessous */
  71.         } while (erreur == 1);
  72. printf("Le programme est maintenant fini. Appuyez sur une touche\n" );
  73. getch();
  74. }


 
Merci beaucoup!

Reply

Marsh Posté le 15-06-2009 à 17:12:27   

Reply

Marsh Posté le 15-06-2009 à 17:24:18    

(et les warnings, on doit les deviner ?)
Ouh putain, la ligne 13 [:ciler]
Et si jamais ton utilisateur saisit des mots de plus de 30 caractères, tu penseras à lui dire de redémarrer son PC ensuite, pour anticiper le plantage qui ne manquera pas d'arriver


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-06-2009 à 17:31:46    

Harkonnen a écrit :

(et les warnings, on doit les deviner ?)
Ouh putain, la ligne 13 [:ciler]
Et si jamais ton utilisateur saisit des mots de plus de 30 caractères, tu penseras à lui dire de redémarrer son PC ensuite, pour anticiper le plantage qui ne manquera pas d'arriver


 
Nan mais c'est terminé depuis presque 10 ans Win9x et ses écrans bleus sur un scanf(), hein. [:dawa]

Reply

Marsh Posté le 15-06-2009 à 17:35:45    

Elmoricq a écrit :


 
Nan mais c'est terminé depuis presque 10 ans Win9x et ses écrans bleus sur un scanf(), hein. [:dawa]


Ca correspond justement à la période où j'ai du écrire ma dernière ligne de C [:dawa]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-06-2009 à 18:03:12    

Harkonnen a écrit :

(et les warnings, on doit les deviner ?)


 
Oups !
 
Les voici:
13 C:\Documents and Settings\Administrator\Desktop\correction.c [Warning] assignment makes integer from pointer without a cast  
37 C:\Documents and Settings\Administrator\Desktop\correction.c [Warning] passing arg 1 of `codage' makes pointer from integer without a cast  
50 C:\Documents and Settings\Administrator\Desktop\correction.c [Warning] passing arg 1 of `codage' makes pointer from integer without a cast  

Reply

Marsh Posté le 15-06-2009 à 18:20:37    

Il ne faut pas mettre un & ou un * qq part à la ligne 13?

Reply

Marsh Posté le 15-06-2009 à 23:21:11    

Ligne 13 : faut que tu castes tes int en char
result=lettre+(char)signe*(char)i*(char)nb;

Reply

Marsh Posté le 15-06-2009 à 23:23:04    

Et je pense que pour les 2 autres erreurs, le probleme vient du prototype de la fonction codage, lettre est juste un char, pas un tableau de char
 
char codage (char lettre[], int i,int nb) --> char codage (char lettre, int i,int nb)

Reply

Marsh Posté le 15-06-2009 à 23:46:22    

non tout faux, lire le code ne suffit pas, faut le comprendre aussi
et arreter d epenser qu'un warning de cast se resout en castant comme un porc
l13 :

 

result = lettre[signe*i*nb];

 

Message cité 2 fois
Message édité par Joel F le 15-06-2009 à 23:46:53
Reply

Marsh Posté le 16-06-2009 à 07:43:24    

Joel F a écrit :

non tout faux, lire le code ne suffit pas, faut le comprendre aussi
et arreter d epenser qu'un warning de cast se resout en castant comme un porc
l13 :
 
result = lettre[signe*i*nb];
 


 
J'aurais tendance à être plutôt de l'avis de boblenain, pour moi il ne faut envoyer qu'un char en premier paramètre de la fonction "codage", pas un tableau de char (sinon je vois pas bien l'intérêt de passer l'intégralité du tableau à chaque appel de la fonction, i.e à chaque itération de la boucle for). Du coup, "lettre" est de type char et n'accepte pas "lettre[xxx]". Par contre, je ne comprends pas bien la méthode de codage, cette ligne 13 reste mystérieuse.
 
Autre (petite) erreur spotted : ligne 34, les "%i" pour formater les string "mot" et "code" (d'ailleurs, je suis toujours mal à l'aise avec l'emploi de %i pour les int, j'ai toujours utilisé le %d, je me demandais si tous les compilateurs acceptaient le %i, j'imagine que oui)


---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 16-06-2009 à 07:43:24   

Reply

Marsh Posté le 16-06-2009 à 08:22:01    

Turkleton a écrit :


J'aurais tendance à être plutôt de l'avis de boblenain, pour moi il ne faut envoyer qu'un char en premier paramètre de la fonction "codage", pas un tableau de char (sinon je vois pas bien l'intérêt de passer l'intégralité du tableau à chaque appel de la fonction, i.e à chaque itération de la boucle for). Du coup, "lettre" est de type char et n'accepte pas "lettre[xxx]". Par contre, je ne comprends pas bien la méthode de codage, cette ligne 13 reste mystérieuse.


 
J'ai pas lu le bon bout [:prozac]
 
Ouais char lettre oui mais n'empeche que le transtypage foireux à totu va = niet

Reply

Marsh Posté le 16-06-2009 à 13:31:58    

Joel F a écrit :

non tout faux, lire le code ne suffit pas, faut le comprendre aussi


 

Joel F a écrit :


J'ai pas lu le bon bout [:prozac]


 :o  
 
Transtypage int <-> char, c'est pas du transtypage foireux à tout va amha. Sinon faut modifier bien plus de choses dans son code ..
 
 

Reply

Marsh Posté le 16-06-2009 à 13:42:48    

Dans l'optique que j'en avais (pointer<->integer) si. La ofc non :o


Message édité par Joel F le 16-06-2009 à 13:42:54
Reply

Sujets relatifs:

Leave a Replay

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