Traduction d'un algorithme en C - C - Programmation
Marsh Posté le 12-06-2009 à 13:03:57
tu fait un scanf avant et pendant ta fonction. Le premier scanf ne sert à rien
Marsh Posté le 12-06-2009 à 13:19:48
Merci de ta réponse.
c'est vrai que je ne comprenais pas pourquoi il n'y avait pas de scan dans l'algo!
J'ai enlever les lignes 29 et 32 mais il se passe la même chose!
Marsh Posté le 12-06-2009 à 14:16:11
pour ton erreur c normal dans tes if et tes while, il faut 2 "=", sinon tu modifie ta valeur et ton test est du coup tjs bon.
Code :
|
sinon, je mettrai des accolades pour bien délimiter le if vu qu'il yen a 2 imbriqués...
c'est du chipotage, mais normalement on déclare les variables de sorte que leur portée soit la plus petite possible (mais suffisante évidemment), donc, sauf erreur de ma part, ca serait plus joli comme ca (ca compilera pareil mais c plus conventionnel)
Code :
|
j'ajoute algorithmiquement, le si erreur=faux n'a pas de sens.
j'ajoute aussi que les if (erreur==0) peuvent etre remplacés par if (!erreur) etc...
[Edit] j'ai édité mon post plusieurs fois...
Marsh Posté le 12-06-2009 à 14:49:19
Merci à toi aussi pour ta réponse!
J'ai essayé de changer ce que tu as fais (copier coller), cependant, le compilateur m'indique ces erreurs:
Ligne 27: `sortie' undeclared (first use in this function) --> pourquoi à tu enlevé les variables du débuts?
Ligne 10: 'for' loop initial declaration used outside C99 mode --> tu as rajouté "int"? je ne sais pas pourquoi?
Sinon, après avoir corrigé les erreurs marqué par le compilateur, il n'y a pas d'amélioration.
J'edit mon post
Merci de ton aide!
Marsh Posté le 12-06-2009 à 14:52:46
ah oui autant pour moi, en fait j'ai rentré sortie dans la boucle parce qu'elle n'étiat pas utilisée ailleurs, et du coup ca servait à rien de le définir aussi haut, puis ensuite je me suis apercu qu'il manquait le return, mais j'ai oublié de ressortir la variable sortie:
Code :
|
Marsh Posté le 12-06-2009 à 15:01:18
En fait tu veux définir "i" juste avant de l'utiliser? Mais le compilateur n'accepte pas!
Sinon j'ai toujours le même affichage quand je lance le exe
Marsh Posté le 12-06-2009 à 15:04:18
Aha il y a du progrès, le deuxieme nombre est demandé!
Mais même problème ensuite (j'avais oublier de mettre sortie=0)!
Je suppose que j'ai des erreurs vers la fin alors?
Merci à toi!
Marsh Posté le 12-06-2009 à 15:10:41
jowhite a écrit : En fait tu veux définir "i" juste avant de l'utiliser? Mais le compilateur n'accepte pas! |
ah? dsl c'est loin le c j'ai pris les habitudes du java et du php...
Marsh Posté le 12-06-2009 à 15:10:58
bah t'en fais pas!Moi je débute juste de toute façon!
Sinon, j'ai l'impression que ce n'est pas ça en fait!
Quand je saisie le nombre 3 pour nb1, rien ne se passe;
Par contre, si je choisi 10 il me demande le deuxieme nombre, si je rechoisi 10, le .exe plante...
Marsh Posté le 12-06-2009 à 15:12:58
j'suis désolé en plus je vois pas les 2 dernières images de ton premier post (proxy de ma boite) du coup je connais pas le problème dans son ensemble...
Marsh Posté le 12-06-2009 à 15:14:34
pataluc a écrit : |
C'est juste pour pas que, en cas d'erreur à un endroit de la chaine, le bloc if derrière ne soit parcouru à chaque fois jusqu'à la sortie du bloc for.
Sinon, pour jowhite, effectivement, la grosse erreur était l'absence de sortie=0 dans ton bloc do, qui fait que s'il y a une erreur, il va te redemander une saisie, qui va être ajoutée à la valeur de "sortie" donnée pendant le premier parcours ayant généré l'erreur.
Mais du coup, ça devrait marcher pour les deux nombres, pas juste pour le premier, c'est bizarre...
Marsh Posté le 12-06-2009 à 15:15:59
ah mince!
Je vais changer ça, comment je peux faire pour que tu puisse voir le reste du problème?
Marsh Posté le 12-06-2009 à 15:16:40
jowhite a écrit : bah t'en fais pas!Moi je débute juste de toute façon! |
Ca viendrait pas de ton "(strlen(chaine)-2)" qui fait que si tu entres un nombre à un seul digit, il ne passe pas dans la boucle ?
Marsh Posté le 12-06-2009 à 15:16:54
Turkleton a écrit : C'est juste pour pas que, en cas d'erreur à un endroit de la chaine, le bloc if derrière ne soit parcouru à chaque fois jusqu'à la sortie du bloc for. |
effectivement. (j'ai pas les yeux en face des trous auj moi...) mais dans ce cas la il faut pas mettre un for mais un while ca serait plus bô.
Marsh Posté le 12-06-2009 à 15:19:17
pataluc a écrit : |
Yep, j'y ai pensé aussi, mais vu qu'il est censé traduire l'algo déjà écrit, faut pas modifier !
En même temps, l'algo est pourri, sans le sortie=0 dans le do...while, en cas d'erreur, sortie va pas avoir la bonne valeur...
Marsh Posté le 12-06-2009 à 15:19:21
Je vais être franc avec vous,
Je suis en école de biologie et les cours de C qu'on a eu c'est genre 6H (+6h d'algo)... Je galère donc un peu!
Marsh Posté le 12-06-2009 à 15:23:25
jowhite a écrit : Je vais être franc avec vous, |
Tu t'en sors pas mal pour si peu de formation. Peux-tu reposter l'intégralité de ton code, qu'on voit où tu en es rendu ?
EDIT : si, je vois bien le reste, mais je n'ai pas trop regardé, ça a l'air bon.
Marsh Posté le 12-06-2009 à 15:32:49
Oups, je dis n'importe quoi pour le "sortie=0" dans le do, il est bien dans l'algorithme et dans le premier code de jowhite, je me suis juste basé sur le code de pataluc, où il ne figure pas. Toutes mes confuses à l'auteur de l'algo !
Marsh Posté le 12-06-2009 à 15:32:56
Turkleton a écrit :
|
+1 j'avais dans ma formation des gars qui en bac+5 math appliquées et info n'auraient pas su faire ca. ^^
Marsh Posté le 12-06-2009 à 15:33:05
Arf je suis bête, j'ai oublier de retirer le int sortie=0 de la boucle, en faisant ça ça marche!!!
Voici le tout:
Code :
|
Citation : 1 j'avais dans ma formation des gars qui en bac+5 math appliquées et info n'auraient pas su faire ca. |
A ce point? ^^
Marsh Posté le 12-06-2009 à 15:37:22
jowhite a écrit : Arf je suis bête, j'ai oublier de retirer le int sortie=0 de la boucle, en faisant ça ça marche!!! |
Rhaaa non, justement ! T'as pas lu mes 5 derniers posts ???
En fait (faudrait vraiment que tu redonnes le code en entier par contre), si tu enlèves le "sortie=0" de la boucle do...while, à chaque fois que tu vas entrer une saisie erronée, il va garder en mémoire ce qui a précédemment été mis dans ta variable sortie.
Ex : je rentre "1a2" dans la première saisie. Il va mettre le "1" dans sortie, puis va détecter une erreur et redemander une saisie. Je saisis "12" cette fois, et ben il va me l'ajouter au "1" qu'il y a déjà dans "sortie", et me donner donc "13".
Marsh Posté le 12-06-2009 à 15:39:47
Ah mince c'était l'autre qu'il fallait enlever?!
Quand j'enlève celui qui n'est pas dans la boucle, le compilateur me dit que la variable sortir n'est pas défini
Marsh Posté le 12-06-2009 à 15:44:49
il faut que tu laisse le "int sortie" avant le "do", mais que tu remette sortie à 0 après le do...
Marsh Posté le 12-06-2009 à 15:45:17
jowhite a écrit : Ah mince c'était l'autre qu'il fallait enlever! |
Plus simplement, j'aurais laissé les deux, mais j'aurais juste enlevé le "int" devant celui qui est dans la boucle do/while, pour que sortie ne soit pas déclaré deux fois. Après, qu'une valeur lui soit affectée plusieurs fois, c'est pas grave, c'est même tout à fait normal.
Je ne sais pas ce qu'on t'a dit mais moi en C, je déclare toujours toutes mes variables au début de ma procédure. Ça évite ce genre de désagréments, et de ne plus savoir si une variable a été déclarée ou pas, et si oui, où.
EDIT : rha grillé
Marsh Posté le 12-06-2009 à 15:48:05
Ah okay, mais le truc:
J'ai entré 15 pour le premier, et 20 pour le deuxieme et il me sort:
le pgcd de 4199552 et de 4199552 est de 4199552 et le ppcm est 262
Marsh Posté le 12-06-2009 à 15:49:39
Turkleton a écrit : |
Oui c'est ce que mon prof m'a dit
Marsh Posté le 12-06-2009 à 15:51:23
jowhite a écrit : Ah okay, mais le truc: |
Haha, ça avance en tout cas !
Code complet et corrigé please
Marsh Posté le 12-06-2009 à 15:51:59
Bon c'est bizarre, avec ce code:
Code :
|
j'obtiens :"le pgcd de 1 et de 2 est de 1 et le ppcm est 2"
Marsh Posté le 12-06-2009 à 15:54:11
moi je comprends pas cette manière de lire un nombre... ya un transtypage qui va pas marcher la non? et puis l'algo s'il lit 15, il voit 1 et ensuite il ajoute 5, ca fait pas 15 mais 6, non?
Marsh Posté le 12-06-2009 à 15:55:03
Rhooo, la grosse erreur de débutant que j'avais même pas vue, honte à moi
Dans un printf, pour afficher un int, il faut mettre %d, et pas %i (je sais, c'est pas logique) !
Allez, prochain essai, tu nous fait péter le champagne de la victoire de l'homme sur le code
Marsh Posté le 12-06-2009 à 15:57:43
pataluc a écrit : moi je comprends pas cette manière de lire un nombre... ya un transtypage qui va pas marcher la non? et puis l'algo s'il lit 15, il voit 1 et ensuite il ajoute 5, ca fait pas 15 mais 6, non? |
Non, j'ai mis du temps à comprendre aussi, mais il semblerait que chaine[x] donne une valeur en ascii si affectée à un int (comme "sortie" ici), je ne savais pas ça mais ça peut être bien pratique. Du coup, 1=code ascii 49 donc, sortie+=(49)-48; va bien donner 1
EDIT : ...mais ça change pas le fait que tu aies raison, le boulay moi
Marsh Posté le 12-06-2009 à 15:58:32
Turkleton a écrit : Non, j'ai mis du temps à comprendre aussi, mais il semblerait que chaine[x] donne une valeur en ascii si affectée à un int (comme "sortie" ici), je ne savais pas ça mais ça peut être bien pratique. Du coup, 1=code ascii 49 donc, sortie+=(49)-48; va bien donner 1 |
je suis d'accord, ca marche pour un nombre à 1 chiffre, mais sinon?
EDIT: j'avais pas vu ton edit... ^^
du coup pour moi faudrait multiplier sortie par 10 à chaque itération du for... sauf si ya un mécanisme en c que je connais pas et qui fait de la magie...
Marsh Posté le 12-06-2009 à 15:59:48
Arf sorry mais c'est toujours pas ça!
J'ai le même résultat!
En tous cas, merci , on touche au but!
Marsh Posté le 12-06-2009 à 16:15:29
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
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.
Marsh Posté le 12-06-2009 à 12:32:53
Bonjours à tous,
Je suis en train de réviser pour mon examen de c et je n'arrive pas à traduire un algorithme en C et de le faire fonctionner
Est ce que vous pourriez m'aider à trouver mes erreurs?
Le sujet est:
1ere partie:
2eme partie: (pouvez vous voir l'immage?
et la fin:
Et voici ce que j'ai traduis (sur devc++):
Quand je veux compiler, aucune erreur apparaît le exe se lance mais je reste bloqué après avoir rentré le 1er nombre... Une idée?
Merci beaucoup!
Message édité par jowhite le 12-06-2009 à 15:16:54