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

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

Traduction d'un algorithme en C

n°1894575
Turkleton
I don't quite understand you
Posté le 12-06-2009 à 16:15:29  profilanswer
 

Reprise du message précédent :

jowhite a écrit :

Le même résultat


Honnêtement, pour moi, ton code me semble bon. Si ça ne retourne pas les valeurs prévues, tant pis, le sujet étant juste de traduire l'algorithme qu'on t'a donné, ce qui est fait. Si l'algo ne fonctionne pas à la base, c'est pas ton problème  :ange:  
 
Après, si tu veux vraiment le faire fonctionner, je pense qu'il va falloir modifier l'algo de base, notamment la ligne "sortie+=(chaine[i])-48;" qui, comme l'a noté pataluc, ne donne pas le résultat escompté.
 
EDIT : je viens de voir que tu avais toujours ton "strlen(chaine)-2" dans ton instruction for. Pourquoi "-2" ? Ça devrait être "-1". Si tu entres un nombre de deux chiffres dans ton scanf, strlen(chaine) va te donner la valeur 2 (il ne compte pas le /0 de fin). Donc il ne va y avoir qu'une seule itération de ta boucle for alors qu'il y a deux chiffres à traiter.


Message édité par Turkleton le 12-06-2009 à 16:41:39

---------------
If you think it could look good, then I guess it should
mood
Publicité
Posté le 12-06-2009 à 16:15:29  profilanswer
 

n°1894576
jowhite
Posté le 12-06-2009 à 16:18:35  profilanswer
 

Ouai, tu as raison! J'ai bien compris le principe et je ne devrais plus m'attarder dessus je pense, j'ai d'autres matières à réviser où j'ai eu beaucoup plus d'heure de cour! (genre la microbiologie XD)
 
Je vous remercie tous les deux, vous m'avez bien aidé!
@+
 

n°1894717
Emmanuel D​elahaye
C is a sharp tool
Posté le 13-06-2009 à 09:35:42  profilanswer
 

jowhite a écrit :

Quand je veux compiler, aucune erreur apparaît


 [:arrakys]

 

-------------- Build: Debug in hello ---------------

 

Compiling: main.c
Linking console executable: bin\Debug\hello.exe
C:\dev\hello\main.c:7: warning: function declaration isn't a prototype
C:\dev\hello\main.c: In function `saisiesure':
C:\dev\hello\main.c:15: warning: char format, different type arg (arg 2)
C:\dev\hello\main.c:16: warning: implicit declaration of function `strlen'
C:\dev\hello\main.c:16: warning: comparison between signed and unsigned
Output size is 19.61 KB
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 4 warnings


Un meilleur réglage permet de voir plus de choses...

 

http://www.bien-programmer.fr/codage.htm#cfg_compilo

 

