Pagina Modulului 5
Ora 37 - Modulul 5

Masa moleculară

Formule chimice simple: H₂O, CO₂, constante atomice și calcul masa totală

45min teorie + 15min probleme PbInfo + exerciții practice
Competența 4.1
Săptămâna 6
Sigla liceului
TEORIE - 45 minute

Ce vei învăța astăzi?

Vom scrie un program C++ care calculează masa moleculară a unor substanțe chimice simple, folosind masele atomice ale elementelor.

Mase atomice: H=1, C=12, O=16, N=14
Parsarea unei formule: simbol + număr
Calculul masei moleculare totale
Abordare simplificată cu if-else

Dicționar: Chimie ↔ C++ (Mase moleculare)

Concept chimicCum se citeșteÎn C++Observație
u (unitate masă atomică)„u" sau „dalton"int H = 1;valoare constantă
H, C, N, O, Ssimboluri chimiceconst int H=1,C=12,...;const = nu se modifică
H₂O (indice = cantitate)„2 atomi de H, 1 de O"2*H + 1*Ocantitate × masă element
Σ (sumă totală)„suma tuturor"total += cant * me;acumulare în buclă
× (înmulțire)„ori"cantitate * masaElemcantitate × masă atomică
% (procent)„la sută"100.0*cant*me/totalatenție: 100.0 nu 100!
Na, Cl, Ca, Fe (2 litere)„sodiu, clor, calciu, fier"string elem;char citește doar 1 literă!

Analogie: Rețetă de prăjitură

Gândește-te la o rețetă:

O prăjitură are nevoie de: 2 ouă (50g fiecare), 1 cană făină (150g), 3 linguri zahăr (15g fiecare).

Masa totală = 2×50 + 1×150 + 3×15 = 100 + 150 + 45 = 295g

Formula chimică funcționează la fel: H₂O = 2×(masa H) + 1×(masa O) = 2×1 + 1×16 = 18 u

Ingredientele = elementele chimice. Cantitățile = indicii din formulă. Masele = masele atomice.

M = n₁×m₁ + n₂×m₂ + ... + nₖ×mₖ
int masa = cant1*H + cant2*O + cant3*S; (predefinit) sau total += cant * masaElem; (buclă)
„masa moleculară = suma (cantitate × masă atomică) pentru fiecare element"

Masele atomice

Masa atomică a unui element este masa relativă exprimată în unități de masă atomică (u).

ElementSimbolMasa atomică (u)
HidrogenH1
CarbonC12
AzotN14
OxigenO16
SodiuNa23
SulfS32
ClorCl35
PotasiuK39
CalciuCa40
FierFe56

Exemple de molecule

H₂O
Apă
2×1 + 1×16 = 18 u
CO₂
Dioxid de carbon
1×12 + 2×16 = 44 u
NH₃
Amoniac
1×14 + 3×1 = 17 u
CH₄
Metan
1×12 + 4×1 = 16 u
NaCl
Sare de bucătărie
1×23 + 1×35 = 58 u
CaCO₃
Calcar (cretă)
40 + 12 + 3×16 = 100 u
M(H₂O) = 2×1 + 1×16 = 18 u
masa = 2*H + 1*O; // = 2*1 + 1*16 = 18
„doi ori hidrogen plus unu ori oxigen"
M(CO₂) = 1×12 + 2×16 = 44 u
masa = 1*C + 2*O; // = 12 + 32 = 44
„un carbon plus doi oxigeni"
M(H₂SO₄) = 2×1 + 1×32 + 4×16 = 98 u
masa = 2*H + 1*S + 4*O; // = 2 + 32 + 64 = 98
„doi hidrogeni + un sulf + patru oxigeni — acid sulfuric"

Abordare simplificată: meniu cu substanțe

Strategie: Pentru început, vom folosi un meniu cu substanțe predefinite. Utilizatorul alege substanța, programul calculează masa. Aceasta simplifică problema — nu trebuie să parsăm formule chimice generale.

