begin process at 2012 05 23 23:52:30
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Math & Algorithmes

 > CALCULATRICE LIGNE DE COMMANDE - CALCUL EXACT

CALCULATRICE LIGNE DE COMMANDE - CALCUL EXACT


 Information sur la source

Note :
Aucune note
Catégorie :Math & Algorithmes Classé sous :calcul exact, calcul, exact, calculatrice, mathématiques Niveau :Initié Date de création :30/12/2010 Date de mise à jour :14/01/2011 13:19:12 Vu :3 766

Auteur : Clempython

Ecrire un message privé
Site perso
Commentaire sur cette source (1)
Ajouter un commentaire et/ou une note

 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

ANTILOG, MORT AUX .LOG
Source avec Zip Source avec une capture DIVISIONS AVEC PRÉCISION RÉGLABLE
Source avec Zip Source avec une capture VOCABULARY, RÉVISER SON VOCABULAIRE PÉDAGOGIQUEMENT
Source avec Zip Source avec une capture PROGRAMME POUR LES MOTS CROISÉS
Source avec Zip Source avec une capture LE MOT LE PLUS LONG PAR DICO

 Sources de la même categorie

Source avec une capture MISE EN EVIDENCE DE L'ALGORITHME A STAR GRAPHIQUEMENT par Mints
Source avec Zip BASE64 ENCRYPT/DECRYPT PYTHON BY MAXOU56800 par Maxou56800
Source avec Zip Source avec une capture TRIANGULATION par mecrosoft
Source avec Zip Source avec une capture COURBE DE BEZIER par mecrosoft
Source avec Zip Source avec une capture CALCUL D'AIRE D'UN TRIANGLE [INTERFACE GRAPHIQUE] par SeventhSon

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture CALCUL MENTAL par chuugar
CALCULATRICE (AIDE SUR LES FONCTIONS EN PYTHON) par matad0r
Source avec Zip Source avec une capture DIVISIONS AVEC PRÉCISION RÉGLABLE par Clempython
Source avec Zip Source avec une capture LE CALCULATOR DE RAYGOLD VERSION 3.1 par raygold
SIMPLE COMPARATEUR IPV4 EN PYTHON par erebos

Commentaires et avis

Commentaire de saigneurdushi le 04/01/2011 05:08:38

Ce dont tu parles c'est plutôt du calcul formel, en tout cas c'est plutôt bon esprit ! :-)

 Ajouter un commentaire


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


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,714 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales