Mon programme fonctionne mais il me fait mal au yeux ! [Résolu]

Signaler
Messages postés
84
Date d'inscription
dimanche 13 septembre 2020
Statut
Membre
Dernière intervention
1 juillet 2021
-
Messages postés
1111
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
27 juillet 2021
-
Bonjour,
J'ai fait un petit programme qui fonctionne il me fait mal au yeux pouvez me dire comment le rectifier ?
Au début je voulais faire deux fichier en créant une classe.
J'ai su l'importer mais je n'ai pas su lui dire fait ce que te demande la classe.
Donc j'ai abandonné la class mais si quelqu'un sait comment faire j'aimerais bien qu'il me le dise car mon programme est très brouillon !

Voici mon programme:

import time
import os

os.system("color c")

def operation():

    calculation = input("Quel opération veux tu faire ? (répondre: multiplication, division, addition ou soustraction)")
    if calculation == "multiplication":
        multi1 = float(input("Quel est le premier nombre de ta multiplication ?"))
        multi2 = float(input("Quel est le deuxième nombre de ta multiplication ?"))
        resultat_multi = multi1 * multi2
        print("Le résulat de la mutiplication est", resultat_multi, "!")
        time.sleep(4)

    if calculation == "division":
        div1 = float(input("Quel est le premier nombre de ta division ?"))
        div2 = float(input("Quel est le deuxième nombre de ta division ?"))
        resultat_div = div1 / div2
        print("Le résulat de la division est", resultat_div, "!")
        time.sleep(4)

    if calculation == "addition":
        add1 = float(input("Quel est le premier nombre de ton addition ?"))
        add2 = float(input("Quel est le deuxième nombre de ton addition ?"))
        resultat_add = add1 + add2
        print("Le résulat de l'addition est", resultat_add, "!")
        time.sleep(4)

    if calculation == "soustraction":
        sous1 = float(input("Quel est le premier nombre de ta soustraction ?"))
        sous2 = float(input("Quel est le deuxième nombre de ta soustraction ?"))
        resultat_sous = sous1 * sous2
        print("Le résulat de la soustraction est", resultat_sous, "!")
        time.sleep(4)



    refaire = input("Veux tu refaire une autre opération (répondre par oui ou non)")
    if refaire == "oui":
        operation()
    else:
        input("Ok, Au revoir !")
        time.sleep(4)
        exit()
operation()


Merci beaucoup !

7 réponses

Messages postés
16448
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 juillet 2021
880
bonjour,
que souhaites-tu améliorer?
Messages postés
84
Date d'inscription
dimanche 13 septembre 2020
Statut
Membre
Dernière intervention
1 juillet 2021

Comme je l'ai dit, faire une classe pour avoir deux fichier et savoir afficher la classe dans le fichier principale.
Messages postés
16448
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 juillet 2021
880
pourquoi faire deux fichiers?
as-tu déjà fait des exercices avec des classes?
que ferait cette classe?
Messages postés
32540
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
27 juillet 2021
7 831
Salut,

Dans un programme on ne devrait pas retrouver des séquences quasi identiques répétées. Là saisie du nombre1, du nombre 2 et du résultat pourraient être communs aux 4 opérations. Puis saisir le nom de l'opération en entier !!! tu pourrais demander juste le symbole * + - /
Il faut exploiter la façon dont python fonctionne, quand on utilise + - * /, tout passe par des méthodes d'objets.
Comme dit au-dessus, il faut éviter la redondance, les boucles, itérables, etc sont à utiliser, il faut aussi gérer les erreurs potentielles, savoir se servir des fonctions de formatage de chaînes.

Ton code revu :

import time
import os

os.system("color c")

def operation():
    fonctions = {
        "multiplication":('ta', "la ",  float.__mul__),
        "division":('ta', "la ", float.__truediv__),
        "addition":('ton', "l'", float.__add__),
        "soustraction":('ta', "la ", float.__sub__),
    }

    while True:
        calculation = input("Quel opération veux tu faire ? (répondre: multiplication, division, addition ou soustraction)")
        if calculation not in fonctions:
            print("Choix inconnu !")
        else:
            break
    nums = []
    for s in ("premier", "second"):
        while True:
            prm = fonctions[calculation][0]
            num = input(f"Quel est le premier nombre de {prm} {calculation} ?")
            try:
                num = float(num)
            except ValueError:
                print("Entrez une valeur numérique !")
            else:
                break
        nums.append(num)
    resultat = fonctions[calculation][2](*nums)
    print(f"Le résultat de {fonctions[calculation][1]}{calculation} est {resultat}")

    while True:
        refaire = input("Veux tu refaire une autre opération (répondre par oui ou non)")
        if refaire == "oui":
            operation()
        elif refaire == "non":
            print("Ok, Au revoir !")
            return
        else:
            print("Ordinateur pas comprendre ce que toi dire !")

operation()


Si t'as des questions, pose-les.

Sinon, je n'ai pas compris ton problème de classes et fichiers, quel est le souci ?
Messages postés
1111
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
27 juillet 2021
122
Bonjour Multi73

Ou bien un peu plus court:

# -*- coding:Latin-1 -*-
import re

p = r'^(\d+\.\d*|[0-9]*)(\+|\-|\*|\/)(\d+\.\d*|[0-9]*)$'

def exp_ok(resp):
    if(re.match(p, resp) or resp == 'q'):
        return(True)
    else:
        return(False)

resp = ''

while(True):
    while(not exp_ok(resp)):
        resp = input('\nEntrer une opération (+, -, *, /) q pour quitter : ')
    if(resp == 'q'): break
    print(eval(resp))
    resp = ''


Ca donne ça:

On peut même faire plus court, on ouvre un interpréteur python ou on lance la calulatrice système.
Les eval, exec sont des fonctions à éviter au maximum et encore moins à conseiller à des débutants.

Pourquoi mettre l'encoding en latin ? Aucun intérêt, l'utf-8 est la norme.

De plus ton expression est incorrecte, elle autorise par exemple un simple / et les parenthèses capturantes sont inutiles, voilà une autre bonne raison de ne pas utiliser eval.

Elle devrait se résumer à :

p = "\d+(\.\d+)?(\+|/|\-|\*)\d+(\.\d+)?$"


Également, ta fonction pourrait se résumer à faire

def exp_ok(resp):
    p = "\d+(\.\d+)?(\+|/|\-|\*)\d+(\.\d+)?$"
    return re.match(p, resp) or resp == 'q'
    # Ou encore pour n'avoir qu'un bool en retour
    # return bool(re.match(p, resp)) or resp == 'q'
    # return any((re.match(p, resp), resp == 'q'))


Nul besoin de condition.
Messages postés
1111
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
27 juillet 2021
122
Oui, on peut toujours faire plus court .... :-)

Je sais qu'il faut éviter eval pour des raisons de sécurité, mais dans cette petite appli, ca ne va pas très loin, on sait on l'on va ... :-)

(d'ailleurs, quand Guido Von Rossum a créé le langage, il y a mis cette fonction, et il n'est pas le premier venu en informatique :-) )
Messages postés
84
Date d'inscription
dimanche 13 septembre 2020
Statut
Membre
Dernière intervention
1 juillet 2021

Merci beaucoup !
J'ai réussi a faire plus court !
Messages postés
1111
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
27 juillet 2021
122
Mieux:

import re

p = r'(\d+\.*\d*(\+|\-|\*|\/))+\d+\.*\d*$'
resp = ''

while(True):
    while(not re.match(p, resp) and resp != 'q'):
        resp = input('\nEntrer une opération arithmétique ou <q>uitter : ')
    if(resp == 'q'): break
    print(eval(resp))
    resp = ''