Accueil > > > CALCULATRICE LIGNE DE COMMANDE - CALCUL EXACT
CALCULATRICE LIGNE DE COMMANDE - CALCUL EXACT
Information sur la source
Description
Voici une calculatrice en ligne de commande (pour calculer 21+2/8+45*5 par exemple) qui utilise le CALCUL EXACT pour donner des solutions sous formes de fractions à des calculs. Elle utilise beaucoup la récursivité, par exemple pour 2+2*5 elle va calculer la somme du produit de 2 et 2 avec 5. Elle ne gère pas encore les parenthèses ni les fonctions telles que racine carrée. De nombreuses améliorations sont à venir. N'hésitez pas à postez des COMMENTAIRES, critiques, questions.
Source
- from fractions import *
- import sys
-
- sys.setrecursionlimit(5000) # profondeur maximal des recusions
-
- def gestion_nb_virgule(chaine):
- chaine_finale = ""
- num = ""
- denum = ""
- for elem in chaine:
- if elem == ".":
- num = denum
- denum = ""
- elif elem in ("+","-","/","*"):
- if num and denum:
- if chaine_finale:
- if chaine_finale[-1] == "/":
- chaine_finale = chaine_finale[:-1]+"*"
- chaine_finale += str(1/Fraction(num+"."+denum))+elem
- denum = num = ""
- else:
- chaine_finale += str(Fraction(num+"."+denum))+elem
- denum = num = ""
- else:
- chaine_finale += denum + elem
- denum = num = ""
- else:
- denum += elem
- if num and denum:
- if chaine_finale:
- if chaine_finale[-1] == "/":
- chaine_finale = chaine_finale[:-1]+"*"
- chaine_finale += str(1/Fraction(num+"."+denum))
- denum = num = ""
- else:
- chaine_finale += str(Fraction(num+"."+denum))
- denum = num = ""
- else:
- chaine_finale += str(Fraction(num+"."+denum))
- denum = num = ""
- else:
- chaine_finale += denum
- denum = num = ""
- return chaine_finale
-
- # Le programme utilise la recursivite pour calculer
-
- def exacalc(chaine):
-
- if "+" in chaine: # ADDITION OU SOUSTRACTION OU MULTIPLICATIONS OU DIVISIONS
- for rang, operation in enumerate(chaine.split("+")):
- if rang == 0: # 1ER NOMBRE
- if ("-" in operation) and (operation[0]!="-") :
- resultat = exacalc(operation)
- if "*" in operation:
- resultat = exacalc(operation)
- if "/" in operation:
- resultat = exacalc(operation)
- else:
- resultat = operation
- else:
- if "-" in operation:
- operation = exacalc(operation)
- if "*" in operation:
- operation = exacalc(operation)
- if "/" in operation:
- operation = exacalc(operation)
-
- if "/" not in resultat:
- resultat += "/1"
- if "/" not in operation:
- operation += "/1"
- resultat = resultat.split("/")
- operation = operation.split("/")
- resultat = str(Fraction(int(resultat[0]),int(resultat[1]))+Fraction(int(operation[0]),int(operation[1])))
-
- elif ("-" in chaine) and (chaine[0]!="-") : # SOUSTRACTION OU MULTIPLICATIONS OU DIVISIONS
- for rang, operation in enumerate(chaine.split("-")):
- if rang == 0: # 1ER NOMBRE
- if "*" in operation:
- resultat = exacalc(operation)
- if "/" in operation:
- resultat = exacalc(operation)
- else:
- resultat = operation
- else:
- if "*" in operation:
- operation = exacalc(operation)
- if "/" in operation:
- operation = exacalc(operation)
-
- if "/" not in resultat:
- resultat += "/1"
- if "/" not in operation:
- operation += "/1"
- resultat = resultat.split("/")
- operation = operation.split("/")
- resultat = str(Fraction(int(resultat[0]),int(resultat[1]))-Fraction(int(operation[0]),int(operation[1])))
- if( resultat[0]=="0") and ("/" in resultat):
- resultat = 0
-
- elif "*" in chaine: # MULTIPLICATIONS OU DIVISIONS
- for rang, operation in enumerate(chaine.split("*")):
- if rang == 0: # 1ER NOMBRE
- if "/" in operation: # DIVISION
- resultat = exacalc(operation)
- else:
- resultat = operation
- else:
- if "/" not in resultat:
- resultat += "/1"
- if "/" not in operation:
- operation += "/1"
- resultat = resultat.split("/")
- operation = operation.split("/")
- resultat = str(Fraction(int(resultat[0]),int(resultat[1]))*Fraction(int(operation[0]),int(operation[1])))
-
- elif "/" in chaine: # QUE DES DIVISIONS
- for rang, operation in enumerate(chaine.split("/")):
- if rang == 0:
- resultat = operation
- elif rang == 1:
- resultat += "/"+operation
- else: # divisions suivantes
- resultat = resultat.split("/")
- resultat = str(Fraction(int(resultat[0]),int(resultat[1]))/Fraction(int(operation),1))
-
- if "/" in resultat:
- resultat = resultat.split("/")
- return str(Fraction(int(resultat[0]),int(resultat[1])))
-
- else:
- return resultat
-
- while 1:
- saisie = raw_input("\nexacalc : ")
- saisie = saisie.replace(" ","")
- saisie = saisie.replace("++","+")
- saisie = saisie.replace("--","+")
- saisie = saisie.replace("+-","-")
- saisie = saisie.replace("-+","-")
- saisie = saisie.replace("**","*")
- saisie = saisie.replace("\\","/") # attention "\\" correspond a "\"
- saisie = saisie.replace("//","/")
- saisie = saisie.replace(",",".")
-
- # ICI DEBUG
- # if saisie and ("+" in saisie)or("-" in saisie)or("*" in saisie)or("/" in saisie):
- # print " ", exacalc(gestion_nb_virgule(saisie))
-
- # ICI ANTI-ERREUR
- if saisie and ("+" in saisie)or("-" in saisie)or("*" in saisie)or("/" in saisie):
- try:
- saisie = gestion_nb_virgule(saisie)
- resultat = exacalc(saisie)
- print " ", resultat
- if "/" in resultat:
- print " ", float(resultat.split("/")[0])/float(resultat.split("/")[1])
- except:
- print "erreur de syntaxe"
from fractions import *
import sys
sys.setrecursionlimit(5000) # profondeur maximal des recusions
def gestion_nb_virgule(chaine):
chaine_finale = ""
num = ""
denum = ""
for elem in chaine:
if elem == ".":
num = denum
denum = ""
elif elem in ("+","-","/","*"):
if num and denum:
if chaine_finale:
if chaine_finale[-1] == "/":
chaine_finale = chaine_finale[:-1]+"*"
chaine_finale += str(1/Fraction(num+"."+denum))+elem
denum = num = ""
else:
chaine_finale += str(Fraction(num+"."+denum))+elem
denum = num = ""
else:
chaine_finale += denum + elem
denum = num = ""
else:
denum += elem
if num and denum:
if chaine_finale:
if chaine_finale[-1] == "/":
chaine_finale = chaine_finale[:-1]+"*"
chaine_finale += str(1/Fraction(num+"."+denum))
denum = num = ""
else:
chaine_finale += str(Fraction(num+"."+denum))
denum = num = ""
else:
chaine_finale += str(Fraction(num+"."+denum))
denum = num = ""
else:
chaine_finale += denum
denum = num = ""
return chaine_finale
# Le programme utilise la recursivite pour calculer
def exacalc(chaine):
if "+" in chaine: # ADDITION OU SOUSTRACTION OU MULTIPLICATIONS OU DIVISIONS
for rang, operation in enumerate(chaine.split("+")):
if rang == 0: # 1ER NOMBRE
if ("-" in operation) and (operation[0]!="-") :
resultat = exacalc(operation)
if "*" in operation:
resultat = exacalc(operation)
if "/" in operation:
resultat = exacalc(operation)
else:
resultat = operation
else:
if "-" in operation:
operation = exacalc(operation)
if "*" in operation:
operation = exacalc(operation)
if "/" in operation:
operation = exacalc(operation)
if "/" not in resultat:
resultat += "/1"
if "/" not in operation:
operation += "/1"
resultat = resultat.split("/")
operation = operation.split("/")
resultat = str(Fraction(int(resultat[0]),int(resultat[1]))+Fraction(int(operation[0]),int(operation[1])))
elif ("-" in chaine) and (chaine[0]!="-") : # SOUSTRACTION OU MULTIPLICATIONS OU DIVISIONS
for rang, operation in enumerate(chaine.split("-")):
if rang == 0: # 1ER NOMBRE
if "*" in operation:
resultat = exacalc(operation)
if "/" in operation:
resultat = exacalc(operation)
else:
resultat = operation
else:
if "*" in operation:
operation = exacalc(operation)
if "/" in operation:
operation = exacalc(operation)
if "/" not in resultat:
resultat += "/1"
if "/" not in operation:
operation += "/1"
resultat = resultat.split("/")
operation = operation.split("/")
resultat = str(Fraction(int(resultat[0]),int(resultat[1]))-Fraction(int(operation[0]),int(operation[1])))
if( resultat[0]=="0") and ("/" in resultat):
resultat = 0
elif "*" in chaine: # MULTIPLICATIONS OU DIVISIONS
for rang, operation in enumerate(chaine.split("*")):
if rang == 0: # 1ER NOMBRE
if "/" in operation: # DIVISION
resultat = exacalc(operation)
else:
resultat = operation
else:
if "/" not in resultat:
resultat += "/1"
if "/" not in operation:
operation += "/1"
resultat = resultat.split("/")
operation = operation.split("/")
resultat = str(Fraction(int(resultat[0]),int(resultat[1]))*Fraction(int(operation[0]),int(operation[1])))
elif "/" in chaine: # QUE DES DIVISIONS
for rang, operation in enumerate(chaine.split("/")):
if rang == 0:
resultat = operation
elif rang == 1:
resultat += "/"+operation
else: # divisions suivantes
resultat = resultat.split("/")
resultat = str(Fraction(int(resultat[0]),int(resultat[1]))/Fraction(int(operation),1))
if "/" in resultat:
resultat = resultat.split("/")
return str(Fraction(int(resultat[0]),int(resultat[1])))
else:
return resultat
while 1:
saisie = raw_input("\nexacalc : ")
saisie = saisie.replace(" ","")
saisie = saisie.replace("++","+")
saisie = saisie.replace("--","+")
saisie = saisie.replace("+-","-")
saisie = saisie.replace("-+","-")
saisie = saisie.replace("**","*")
saisie = saisie.replace("\\","/") # attention "\\" correspond a "\"
saisie = saisie.replace("//","/")
saisie = saisie.replace(",",".")
# ICI DEBUG
# if saisie and ("+" in saisie)or("-" in saisie)or("*" in saisie)or("/" in saisie):
# print " ", exacalc(gestion_nb_virgule(saisie))
# ICI ANTI-ERREUR
if saisie and ("+" in saisie)or("-" in saisie)or("*" in saisie)or("/" in saisie):
try:
saisie = gestion_nb_virgule(saisie)
resultat = exacalc(saisie)
print " ", resultat
if "/" in resultat:
print " ", float(resultat.split("/")[0])/float(resultat.split("/")[1])
except:
print "erreur de syntaxe"
Historique
- 14 janvier 2011 13:19:13 :
- Ajout de la gestion des nombres à virgule.
+ Corrections de bugs.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Calculatrice qui trace les fonctions du second degré [ par micha_jonathan ]
Bonjour, je suis actuelement entrain de créer une calculatrice en python qui permet de tracer les fonction du second degré. J'ai réalis
calcul matriciel [ par evelockertrue ]
salut,j'ai pour projet de développer un package contenant des fonctions ècrites en python et qui serviront à optimiser le ca
calcul matriciel simple [ par gwenc_hlan ]
bonjour, comment peut on faire sous Python du calcul matriciel simple ? (additionner, multiplier ou inverser des matrices). faut - il impérativeme
Problème de calcul simple [ par vaggarath ]
Bonjour bonjour. Voilà j'ai un problème tout c*n, j'en suis sur... En fait je fais un boutton qui procède à un calcul suivant les valeurs rentrées au
Probleme de "Package" [ par elnabo ]
Bonjour, voila comme vous avez peut-être vu j'ai codé une petite calculatrice basique (code, ici: [url=http://www.pythonfrance.com/codes/CALCULATRICE-
Django calcul de conversion [ par jenny100 ]
bonjour voila mon probleme j'ai un template qui affiche un champ avec une valeur numerique et un bouton submit une liste deroulante qui permet la s
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
974 Application Server (12.2.4.0)974 APPLICATION SERVER (12.2.4.0)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP mySongBook Player (1.0.0)MYSONGBOOK PLAYER (1.0.0)mySongBook Player est un logiciel gratuit permettant l'accès à une archive de tablatures/partitio... Cliquez pour télécharger mySongBook Player
|