# -*- coding:utf-8 -*- __projet__ = "Corrections" __nom_fichier__ = "expressions" __author__ = "Christine Fay-Varnier" __date__ = "mai 2021" from string import digits def est_valide(expression): """ :param expression: chaîne de caractères :return: True si la chaîne est bien formée ne contient que des caractères autorisés (chiffres et "+") et que les opérateurs "+" sont bien placés (ni au début, ni à la fin, ni en doublon) """ # test chaine vide if expression=="": return False # test position d'un + en début ou fin de chaîne if expression[0] == '+' or expression[-1] == '+': return False # test caractères autorisés for i, car in enumerate(expression): if car == '+': if expression[i+1] == "+": # on a deux + qui se suivent l'expression n'est pas valide ... return False elif not car.isdigit(): # si le caractère n'est pas un '+' il faut que ce soit un chiffre return False # on teste si le dernier caratère est bien un chiffre if not expression[-1].isdigit(): return False # si tous les autres tests sont bons, on peut retourner True return True # Variante 1 def est_valide_1(expression): """ :param expression: chaîne de caractères :return: True si la chaîne est bien formée ne contient que des caractères autorisés (chiffres et "+") et que les opérateurs "+" sont bien placés (ni au début, ni à la fin, ni en doublon) """ # test chaine vide if expression=="": return False # test position d'un + en début ou fiun de chaîne if expression[0] == '+' or expression[-1] == '+': return False # test de non doublement d'un '+' if "++" in expression: return False # test caractères autorisés for car in expression: if car!='+': # si le caractère n'est pas un '+' il faut que ce soit un chiffre if not car.isdigit(): return False # si tous les autres tests sont bons, on peut retourner True return True # Variante 2 def est_valide_2(expression): opdes = expression.split('+') for element in opdes: if not element.isdigit(): return False return True def evalue(expression): """ :param expression: expression arithmétique exprimant une somme de valeur sous forme de chaîne :return: l'expression évaluée """ if not est_valide(expression): # si l'expression n'est pas valide on ne peut pas l'valuer return False # on récupère les opérandes de l'expression en 'splitant' l'expression avec '+' comme séparateur lvaleurs = expression.split('+') # on calcule la somme som = 0 for val in lvaleurs: som += int(val) return som # Variante 1 def evalue_variante(expression): """ :param expression: expression arithmétique exprimant une somme de valeur sous forme de chaîne :return: l'expression avaluée """ if not est_valide(expression): # si l'expression n'est pas valide on ne peut pas l'évaluer return False # on récupère les opérandes de l'expression en 'splitant' l'expression avec '+' comme séparateur lvaleurs = expression.split('+') # on convertit les valeurs en entiers lvaleurs = [int(val) for val in lvaleurs] return sum(lvaleurs) if __name__ == '__main__': # tests print(est_valide("123+15+1")) print(est_valide("123+15-1")) print(est_valide("")) print(est_valide("12+")) print(est_valide("+12")) print(est_valide("12++12")) print() print(est_valide_1("123+15+1")) print(est_valide_1("123+15-1")) print(est_valide_1("")) print(est_valide_1("12+")) print(est_valide_1("+12")) print(est_valide_1("12++12")) print() print(est_valide_2("123+15+1")) print(est_valide_2("123+15-1")) print(est_valide_2("")) print(est_valide_2("12+")) print(est_valide_2("+12")) print(est_valide_2("12++12")) print() print(evalue("123+15+1+10")) print(evalue_variante("123+15+1+10"))