Masse moléculaire [dx06] - Exercice Karine Zampieri, Stéphane Rivière, Béatrice Amerein-Soltner Unisciel algoprog Version 9 avril 2015 Table des matières 1 Représentation des éléments (4 points) 1 2 Fonctions num, design, abrev (4 points) 2 3 Masse moléculaire 2 3.1 Chargement des données........................... 2 3.2 Analyse de la formule............................. 4 3.3 Masse moléculaire d un composé....................... 5 3.4 Facultatif : Complément........................... 7 Masse moléculaire / pg-fschimiea1 (C++, TP) 1 Représentation des éléments (4 points) Le système de classification périodique des éléments chimiques (abrégé CPE) a la particularité d être quasiment figé. Un élément du CPE est décrit par : Son abréviation abrv (le symbole chimique, chaîne de caractères). Son poids atomique poids (réel). Son numéro d ordre num (entier). Sa désignation design (chaîne de caractères). (0.5 point) Définissez le type Element, structure qui inclut tous les champs représentant un élément du CPE. (0.5 point) Définissez la constante NMAX (nombre maximum d éléments) de valeur 200 puis le type TableauCPE, structure qui inclut : Un tableau elems de taille maximale NMAX contenant des Element. Un entier nelems mémorisant le nombre effectif d éléments dans le tableau. 1
Unisciel algoprog Masse moléculaire / dx06 2 (1 point) Écrivez une procédure afficherelement(e) qui affiche les données d un Element e. (2 points) Déduisez une procédure affichercpe(t) qui affiche tous les éléments d un TableauCPE t. 2 Fonctions num, design, abrev (4 points) Dans cette partie, toutes les fonctions étant similaires, la documentation DOXYGEN sera réalisée pour la fonction rechlin et la fonction num uniquement. (2 points) Écrivez une fonction rechlin(t,abrv) qui recherche une abréviation abrv (chaîne de caractères) dans un TableauCPE t et renvoie son indice. Dans le cas d une recherche infructueuse, la fonction renvoie -1 comme valeur. (1 point) Déduisez des fonctions num(t,abrv) et design(t,abrv) qui recherchent une abréviation abrv (chaîne de caractères) dans un TableauCPE t et renvoient respectivement le numéro d ordre et la désignation de l élément. Dans le cas d une recherche infructueuse, la fonction renvoie -1 (ou la chaîne vide) comme valeur. (1 point) Écrivez une fonction abrev(t,num) qui recherche un numéro atomique num (entier) dans un TableauCPE t et renvoie le symbole chimique de l élément, la chaîne vide (en cas de recherche infructueuse). 3 Masse moléculaire 3.1 Chargement des données On dispose d un fichier texte qui contient les éléments de la classification périodique, à raison d un élément du CPE par ligne : le symbole chimique, le numéro atomique, la masse atomique et la désignation. Voici un bref extrait du fichier :
Unisciel algoprog Masse moléculaire / dx06 3 Symbol AtNo MasseAtom1 Name H 1 1.008 Hydrogen He 2 4.002602 Helium... U 92 238.02891 Uranium Écrivez une fonction lireelement(e,is) qui lit un Element dans e depuis un flux d entrée is et renvoie Vrai si l opération de lecture a été effectuée, Faux sinon. Déduisez une fonction chargercpe(t,fn) qui charge les données dans un TableauCPE t depuis un fichier de nom fn. Elle renvoie Vrai si l opération de chargement a été effectuée, Faux sinon (erreur ouverture). Écrivez une procédure test_charger qui demande et saisit le nom du fichier contenant les données, charge les données puis affiche le tableau des éléments. Testez. Copiez/collez la procédure test_charger en la procédure test_fncs1. Supprimez l appel de la procédure d affichage puis complétez-la pour qu elle demande et saisit une abréviation puis vérifie les résultats renvoyées par les fonctions, et ce jusqu à ce que l utilisateur tape le mot FIN pour finir.
Unisciel algoprog Masse moléculaire / dx06 4 Testez. 3.2 Analyse de la formule Une formule chimique brute est constituée de symboles chimiques éventuellement suivis de valeurs numériques. Exemples : CH3, C2H3O2Na, CI2, H2O, etc. (On se limitera aux valeurs numériques strictement inférieures à 10.) La première étape consiste à analyser la formule brute pour savoir de combien d éléments elle est composée et le nombre d éléments de chaque sorte. Exemples : H2O contient 2 éléments : H et O et on a 2H et 1O. De même HO3H2Cl peut être décomposé en : 1H, 3O, 2H et 1Cl. Pour analyser une formule brute s (chaîne de caractères), on peut alors utiliser la stratégie suivante : Pour chacune des majuscules détectées dans s : 1. Calculer le nombre de caractères u présents entre cette majuscule et la suivante (Comment faire pour déterminer le nombre de caractères qui suit la dernière majuscule?). 2. Selon la valeur de ce nombre u, identifier le nom de l élément e et son nombre z. Nous commencerons donc par écrire des fonctions utilitaires au problème et terminerons par la procédure de calcul de e et z. Écrivez une fonction estmajuscule(c) qui teste et renvoie Vrai si le caractère c est une majuscule, Faux sinon. De même, par copier/collez, définissez une fonction estminuscule(c) qui teste et renvoie Vrai si le caractère c est une minuscule, Faux sinon. Écrivez une fonction estchiffre(c) qui teste et renvoie Vrai si le caractère c représente un chiffre, Faux sinon. Écrivez une fonction cvchiffre(c) qui renvoie la valeur numérique (un entier) du caractère c représentant un chiffre. Exemples : cvchiffre( 0 ) ==> 0 cvchiffre( 8 ) ==> 8 Écrivez une fonction evalcaract(txt,p) qui renvoie le p-ème caractère de txt (chaîne de caractères).
Unisciel algoprog Masse moléculaire / dx06 5 Écrivez une fonction rechmajuscule(s,k) qui recherche la prochaine majuscule après l indice k dans une chaîne de caractères s, et qui renvoie sa position, -1 en cas de recherche infructueuse. Attention, on recherche à partir de k+1. Écrivez une procédure calculerez(s,k1,k2,abrv,z) qui, pour une formule brute s (chaîne de caractères), recherche la prochaine majuscule à partir de k1 (entier) et restitue cette position dans k2 (entier). Elle calcule également l abréviation correspondante dans abrv (chaîne de caractères) et la valeur du chiffre dans z (entier). Aide détaillée Si u vaut 1 : cela signifie que deux majuscules se suivent. Le nom de l élément e est alors égal au caractère de la formule et z vaut 1. Si u vaut 2 : le caractère situé entre les deux majuscules peut être une minuscule ou un chiffre. A l aide d un test adéquat, faites l affectation pour e et z. Si u vaut 3 : on a obligatoirement une minuscule suivie d un chiffre. Identifiez e et z. 3.3 Masse moléculaire d un composé Écrivez une fonction poids(t,abrv) qui recherche une abréviation abrv (chaîne de caractères) dans un TableauCPE t et renvoie le poids atomique. Dans le cas d une recherche infructueuse, la fonction renvoie 0 comme valeur.
Unisciel algoprog Masse moléculaire / dx06 6 Dans un premier temps, on suppose que la formule est correcte (c.-à-d. sans erreur). Écrivez une fonction masse(t,s) qui, étant donné un TableauCPE t, calcule et renvoie la masse moléculaire d une formule brute s (chaîne de caractères) en utilisant la procédure calculerez. Aide simple Pour chacune des majuscules détectées dans s : 1. Identifiez le nom de l élément e et son nombre z. 2. Cumulez la masse moléculaire de ce sous-composé. Copiez/collez la procédure test_charger en la procédure test_masse. Supprimez l appel de la procédure d affichage puis complétez-la pour qu elle demande et saisit un composé, en détermine les éléments et les quantités puis affiche la masse moléculaire du composé. Itérez jusqu à ce que l utilisateur tape le mot FIN pour finir. Testez avec un ou deux des éléments suivants : Mn 2 P 2 O 7 = 283.81632 CaCO 3 = 100.0862 K 2 IrCl 6 = 483.12 SiHF 3 = 86.089
Unisciel algoprog Masse moléculaire / dx06 7 3.4 Facultatif : Complément Copiez/collez la fonction masse en la fonction masse2. Complétez la fonction masse2 pour traiter les cas d erreurs de la formule. En particulier : 1. Le premier caractère doit être une majuscule. 2. Si u vaut 2, le second caractère de la chaîne ne peut pas être autre chose qu un chiffre ou une minuscule. 3. Si u vaut 3, le second caractère doit être une minuscule et le troisième un chiffre. 4. u ne peut pas être plus grand que 3. Copiez/collez la procédure test_masse en la procédure test_masse2 et modifiez l appel de la fonction. Testez.