Ton code sans warnings :

 
Code :
  1. #include <conio.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>             /* -ed- */
  5. /*Fonction saisiesure*/
  6. int saisiesure (void)           /* -ed- */
  7. {
  8.    int i, erreur;
  9.    int sortie = 0;
  10.    do
  11.    {
  12.       char chaine[50];
  13.       int sortie = 0;
  14.       erreur = 0;
  15.       scanf ("%s", chaine);     /* -ed- */
  16.       for (i = 0; i <= (int) (strlen (chaine) - 2); i++)
  17.      /* -ed- pas terrible le cast... de toutes façon, c'est une tres mauvaise idee
  18.          de mettre un strlen() dans une boucle quand la chaine est invariante. */
  19.       {
  20.          if (erreur == 0)
  21.          {
  22.             if ((chaine) < 48 || (chaine[i]) > 57)
  23.             {
  24.                erreur = 1;
  25.             }
  26.             else
  27.             {
  28.                sortie += (chaine[i]) - 48;
  29.             }
  30.          }
  31.       }
  32.       if (erreur == 1)
  33.          printf ("erreur recommencez\n" );
  34.    }
  35.    while (erreur == 1);
  36.    return (sortie);
  37. }
  38. int main (void)
  39. {
  40.    int nb1, nb2, pgcd, ppcm, temp1, temp2;
  41.    ppcm = 0;
  42.    printf ("1er nombre\n" );
  43.    nb1 = saisiesure ();
  44.    printf ("2er nombre\n" );
  45.    nb2 = saisiesure ();
  46.    if (nb1 < nb2)
  47.    {
  48.       temp1 = nb1;
  49.       temp2 = nb2;
  50.    }
  51.    else
  52.    {
  53.       temp2 = nb1;
  54.       temp1 = nb2;
  55.    }
  56.    do
  57.    {
  58.       pgcd = temp1;
  59.       temp1 = temp2 % temp1;
  60.       temp2 = pgcd;
  61.    }
  62.    while (temp1 > 0);
  63.    pgcd = temp2;
  64.    ppcm = (nb1 * nb2) / pgcd;
  65.    printf ("le pgcd de %i et de %i est %i et le ppcm est %i\n", nb1, nb2,
  66.            pgcd, ppcm);
  67. /* Attendre avant de quitter le programme */
  68.    system ("pause" );
  69. /* Fin du programme sans erreur */
  70.    return (0);
  71. }


Attention la variable 'sortie' est définie 2 fois. La dernière définition 'masque' ([i]shadows) la premire. La fonction retourne toujours 0.

 

Il ne faut pas compliquer le code plus que nécessaire :

Code :
  1. #include <conio.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <errno.h>              /* -ed- */
  5. static void fclean (char *line, FILE * fp)
  6. {
  7.    char *p = strchr (line, '\n');
  8.    if (p != NULL)
  9.    {
  10.       *p = 0;
  11.    }
  12.    else
  13.    {
  14.       int c;
  15.       while ((c = fgetc (fp)) != '\n' && c != EOF)
  16.       {
  17.       }
  18.    }
  19. }
  20. /*Fonction saisiesure*/
  21. int saisiesure (void)
  22. {
  23.    int erreur;
  24.    int sortie = 0;
  25.    do
  26.    {
  27.       char chaine[50];
  28.       char *pend;
  29.       erreur = 0;
  30.       fgets (chaine, sizeof chaine, stdin);
  31.       fclean (chaine, stdin);
  32.       sortie = strtol (chaine, &pend, 10);
  33.       erreur = *pend != 0 || errno == ERANGE;
  34.       if (erreur)
  35.       {
  36.          printf ("erreur recommencez\n" );
  37.       }
  38.    }
  39.    while (erreur);
  40.    return sortie;
  41. }
  42. int main (void)
  43. {
  44.    int nb1, nb2, pgcd, ppcm, temp1, temp2;
  45.    ppcm = 0;
  46.    printf ("1er nombre\n" );
  47.    nb1 = saisiesure ();
  48.    printf ("2er nombre\n" );
  49.    nb2 = saisiesure ();
  50.    if (nb1 < nb2)
  51.    {
  52.       temp1 = nb1;
  53.       temp2 = nb2;
  54.    }
  55.    else
  56.    {
  57.       temp2 = nb1;
  58.       temp1 = nb2;
  59.    }
  60.    do
  61.    {
  62.       pgcd = temp1;
  63.       temp1 = temp2 % temp1; /* -ed- ATTENTION si temp2 vaut 0, le comportement est indéfini. */
  64.       temp2 = pgcd;
  65.    }
  66.    while (temp1 > 0);
  67.    pgcd = temp2;
  68.    ppcm = (nb1 * nb2) / pgcd; /* -ed- ATTENTION si pgcd vaut 0, le comportement est indéfini. */
  69.    printf ("le pgcd de %i et de %i est %i et le ppcm est %i\n", nb1, nb2,
  70.            pgcd, ppcm);
  71. /* Fin du programme sans erreur */
  72.    return (0);
  73. }


