J_Bernon

Tracé tableau d'avancement

Oct 22nd, 2019
76
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Sun Sep 29 09:12:11 2019
  4.  
  5. @author: Julien Bernon (Lycée Louis Feuillade, Lunel)
  6. """
  7.  
  8. """
  9. Remarques :
  10. 1) J'utilise des couleurs d'affichage pour print , cela est possible
  11. en ajoutant la balise \033[xxm loremipsum \033[0m]
  12. 30: couleur noire
  13. 31: couleur rouge
  14. 32: couleur vert
  15. 33: couleur orange
  16. 34: couleur bleu
  17. 35: couleur violet
  18. 36: couleur turquoise
  19. 37: couleur blanc
  20.  
  21. Autre :
  22.  
  23. 2: couleur par défaut console
  24. 4: style souligné
  25. 7: style stabilo fluo couleur par défaut de ta console
  26. 8: style invisible
  27. 9 : style barré
  28.  
  29. 40 à 47: style stabilo avec les couleurs de 30 à 37
  30. du coup, je définis une fonction style(text,coul=2)
  31. qui renvoit le texte proprement mis en couleur
  32.  
  33. 2) Le tableau d'avancement n'est lisible que si la console est suffisament étendue !
  34. Cela peut poser un problème si la formule contient de nombreuses substances ou que la
  35. résolution d'affichage est trop faible
  36. """
  37.  
  38.  
  39. def style(texte,coul=2):
  40.     return "\033["+str(coul)+"m"+texte+"\033[0m"
  41.    
  42.  
  43.  
  44.  
  45. # Cette fonction permet de définir les substances présentes pour la réaction
  46. def substances():
  47.     print(style("\n1) Substances présentes/produites",33))
  48.    
  49.     nb_reac=int(input(style("Combien y a-t-il de réactifs ? ",34)))
  50.     nb_prod=int(input(style("Combien y a-t-il de produits ? ",34)))
  51.     reac=[]
  52.     for i in range(nb_reac):
  53.         reac.append(([input(style("Quel symbole pour le réactif n°"+str(i+1)+" ? ",34)),0,0,0,0]))
  54.    
  55.     prod=[]
  56.     for i in range(nb_prod):
  57.         prod.append(([input(style("Quel symbole pour le produit n°"+str(i+1)+" ? ",34)),0,0,0,0]))
  58.     print("OK.")
  59.     return reac,prod
  60.  
  61. # Une fois les substances définies, on indique ensuite la stoechiométrie
  62. def stoechiometrie(reac,prod):
  63.     print(style("2) Coefficients stoechiométriques",33))
  64.     for i in reac:
  65.         i[1]=float(input(style("Coefficient devant "+i[0]+" ? ",34)))
  66.         if(i[1]==int(i[1])):
  67.             i[1]=int(i[1])
  68.     for i in prod:
  69.         i[1]=float(input(style("Coefficient devant "+i[0]+" ? ",34)))
  70.         if(i[1]==int(i[1])):
  71.             i[1]=int(i[1])
  72.     print("\n\nL'équation de réaction est donc :")
  73.     equa=""
  74.     for i in reac:
  75.         equa+=str(i[1])+i[0]+" + "
  76.     equa=equa[0:-2]
  77.     equa+= "--> "
  78.     for i in prod:
  79.         equa+=str(i[1])+i[0]+" + "
  80.     equa=equa[0:-2]
  81.     print("\n"+equa)
  82.     return reac,prod
  83.  
  84. # On indique enfin les quantités de matières initialement présentes
  85. def quantites(reac,prod):
  86.     print(style("\n\n3) Quantités de matières initiales",33))
  87.     print(style("/!\\",31)+ "Si la quantité n'est pas connue, entrer N")
  88.     print("Pour écrire '2,5x10^-3' entrez 2.5e-3")
  89.     for i in reac:
  90.         i[2]=input(style("Quantité initiale de "+i[0]+" ? ",34))
  91.         if (i[2]!="N"):
  92.             i[2]=float(i[2])
  93.     for i in prod:
  94.         i[2]=input(style("Quantité initiale de "+i[0]+" ? ",34))
  95.         if (i[2]!="N"):
  96.             i[2]=float(i[2])
  97.     return reac,prod
  98.  
  99. # Le tableau d'avancement s'affiche de façon littérale
  100. def tableau_litt(reac,prod):
  101.     print(style("\nII - Construction du tableau d'avancement",32))
  102.     print("D'après les données le tableau littéral est le suivant :\n")
  103.     #définition des intervalles
  104.     #la ligne la plus large est celle des xmax, on se réfère donc à elle
  105.    
  106.     tableau=[]
  107.     # Première ligne : équation
  108.     ligne=[]
  109.     ligne.append("      ")
  110.     for i in reac :
  111.         ligne.append(str(i[1])+" "+i[0])
  112.         ligne.append(" + ")
  113.     del(ligne[-1])
  114.     ligne.append(" --> ")    
  115.     for i in prod :
  116.         ligne.append(str(i[1])+" "+i[0])
  117.         ligne.append(" + ")
  118.     del(ligne[-1])
  119.     tableau.append(ligne)
  120.    
  121.     #deuxième ligne x=0
  122.     ligne=[]
  123.     ligne.append(" x=0  |")
  124.     for i in reac :
  125.         if (i[2]!="N") :
  126.             ligne.append(" n0("+i[0]+")")
  127.         else :
  128.             ligne.append(" / ")
  129.         ligne.append(" | ")
  130.     del(ligne[-1])
  131.     ligne.append("     ")  
  132.     for i in prod :
  133.         if (i[2]!="N") :
  134.             ligne.append(" n0("+i[0]+")")
  135.         else :
  136.             ligne.append(" / ")
  137.         ligne.append(" | ")
  138.     del(ligne[-1])
  139.     tableau.append(ligne)
  140.    
  141.     #troisième ligne x
  142.     ligne=[]
  143.     ligne.append("  x   |")
  144.     for i in reac :
  145.         if (i[2]!="N") :
  146.             ligne.append("   n0("+i[0]+")-"+str(i[1])+"x  ")
  147.         else :
  148.             ligne.append(" / ")
  149.         ligne.append(" | ")
  150.     del(ligne[-1])
  151.     ligne.append("     ")
  152.     for i in prod :
  153.         if (i[2]!="N") :
  154.             ligne.append("   n0("+i[0]+")-"+str(i[1])+"x  ")
  155.         else :
  156.             ligne.append(" / ")
  157.         ligne.append(" | ")
  158.     del(ligne[-1])
  159.     tableau.append(ligne)
  160.    
  161.     #dernière ligne xmax
  162.     ligne=[]
  163.     ligne.append(" xmax |")
  164.     for i in reac :
  165.         if (i[2]!="N") :
  166.             ligne.append(" n0("+i[0]+")-"+str(i[1])+"xmax ")
  167.         else :
  168.             ligne.append(" / ")
  169.         ligne.append(" | ")
  170.     del(ligne[-1])
  171.     ligne.append("     ")
  172.     for i in prod :
  173.         if (i[2]!="N") :
  174.             ligne.append(" n0("+i[0]+")-"+str(i[1])+"xmax ")
  175.         else :
  176.             ligne.append(" / ")
  177.         ligne.append(" | ")
  178.     del(ligne[-1])
  179.     tableau.append(ligne)
  180.    
  181.     tableau=centrage_texte(tableau)
  182.    
  183.     affiche_tableau(tableau)
  184.     return tableau
  185.    
  186.  
  187. # Comme la console est en mode texte, il faut mesurer le nombre de caractères de chaque
  188. # case afin d'avoir un bon alignement
  189. def centrage_texte(tableau):    
  190.     #On va compléter toutes les chaînes de caractères de façon à avoir un alignement vertical
  191.     dummy=[]
  192.     for i in range(len(tableau)):
  193.         dummy.append([])
  194.         for j in range(len(tableau[i])):
  195.             dummy[i].append([])
  196.    
  197.     for i in range(len(tableau[0])):
  198.         max_char=max(len(tableau[0][i]),len(tableau[1][i]),len(tableau[2][i]),len(tableau[3][i]))
  199.         for j in range(len(tableau)):
  200.             a_ajouter=max_char-len(tableau[j][i])
  201.             espaces_g,espaces_d="",""
  202.             for k in range(a_ajouter//2):
  203.                 espaces_g+=" "
  204.             for h in range(a_ajouter-a_ajouter//2):
  205.                 espaces_d+=" "
  206.             dummy[j][i]=espaces_g+tableau[j][i]+espaces_d
  207.     return dummy
  208.  
  209. # fonction qui affiche le tableau en ajoutant une ligne horizontale
  210. # entre l'équation de réaction et les bilans de matière
  211. def affiche_tableau(tableau):
  212.     for i in range(len(tableau)):
  213.         if (i==1):
  214.             #décompte du nombre totale de caractères en largeur
  215.             largeur_totale=0
  216.             for k in tableau[0]:
  217.                 largeur_totale+=len(k)
  218.             ligne=""
  219.             for k in range(largeur_totale):
  220.                 ligne+="-"
  221.             print(ligne)
  222.         ligne=""
  223.         for j in tableau[i]:
  224.             ligne+=j
  225.         print(ligne)
  226.  
  227. # Calcule l'avancement maximal pour chaque produit, et retourne l'avancement maximal
  228. # de la réaction
  229. def avancement_max(reac):
  230.     print(style("III- Avancement",32))
  231.     xmax=1e20
  232.     for i in reac:
  233.         if(i[2]!="N"):
  234.             i[3]=i[2]/i[1]
  235.             if (i[3]<xmax):
  236.                 xmax=i[3]
  237.     print("L'avancement maximal vaut donc xmax="+str(xmax)+"mol.\n")
  238.     return reac,xmax
  239.  
  240. # Une fois xmax déterminé, cette fonction finit le travail en calculant les
  241. # quantités résiduelles de chaque substance
  242. def bilan_matiere(reac,prod,xmax,tableau):
  243.     print(style("IV- Bilan de matière\n",32))
  244.    
  245.     ligne=[]
  246.     ligne.append(" xmax |")
  247.     for i in reac :
  248.         if (i[2]!="N") :
  249.             i[4]=i[2]-i[1]*xmax
  250.             ligne.append(str(i[4]))
  251.         else :
  252.             i[4]=i[2]
  253.             ligne.append(" / ")
  254.         ligne.append(" | ")
  255.     del(ligne[-1])
  256.     ligne.append("     ")
  257.     for i in prod :
  258.         if (i[2]!="N") :
  259.             i[4]=i[2]+i[1]*xmax
  260.             ligne.append(str(i[4]))
  261.         else :
  262.             i[4]=i[2]
  263.             ligne.append(" / ")
  264.         ligne.append(" | ")
  265.     del(ligne[-1])
  266.     while (len(tableau)>4):
  267.         del(tableau[4])
  268.     tableau.append(ligne)
  269.    
  270.     tableau=centrage_texte(tableau)
  271.    
  272.     affiche_tableau(tableau)
  273.     return reac,prod,xmax,tableau
  274.  
  275. ### script d'éxecution - commenter si besoin ###
  276. print(style("Traceur de tableau d'avancement",4))
  277. print(style("\nI - Définition de l'équation de réaction",32))
  278. reac,prod=substances()
  279. reac,prod=stoechiometrie(reac,prod)
  280. reac,prod=quantites(reac,prod)
  281. tableau=tableau_litt(reac,prod)
  282. reac,xmax=avancement_max(reac)
  283. reac,prod,xmax,tableau=bilan_matiere(reac,prod,xmax,tableau)
  284.  
  285. ################################################
RAW Paste Data