Mon programme fonctionne mais il me fait mal au yeux !

Résolu
Multi73 Messages postés 95 Statut Membre -  
Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   -
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

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour,
    que souhaites-tu améliorer?
    0
  2. Multi73 Messages postés 95 Statut Membre 2
     
    Comme je l'ai dit, faire une classe pour avoir deux fichier et savoir afficher la classe dans le fichier principale.
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      pourquoi faire deux fichiers?
      as-tu déjà fait des exercices avec des classes?
      que ferait cette classe?
      0
  3. jee pee Messages postés 31963 Date d'inscription   Statut Modérateur Dernière intervention   10 009
     
    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
  4. fudru
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    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
    1. fudru
       
      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
  7. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    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
    1. Multi73 Messages postés 95 Statut Membre 2
       
      Merci beaucoup !
      J'ai réussi a faire plus court !
      0
  8. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    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