def decode_mineral_1(nom_mineral): """ @param mineral: composition du mineral est donne sous forme d'une chaîne de caractères : "Na2AlSi3O10H2O" @return: calcule la décomposition du minéral sous forme d'une liste de tuples (elts,nb) Exemple : Calcite : CaCO3 --> (("Ca",1),("C",1),("O",3)) """ # on considère qe le nom d'un élément commence par une majuscule # et se poursuit par des minuscules # initialisation du tuple représentant le mineral mineral = [] nom = nom_mineral[0] # on initialise avec la 1ère lettre majuscule nb = 0 for car in nom_mineral[1:]: # on teste si on est en début d'élément avec une majuscule if car.isupper(): # si on est sur une majuscule, c'est le démarrage d'un nouvel élément # on ajoute l'élément analysé précédemment if nb == 0: # si on n'a pas rencontré de nombre, on considère que la quantité est 1 nb = 1 # si on gère sous forme de chaînes de caractères, on teste if nb == "" mineral.append((nom, nb)) # on initialise le nouveau nom et le nombre d'atomes nom = car nb = 0 elif car.islower(): # on a une minuscule, on complète le nom du composant nom = nom + car else: # on est sur un chiffre, on calcule la quantité du composant nb = nb * 10 + int(car) # on peut également créer le nombre sous forme de chaîne de caractères nb += car # à la sortie de l'itération on doit ajouter le dernier element if nb == 0: nb = 1 mineral.append((nom, nb)) return mineral def decode_mineral_2(minerai): """ @param mineral: composition du mineral est donne sous forme d'une chaîne de caractères : "Na2AlSi3O10H2O" @return: calcule la décomposition du minéral sous forme d'une liste de tuples (elts,nb) Exemple : Calcite : CaCO3 --> (("Ca",1),("C",1),("O",3)) """ ln = len(minerai) mineral = [] i = 0 while i < ln: nom = minerai[i] # initialisation avec le premier élément qui doit être une majuscule i += 1 while i < ln and minerai[i].islower(): # on parcourt la chaîne de caractères tant qu'on a un caractère minuscule pour construire le nom du composant nom += minerai[i] i += 1 nombre = '' while i < ln and minerai[i].isdigit(): # on parcourt la chaîne de caractères tant qu'on a un chiffre pour construire la quantité de répétition nombre += minerai[i] i += 1 if nombre == '': # si on n'a pas de chiffres (ex : on a "AlSi3") on fixe le nombre de répétitions à 1 n = 1 else: n = int(nombre) # sinon on convertit la chaîne correspondant à un nombre mineral.append((nom, n)) return mineral if __name__ == '__main__': nom_mineral = "Na2AlSi3O10H2O" print(decode_mineral_1(nom_mineral)) print(decode_mineral_2(nom_mineral))