Le résultat semble cohérent...


1er nombre
123
2er nombre
456
le pgcd de 123 et de 456 est 3 et le ppcm est 18696

 

Process returned 0 (0x0)   execution time : 4.522 s

 

Press any key to continue.


Penser à ajouter le code nécessaire pour éviter les cas litigieux signalés au-dessus dans le code (ATTENTION ...) .


Message édité par Emmanuel Delahaye le 13-06-2009 à 10:06:46

---------------
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°1895017
jowhite
Posté le 15-06-2009 à 00:19:38  profilanswer
 

Je te remercie beaucoup e ton aide, mais comme je l'ai dit, il s'agit d'un exercice ou il faut traduire l'algorithme. Je n'ai pas du tous les compétences pour savoir si le code est compliqué plus que nécessaire! En tous cas, merci beaucoup!

n°1895113
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-06-2009 à 12:22:33  profilanswer
 

jowhite a écrit :

Je te remercie beaucoup e ton aide, mais comme je l'ai dit, il s'agit d'un exercice ou il faut traduire l'algorithme. Je n'ai pas du tous les compétences pour savoir si le code est compliqué plus que nécessaire! En tous cas, merci beaucoup!


Je ne te demande pas de te justifier... Pose des questions si tu ne comprends pas.
 


---------------
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°1895126
Turkleton
I don't quite understand you
Posté le 15-06-2009 à 12:54:21  profilanswer
 

Emmanuel Delahaye a écrit :


Je ne te demande pas de te justifier... Pose des questions si tu ne comprends pas.
 


Ta participation était intéressante (vraiment), mais ça serait bien que tu lises tout le topic aussi (je sais, c'est chiant). Tu verras que nous avions déjà résolu pas mal de trucs (genre le "sortie" défini deux fois, ...), que le sujet était effectivement de traduire directement un algorithme (jowhite n'essayait donc pas de se justifier, mais juste de te dire que tes améliorations, bien qu'indispensables dans un vrai programme, n'avaient pas lieu d'être ici), et surtout que c'était juste un exercice de révision pour une matière à petit coef, donc qu'il (ou elle) n'allait pas se prendre la tête dessus vu que y'a d'autres matières plus importantes à réviser.
 
Je te jette pas la pierre, y'a plein de topics prog où je n'ai envie de lire que le premier post, et d'y répondre directement (même si le code a déjà changé entre-temps, ce qui était le cas ici)


---------------
If you think it could look good, then I guess it should
n°1895133
Trap D
Posté le 15-06-2009 à 13:08:51  profilanswer
 

-ed- Juste une remarque

Citation :

ppcm = (nb1 * nb2) / pgcd; /* -ed- ATTENTION si pgcd vaut 0, le comportement est indéfini. */


Si un jour le pgcd des deux nombres est 0, on peut être sur que le programme est faux !

Message cité 2 fois
Message édité par Trap D le 15-06-2009 à 13:09:53
n°1895136
Turkleton
I don't quite understand you
Posté le 15-06-2009 à 13:12:29  profilanswer
 

Trap D a écrit :

-ed- Juste une remarque

Citation :

ppcm = (nb1 * nb2) / pgcd; /* -ed- ATTENTION si pgcd vaut 0, le comportement est indéfini. */


Si un jour le pgcd des deux nombres est 0, on peut être sur que le programme est faux !


 
Haha, ok, si vous vous liguez tous contre moi alors...  ;)


---------------
If you think it could look good, then I guess it should
n°1895141
Trap D
Posté le 15-06-2009 à 13:23:10  profilanswer
 

Turkleton >> j'applique le même principe, sauf que c'est pas le premier post

Citation :

Je te jette pas la pierre, y'a plein de topics prog où je n'ai envie de lire que le premier post

n°1895146
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-06-2009 à 13:45:56  profilanswer
 

Trap D a écrit :

-ed- Juste une remarque

Citation :

