Partage
  • Partager sur Facebook
  • Partager sur Twitter

Programme qui additionne des valeurs naturelles

Sujet résolu
    14 septembre 2020 à 15:18:30

    Bonjour

    Je veux écrire un programme qui additionne des valeurs naturelles lues sur entrée et affiche le résultat.

    La première donnée lue ne fait pas partie des valeurs à sommer. Elle détermine si la liste contient un nombre déterminé à l’avance de valeurs à lire ou non :

    - si cette valeur est un nombre positif ou nul, elle donne le nombre de valeurs à lire et à sommer ;

    - si elle est négative, cela signifie qu’elle est suivie d’une liste de données à lire qui sera terminée par le caractère "F" signifiant que la liste est terminée.

    J'ai commencé à écrire le code suivant, mais je suis bloqué parce que après avoir créé l'entrée de première valeur lue qui ne fait pas partie des valeurs à sommer,  je n'arrive pas à créer les entrées qui des valeurs qui seront additionnées.

    vi = int(input()) # Valeur initiale qui ne sera pas sommée
    for i in range(0, vi):
    v = vi * int(input()) # pour déterminer le nombre de valeurs qui seront sommées

    Est-ce que quelqu'un peut m'aider à résoudre ce problème?

    • Partager sur Facebook
    • Partager sur Twitter
      14 septembre 2020 à 15:51:19

      déjà tu as 2 conditions sur vi.

      ensuite (pour le 1er cas, vi>=0), pourquoi tu multiplies vi à la valeur entrée ? ce n'est pas ce qui est demandé; tu pars d'une variable de valeur nulle et tu lui additionnes la nouvelle valeur rentrée v=v+int(input()), rien de bien compliqué.

      • Partager sur Facebook
      • Partager sur Twitter
        14 septembre 2020 à 15:53:12

        Je comprend pas ta dernière ligne, pourquoi une multiplication alors qu'on demande une somme ? Pourquoi utiliser vi dans le calcul alors que la consigne dit qu'il ne faut pas qu'elle fasse partie du calcul ?

        Ensuite tu as deux choix, soit tu accumules les valeurs dans une liste et tu fais la somme à la fin, soit tu fais la somme au fur et à mesure, quel que soit le choix fait il va falloir initialiser l'accumulateur avant le début de la boucle, soit créer une liste vide, soit créer un entier initialisé à zéro, et ensuite lui ajouter les valeurs dans la boucle.

        • Partager sur Facebook
        • Partager sur Twitter

        Blond, bouclé, toujours le sourire aux lèvres...

          14 septembre 2020 à 16:48:44

          C'est en réalité plus compliqué que ça. La première entrée permet de connaitre par la suite le nombre d'entrées à prendre en compte pour effectuer la somme. Par exemple si la première entrée est 4 (valeur initiale que j'ai appelée vi), j'aurai à faire 4 autres entrées et ce sont ces 4 dernières entrées qui seront additionnées. Concrètement, si je rentre le chiffre 4 en premier, il faut que je puisse entrer 4 autres chiffres, par exemple 8, 10, 30, 2 sans pouvoir dépasser ces 4 nombres. La somme qui sera affichée est 8 + 10 + 30 + 2 = 40. La première valeur "4" n'est pas prise en compte pour le calcul. 

          En rentrant la valeur initiale, c'est donc pour avoir le nombre des autres valeurs à entrer  j'ai utilisé la formule:  v = vi * int(input()) 

          • Partager sur Facebook
          • Partager sur Twitter
            14 septembre 2020 à 17:58:08

            C'est ce que j'avais compris oui, mais je comprend toujours pas pourquoi faire une multiplication.

            Si on veut entrer 4 valeurs, on entre 4 directement, pas besoin de multiplier quoi que ce soit ?

            De toutes façons une fois que tu es dans la boucle for c'est trop tard, tu es déjà parti pour 4 tours de boucle, tout ce que tu as à faire dans la boucle c'est une somme.

            Pour reprendre ton exemple si je rentre dans le programme : 4 puis 8, ton programme va calculer 4*8 au premier tour de boucle, et enregistrer le résultat dans v. Pourquoi faire ?

            -
            Edité par LoupSolitaire 14 septembre 2020 à 18:00:11

            • Partager sur Facebook
            • Partager sur Twitter

            Blond, bouclé, toujours le sourire aux lèvres...

              14 septembre 2020 à 18:22:41

              Loupsolitaire, c'est compris. Mon problème est d'entrer une première valeur qui détermine par la suite le nombre de donnée à entrer. Ce sont ces dernières données qui seront pris en compte dans l'addition.
              • Partager sur Facebook
              • Partager sur Twitter
                14 septembre 2020 à 18:38:20

                c'est le rôle de la boucle et de l'utilisation de la fonction range dans celle-ci

                for i in range(0,vi) va faire vi boucle avec i prenant comme valeur 0 à vi-1 à chaque itération

                • Partager sur Facebook
                • Partager sur Twitter
                  14 septembre 2020 à 18:45:21

                  Ça peut ressembler à ceci:
                  vi=int(input("Nombre de valeurs: "))
                  somme=0
                  for i in range(vi):
                      somme+=int(input(f"Nombre {i+1}"))  # les humains n'aiment pas commencer à 0, c'est déprimant ...
                  print(somme)

                  -
                  Edité par PierrotLeFou 14 septembre 2020 à 18:48:09

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Le Tout est souvent plus grand que la somme de ses parties.

                    15 septembre 2020 à 14:58:52

                    PierrotLeFou, merci pour cette solution qui convient bien avec les nombres entiers. Cependant j'ai une autre variante et je ne trouve pas de solution. Ici, il y a une condition: si la première entrée est -1, ce sont les entrées qui suivent qui seront prises en compte pour l'addition. La boucle s'arrête si on rentre la lettre 'F'. Voici le code que j'ai écrit et qui ne me donne pas satisfaction, car non seulement la somme se fait après 3 chiffres avec seulement les deux dernières entrées, mais après avoir mis la lettre 'F' je reçois ce message d'erreur!  somme = somme + int(input())
                    ValueError: invalid literal for int() with base 10: 'F'.
                    VALEUR_FINALE = 'F' #Valeur de la lettre qui arrête la boucle
                    data = input()
                    somme = 0
                    if data == -1: # Première valeur à rentrer, mais qui n'est pas prise en compte dans l'addition
                    while data != VALEUR_FINALE:
                    data = int(data)
                    somme = somme + int(input())
                    print(somme) # le résultat attendu : somme des valeurs rentrées en dehors de la première valeur (-1) et de la lettre "F"
                    else:
                    data = input()
                    Est-ce que quelqu'un peut m'aider?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 septembre 2020 à 15:34:20

                      Le bout de code que tu poste plante au lancement à cause de l'indentation, et même en corrigeant l'indentation il passe toujours par le else, et donc la boucle n'est jamais exécutée parce que data est une chaîne de caractères, donc la comparaison avec un entier (-1) est toujours fausse.

                      Vu le message d'erreur que tu vois je suppose que le code que tu teste a été corrigé. Le souci est tout bête, "F" ne peut pas être converti en entier par la fonction int(), donc il faut récupérer le input sans le convertir, le comparer à "F" pour savoir si on s'arrête ou pas, et convertir en int() seulement après ça.

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Blond, bouclé, toujours le sourire aux lèvres...

                        15 septembre 2020 à 16:24:26

                        LoupSolitaire, j'apprécierais si tu pouvais m'aider davantage, car je suis débutant en python. Merci.

                        -
                        Edité par SeydouWorou 15 septembre 2020 à 16:25:00

                        • Partager sur Facebook
                        • Partager sur Twitter
                          15 septembre 2020 à 17:00:21

                          Ça m'aiderait de savoir ce que tu ne comprend pas, sinon je sais pas ce que je dois réexpliquer dans ce que j'ai écrit. Parce que là pour t'aider plus il faudrait que je fasse l'exercice à ta place vu que j'ai quasiment écrit l'algo, il est juste en français au lieu d'être en python.

                          Au hasard, récupérer l'input sans le convertir et le comparer à "F", ça veut dire faire ça :

                          data = input()
                          if data == 'F':
                              ...
                          else:
                             ...



                          -
                          Edité par LoupSolitaire 15 septembre 2020 à 17:00:46

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Blond, bouclé, toujours le sourire aux lèvres...

                            15 septembre 2020 à 17:30:03

                            LoupSolitaire, est-ce que c'est à l’intérieur de la boucle While data != VALEUR_FINALE qu'il faut faire le test que vous avez recommandé?
                            • Partager sur Facebook
                            • Partager sur Twitter
                              15 septembre 2020 à 19:33:24

                              SeydouWorou a écrit:

                              LoupSolitaire, est-ce que c'est à l’intérieur de la boucle While data != VALEUR_FINALE qu'il faut faire le test que vous avez recommandé?

                              Oui, l'utilisateur n'est pas censé entrer la lettre F si on est pas encore entré dans la boucle.

                              J'ai l'impression, vu ta question, que tu n'as pas clairement noté qu'il y a deux parties dans ton programme :

                              • l'entrée de la première valeur et la décision qui en découle, qui n'a pas besoin de boucle puisqu'on a juste une valeur
                              • l'entrée des valeurs suivantes, qui elle se fait dans une boucle puisqu'on a plusieurs valeurs à récupérer.

                              Le fait d'utiliser la variable data hors de la boucle, puis dans la boucle me laisse penser ça aussi. C'est pas logique d'utiliser le même nom alors que ça n'a pas le même sens.

                              Ce serait plus explicite avec des noms de variables plus clairs comme ça par exemple :

                              VALEUR_FINALE = 'F'  # Valeur de la lettre qui arrête la boucle
                              nombre_valeurs = int(input())
                              somme = 0
                              if nombre_valeurs == -1:
                                  valeur_x = input()
                                  while valeur_x != VALEUR_FINALE:
                                      ...
                                  print(somme) # le résultat attendu
                              else:
                                  ...

                              Si j'ai pas fait d'erreur tu n'as plus qu'à compléter ce bout de code (attention j'ai pas testé donc pas de panique si ça plante).

                              -
                              Edité par LoupSolitaire 15 septembre 2020 à 19:34:39

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Blond, bouclé, toujours le sourire aux lèvres...

                                15 septembre 2020 à 22:51:32

                                acc = 0
                                mod = int(input(': '))
                                
                                while mod:
                                    num  = input('nombre ou f:')
                                    if num=='f':
                                        if mod>0:continue
                                        break
                                    mod -= 1
                                    acc += int(num)
                                
                                print(f'acc = {acc}')
                                
                                

                                -
                                Edité par josmiley 16 septembre 2020 à 11:02:05

                                • Partager sur Facebook
                                • Partager sur Twitter

                                Python c'est bon, mangez-en. 

                                Programme qui additionne des valeurs naturelles

                                × 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