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

Python Discussion :

Problème de calcul sur python


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 5
    Par défaut Problème de calcul sur python
    Bonjour tout le monde,

    J'essaye de créer un input, afin d'entrer une planète X avec planète Y afin de faire la soustraction pour calculer la distance entre les deux, mais je suis bloqué, ça fait 2 heures je suis dessus donc je me permets de poster ça ici si quelqu'un pourrait me donner un coup de pouce


    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
    sun=0
    mercury=1
    venus=2
    earth=3
    mars=4
    jupiter=5
    saturn=6
    urans=7
    neptune=8
     
     
    def code(star1,star2):
        diff = star1 - star2
        return diff
     
    print ('helloooo we will calculate the distance between two stars')
    star1 = input("Enter the first star: ")
    star2 = input("Enter the second start: ")
     
     
    code(star1,star2)

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 304
    Par défaut
    Salut,

    Ton problème c'est ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    >>> foo = 1
    >>> i = input("name: ")
    name: foo
    >>> i == foo
    False
    >>>
    Le premier foo est une référence à l'entier 1 et celui que j'ai entré est une string qui n'a rien à voir avec le premier.

    Plusieurs solutions comme toujours:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    astres = {"sun": 0,
              "mercury": 1,
              "venus": 2,
              "earth": 3,
              "mars": 4,
              "jupiter": 5,
              "saturn": 6,
              "urans": 7,
              "neptune": 8}
     
    star1 = input("Enter the first star: ") # par exemple "jupiter"
    print(astres[star1]) # --> 5
    Plus facile pour l'utilisateur, tu lui fais choisir dans une liste que tu affiches:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    astres = ["sun",
              "mercury",
              "venus",
              "earth",
              "mars",
              "jupiter",
              "saturn",
              "urans",
              "neptune"]
     
    affichage de la liste au moyen d'une boucle avec les numéros des astres (index)
    star1 = input("Enter the first star: ") # par exemple 4
    print(astres[star1]) # --> "mars"
    Etc ...

    Pour info, les planètes sont des noms propres.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 810
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 810
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par devfr Voir le message
    afin de faire la soustraction pour calculer la distance entre les deux
    Petit détail: en dehors des erreurs de conception liées à la nature des infos entrées (comme expliqué par VinsS où tu entres une string que tu tentes de convertir en variable de même nom, ce qui ne se fait pas => on entre une string qu'on analyse pour utiliser alors la variable/valeur adéquate), ton programme ne calcule pas la distance entre deux planètes, mais le nombre de planètes situées entre les deux planètes choisies. Ce qui n'est pas exactement la même chose.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 683
    Par défaut
    Salut,

    Citation Envoyé par devfr Voir le message
    J'essaye de créer un input, afin d'entrer une planete X avec planete Y afin de faire la soustraction pour calculer la distance entre les deux, mais je suis bloqué, ca fait 2 heures je suis dessus donc je me permet de poster ça ici si quelqu'un pourrait me donner un coup de pouce
    La différence de l'ordre des planètes du système solaires n'est pas une "distance".
    De plus, la distance de la Terre à Jupiter et la même que la distance de Jupiter à la Terre...
    "distance" étant une fonction symétrique donne un résultat positif ou nul.
    C'est plus compliqué qu'une simple différence qui peut retourner un nombre négatif.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 5
    Par défaut
    Bonjour,

    Merci pour vos réponses, effectivement je me suis perdu dans l'exemple, j'ai commencé à programmer depuis deux semaines, plein de choses m'échappent encore.

    j'ai checké par exemple foo, ca veut dire une commande random. Mais que veut dire : >>> ?

    Si on retourne au problème, si je le présente sous cette forme : ( la personne entre son budget, ensuite le nom du premier object qu'elle veut acheter, et du deuxieme, ensuite la fonction va déduire le montant total des objects au budget)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def calculation(budget,object1,object2):
        remaining = budget-object1-object2
        return remaining
     
    budget = float(input("Enter your budget : "))
    object1 = float(input("Object N1 : "))
    object2 = float(input("Object N2 : "))
     
     
    print(calculation(budget,object1,object2))



    Je suis bloqué à là, si j'entre juste des chiffres aux input j'ai bien le résultat, mais comment faire si on veut écrire le nom d'un objet et pas son montant. J'imagine faire une liste dictionnaire genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    { phone : 1200,
    mouse : 20,
    keyboard : 50,
    mousepad : 2 }
    etc, mais du coup comme convertir ce que l'utilisateur va mettre dans l'input et le retourner à la valeur d'une liste que j'aurais au préalable crée ?

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 810
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 810
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par devfr Voir le message
    Bonjour,
    Non, une fois suffit. C'est un forum donc l'équivalent d'une discussion. Quand tu discutes avec quelqu'un, tu ne lui dis pas "bonjour" à chaque nouvelle phrase... si ?

    Citation Envoyé par devfr Voir le message
    j'ai checké par exemple foo, ca veut dire une commande random.
    Non, c'est juste un nom de variable. VinsS a besoin d'une variable pour illustrer son explication, il la nomme "foo". Moi j'aurais écrit "toto".

    Citation Envoyé par devfr Voir le message
    Mais que veut dire : >>> ?
    C'est le prompt quand on travaille dans l'idle Python (pour taper de courts exemples, pas besoin de paser par un script). On voit que tu n'y es pas allé souvent sur idle toi...

    Citation Envoyé par devfr Voir le message
    Si on retourne au problème, si je le présente sous cette forme : ( la personne entre son budget, ensuite le nom du premier object qu'elle veut acheter, et du deuxieme, ensuite la fonction va déduire le montant total des objects au budget)
    Pourquoi programmer sur 2 objets ? Et si la personne veut en acheter un ? trois ?

    Programme ton calcul sur un objet à la fois, et ensuite grâce à la magie des boucles, tu pourras répéter l'opération "n" fois pour "n" objets. Dans le style
    Code algo : 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
    entrer le budget
    boucle infinie, faire
        afficher "il vous reste ", budget
        afficher "entrez le nom de l'objet (ou rien pour quitter)"
        attendre saisie
        si saisie vide alors
            break
        fin si
        si saisie pas dans liste des objets disponibles alors
            afficher "objet inconnu"
            continue
        fin si
        récupérer prix objet en fonction de saisie
        si prix objet > budget alors
            afficher "objet trop cher"
            continue
        fin si
        budget=budget - prix objet
        ajouter objet dans liste des objets acquis
    fin faire

    Citation Envoyé par devfr Voir le message
    mais comment faire si on veut écrire le nom d'un objet et pas son montant. J'imagine faire une liste dictionnaire genre :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    { phone : 1200,
    mouse : 20,
    keyboard : 50,
    mousepad : 2 }
    Oui mais tel qu'écrit, Python pensera que phone, mouse etc sont des variables. Si tu veux des strings comme clefs, faut les écrire comme strings

    Citation Envoyé par devfr Voir le message
    etc, mais du coup comme convertir ce que l'utilisateur va mettre dans l'input et le retourner à la valeur d'une liste que j'aurais au préalable crée ?
    Il y a plusieurs façons. Si on imagine que tu stockes le nom de l'objet acheté dans une variable "saisie", alors tu peux utiliser saisie in/not in dico.keys() pour vérifier que le nom saisi existe bien dans le dico. Tu peux aussi utiliser dico.get(saisie, None) pour récupérer la valeur correspondant à la saisie ou "None" si cette saisie n'existe pas. Utiliser un dico implique quand-même que tu saches manipuler les dictionnaires un minimum. Ainsi que de connaitre les différents opérateurs Python, bref que tu aies lu les premières pages d'un tutoriel Python...

    Et quand tu postes du code;
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 26
    Par défaut reponse
    Hello,

    je te propose une solution, je débute aussi alors elle n'est surement pas parfaite!
    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
     
    dico = {'mars': 215, 'terre': 2444, 'jupiter': 645}
     
     
    def findDist(a, b):
        for k, v in dico.items():
            if k == a:
                dist1 = dico[a]
            if k == b:
                dist2 = dico[b]
        return dist1, dist2
     
     
    def calcDist(a, b):
        if a < b: return b - a
        return a - b
     
     
    try:
        planet1 = str(input("Entrer la 1er planet: \n"))
        planet2 = str(input("Entrer la deuxième planet: \n"))
    except Exception as e:
        print("erreur: {}".format(e))
     
    distance1, distance2 = findDist(planet1, planet2)
     
    distancetotale = calcDist(distance1, distance2)
    print("La distance entre la planet {} et la planet {} est de : {} km\n".format(planet1, planet2, distancetotale))

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 683
    Par défaut
    Salut,

    Citation Envoyé par BamBi25 Voir le message
    je te propose une solution, je débute aussi alors elle n'est surement pas parfaite!
    Déjà, quand on écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try:
        planet1 = str(input("Entrer la 1er planet: \n"))
        planet2 = str(input("Entrer la deuxième planet: \n"))
    except Exception as e:
        print("erreur: {}".format(e))
    pour afficher le message de l'exception et continuer comme si tout s'était bien passé, c'est complètement loufoque.

    On doit imaginer/anticiper les exceptions qui pourront être remontées par ces instructions et savoir que faire dans le cas où, car si l'opération ne s'est pas bien passée, il va falloir "corriger" en demandant à l'utilisateur une autre saisie ou arrêter le programme (ce que Python sait bien faire tout seul).

    Comme input lit la chaine de caractères entrée par l'utilisateur, difficile d'imaginer qu'une exception soit levée (et inutile d'y appliquer str puisque c'est déjà un str).

    Par contre, l'utilisateur peut entrer une planète inconnue (qui n'est pas dans le dictionnaire) et là il y aurait des choses à faire.

    Et si ce boulot était fait, le reste du code ne sert à rien puisque si planet1 et planet2 sont des clefs du dictionnaire, la distance se calcule simplement via abs(dico[planet1] - dico[planet2]).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 26
    Par défaut
    Je pense avoir pris toutes les remarques en compte, voici mon nouveau code:

    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
    dico = {'mars': 215, 'terre': 2444, 'jupiter': 645}
     
    def verifPlanet(dico, planet):
        try:
            dico[planet]
     
        except KeyError:
            print("Erreur la planet: {} n'est pas dans la liste: {} ".format(planet, dico.keys()))
            planet = verifPlanet(dico, input("Entrer le nom d'une planet dans la liste: \n"))
        return planet
     
     
    planet1 = verifPlanet(dico, input("Entrer la 1er planet: \n"))
    planet2 = verifPlanet(dico, input("Entrer la deuxième planet: \n"))
     
    distancetotale = abs(dico[planet1] - dico[planet2])
    print("La distance entre la planet {} et la planet {} est de : {} km\n".format(planet1, planet2, distancetotale))

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 810
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 810
    Billets dans le blog
    1
    Par défaut
    Tu as in/not in plus économique que ce lourd try...except pour vérifier si une clef est ou n'est pas présente dans un dico => if planet not in dico.keys(): ... (et le ".keys()" est même facultatif)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 5
    Par défaut
    Merci pour vos réponses, donc un code par rapport à des objets ressemblerait à ceci ?
    Comment est ce que je pourrais améliorer le code ? Et apporter de nouvelles fonctionnalitées ? A votre avis

    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
     list_shop = {'phone' : 5, 'screen' : 1, 'tv' : 50, 'cow' : 49, 'pen':9}
     
     
    def check_shop(list_shop,object):
        try:
            list_shop[object]
        except KeyError:
            print("Error, the object {} is not allowed, please write only things into this: {}".format(object,list_shop.keys()))
            print(check_shop(list_shop,input("Enter your object: \n")))
        return object
     
     
    budget = input("Enter your budget:\n")
     
    object_1 = check_shop(list_shop, input("Enter your object: \n"))
    object_2 = check_shop(list_shop, input("Enter your 2nd object: \n"))
     
    total =  int(budget) - ((list_shop[object_1] - list_shop[object_2]))
     
    print("After your 2 expanses ({} and {}), you have now  ${} remaining".format(object_1,object_2,total))

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 810
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 810
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par devfr Voir le message
    donc un code par rapport à des objets ressemblerait à ceci ?
    Non. Il suffit pas de mettre le mot "object" pour que ça devienne un objet. Un objet c'est un élément qui regroupe des caractéristiques (attributs) et des actions (méthodes). Ca se définit via le mot clef class. Et bien entendu ça ne s'utilise que si ça en vaut la peine.

    Citation Envoyé par devfr Voir le message
    Comment est ce que je pourrais améliorer le code ? Et apporter de nouvelles fonctionnalitées ? A votre avis
    Ben ton code s'arrête à l'achat de 2 éléments. Et celui qui n'en veut qu'un seul ? Et celui qui en veut 3
    J'aurais plutôt vu une boucle qui offre l'achat d'un élément, qui stocke cet élément dans la liste des achats, qui décompte la somme payée du portefeuille et qui repart en haut proposer l'achat d'un autre élément. Avec une possibilité de quitter (comme par exemple "chaine vide").

    Et ta fonction qui checke si l'objet est présent, qu'est-ce qu'elle est lourde. Elle commence par demander inutilement l'objet de la liste juste pour pouvoir détecter l'échec. Pourquoi ne demande-t-elle pas plus simplement "est-ce que l'objet existe ?" if object in list_shop...
    De plus ce n'est pas à elle de redemander la saisie. Une fonction dont le rôle est de vérifier les choses se contente de vérifier les choses et renvoyer l'info à l'appelant. C'est lui qui analyse le résultat et prend la décision de faire re-saisir ou faire autre chose.

    Citation Envoyé par devfr Voir le message
    total = int(budget) - ((list_shop[object_1] - list_shop[object_2]))
    T'es sûr de tes maths là ? Je ne sais pas si je t'emploierai comme dev Python mais une chose est sûre, je ne t'emploierai pas comme vendeur. Parce qu'en plus d'avoir dédoublé inutilement les parenthèses, le type qui t'achète le second objet il l'a gratos mais tu lui rends encore le montant de l'objet. J'avais 44$, j'ai acheté un téléphone et une télé et je me suis retrouvé avec 89$ à la fin.
    Mais le vrai souci, ce n'est pas vraiment l'erreur de la formule (ça peut arriver à tout le monde de se tromper entre "+" et "-"), c'est surtout que si tu avais testé ton code, réellement testé et regardé avec attention les valeurs affichées par rapport aux valeurs attendues, tu aurais vu qu'il y avait un smurf, trouvé la cause et corrigé avant de nous le montrer.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Problème de précision de calcul sur Python
    Par alae a dans le forum Général Python
    Réponses: 2
    Dernier message: 05/04/2019, 10h47
  2. [AC-2007] Problèmes de calculs sur un état
    Par sandralep84 dans le forum IHM
    Réponses: 3
    Dernier message: 03/09/2012, 12h26
  3. problème de calculs sur dates
    Par Sefrou dans le forum IHM
    Réponses: 3
    Dernier message: 12/02/2011, 00h27
  4. [WD10] problème de calcul sur monétaire
    Par kwakly dans le forum WinDev
    Réponses: 2
    Dernier message: 30/05/2008, 13h56
  5. Problème de calcul sur heure
    Par Copernic09 dans le forum Langage
    Réponses: 8
    Dernier message: 09/05/2007, 09h47

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