Un alcane est une molécule composée de carbone et d'hydrogène. Le méthane, le propane, le butane sont des alcanes.
Par exemple, le butane a pour composition C4H10, soit 4 atomes carbone et 10 atomes hydrogène. En général, si $n$ est le nombre d'atomes carbone, le nombre d'atomes hydrogène est $2n+2$.
À faire : Écrire une fonction est_alcane(formule) qui pour une formule donnée sous forme de texte, par exemple "C4H10" renvoie True ou False, selon si c'est un alcane ou non.
L'usage est de ne pas écrire le 1 quand il n'y a qu'un seul atome. Par exemple "CH4" pour le méthane ou "CO2" pour le dioxyde de carbone.
Ajoutez les tests suivants à la suite de la fonction :
# tests
assert est_alcane("C") == False
assert est_alcane("C2") == False
assert est_alcane("CH4") == True
assert est_alcane("C2H6") == True
assert est_alcane("C3H8") == True
assert est_alcane("C15H32") == True
assert est_alcane("C15H62") == False
assert est_alcane("CO2") == False
assert est_alcane("CuB7C15Na3") == False
assert est_alcane("4C10H") == False
Vous pouvez vérifier une structure plus complexe qui précise l'organisation de la molécule. Par exemple, on note les alcools sous cette forme CH3-CH2-CH2-OH pour le propanol.
À faire : écrire une fonction est_alcool(formule).
Découper une chaîne caractère après caractères est fastidieux et peu performant. L'informatique propose une théorie des langages qui étudie la capacité à reconnaître certains motifs. [Noam Chomsky](https://fr.wikipedia.org/wiki/Noam_Chomsky) a grandement contribué à cette théorie. Une application : les expressions régulières.
Voici un exemple pour le cas précédent :
import re # expressions régulières
def decomposeFormule(formule):
regex = "([A-Z][a-z]*)([0-9]*)"
return re.findall(regex, formule)
On obtient un découpage parfait même pour des formules comme "Cu12N3HB".
La suite du travail en est grandement facilitée.