Bonjour,
Je vous présente la première partie que j'ai commencée ce matin. Voici la tête de la calculatrice :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | La calculatrice Polonaise Tapez 'quit' ou 'q' pour quitter le programme. Tapez 'clear' ou 'c' pour nettoyer la calculatrice. [1]: 5 [1]= 5.0 [2]: 9 [2]= 9.0 [3]: 9 9 + [3]= 18.0 [4]: 9 9 + 5 4 98 */ - ERREUR : La syntaxe entrée est invalide. [4]: 9 9 + 5 4 98 * / - [4]= 17.987244897959183 [5]: |
Et le code :
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | #!/usr/bin/env python3 # coding: utf-8 # Made by Louis Etienne import os import re class UserRequest(Exception): ''' Exception envoyée quand l'user demande quelque chose ''' pass CONTROLS = ['QUIT', 'Q', 'CLEAR', 'C'] OPERATORS = ['+', '*', '-', '/', '^'] def clear(): ''' Nettoye le terminal ''' os.system('cls' if os.name == 'nt' else 'clear') def is_number(s): ''' Vérifie que le nombre soit bien un flottant Retourne True si vrai, False si non ''' try: float(s) # pour int et float except ValueError: return False else: return True def check_format(entry): ''' Prend l'entrée de l'user et vérifie : - qu'elle ne contient pas de lettre - que les chars sont séparé par des espaces Retourne la liste si tout est valide, autrement retourne False ''' # On vérifie qu'il n'y ai pas de lettre if re.search('[a-zA-Z]', entry): return False else: # On vérifie que les chars sont bien séparé par des espaces list_chars = entry.split(' ') # On supprime les "" si il y a list_chars = [item for item in list_chars if item != ''] for char in list_chars: if not is_number(char) and not char in OPERATORS: return False # Si l'entrée a passé tous les tests return list_chars def calc(entry): ''' Effectue les calculs et retourne le résultat ''' result = [] # La pile error = False for char in entry: if is_number(char): result.append(float(char)) else: try: nb1 = result.pop() nb2 = result.pop() nb1, nb2 = nb2, nb1 except IndexError: print('ERREUR : Pas assez d\'opérateurs pour l\'opération \'{}\'.'.format(char)) error = True else: if char == '+': result.append(float(nb1 + nb2)) elif char == '-': result.append(float(nb1 - nb2)) elif char == '*': result.append(float(nb1 * nb2)) elif char == '/': try: result.append(float(nb1 / nb2)) except ZeroDivisionError: print('ERREUR : Impossible de diviser par 0.') error = True elif char == '^': result.append(float(pow(nb1, nb2))) else: error = True return result[0] if not error else None def main(): ''' Boucle principale du programme. ''' print('La calculatrice Polonaise') print('Tapez \'quit\' ou \'q\' pour quitter le programme.') print('Tapez \'clear\' ou \'c\' pour nettoyer la calculatrice.') print() loop = True nb_calc = 0 while loop: # On vérifie que l'user ne rentre pas n'importe quoi try: entry = input('[{}]: '.format(nb_calc + 1)) if entry.upper() not in CONTROLS: entry = check_format(entry) assert entry else: raise UserRequest except UserRequest: # Si l'user demande de quitter le programme if entry.upper() in ['QUIT', 'Q']: loop = False # Si l'user demande de nettoyer le terminal elif entry.upper() in ['CLEAR', 'C']: clear() except KeyboardInterrupt: print('') # Force le terminal à passer à la ligne loop = False except AssertionError: print('ERREUR : La syntaxe entrée est invalide.') else: nb_calc += 1 result = calc(entry) if result is not None: print('[{}]= {}\n'.format(nb_calc, result)) if __name__ == '__main__': main() |
Je continue sur la partie 2 !
+1
-0