PROGRAMME QUI CALCUL LE PPCM ET LE PGCD

tuckleberry Messages postés 12 Date d'inscription vendredi 15 juin 2007 Statut Membre Dernière intervention 11 janvier 2010 - 11 janv. 2010 à 11:40
AnoSantino Messages postés 13 Date d'inscription samedi 9 janvier 2010 Statut Membre Dernière intervention 2 mars 2012 - 11 avril 2011 à 00:25
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/51097-programme-qui-calcul-le-ppcm-et-le-pgcd

AnoSantino Messages postés 13 Date d'inscription samedi 9 janvier 2010 Statut Membre Dernière intervention 2 mars 2012
11 avril 2011 à 00:25
Merci de vos commentaires mais y'a une année de cela je venais à peine de commencer à utiliser la programmation( ne connaissons ni les fonctions ,ni la récursivité,je ne faisais que découvrir la programmation en langage C) .Maintenant quand je revois vos propositions elles sont nettement meilleures ,juste que je ne pouvais pas les comprendre à l'époque,merci.
abiolos Messages postés 3 Date d'inscription jeudi 14 janvier 2010 Statut Membre Dernière intervention 23 janvier 2010
23 janv. 2010 à 20:44
Salut à tous.Il faut comprendre ce que c'est que le PPCM.Si on dit que le PPCM de X et Y est Z alors Z mode X = Z mode Y=0.
Voici alors l'algo que je propose:

ALGO: PPCFM

VAR: X, Y,a: ENTIERS

aFFICHER; Veuillez saisir un nombre
Saisir: X
Afficher: Veuillez saisir le second nombre
Saisir: Y
Si X<Y alors
a .=X
Répeter a mode X et a mode Y jusqu'à a mode X = a mode Y=0


Fin
Pariterre Messages postés 15 Date d'inscription mercredi 6 août 2008 Statut Membre Dernière intervention 5 septembre 2010
14 janv. 2010 à 22:43
Qu'est-ce que tu veux dire?
si tu parles d'expliquer la fonction, c'est parce qu'elle parle d'elle-même n fait :
exemple :
int PGCD(int a, int b)
{
if (b == 0)
return a;
else
return PGCD(b, a%b);
}

Signifie :
int PGCD(int a, int b) //Pour la fonction PGCD, cette fonction a besoin du paramètre a et du paramètre b (sans modifier les originaux) et lorsquelle finira envoyera à celui qui l'a appelé un integer.

if (b == 0)
return a;
//Si b est égal à 0, il faut retourner (envoyer, c'est le int) la valeur "a".

else
return PGCD(b, a%b);
//Sinon, revoyer la valeur donnée par la fonction PGCD avec les valeurs suivantes. Ici, la fonction appelle s'appelle elle-même. Ce qui va se passer, c'est que dans la valeur "a" elle va y placer la quantité "b" et dans la variable "b" elle y placera la quantité "a modulo b".

Au final, un moment donné la variable "b" égalera 0 et donc la fonction arrêtera de s'appeler elle-même et renvoyera au "main" la valeur de "a". Celui-ci, par définition [voir wikipédia PGCD] vaudra le PGCD.

C'était ta question?
abiolos Messages postés 3 Date d'inscription jeudi 14 janvier 2010 Statut Membre Dernière intervention 23 janvier 2010
14 janv. 2010 à 22:35
pourqoi n'écrit on pas les algo en français
Pariterre Messages postés 15 Date d'inscription mercredi 6 août 2008 Statut Membre Dernière intervention 5 septembre 2010
13 janv. 2010 à 00:08
Ah ouais! beaucoup plus encore! Je n'y avais pas pensé à celle-là ;)
Pour optimiser encore, on peut même enlever le "else"

