ca y est j´ai debuggué ton programme.
Voici le code incriminé :
while ( reste ! = 0 && resteA ! =0)
{
reste = x % y;
x = y;
y = reste;
resteA = x % y;
x = y;
y = resteA;
}
Bon je t´explique. Toi tu fais pour x=10000 et y=5000, reste = 10000 % 5000 donc reste = 0. D´accord ?
Ensuite tu dis que y = reste donc y = 0. On est tjs d´accord ?
Or tu fais resteA = 10000 % 0 car y=0. Sachant que les divisions ( car % c´est comme une division) par 0 ne marche pas que ce soit un PC ou une calculatrice, d´ou l´erreur d´execution.
Donc pour que l´execution fonctionne tu fais :
while ( reste ! = 0 && resteA ! =0)
{
reste = x % y;
x = y;
y = reste;
if ( reste ! =0)
{
resteA = x % y;
x = y;
y = resteA;
}
}
Et oui tu rajoute une condition pour s´assurer que reste ne fasse pas 0.
Le pb c´est que ton programme ne donne pas le bon résultat avec 10000 et 5000.
En fait, tu en as fait trop dans ton programme, ce qui fausse le résultat. Y´a des bouts de code dans ton programme ( mise a part les saisies et les trucs de base) qui sont la solution. Pour info moi je l´ai fait en une 20aine de ligne sans compter les sauts de ligne. Et je n´ai utilisé que le #include < iostream.h>.
Mais si tu veux plus d´aide va voir le lien que je t´ai fourni plus haut. Tiens je te le refile : http://villemin.gerard.fr.free.fr/ThNbDemo/AlgoEucl.htm Regarde que jusqu´à l´organigramme pour corser un peu, c´est ce que je fait.
Mais je le répète un bout de ton code est la solution. ce que tu as rajouté autour a tout fait foiré.
En fait, regarde avant l´orginagramme. Et tu mets juste ce bout de code qui est la solution et t´as fini ton programme.
Ok merci je pense que je vais tt refaire je vs recontacte dès ke c´est recodé...
Bon, voilà c´est recodé, mais y a un pb à la compilation cette fois ci:
"C:\DEV-C_~1\Lib\\libmingw32.a(main.o)(.text+0x8e)
: undefined reference to `WinMain@16´"
Voici le code:
using namespace std;
int maint ( )
{
long x, y, r, xx, yy;
cout < < " Ce programme vous permet de calculer le PGCD de deux nombres x et y" < < endl;
cout < < " Quelle est la valeur de x? \n" < < endl;
cin > > x;
xx = x;
cout < < " \nQuelle est la valeur de y?" < < endl;
cin > > y;
yy = y;
if ( x > y)
{
r = x % y
while ( r ! = 0)
{
x = y;
y = r;
r = x % y;
}
cout < < " Le PGCD de " < < xx < < " et " < < yy < < " est " < < y;
getchar ( );
}
if ( x < y)
{
r = x;
x = y;
y = r;
r = x % y;
while ( r ! = 0)
{
x = y;
y = r;
r = x % y;
}
cout < < " Le PGCD de " < < xx < < " et " < < yy < < " est " < < y;
getchar ( );
}
if ( x == y)
{
cout < < " Le PGCD de " < < xx < < " et " < < yy < < " est " < < x;
getchar ( );
}
return 0;
}
Morpheus, qui a de gros pbs
Ligne 7 :
int main() et non int maint() ![]()
Ton programme doit surement marcher mais tu pouvais le raccourcir. En effet dans tes 3 tests de condition tu fais la même chose. En effet, quelque soit la condition ( x<y ou x>y ou x=y), ben ca marche.
Sinon ici :
if ( x > y)
{
r = x % y
T´as oublié un point-virgule ( ;)
freedix
Mais keske chui con!!! franchement là je m´étonne! Mais bon g unee xcuse: il était 1h du at, un samedi...
kylin
OUé bah je crois ke le prog est bouclé... Merci pour toute ton aide!!!
Et longue vie à jeuxvideo.com!!!
Morpheus
De rien Morpheus mais tu pouvais encore le raccourcir. T´enlèves toutes les conditions ( les if) et tu supprimes ce qui est inutile et hop tu obtiendras un programme optimiser avec le même résultat.
Kilyn_ > Comme je l´ai dis, mes programmes dans leur première version sont bourrés d´erreurs ( je sais mal coder, et ne sais pas du tout écrire un programme correct. On va dire que j´ai appris sur le tas.)
Quand à l´erreur %d au lieu de %ld c´est juste un problème d´inatention lorsque j´ai changé deux ou trois choses.
J´espère que vous m´excuserez de toutes ces erreurs. Après reflexion, je suis capable de réécrire pgcd.c sans ennuis, et le nouveau code est bien différent du code d´origine.
Non ce n´est pas grave DasHuhn. Tout le monde fait des erreurs, même les meilleurs programmeurs du monde. Moi il m´arrive d´oublier les points virgules, alors tu vois. ^^
Les points virgules, c´est assez lourd au debut, mais tres vite tu vas ne plus les oublier. Nan, apres les erreurs sont beaucoup plus subtiles et surtout plus coriaces à trouver
Genre les segmentation fault
(
Après 1an d´arrêt, je me suis remis à la prog, et je me rends compte que la fonction de calcul du pgcd peut tenir en 2 lignes:
int pgcd(int a, int b)
{
if(a%b == 0) return b;
else return pgcd(b, a%b);
}
![]()
(comparez à ma première version ^^)
et oui, ceci est l´algorithme d´euclide...
mais cette version est recursive. peut etre peux tu ecrire cette fonction en iteratif...
Sympathique remontée. Que de (mauvais) souvenirs.
ta fonction est récursive terminale comme on dit, donc n´importe quel compilo (même gcc d´après moi) est capable de dérouler ça).
Ce qui veut dire que tu as la simplicité d´un code récursif avec la quasi efficacité d´un code itératif (pas de limite de la profondeur de récursions entre autre)
Donc contrairement à godrik, je ne pense pas qu´il faille la réécrire en itératif.
Le C optimise les récursivités terminales ? (si c´est pas comme ça qu´on dit, pas taper)
Le Scheme je savais mais le C...
ICC le fait, pour le reste je n´ais pas testé, mais c´était peut-être une supposition hasardeuse - il faudrait vérifier effactivement.