Menu

PGCD PPCM [Fermé]

Messages postés
2
Date d'inscription
mercredi 25 avril 2018
Statut
Membre
Dernière intervention
25 avril 2018
-
Bonjour à tous,
je suis actuellement étudiant en licence informatique et j'ai un petit souci.

Alors voilà, on me demande de créer une fonction pgcd_ppcm ayant comme paramètres deux entiers positifs et les adresses de deux variables (la première pour le pgcd et la seconde pour le ppcm) et qui retourne la constante ALLRIGHT (resp.ARGHH) si le calcul a pu s'effectuer (resp. sinon) et modifie les variables pointées en leur affectant respectivement le plus grand commun diviseur et le plus petit commun multiple des deux entiers passés en paramètres. Et donc voici mon programme:

int pgcd_ppcm(unsigned int a,unsigned int b ,int* pgcd,int* ppcm){
    
    while(a != b && a != 0 && b != 0){
        if(a > b){
            a =a;
            a=a-b;
        }
        else{
            a= b;
        }        


*pgcd = &a;
    }
    int p=a*b;


*ppcm =(p / *pgcd);
}
    

int main(void) {
  
    int pgcd_ppcm(unsigned int a,unsigned int b,int* pgcd,int* ppcm);
   
 return EXIT_SUCCESS;
}


Dans ce cas j'ai plusieurs problèmes, comme comment utiliser le resp. ARGHH pour le message ALLRIGHT et autre, et ma fonction n'est toujours pas correcte du à plusieurs erreur on me signale que certaine partie sont justes mais d'autres non avec ces messages d'erreur: Some possible problems Your function called over 10 and 48 returned 1644987948 as resuting value while 42 was expected , Some possible problems The third parameter of your function should be a pointer to an integer while 'int * pgcd' was found et Some possible problems, Caught segfault - Check if you did not accessed an address that you should have not (e.g. accessing an array out of its bounds). 0x0000000000403273 in pgcd_ppcm (a=10, b=10, pgcd=0x0, ppcm=0x7fffffffebdc) #0 0x0000000000403273 in pgcd_ppcm (a=10, b=10, pgcd=0x0, ppcm=0x7fffffffebdc)

Oui ça fait beaucoup d'erreur désolé mais c'est ma première année de programmation.
Merci d'avance pour vos réponses.



Afficher la suite 

1 réponse

Messages postés
8102
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 juillet 2019
398
0
Merci
bonsoir, je pense que tu devrais d'abord faire des exercices beaucoup plus simples.
je te suggère de d'abord calculer la somme de deux nombres.
damahdi
Messages postés
2
Date d'inscription
mercredi 25 avril 2018
Statut
Membre
Dernière intervention
25 avril 2018
-
Bonsoir, merci du conseil mais je pense avoir dépasser ce stade. Certes je ne suis pas doué mais j'aimerai une réponse concrète.
[Dal]
Messages postés
5169
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 juillet 2019
786 -
par rapport à ton code, sur le plan du langage C (abstraction faite de l'algorithme mathématique) :

- dans le code que tu postes, tu n'appelles pas valablement ta fonction dans main, tu ne fais que reproduire son prototype, sans passer des valeurs et variables définies dans main correspondantes aux types attendus
- tu n'as pas définit non plus dans main les variables que tu dois passer à ta fonction
- ton prototype
pgcd_ppcm(unsigned int a,unsigned int b,int* pgcd,int* ppcm)
devrait sans doutes être plutôt
pgcd_ppcm(unsigned int a, unsigned int b, unsigned int* pgcd, unsigned int* ppcm)
(même si cela n'a pas d'impact direct sur le bon fonctionnement du code, c'est plus rigoureux)
-
a =a;
ne sert à rien
-
*pgcd = &a;
change la valeur de l'entier pointé par le pointeur pgcd en lui affectant l'adresse mémoire de a, ce n'est sans doutes pas ce que tu veux faire et ton code devrait probablement être
*pgcd = a;
pour changer la valeur de l'entier pointé par le pointeur pgcd en lui affectant le contenu de
a
... avec ton code, tu te retrouves donc avec une valeur affectée à l'emplacement pointé par
pgcd
qui n'a rien à voir avec la valeur calculée de
a
...
- selon son prototype, ta fonction
pgcd_ppcm()
retourne un
int
, mais cette fonction ne comporte aucune instruction
return
retournant quoi que ce soit

Le fait que tu fasses ce type d'erreurs signifie que tu dois revoir les bases du langage C et je suis assez d'accord avec la suggestion de yg_be :-)

Cela dit, avec ces indications, et ton cours de C, tu devrais arriver à corriger ton code sur le plan du langage C.

Ensuite, il faudra que tu t'attaques à l'algorithme mathématique.
[Dal]
Messages postés
5169
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
18 juillet 2019
786 -
Voilà un code en C proposant une fonction addition, qui stocke le résultat grâce au passage de pointeur en argument et retourne une valeur indiquant le statut de son exécution :

#include <stdio.h>
#include <stdlib.h>

#define TOUT_VA_BIEN    1
#define RIEN_NE_VA_PLUS 0

/**
 * addition() - calculer la somme de deux entiers
 * @a: premier entier
 * @b: second entier
 * @somme: résultat de la somme
 *
 * Calcule la somme de deux entiers en stockant le résultat
 * à l'adresse pointée par le 3ème paramètre
 *
 * Retourne: TOUT_VA_BIEN si le résultat est inférieur à 10
 * et RIEN_NE_VA_PLUS sinon
 */
int addition(int a, int b, int * somme) {
    *somme = a + b;

    if (*somme < 10)
        return TOUT_VA_BIEN;
    else
        return RIEN_NE_VA_PLUS;
}

int main(void) {
    int a = 2;
    int b = 3;
    int somme;
    int statut;

    statut = addition(a, b, &somme);
    printf("La somme de %d et %d vaut %d\n", a, b, somme);
    if (statut == TOUT_VA_BIEN)
        printf("Tout va bien :-)\n");
    if (statut == RIEN_NE_VA_PLUS)
        printf("Alerte : l'addition des deux nombres n'est pas "
                "inférieure à 10\n");

    return EXIT_SUCCESS;
} 


cela devrait t'aider à comprendre tout cela :-)