Et hop! une variable intermédiaire de moins :D
tuckleberry Messages postés 12 Date d'inscription vendredi 15 juin 2007 Statut Membre Dernière intervention 11 janvier 2010
12 janv. 2010 à 09:50
ah oui j'ai mal vu la structure, manque d'habitude..
À propos de fonction sur wikipédia pour le PGCD on trouve un algo récursif :
int PGCD(int a, int b)
{
if (b == 0)
return a;
else
return PGCD(b, a%b);
}
Pariterre Messages postés 15 Date d'inscription mercredi 6 août 2008 Statut Membre Dernière intervention 5 septembre 2010
12 janv. 2010 à 05:29
Pourquoi ne pas passer par une fonction? ça réduirait grandement ton nombre de variables intermédiaires... et ça te permettrait de conserver tes valeurs de départ. De plus, ça donne un codage plus propre il me semble. Enfin, voici ce que je te propose :


#include<stdio.h>
#include<conio.h>

int calculPgcd(int a, int b)
{
int x;
while (b != 0)
{
x = a%b;
a = b;
b = x;
}
return a;
}

void trier(int *a,int *b)
{
int x;
if (b > a)
{
x = *b;
*b = *a;
*a = x;
}
}

int main()
{
int nbre1, nbre2, pgcd, ppcm;

//Demander variables
printf("Entrez le premier entier positif:\t");
scanf("%d",&nbre1);
printf("\nEntrez le deuxieme entier positif:\t");
scanf("%d",&nbre2);

//Trier en ordre décroissant
trier(&nbre1, &nbre2);

//Faire le calcul du PGCD
pgcd = calculPgcd(nbre1, nbre2);
ppcm = nbre1*nbre2/pgcd;

//Écrire les réponse
printf("\nLe PPCM est :\t%d ",ppcm);
printf("\nLe PGCD est :\t%d", pgcd);
return 0;
}



Si jamais tu n'as pas besoin d'utiliser pgcd et ppcm en tant que variable, il est possible de les supprimer et de remplace le printf("...", nbre1*nbre2/calculPgcd(nbre1,nbre2)) et l'autre par l'équivalent sans "nbre1*nbre2/"

Pour la lisibilité des autres, je te consille de commenter ton code (quoique ce n'est pas un très gros codage non plus celui-là.. mais surtout de mettre tes braquettes en évidence, j'ai eu de la difficulté à voir où se terminait les while, parfois.

Dernière chose, quand tu déclares ton main() (corrigez moi si je me trompe), si tu ne veux pas finir par un "return 0;", tu dois mettre un void main() et non rien. Sinon, il faut mettre "int main()".

Voilà, c'est mes commentaires :) bonne continuation
AnoSantino Messages postés 13 Date d'inscription samedi 9 janvier 2010 Statut Membre Dernière intervention 2 mars 2012
11 janv. 2010 à 17:46
Non ,vous avez fait une conclusion hâtive,le plus entier qu'on a entrer ne prend pas la valeur de 0 juste après le calcul du PPCM .J'ai séparer les blocs pour éviter ce problème ,et calculer le PPCM en premier.
Pour vous aidez à mieux me comprendre,je vous invite à lire ma structure qui est ce qui suit:
...
{
...
*(instruction 1)if (condition 1)
{
permutation
}

*(instruction 2)if (condition2)
printf("...");[bloc 1]
else (!condition2)
{t=(a*b)(mémorisation du produit);
while(condition)
{
permutation
}
m=t/a;
printf("...");
}[bloc 2]
*(instruction 3) while(condition)
{
permutation
}
printf("...");
getch();
}

Après si vous essayez mon programme et que vous voyez vraiment qu'il y a une erreur faite le moi savoir.
Je n'ai pas fait intentionnellement la boucle de contrôle .
tuckleberry Messages postés 12 Date d'inscription vendredi 15 juin 2007 Statut Membre Dernière intervention 11 janvier 2010
11 janv. 2010 à 11:40
Si je ne me trompe pas, après le calcul du PPCM, b est égal 0, du coup pour calculer le PGCD ça risque d'être compliqué ?
Rejoignez-nous