// Pseudocod: Calculator masă moleculară cu meniu SET H 1, C 12, N 14, O 16, S 32 // constante DO PRINT "1=H2O 2=CO2 3=NH3 4=CH4 5=H2SO4 6=Manual 0=Iesire" READ optiune masa 0 SWITCH optiune CASE 1: masa 2*H + 1*O CASE 6: // parsare manuală READ n // câte elemente FOR i 1 TO n READ elem, cantitate IF elem == 'H' THEN masaElem H ELSE IF elem == 'C' THEN masaElem C ... masa masa + cantitate * masaElem END FOR END SWITCH PRINT masa, " u" WHILE optiune != 0
Calculator de masă moleculară - versiunea cu meniu
#include <iostream>
using namespace std;

int main() {
    // Constante - mase atomice
    const int H = 1, C = 12, N = 14, O = 16, S = 32;
    
    int optiune;
    do {
        cout << "\n=== CALCULATOR MASA MOLECULARA ===" << endl;
        cout << "1. H2O  (Apa)" << endl;
        cout << "2. CO2  (Dioxid de carbon)" << endl;
        cout << "3. NH3  (Amoniac)" << endl;
        cout << "4. CH4  (Metan)" << endl;
        cout << "5. H2SO4 (Acid sulfuric)" << endl;
        cout << "6. Introduce manual (element + numar)" << endl;
        cout << "0. Iesire" << endl;
        cout << "Alege: "; cin >> optiune;
        
        int masa = 0;
        switch (optiune) {
            case 1: masa = 2*H + 1*O;
                cout << "H2O = 2*" << H << " + 1*" << O;
                break;
            case 2: masa = 1*C + 2*O;
                cout << "CO2 = 1*" << C << " + 2*" << O;
                break;
            case 3: masa = 1*N + 3*H;
                cout << "NH3 = 1*" << N << " + 3*" << H;
                break;
            case 4: masa = 1*C + 4*H;
                cout << "CH4 = 1*" << C << " + 4*" << H;
                break;
            case 5: masa = 2*H + 1*S + 4*O;
                cout << "H2SO4 = 2*" << H << " + 1*" 
                     << S << " + 4*" << O;
                break;
            case 6: {
                int total = 0, n;
                char elem;
                cout << "Cate elemente are formula? "; cin >> n;
                for (int i = 0; i < n; i++) {
                    int cantitate, masaElem = 0;
                    cout << "Element (H/C/N/O/S): "; cin >> elem;
                    cout << "Cantitate: "; cin >> cantitate;
                    if (elem == 'H') masaElem = H;
                    else if (elem == 'C') masaElem = C;
                    else if (elem == 'N') masaElem = N;
                    else if (elem == 'O') masaElem = O;
                    else if (elem == 'S') masaElem = S;
                    else {
                        cout << "Element necunoscut!" << endl;
                        continue; // sarim peste acest element si trecem la urmatorul
                    }
                    total += cantitate * masaElem;
                }
                masa = total;
                break;
            }
        }
        if (optiune >= 1 && optiune <= 6 && masa > 0)
            cout << " = " << masa << " u" << endl;
    } while (optiune != 0);
    
    return 0;
}

Cum funcționează parsarea manuală?

Parcurgere pas cu pas pentru H₂SO₄:
PasElement (char)CantitateMasă elementC++: cant*meTotal acumulat
1H212*1=20+2=2
2S1321*32=322+32=34
3O4164*16=6434+64=98

Total: 2 + 32 + 64 = 98 u

Greșeli frecvente

Eroare #1: Element necunoscut fără mesaj

Dacă utilizatorul introduce un element care nu e în listă (ex: 'P' pentru fosfor), programul adaugă 0 la masă — fără avertisment! Adaugă mereu else { cout << "Element necunoscut!"; }

Eroare #2: Simboluri cu 2 litere