ppcm = (nb1 * nb2) / pgcd; /* -ed- ATTENTION si pgcd vaut 0, le comportement est indéfini. */


Si un jour le pgcd des deux nombres est 0, on peut être sur que le programme est faux !


Oui, les maths j'y connais rien. J'ai fait une remarque 'informatique'...

 

'pgcd' (et non "Le PGCD" ) est une variable comme une autre. Ici, en tant que codeur, je ne m'intéresse pas à sa signification.

 


Message édité par Emmanuel Delahaye le 15-06-2009 à 13:47:56

---------------
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/
mood
Publicité
Posté le 15-06-2009 à 13:45:56  profilanswer
 

n°1895202
fodger
ARRRACHHEE TTAAA FFFOUUFFOUNE!
Posté le 15-06-2009 à 15:12:09  profilanswer
 

Personne n'a réagi à une énormité de base : for (i = 0; i <= (int) (strlen (chaine) - 2); i++)
 
Chocking  :sweat: !

n°1895235
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-06-2009 à 15:43:42  profilanswer
 

fodger a écrit :

Personne n'a réagi à une énormité de base : for (i = 0; i <= (int) (strlen (chaine) - 2); i++)
 
Chocking  :sweat: !


J'ai poubellisé et remplacé ce monstre sans le commenter. Il me semble que d'autres l'ont fait...
 


---------------
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°1895339
jowhite
Posté le 15-06-2009 à 16:56:31  profilanswer
 

Justement, je n'ai pas compris pourquoi il faut remettre "(int)" dans le "for".
Vous pouvez m'expliquer?
 
PS: ne vous engueulez pas pour ça XD

Message cité 1 fois
Message édité par jowhite le 15-06-2009 à 16:57:01
n°1895344
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-06-2009 à 17:02:50  profilanswer
 

jowhite a écrit :

Justement, je n'ai pas compris pourquoi il faut remettre "(int)" dans le "for".
Vous pouvez m'expliquer?

 

PS: ne vous engueulez pas pour ça XD


  • strlen() retourne un size_t qui est un entier non signé.
  • i est un int, c'est à dire un entier signé.
  • La comparaison entre un int (signé) et un size_t (non signé) n'est pas portable. Le comportement dépend de l'implémentation. Si les 2 membres sont signés ou non signés, le comportement est défini par la norme.
  • Le cast permet de transformer le size_t en int (ça fonctionne si la longueur de la chaine est <= INT_MAX).



Message édité par Emmanuel Delahaye le 15-06-2009 à 17:03:40

---------------
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°1895354
fodger
ARRRACHHEE TTAAA FFFOUUFFOUNE!
Posté le 15-06-2009 à 17:20:01  profilanswer
 

Citation :

for (i = 0; i <= (int) (strlen (chaine) - 2); i++)


 
Le gros caca de base que tu fais la dedans ne saute pas aux yeux?
 
A chaque itération de ta boucle for tu effectues (int) (strlen (chaine) - 2)!!!!!!!!!!!!!!!!!!!!!
 
Prends des bons réflexes tout de suite, sinon tu pondras des grosses bouzes bien lentes souvent.
 
Ca tient au bon sens, et surtout ça montrera que tu comprends ce que tu écris.

n°1895385
jowhite
Posté le 15-06-2009 à 18:10:42  profilanswer
 

Bah justement, ce n'est pas vraiment le cas ^^

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Programmation C++ p4Syntaxe étrange en C++ avec GCC (résolu)
Développeurs passant à C#, relativement néophytes en POO[ Language C ] Copie du contenu d'un fichier dans un tableau.
[Resolu]Serveur Multi Thread en CLancer l'appli heure/zone horaire windows depuis C++
Langage C, Projet, Puissance 4 en langage C[C] Fork et Pipe
[C] Image ne s'affiche pas correctement sur un LCDSuppression auto des commentaires C/C++
Plus de sujets relatifs à : Traduction d'un algorithme en C


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)