IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

[Debutant]Premier programme blemes+ questions


Sujet :

C++

  1. #1
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut [Debutant]Premier programme blemes+ questions
    Bonjour à tous,

    Tout d'abord je me présente brièvement (enfin... sur tous les forums je dit que je me présente brièvement et je prends trois heures).

    Je m'appelle TicTac, plus connu sous les autres forums, surtout sur Gamekult.com, sous Bakura. J'ai 15 ans et demi, je suis en seconde et j'aimerais plus tard travailler dans le jeu vidéo (pas nécessairement en France). J'avais toujours hésité entre la modélisation et la prog, bien que ce soit vraiment des sujets très vastes avec plein de "sous-métiers" dedans je suppose. Bref, vu que je suis à 2-3 ans si tout ce passe bien de ma "vraie" orientation, j'ai décidé de voir par moi même voir ce qui me plaisait le plus. J'ai commencé par la modélisation avec blender, mais je me suis vite aperçu que je n'avais aps de talent artistique. J'ai donc essayé la prog en achetant un gros pavé à un ami (Programmer en C++ aux éditions campus press de jesse liberty et bradley jones). Il y a 21 chapitres, j'ai fait les 5 premiers, mais là je bloque un peu sur le 5ème, les classes, j'ai un peu de mal à comprendre, je vais donc me refaire tout le bouquin depuis le début plus calmement pour bien saisir toutes les notions, bien qu'il y ait certaines choses que je comprends pas l'utilité pour l'instant). Mais avant de refaire toutes les leçons, je voulais voir ce que je pouvais faire au bout d'une semaine. J'ai réussi à recréer un programme de soustraction, addition du livre sans le regarder (bon par contre c'était bourré de faute et j'ai du tout corriger lol).

    Mais je voulais créer un petit programme pour calculer les PGCD (j'ai peut-être visé trop haut pour même pas une semaine d'étude de ce langage). Voici donc ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #include <iostream>
    using namespace std;
     
    int fonctionPgcd (int un, int deux, int result);
     
    int main()
    {
        int un;
        int deux;
        int result;
     
        cout << "Entrez deux chiffres, avec a>b : ";
        cout << "\nLe premier : ";
        cin >> un;
        cout << "\nEt le second : ";
        cin >> deux;
     
        result = fonctionPgcd (un,deux, result);
     
        cout << "Le PGCD de : " << un << " et " << deux << " est " << result;
     
        char response;
        cin >> response;
        return 0;
    }
     
    int fonctionPgcd (int un, int deux)
    {
    int result;
     
    if (un>deux)
    {
       result = un/deux;
     
       if (result == float)
       {
          result = un-deux*result;
       }
    }
    else
    {
    cout << "Impossible.";
    }
     
    if (deux/result == float)
    {
        fonctionPgcd (un, deux, result);
    }
     
    else
    {
    return result;
    };
    }
    J'ai corrigé une dizaine d'erreurs mais yen a d'autres que j'arrivent pas :/ Bon premièrement je sais même pas si ça va donner les bons résultats, j'ai fait ça à la va vite donc je sais même pas si la méthode de calcul est bonne. D'autre part il y a une petite dizaine d'erreur. DevC++ m'indique :

    In function `int fonctionPgcd(int, int)':
    expected primary-expression before "float"
    expected `)' before "float"
    expected primary-expression before "float"
    expected `)' before "float"

    ah en fait ya pas tant d'erreurs que ça... Bref, je vois que c'est un problème avec les float, en fait je voulais dire si result n'est pas un float, faire ça et ça... Mais visiblement ça marche pas comme ça :p

    Enfin dernières questions :
    1) Est-ce que il y a des mauvaises habitudes qu'il faut que j'enlève dès maintenant ? Genre les char response; std::cin >> response; ! ca c'est mon livre qui me dit de faire comme ça pour mettre une pause dans le programme mais je sais pas si c'est la meilleur technique.
    2) Enfin, le livre dit qu'il faut créer un "prototype" de la fonction, juste au dessus de int main(), toutefois j'ai pas compris l'utilité vu que de toute façon la fonction est écrite plus bas et appelée dans le programme main ?

    Merci Et soyez sympa, je débute tout juste et je ne demande qu'à progresser

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    In function `int fonctionPgcd(int, int)':
    expected primary-expression before "float"
    expected `)' before "float"
    expected primary-expression before "float"
    expected `)' before "float"
    Tu ne peux effectivement pas tester si result est un float de cette manière. De toute façon, tu divises deux entiers -> division entière. Et pour en rajouter une couche, tu mets le resultat dans un entier. Donc result ne pourra quoiqu'il arrive jamais être décimal.

    1) Est-ce que il y a des mauvaises habitudes qu'il faut que j'enlève dès maintenant ? Genre les char response; std::cin >> response; ! ca c'est mon livre qui me dit de faire comme ça pour mettre une pause dans le programme mais je sais pas si c'est la meilleur technique.
    A priori tu as déjà évité les erreurs classiques des débutants, pour le reste pense à consulter la FAQ C++ (qui parle notamment de la pause).

    2) Enfin, le livre dit qu'il faut créer un "prototype" de la fonction, juste au dessus de int main(), toutefois j'ai pas compris l'utilité vu que de toute façon la fonction est écrite plus bas et appelée dans le programme main ?
    Parce qu'au moment où le compilateur tombe sur la ligne qui appelle ta fonction, il n'est pas encore passée sur cette derniere. Il faut donc la déclarer afin que le compilo sache qu'elle est bien définie quelque part plus loin.

  3. #3
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Tu ne peux effectivement pas tester si result est un float de cette manière. De toute façon, tu divises deux entiers -> division entière. Et pour en rajouter une couche, tu mets le resultat dans un entier. Donc result ne pourra quoiqu'il arrive jamais être décimal.
    Ben en fait tant que le résultat n'était pas un chiffre entier, donc un chiffre décimal (donc un float je crois), ben je voulais que le programme continue la suite du programme. Donc comment je peux faire si je veux dire donc que si le résultat n'est pas un entier (par exemple 2535/1175 donne un truc du style 2,15......, donc c'est bien pas un entier !).

    Enfin bon si c'est trop complexe dite le moi, je finirais mon programme plus tard, mais j'en suis sur que j'en suis pas très loin de la fin

    Je lirais la FAQ demain

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pour tester si une division est "entière" ou non tu as le modulo (le reste de la division entière)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (un % deux == 0)
    {
        // un / deux tombe rond (n'a pas de reste)
    }

  5. #5
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Ah ouais le modulo je l'avais oublié. Je verrais demain ! merci pour tout

  6. #6
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    bon désolé de te redéranger, j'ai fait le truc maintenatn en fait, ya plus d'erreur dans le code à part ça :

    In function `main':
    [Linker error] undefined reference to `fonctionPgcd(int, int, int)'
    In function `Z12fonctionPgcdii':
    [Linker error] undefined reference to `fonctionPgcd(int, int, int)'
    ld returned 1 exit status

    je comprends pas :/ Je reposte le code corrigé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #include <iostream>
    using namespace std;
     
    int fonctionPgcd (int un, int deux, int result);
     
    int main()
    {
        int un;
        int deux;
        int result;
     
        cout << "Entrez deux chiffres, avec a>b : ";
        cout << "\nLe premier : ";
        cin >> un;
        cout << "\nEt le second : ";
        cin >> deux;
     
        result = fonctionPgcd (un,deux,result);
     
        cout << "Le PGCD de : " << un << " et " << deux << " est " << result;
     
        char response;
        cin >> response;
        return 0;
    }
     
    int fonctionPgcd (int un, int deux)
    {
    int result;
     
    if (un>deux)
    {
       result = un/deux;
     
       if (un%deux != 0)
       {
          result = un-deux*result;
       }
    }
    else
    {
       cout << "Impossible.";
    }
     
    if (un%deux != 0)
    {
        fonctionPgcd (un, deux, result);
    }
     
    else
    {
    return result;
    }
    }
    et on peut rendre le code un peu plus clair ? Ca fait très brouillon je trouve

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu as ajouté un troisième paramètre dans la déclaration de ta fonction Pgcd, mais pas dans sa définition.

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int fonctionPgcd (int un, int deux, int result);
     
        result = fonctionPgcd (un,deux,result);
    C'est là qu'est le problème: le paramètre "int result" est de trop. (d'ailleurs, la fonction ne s'en sert pas et marche très bien sans)

    Bref, tu devrais les remplacer par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int fonctionPgcd (int un, int deux);
     
        result = fonctionPgcd (un,deux);
    Cela devrait suffire.

  9. #9
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Merci bien à vous deux

    J'ai beaucoup de mal à m'y retrouver dans les fonctions, des fois il faut mettre des int, des fois non,...)

    Sinon le code est ceci : ainsi il se lance, mais il ne me trouve pas le bon résultat :/ je regarderais ça de plus près voir ou ca fonctionne mal, sinon j'attendrais d'être un peu plus expérimenté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #include <iostream>
    using namespace std;
     
    int fonctionPgcd (int un, int deux);
     
    int main()
    {
        int un;
        int deux;
        int result;
     
        cout << "Entrez deux chiffres, avec a>b : ";
        cout << "\nLe premier : ";
        cin >> un;
        cout << "\nEt le second : ";
        cin >> deux;
     
        result = fonctionPgcd (un,deux);
     
        cout << "Le PGCD de : " << un << " et " << deux << " est " << result;
     
        char response;
        cin >> response;
        return 0;
    }
     
    int fonctionPgcd (int un,int deux)
    {
    int result;
     
    if (un>deux)
    {
       result = un/deux;
     
       if (un%deux != 0)
       {
          result = un-deux*result;
       }
    }
    else
    {
       cout << "Impossible.";
    }
     
    if (un%deux != 0)
    {
        fonctionPgcd (un, deux);
    }
     
    else
    {
    return result;
    }
    }

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Le problème de résultat est sans doute dans ta fonction de calcul...

    if (un%deux != 0)
    {
    fonctionPgcd (un, deux);
    }
    Euh... Ta fonction va s'appeler récursivement jusqu'à ce que mort s'ensuive, avec ça...

  11. #11
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Citation Envoyé par Médinoc
    Le problème de résultat est sans doute dans ta fonction de calcul...

    if (un%deux != 0)
    {
    fonctionPgcd (un, deux);
    }
    Euh... Ta fonction va s'appeler récursivement jusqu'à ce que mort s'ensuive, avec ça...
    Oui je me suis certainement trompé, mais en fait je voulais que jusqu'à ce que le reste ne soit pas nul, la fonction recommence. Une fois que c'est nul, il me renvoie result qui normalement doit m'envoyer un-deux*result (le result d'avant)

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Mais tu ne modifies jamais les opérandes : si les nombres "un" et "deux" restent toujours les mêmes, le reste de leur division restera le même aussi...

    Si tu veux le plus grand diviseur commun (c'est bien ça, PGCD, non?), il te faut sans doute une boucle en effet, je pense à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int pgcd(int un, int deux)
    {
    int i;
    bool bOK = false; //C++
    for( i = 2 ; i <= min(un, deux) ; i++)
      {
      if(un%i == 0 && deux%i == 0)
        {
        bOK = true;
        break;
        }
      }
    return (bOK ? i : 1);
    }
    Je ne sais pas s'il y a un algo plus rapide, mais ceci devrait être un algo qui marche. (le premier nombre en partant de 2 qui arrive à diviser les deux sans reste, et il sera forcement inférieur aux deux nombres ou égal au plus petit).
    Si la fonction ne trouve rien, alors leur plus grand diviseur commun est 1 : (ils sont premiers entre eux, c'est bien cela?)

  13. #13
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Bon la c'est trop compliqué pour moi, j'ai pas encore vu les booléen, les for et tout ça lol :p

    sinon oui c'est le pgcd !
    en fait moi j'utilise la méthode qu'on m'a appris au collège et je l'ai retranscrite, par exemple pour duex chiffres, 2535 et 1175 :

    a>b b a/b r(a-bx(a/b)
    2535 1175 2 185
    1175 185 6 65
    185 65 2 55
    65 55 1 10
    55 10 5 5
    10 5 2 0
    Le PGCD est dans ce cas 5 (le reste précédent le dernier reste à 0).

    J'ai tenté de la retranscrire, mais ya un problème quelque part.

    Mais tu ne modifies jamais les opérandes : si les nombres "un" et "deux" restent toujours les mêmes, le reste de leur division restera le même aussi...
    en fait je crois que du moment qu'on faisait par exemple result = a/b result prendrais le resultat de a/b, puis après si je remet result, result ne prendra pas sa valeur initiale mais celle de a/b, etc...

  14. #14
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Je crois que tu te compliques la vie pour rien. L'algorithme est le suivant (si je me souviens bien) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    PGCD(a, b)
      SI a < b ALORS
        echanger a et b
     
      SI a est divisible par b ALORS
        renvoyer b
      SINON
        renvoyer PGCD(b, a - b)
    FIN
    En C++ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int PGCD(int un, int deux)
    {
        if (un < deux)
            std::swap(un, deux);
     
        if (un % deux == 0)
            return deux;
        else
            return PGCD(deux, un - deux);
    }

  15. #15
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Citation Envoyé par Loulou24
    Je crois que tu te compliques la vie pour rien. L'algorithme est le suivant (si je me souviens bien) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    PGCD(a, b)
      SI a < b ALORS
        echanger a et b
     
      SI a est divisible par b ALORS
        renvoyer b
      SINON
        renvoyer PGCD(b, a - b)
    FIN
    En C++ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int PGCD(int un, int deux)
    {
        if (un < deux)
            std::swap(un, deux);
     
        if (un % deux == 0)
            return deux;
        else
            return PGCD(deux, un - deux);
    }
    J'avoue ne pas bien comprendre comment tu calcules ton PGCD. D'ailleurs ça me donne des résultats assez fantaisistes (le PGCD de 2535 et 1175 est 1360 ) ! Enfin bref c'est pas grave laissez tomber, merci quand même. Je vais continuer à lire mon livre et je reprendrais ce program plus tard

  16. #16
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    J'avoue ne pas bien comprendre comment tu calcules ton PGCD
    Pourtant l'algorithme est très court et clair. Qu'est-ce que tu ne comprends pas ? D'autant plus que l'exemple détaillé que tu donnes plus haut en es l'exacte illustration.

    D'ailleurs ça me donne des résultats assez fantaisistes (le PGCD de 2535 et 1175 est 1360 )
    Chez moi ça donne 5

  17. #17
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Citation Envoyé par Loulou24
    J'avoue ne pas bien comprendre comment tu calcules ton PGCD
    Pourtant l'algorithme est très court et clair. Qu'est-ce que tu ne comprends pas ? D'autant plus que l'exemple détaillé que tu donnes plus haut en es l'exacte illustration.

    D'ailleurs ça me donne des résultats assez fantaisistes (le PGCD de 2535 et 1175 est 1360 )
    Chez moi ça donne 5
    Lol oui chez moi aussi le PGCD de 2535 et 1175 est 5, mais avec ton programme ça donne 1360 (C'est corrigé, voir le dernier edit du post)

    donc d'après toi. Il prend les deux nombres a et b. Ok ca je suis d'accord. Si a < b il les échange àa aussi ok. Mais ce que je comprend de ton programme c'est : si le modulo de un et deux vaut 0, en l'occurence le premier modulo de 2535 et 1175 = 185, il retourne deux, or deux c'est un des chiffres qu'on a rentré ! Il ne manquerait pas un result ? qui choperait le modulo. enfin bref c'est pas très clair pour moi

    moi je t'explique ce que je voulais faire clairement (peut-être que c'est ce que faisait ta fonction, mais je ne l'ia pas compris, j'en suis désolé !) :

    On reprend 2535 (a) et 1175 (b). Si le modulo de ces deux chiffres vaut 0, il renvoie le modulo d'avant, donc qui sera le b et donc le PCGD. Le modulo, si n'est pas égale a 0, le a prend la forme de b (donc 1175) et b prend la forme du résultat du modulo (2535%1175 = 185 donc a = 1175 et b = 185). Et on recommence jusqu'à ce que le modulo de a et b soit égale à 0, là il pourra reprendre le dernier b, ce qui sera le PCGD.

    En y réfléchissant bien, c'est pas du tout la fonction que j'ai faite :/ Alors dite moi juste si ce raisonnement est bon, et j'essayerai un nouvel essai demain. Je sais vraiment pas dans quoi je me suis embarqué là, c'était vraiment pas de mon niveau ) !

    Et en plus j'ai mal à la t^te à force de réfléchir ^^ deamin j'ai un contrôle de math je vais mettre des modulos partout moa (on a même pas appris ça encore, les modulos, c'est en quelle classe ?)

    EDIT : euh après avoir relu ce que tu as dit, tout ce que j'ai dit en fin de compte c'est ce que tu as dit :/ JE ME MELANGE COMPLETEMENT MOI

    EDIT 2 : bon j'ai remis ce que tu avais dit plus haut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int PGCD(int un, int deux) 
    { 
        if (un < deux) 
            std::swap(un, deux); 
     
        if (un % deux == 0) 
            return deux; 
        else 
            return PGCD(deux, un - deux); 
    }
    et ça marche parfaitement maintenant ! Merci bien ! mais je comprend pas tout :/ Un c'est donc 2535 et deux 1175. Et il teste le modulo. Si c'est 0 il renvoit deux, ok. Mais après je pige pas trop. il renvoie la fonction fonctionPgcd avec deux donc 1175 et un - deux. Or un - deux = 2535 - 1175 = 1360. Et je vois pas ce que va faire ce 1360 car quand je calcul le PGCD à la main sur une feuille jamais je ne vois de 1360. Est-ce la méthode euclidienne, par les divisions, que tu as utilisé là ? Je ne pense pas nan ?

  18. #18
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Euh... oui, mes cours de maths sur le PGCD remontent à 3 ans, il est possible que le - soit en fait un %

  19. #19
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Citation Envoyé par Loulou24
    Euh... oui, mes cours de maths sur le PGCD remontent à 3 ans, il est possible que le - soit en fait un %
    Ben en fait avec le - ca marche, donc ca peut pas être le % enfin bref, maintenant mon programme sur le PGCD marche, c'est super, même si tu as fait 100 % de la fonction qui justement m'intéressait :/ Mais bon j'ai un peu mieux compris !

    Maintenant je vais allez lire la FAQ du C++ puis je vais devoir bouquiner Guy de Maupassant () et demain je reprendrais le bouquin de C++ que j'ai. d'ailleurs, est-ce que tu connais un très bon bouquin sur le C++ ? Dès que j'aurais fini le miens, j'en prendrais certainemet un autre pour avoir deux méthodes pédagogiques. Et connais-tu un bon site ? J'ai vu les cours sur developpez.com mais c'est pas exactement ce que je recherche, c'est souvent d'un niveau trop avancé mais surtout ça ne respecte jamais les mêmes "conventions" que dans mon livre, donc ça m'embrouille un peu :p

    En tout cas merci, je garde ce forum, car je sens que je vais souvent avoir besoin d'aide

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Citation Envoyé par TicTac
    Ben en fait avec le - ca marche, donc ca peut pas être le %
    Si, ça peut l'être:
    A - B == A % B ssi B <= A < 2B
    Par contre, ce n'est pas le cas dans l'exemple, mais peut-être que ça se reflète dans un des appels suivants...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Premier programme: questions
    Par hjyf84 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 13/11/2011, 11h56
  2. Un de mes premiers programme : Quelques questions...
    Par allezlolo dans le forum Débuter
    Réponses: 15
    Dernier message: 26/04/2008, 09h51
  3. [Débutant] Première question Debugger
    Par gicquairea dans le forum Prolog
    Réponses: 6
    Dernier message: 29/08/2007, 23h38
  4. [debutant] premier pas avec le SDK directX9
    Par arno2004 dans le forum DirectX
    Réponses: 6
    Dernier message: 27/05/2004, 21h03
  5. Réponses: 2
    Dernier message: 14/04/2004, 19h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo