Mon programme fonctionne mais il me fait mal au yeux !

Résolu/Fermé
Multi73 Messages postés 88 Date d'inscription dimanche 13 septembre 2020 Statut Membre Dernière intervention 4 mai 2022 - Modifié le 27 juin 2021 à 18:44
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 - 29 juin 2021 à 09:10
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

yg_be Messages postés 22773 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 9 mai 2024 1 481
27 juin 2021 à 18:59
bonjour,
que souhaites-tu améliorer?
0
Multi73 Messages postés 88 Date d'inscription dimanche 13 septembre 2020 Statut Membre Dernière intervention 4 mai 2022 2
27 juin 2021 à 19:22
Comme je l'ai dit, faire une classe pour avoir deux fichier et savoir afficher la classe dans le fichier principale.
0
yg_be Messages postés 22773 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 9 mai 2024 1 481
27 juin 2021 à 20:44
pourquoi faire deux fichiers?
as-tu déjà fait des exercices avec des classes?
que ferait cette classe?
0
jee pee Messages postés 39705 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 9 mai 2024 9 267
27 juin 2021 à 19:23
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 * + - /
0
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 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 28 juin 2021 à 11:48
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:

0
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.
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
28 juin 2021 à 13:09
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 :-) )
0
Multi73 Messages postés 88 Date d'inscription dimanche 13 septembre 2020 Statut Membre Dernière intervention 4 mai 2022 2
Modifié le 28 juin 2021 à 17:16
Merci beaucoup !
J'ai réussi a faire plus court !
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
29 juin 2021 à 09:10
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 = ''
0