Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- """
- Created on Sun Sep 29 09:12:11 2019
- @author: Julien Bernon (Lycée Louis Feuillade, Lunel)
- """
- """
- Remarques :
- 1) J'utilise des couleurs d'affichage pour print , cela est possible
- en ajoutant la balise \033[xxm loremipsum \033[0m]
- 30: couleur noire
- 31: couleur rouge
- 32: couleur vert
- 33: couleur orange
- 34: couleur bleu
- 35: couleur violet
- 36: couleur turquoise
- 37: couleur blanc
- Autre :
- 2: couleur par défaut console
- 4: style souligné
- 7: style stabilo fluo couleur par défaut de ta console
- 8: style invisible
- 9 : style barré
- 40 à 47: style stabilo avec les couleurs de 30 à 37
- du coup, je définis une fonction style(text,coul=2)
- qui renvoit le texte proprement mis en couleur
- 2) Le tableau d'avancement n'est lisible que si la console est suffisament étendue !
- Cela peut poser un problème si la formule contient de nombreuses substances ou que la
- résolution d'affichage est trop faible
- """
- def style(texte,coul=2):
- return "\033["+str(coul)+"m"+texte+"\033[0m"
- # Cette fonction permet de définir les substances présentes pour la réaction
- def substances():
- print(style("\n1) Substances présentes/produites",33))
- nb_reac=int(input(style("Combien y a-t-il de réactifs ? ",34)))
- nb_prod=int(input(style("Combien y a-t-il de produits ? ",34)))
- reac=[]
- for i in range(nb_reac):
- reac.append(([input(style("Quel symbole pour le réactif n°"+str(i+1)+" ? ",34)),0,0,0,0]))
- prod=[]
- for i in range(nb_prod):
- prod.append(([input(style("Quel symbole pour le produit n°"+str(i+1)+" ? ",34)),0,0,0,0]))
- print("OK.")
- return reac,prod
- # Une fois les substances définies, on indique ensuite la stoechiométrie
- def stoechiometrie(reac,prod):
- print(style("2) Coefficients stoechiométriques",33))
- for i in reac:
- i[1]=float(input(style("Coefficient devant "+i[0]+" ? ",34)))
- if(i[1]==int(i[1])):
- i[1]=int(i[1])
- for i in prod:
- i[1]=float(input(style("Coefficient devant "+i[0]+" ? ",34)))
- if(i[1]==int(i[1])):
- i[1]=int(i[1])
- print("\n\nL'équation de réaction est donc :")
- equa=""
- for i in reac:
- equa+=str(i[1])+i[0]+" + "
- equa=equa[0:-2]
- equa+= "--> "
- for i in prod:
- equa+=str(i[1])+i[0]+" + "
- equa=equa[0:-2]
- print("\n"+equa)
- return reac,prod
- # On indique enfin les quantités de matières initialement présentes
- def quantites(reac,prod):
- print(style("\n\n3) Quantités de matières initiales",33))
- print(style("/!\\",31)+ "Si la quantité n'est pas connue, entrer N")
- print("Pour écrire '2,5x10^-3' entrez 2.5e-3")
- for i in reac:
- i[2]=input(style("Quantité initiale de "+i[0]+" ? ",34))
- if (i[2]!="N"):
- i[2]=float(i[2])
- for i in prod:
- i[2]=input(style("Quantité initiale de "+i[0]+" ? ",34))
- if (i[2]!="N"):
- i[2]=float(i[2])
- return reac,prod
- # Le tableau d'avancement s'affiche de façon littérale
- def tableau_litt(reac,prod):
- print(style("\nII - Construction du tableau d'avancement",32))
- print("D'après les données le tableau littéral est le suivant :\n")
- #définition des intervalles
- #la ligne la plus large est celle des xmax, on se réfère donc à elle
- tableau=[]
- # Première ligne : équation
- ligne=[]
- ligne.append(" ")
- for i in reac :
- ligne.append(str(i[1])+" "+i[0])
- ligne.append(" + ")
- del(ligne[-1])
- ligne.append(" --> ")
- for i in prod :
- ligne.append(str(i[1])+" "+i[0])
- ligne.append(" + ")
- del(ligne[-1])
- tableau.append(ligne)
- #deuxième ligne x=0
- ligne=[]
- ligne.append(" x=0 |")
- for i in reac :
- if (i[2]!="N") :
- ligne.append(" n0("+i[0]+")")
- else :
- ligne.append(" / ")
- ligne.append(" | ")
- del(ligne[-1])
- ligne.append(" ")
- for i in prod :
- if (i[2]!="N") :
- ligne.append(" n0("+i[0]+")")
- else :
- ligne.append(" / ")
- ligne.append(" | ")
- del(ligne[-1])
- tableau.append(ligne)
- #troisième ligne x
- ligne=[]
- ligne.append(" x |")
- for i in reac :
- if (i[2]!="N") :
- ligne.append(" n0("+i[0]+")-"+str(i[1])+"x ")
- else :
- ligne.append(" / ")
- ligne.append(" | ")
- del(ligne[-1])
- ligne.append(" ")
- for i in prod :
- if (i[2]!="N") :
- ligne.append(" n0("+i[0]+")-"+str(i[1])+"x ")
- else :
- ligne.append(" / ")
- ligne.append(" | ")
- del(ligne[-1])
- tableau.append(ligne)
- #dernière ligne xmax
- ligne=[]
- ligne.append(" xmax |")
- for i in reac :
- if (i[2]!="N") :
- ligne.append(" n0("+i[0]+")-"+str(i[1])+"xmax ")
- else :
- ligne.append(" / ")
- ligne.append(" | ")
- del(ligne[-1])
- ligne.append(" ")
- for i in prod :
- if (i[2]!="N") :
- ligne.append(" n0("+i[0]+")-"+str(i[1])+"xmax ")
- else :
- ligne.append(" / ")
- ligne.append(" | ")
- del(ligne[-1])
- tableau.append(ligne)
- tableau=centrage_texte(tableau)
- affiche_tableau(tableau)
- return tableau
- # Comme la console est en mode texte, il faut mesurer le nombre de caractères de chaque
- # case afin d'avoir un bon alignement
- def centrage_texte(tableau):
- #On va compléter toutes les chaînes de caractères de façon à avoir un alignement vertical
- dummy=[]
- for i in range(len(tableau)):
- dummy.append([])
- for j in range(len(tableau[i])):
- dummy[i].append([])
- for i in range(len(tableau[0])):
- max_char=max(len(tableau[0][i]),len(tableau[1][i]),len(tableau[2][i]),len(tableau[3][i]))
- for j in range(len(tableau)):
- a_ajouter=max_char-len(tableau[j][i])
- espaces_g,espaces_d="",""
- for k in range(a_ajouter//2):
- espaces_g+=" "
- for h in range(a_ajouter-a_ajouter//2):
- espaces_d+=" "
- dummy[j][i]=espaces_g+tableau[j][i]+espaces_d
- return dummy
- # fonction qui affiche le tableau en ajoutant une ligne horizontale
- # entre l'équation de réaction et les bilans de matière
- def affiche_tableau(tableau):
- for i in range(len(tableau)):
- if (i==1):
- #décompte du nombre totale de caractères en largeur
- largeur_totale=0
- for k in tableau[0]:
- largeur_totale+=len(k)
- ligne=""
- for k in range(largeur_totale):
- ligne+="-"
- print(ligne)
- ligne=""
- for j in tableau[i]:
- ligne+=j
- print(ligne)
- # Calcule l'avancement maximal pour chaque produit, et retourne l'avancement maximal
- # de la réaction
- def avancement_max(reac):
- print(style("III- Avancement",32))
- xmax=1e20
- for i in reac:
- if(i[2]!="N"):
- i[3]=i[2]/i[1]
- if (i[3]<xmax):
- xmax=i[3]
- print("L'avancement maximal vaut donc xmax="+str(xmax)+"mol.\n")
- return reac,xmax
- # Une fois xmax déterminé, cette fonction finit le travail en calculant les
- # quantités résiduelles de chaque substance
- def bilan_matiere(reac,prod,xmax,tableau):
- print(style("IV- Bilan de matière\n",32))
- ligne=[]
- ligne.append(" xmax |")
- for i in reac :
- if (i[2]!="N") :
- i[4]=i[2]-i[1]*xmax
- ligne.append(str(i[4]))
- else :
- i[4]=i[2]
- ligne.append(" / ")
- ligne.append(" | ")
- del(ligne[-1])
- ligne.append(" ")
- for i in prod :
- if (i[2]!="N") :
- i[4]=i[2]+i[1]*xmax
- ligne.append(str(i[4]))
- else :
- i[4]=i[2]
- ligne.append(" / ")
- ligne.append(" | ")
- del(ligne[-1])
- while (len(tableau)>4):
- del(tableau[4])
- tableau.append(ligne)
- tableau=centrage_texte(tableau)
- affiche_tableau(tableau)
- return reac,prod,xmax,tableau
- ### script d'éxecution - commenter si besoin ###
- print(style("Traceur de tableau d'avancement",4))
- print(style("\nI - Définition de l'équation de réaction",32))
- reac,prod=substances()
- reac,prod=stoechiometrie(reac,prod)
- reac,prod=quantites(reac,prod)
- tableau=tableau_litt(reac,prod)
- reac,xmax=avancement_max(reac)
- reac,prod,xmax,tableau=bilan_matiere(reac,prod,xmax,tableau)
- ################################################
Add Comment
Please, Sign In to add comment