Na, Cl, Ca, Fe au 2 caractere. Cu char elem citești doar 'N', nu "Na". Pentru simboluri cu 2 litere, folosește string în loc de char.

Eroare #3: Cantitate 1 presupusă

În formula CO₂, carbonul are cantitatea 1 (nu se scrie explicit). Dacă utilizatorul uită să scrie 1, programul trebuie gestionat corect.

Verificare cunoștințe

1. Masa moleculară a CO₂ este:

2. De ce folosim const pentru masele atomice?

3. Câte elemente distincte are formula C₆H₁₂O₆?

4. Masa moleculară a NH₃ (amoniac) este:

5. Pentru H₂SO₄ introdus manual, câte elemente introduci?

Extensie: formule cu paranteze și coeficienți

Formulele din lecție pot fi introduse manual ca perechi element-cantitate. Pentru formule mai realiste apar două cazuri noi:

  • Coeficient în fața moleculei: 2H2O înseamnă două molecule de apă, deci masa totală este 2 * masa(H2O).
  • Paranteze: Ca(OH)2 înseamnă Ca + 2*O + 2*H; multiplicatorul de după paranteză se aplică tuturor elementelor din grup.
Ca(OH)2 = Ca + 2·O + 2·H = 40 + 2·16 + 2·1 = 74 u
// idee: calculezi grupul dintre paranteze, apoi îl înmulțești cu factorul
Pentru liceu, poți trata parantezele ca extensie: întâi formule simple, apoi grupuri multiplicate.

Întrebări frecvente (FAQ)

De ce masele atomice sunt numere întregi în program?

În realitate, masele atomice sunt zecimale (ex: Cl = 35.45 u), dar pentru simplitate folosim valori rotunjite la cel mai apropiat întreg. La acest nivel, diferența e neglijabilă. Poți folosi double pentru precizie mai mare.

Cum gestionez simboluri cu 2 litere (Na, Cl, Fe)?

Folosește string în loc de char: string elem; cin >> elem;. Apoi compari cu if(elem == "Na"). Așa funcționează și pentru H (1 literă) și Na (2 litere).

Cum adaug un element nou în program?

Trei pași: (1) declară constanta: const int Fe = 56;, (2) adaugă un case nou în switch, (3) adaugă un else if în parsarea manuală. Ideal, folosește un vector de structuri pentru scalabilitate.

De ce masa H₂O nu e exact 18.000 g/mol?

Masa atomică reală a H este 1.008 u (nu exact 1), iar O este 15.999 u. Deci H₂O = 2×1.008 + 15.999 = 18.015 u. Noi rotunjim pentru simplitate — la nivel de programare educațională, diferența e minimă.

PROBLEME PBINFO - 15 minute

PbInfo - Masa pentru H2O

Formula simpla

Enunț:

Cerință: Calculeaza masa moleculara pentru formula H2O.

Date de intrare:

Formula H2O.

Date de ieșire:

Masa moleculara.

Exemplu:

Intrare:

H2O

Ieșire:

18

Explicație: 2*1+16=18.

Cum gândim soluția:
  1. Citim formula ca string.
  2. Pentru H adaugam 1 inmultit cu numarul de atomi.
  3. Pentru O adaugam 16.

Tip: Pentru aceasta problema poti trata doar H, C, O.

Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;

int masaAtomica(char e) {
    if (e == 'H') return 1;
    if (e == 'C') return 12;
    if (e == 'O') return 16;
    return 0;
}

int main() {
    string f;
    cin >> f;
    int total = 0;
    for (int i = 0; i < f.size(); i++) {
        char e = f[i];
        int nr = 1;
        if (i + 1 < f.size() && isdigit(f[i + 1])) {
            nr = f[i + 1] - '0'; // caracterul '2' devine numarul 2
            i++;                 // sarim peste cifra deja folosita
        }
        total += masaAtomica(e) * nr;
    }
    cout << total;
}

PbInfo - Masa pentru CO2

Atom implicit

Enunț:

Cerință: Calculeaza masa moleculara pentru CO2.

Date de intrare:

Formula CO2.

Date de ieșire:

Masa moleculara.

Exemplu:

Intrare:

CO2

Ieșire:

44

Explicație: C=12 si O2=32.

Cum gândim soluția:
  1. C are numar implicit 1.
  2. O are numar 2.
  3. Adunam 12+32.

Tip: Numarul lipsa inseamna 1.

Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int masa(char e) {
    if (e == 'H') return 1;
    if (e == 'C') return 12;
    if (e == 'O') return 16;
    return 0;
}
int main() {
    string f;
    cin >> f;
    int total = 0;
    for (int i = 0; i < f.size(); i++) {
        char e = f[i];
        int nr = 1;
        if (i + 1 < f.size() && isdigit(f[i + 1])) {
            nr = f[i + 1] - '0';
            i++;
        }
        total += masa(e) * nr;
    }
    cout << total;
}

PbInfo - Formula cu mai multi termeni

Parsare simpla

Enunț:

Cerință: Se citeste o formula formata din H, C, O si cifre de o singura cifra. Afiseaza masa.

Date de intrare:

Formula chimica.

Date de ieșire:

Masa moleculara.

Exemplu:

Intrare:

C6H6O

Ieșire:

94

Explicație: 6*12+6*1+16=94.

Cum gândim soluția:
  1. Parcurgem caracterele.
  2. Cand gasim element, citim cifra de dupa el daca exista.
  3. Adunam masa atomica * numar.

Tip: Aceasta varianta nu trateaza paranteze. isdigit(f[i+1]) verifica daca urmatorul caracter este cifra, iar f[i+1] - '0' transforma caracterul '6' in numarul 6.

Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int masa(char e) {
    if (e == 'H') return 1;
    if (e == 'C') return 12;
    if (e == 'O') return 16;
    return 0;
}
int main() {
    string f;
    cin >> f;
    int total = 0;
    for (int i = 0; i < f.size(); i++) {
        char e = f[i];
        int nr = 1;
        if (i + 1 < f.size() && isdigit(f[i + 1])) {
            nr = f[i + 1] - '0';
            i++;
        }
        total += masa(e) * nr;
    }
    cout << total;
}
EXERCIȚII PRACTICE - 2 sarcini / 20 minute

Exercițiul Practic: Masa moleculară

Aplică masele atomice pentru formule chimice simple, comparații și validări de substanțe. Poți rezolva cu formule scrise direct sau cu citire manuală element-cantitate.

Important: parserul simplu din lecție citește doar elemente de o literă și cifre de o singură cifră. Pentru Na, Cl sau Ca, este mai clar să folosești variante scrise direct în case, așa cum apare la sarcina 1.

Sarcina 1: Adaugă substanțe noi

Adaugă în meniu: C₆H₁₂O₆ (Glucoză), NaCl (Sare - Na=23, Cl=35), CaCO₃ (Calcar - Ca=40).

M(C₆H₁₂O₆) = 6×12 + 12×1 + 6×16 = 180 u
masa = 6*C + 12*H + 6*O; // glucoză
„fiecare substanță = un case nou în switch, cu formula ei de masă"
Pași de rezolvare
  1. Declară noi constante: const int Na=23, Cl=35, Ca=40;
  2. Adaugă case 7: masa = 6*C + 12*H + 6*O; (Glucoză)
  3. Adaugă case 8: masa = 1*Na + 1*Cl; (NaCl)
  4. Adaugă case 9: masa = 1*Ca + 1*C + 3*O; (CaCO₃)
  5. Verifică: Glucoză=180, NaCl=58, CaCO₃=100
// Pseudocod: Adăugare substanțe noi în meniu SET Na 23, Cl 35, Ca 40 // constante noi CASE 7: masa 6·C + 12·H + 6·O // Glucoză C₆H₁₂O₆ CASE 8: masa 1·Na + 1·Cl // NaCl CASE 9: masa 1·Ca + 1·C + 3·O // CaCO₃

De ce funcționează? Fiecare substanță nouă devine un case în switch. Formula chimică se traduce direct: cantitate × masă atomică pentru fiecare element, toate însumate. Constantele Na, Cl, Ca se adaugă o singură dată, apoi se folosesc în oricâte case-uri.

// Adauga constante noi (se declara o singura data)
const int Na = 23, Cl = 35, Ca = 40;

// In switch, adauga aceste case-uri:
case 7: masa = 6*C + 12*H + 6*O;       // Glucoza C6H12O6 = 72+12+96 = 180
    cout << "C6H12O6 = 6*12 + 12*1 + 6*16";
    break;
case 8: masa = 1*Na + 1*Cl;             // Sare NaCl = 23+35 = 58
    cout << "NaCl = 23 + 35";
    break;
case 9: masa = 1*Ca + 1*C + 3*O;       // Calcar CaCO3 = 40+12+48 = 100
    cout << "CaCO3 = 40 + 12 + 3*16";
    break;
Sarcina 2: Compararea a două substanțe

Citește datele pentru 2 substanțe (manual). Afișează care are masa moleculară mai mare.

M₁ vs M₂: compară suma(n×m) pentru fiecare substanță
if(masa[0] > masa[1]) cout << "Substanta 1 e mai grea";
„calculează masa fiecărei substanțe separat, apoi compară cele două valori"
Pași de rezolvare
  1. FOR s = 0..1: citește elementele fiecărei substanțe
  2. Acumulează: masa[s] += cant * me;
  3. Compară: if(masa[0] > masa[1]) → substanța 1 e mai grea
// Pseudocod: Compararea a două substanțe PENTRU s 0 LA 1 CITEȘTE n // nr. elemente substanță s masa[s] 0 PENTRU i 0 LA n-1 CITEȘTE elem, cant me masaAtomica(elem) // H→1, C→12, ... masa[s] masa[s] + cant · me SFÂRȘIT PENTRU SFÂRȘIT PENTRU DACĂ masa[0] > masa[1] ATUNCI SCRIE "Substanța 1 e mai grea" ALTFEL DACĂ masa[1] > masa[0] ATUNCI SCRIE "Substanța 2 e mai grea" ALTFEL SCRIE "Au aceeași masă"

De ce funcționează? Folosim un vector masa[2] pentru a stoca masele celor două substanțe. Bucla exterioară (s=0..1) parcurge cele 2 substanțe, iar cea interioară citește elementele fiecăreia. La final, o simplă comparație cu if ne spune care e mai grea.

#include <iostream>
using namespace std;

int main(){
    const int H=1,C=12,N=14,O=16,S=32;  // mase atomice constante
    int masa[2];                          // masa[0]=subst.1, masa[1]=subst.2
    for(int s=0;s<2;s++){                // parcurgem cele 2 substante
        int n; char elem;
        cout << "Substanta " << s+1 << " - nr elemente: ";
        cin >> n;
        masa[s]=0;                        // initializam masa substanței s
        for(int i=0;i<n;i++){             // citim fiecare element
            int cant, me=0;
            cout << "Element si cantitate: ";
            cin >> elem >> cant;          // ex: H 2
            if(elem=='H')me=H; else if(elem=='C')me=C;
            else if(elem=='N')me=N; else if(elem=='O')me=O;
            else if(elem=='S')me=S;
            masa[s]+=cant*me;             // acumulam: cantitate * masa atomica
        }
        cout << "Masa: " << masa[s] << " u" << endl;
    }
    // Comparare finala
    if(masa[0]>masa[1]) cout << "Substanta 1 e mai grea";
    else if(masa[1]>masa[0]) cout << "Substanta 2 e mai grea";
    else cout << "Au aceeasi masa";
    return 0;
}

Descarcă toate exercițiile și soluțiile