Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec une liste.

Sujet résolu
    24 mars 2011 à 14:58:00

    Bonjour,

    Toujours en apprentissage du langage Python, j'ai décidé que j'allais coder l'Algorithme d'Euclide pour calculer des PGCD. Alors voilà, au cas où vous ne connaitriez pas le principe :
    On donne 2 nombres a et b, on écrit la division euclidienne de a par b.
    Puis on écrit la division euclidienne de b par le reste r de la division précédente.
    Et ainsi de suite, jusqu'à ce que le reste qu'on trouve soit égal à 0.
    A ce moment là, le PGCD de a et de b, et egal au reste de l'avant dernière division euclidienne.

    Alors je vous colle mon Code. Pourquoi je vous le colle ? Eh bien, le fait est que ... Il m'écrit les divisions euclidiennes successives oui ... Mais au moment où il est censé me donner le PGCD, eh bien j'ai un joli " 'list' object is not callable " ... :euh:
    Alors j'ai essayé de réecrire de plusieurs façons différentes tout ça mais ... rien y fait.
    Je m'en remets donc à vous :)
    Voilà mon code :
    #!/usr/bin/python3
    # -*-coding:Utf-8 -*
    
    # Ce programme utilise l'algorithme d'Euclide pour déterminer le PGCD de deux nombres a et b, avec a > b.
    
    print("Entrez les nombres a et b dont vous voulez calculer le PGCD")
    a = input("a = ")
    b = input("b = ")
    
    restes = list()
    r = 1 # Valeur arbitraire pour entrer dans la boucle.
    i = -1
    
    # On établit les divisions successives de a par b de la forme : a = bq + r.
    while r!= 0:
        q = a/b
        int(q)
        r = a - b*q
        restes.append(r)
        print(a, "=", b, "*", q, "+", r)
        a = b
        b = r
        i += 1
        continue
    
    print("PGCD(a;b) =", restes(i-1))
    
    input()
    


    Alors voilà, maintenant vous savez tout.
    Une dernière chose, je sais que mon programme n'est pas parfait, qu'il buguera dès lors que je mettrai b = 0, et tout et tout ... Mais je m'attaquerai à tout ça une fois qu'il sera capable de m'afficher un PGCD correctement ^^

    Merci à vous :) Et si vous avez des questions, je suis là !
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      24 mars 2011 à 15:18:15

      Tu aurais pu mettre le message d'erreur

      print("PGCD(a;b) =", restes[i-1])
      • Partager sur Facebook
      • Partager sur Twitter
        24 mars 2011 à 15:27:30

        Wouah, Je me sens un peu idiot. J'avais écrit le message d'erreur enfin bon : TypeError : 'list' object is not callable.

        Ecoute, euh, j'ai un peu l'impression d'avoir dérangé pour rien, mais bon, merci à toi :)
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          24 mars 2011 à 15:29:00

          Non le message d'erreur comprend tout le traceback, numéro de ligne comprise

          Tu reposeras des questions, car il y a d'autres erreurs, j'attend que tu les poses, d'ailleurs
          • Partager sur Facebook
          • Partager sur Twitter
            24 mars 2011 à 15:37:48

            Effectivement, après qu'il m'a affiché le PGCD, j'ai un message d'erreur oui.
            Quand je lance le programme via le Terminal comme ceci : (J'ai utilisé un exemple avec des nombres au hasard)

            ***@***-computer:~$ cd Python
            ***@***-computer:~/Python$ python PGCD.py
            Entrez les nombres a et b dont vous voulez calculer le PGCD
            a = 24782
            b = 6952
            (24782, '=', 6952, '*', 3, '+', 3926)
            (6952, '=', 3926, '*', 1, '+', 3026)
            (3926, '=', 3026, '*', 1, '+', 900)
            (3026, '=', 900, '*', 3, '+', 326)
            (900, '=', 326, '*', 2, '+', 248)
            (326, '=', 248, '*', 1, '+', 78)
            (248, '=', 78, '*', 3, '+', 14)
            (78, '=', 14, '*', 5, '+', 8)
            (14, '=', 8, '*', 1, '+', 6)
            (8, '=', 6, '*', 1, '+', 2)
            (6, '=', 2, '*', 3, '+', 0)
            ('PGCD(a;b) =', 2)
            
            Traceback (most recent call last):
              File "PGCD.py", line 28, in <module>
                input()
              File "<string>", line 0
                
                ^
            SyntaxError: unexpected EOF while parsing


            Pour ce qui est de la ligne 28, c'est uniquement pour que mon programme ne se ferme avant que j'ai pu voir le PGCD qu'il me retourne.
            Et pour ce qui est de la ligne 0, je ne vois absolument pas ce qu'il veut me dire o_O
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              24 mars 2011 à 15:56:00

              Tu utilises du code pour la version 3 de python

              Dans l'interpréteur tape ceci

              >>> import sys
              >>> sys.version
              


              • Partager sur Facebook
              • Partager sur Twitter
                24 mars 2011 à 16:07:16

                Oui, j'utilise Python 3.
                J'ai tapé ce que tu m'as demandé dans l'interpreteur :
                >>> import sys
                >>> sys.version
                '2.6.6 (r266:84292, Sep 15 2010, 16:22:56) \n[GCC 4.4.5]'


                Euuh ... Pourquoi il est marqué 2.6.6 ? o_O
                J'ai les Version 2 et 3 sur mon PC mais c'est pas normal, pour moi, j'ai jamais utilisé la version 2 !
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  24 mars 2011 à 16:08:29

                  Quand tu executes ton code utilises cette syntaxe

                  python3 tonfichier.py


                  J'attend la suite des erreurs :)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 mars 2011 à 22:20:43

                    En effet ! Je vois ça ! Merci du tuyau, j'y ferai attention maintenant !
                    Alors oui effectivement il me signale une erreur au niveau de la définition de " q " :

                    Entrez les nombres a et b dont vous voulez calculer le PGCD
                    a = 23
                    b = 4
                    Traceback (most recent call last):
                      File "PGCD.py", line 16, in <module>
                        q = a/b
                    TypeError: unsupported operand type(s) for /: 'str' and 'str'


                    Et évidemment ... Je ne sais toujours pas ce qui ne va pas ... " str " c'est pour une chaine de caractère ? Mais, et alors ? :euh:
                    Considèrerait-il a et b comme des chaines de caractères ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      24 mars 2011 à 22:33:07

                      a = int(input("a = "))
                      b = int(input("b = "))
                      


                      Ensuite tu auras un autre problème, pour trouver la solution teste des divisions en version 2.x et en version 3.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 mars 2011 à 22:41:39

                        En effet. En Version 2, ca fonctionne parfaitement. En version 3 ... C'est une autre histoire. Mon " q " n'est pas un entier mais un décimal, et du coup je me retrouve un reste égal à 0, et un PGCD égal à 0 [Ce qui est absurde].
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          24 mars 2011 à 22:42:55

                          Pour cela utilise la fonction floor du module math

                          Le tout corrigé ça donne ceci

                          #!/usr/bin/python3
                          # -*-coding:Utf-8 -*
                          
                          # Ce programme utilise l'algorithme d'Euclide pour déterminer le PGCD de deux nombres a et b, avec a > b.
                          
                          from math import floor
                          
                          print("Entrez les nombres a et b dont vous voulez calculer le PGCD")
                          a = int(input("a = "))
                          b = int(input("b = "))
                          
                          restes = list()
                          r = 1 # Valeur arbitraire pour entrer dans la boucle.
                          i = -1
                          
                          # On établit les divisions successives de a par b de la forme : a = bq + r.
                          while r!= 0:
                              q = floor(a/b)
                              r = a - b*q
                              restes.append(r)
                              print(a, "=", b, "*", q, "+", r)
                              a = b
                              b = r
                              i += 1
                              continue
                          
                          print("PGCD(a;b) =", restes[i-1])
                          
                          input()
                          


                          • Partager sur Facebook
                          • Partager sur Twitter
                            24 mars 2011 à 23:05:00

                            Ecoute je te remercie, je peux dire que maintenant il fonctionne à merveille o_O
                            J'essaierai de me rappeler tout ça dans le futur :)

                            Merci à toi ! Je reviendrai si j'ai un autre problème !
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              25 mars 2011 à 8:32:38

                              Citation : Acerane

                              je peux dire que maintenant il fonctionne à merveille o_O



                              Essaye donc de trouver le pgcd de 42 et 42.


                              À part ça, ton programme est quand même bien compliqué : si tu veux juste le pgcd, le quotient ne sert à rien (seuls les restes sont nécessaires), ta liste ne sert à rien non plus, le continue de la boucle non plus, l'incrémentation du i non plus. Le recours à math n'est pas du tout nécessaire (suffit de faire un quotient genre a//b)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                29 mars 2011 à 0:24:33

                                Je sais bien que mon programme n'est pas parfait. Je sais aussi qu'il est pas " optimisé ". Ce dont je suis sûr, c'est qu'il est capable de calculer des PGCD dits " raisonnables ". Sincèrement, qui irait coder un programme pour trouver le PGCD de 42 et ... 42 ... ?
                                Je comprends ce que tu veux dire, mon programme buguera dès que je mettrai b = 0 par exemple.
                                Je m'occuperai de ça plus tard. Après, je suis aussi un débutant, je ne peux pas coder un programme que toi tu pourrais coder [Je suppose que tu as de l'expérience en la matière].
                                Et pour finir, mon but était de recoder selon l'algorithme d'Euclide, alors que ma liste ne serve à rien, que mes quotients ne me servent à rien, que continue ne serve à rien, et que l'incrémentation de i ne serve à rien ... Soit, si tu le dis je te crois ...
                                Mais écoute ... J'y peux rien pour l'instant. Quand j'saurai comment me débarraser de tout ce que tu me dis, je le ferai.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  29 mars 2011 à 0:43:15

                                  Citation : Acerane

                                  .
                                  Mais écoute ... J'y peux rien pour l'instant. Quand j'saurai comment me débarraser de tout ce que tu me dis, je le ferai.




                                  Tiens, le code du pgcd fourni dans les sources de Python :


                                  def gcd(a, b):
                                      while b:
                                          a, b = b, a%b
                                      return a
                                  
                                  print(gcd(2011**5*1975*111111,2011*1976*1111111))
                                  
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Problème avec une liste.

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown