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.
Dicționar: Chimie ↔ C++ (Mase moleculare)
| Concept chimic | Cum se citește | În C++ | Observație |
|---|---|---|---|
| u (unitate masă atomică) | „u" sau „dalton" | int H = 1; | valoare constantă |
| H, C, N, O, S | simboluri chimice | const int H=1,C=12,...; | const = nu se modifică |
| H₂O (indice = cantitate) | „2 atomi de H, 1 de O" | 2*H + 1*O | cantitate × masă element |
| Σ (sumă totală) | „suma tuturor" | total += cant * me; | acumulare în buclă |
| × (înmulțire) | „ori" | cantitate * masaElem | cantitate × masă atomică |
| % (procent) | „la sută" | 100.0*cant*me/total | atenț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.
int masa = cant1*H + cant2*O + cant3*S; (predefinit) sau total += cant * masaElem; (buclă)Masele atomice
Masa atomică a unui element este masa relativă exprimată în unități de masă atomică (u).
| Element | Simbol | Masa atomică (u) |
|---|---|---|
| Hidrogen | H | 1 |
| Carbon | C | 12 |
| Azot | N | 14 |
| Oxigen | O | 16 |
| Sodiu | Na | 23 |
| Sulf | S | 32 |
| Clor | Cl | 35 |
| Potasiu | K | 39 |
| Calciu | Ca | 40 |
| Fier | Fe | 56 |
Exemple de molecule
masa = 2*H + 1*O; // = 2*1 + 1*16 = 18masa = 1*C + 2*O; // = 12 + 32 = 44masa = 2*H + 1*S + 4*O; // = 2 + 32 + 64 = 98Abordare 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.
#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₄:
| Pas | Element (char) | Cantitate | Masă element | C++: cant*me | Total acumulat |
|---|---|---|---|---|---|
| 1 | H | 2 | 1 | 2*1=2 | 0+2=2 |
| 2 | S | 1 | 32 | 1*32=32 | 2+32=34 |
| 3 | O | 4 | 16 | 4*16=64 | 34+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ă este2 * masa(H2O). - Paranteze:
Ca(OH)2înseamnăCa + 2*O + 2*H; multiplicatorul de după paranteză se aplică tuturor elementelor din grup.
// idee: calculezi grupul dintre paranteze, apoi îl înmulțești cu factorulÎntrebări frecvente (FAQ)
Î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.
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).
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.
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ă.
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:
- Citim formula ca string.
- Pentru H adaugam 1 inmultit cu numarul de atomi.
- 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:
- C are numar implicit 1.
- O are numar 2.
- 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:
- Parcurgem caracterele.
- Cand gasim element, citim cifra de dupa el daca exista.
- 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ț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).
masa = 6*C + 12*H + 6*O; // glucozăPași de rezolvare
- Declară noi constante:
const int Na=23, Cl=35, Ca=40; - Adaugă case 7:
masa = 6*C + 12*H + 6*O;(Glucoză) - Adaugă case 8:
masa = 1*Na + 1*Cl;(NaCl) - Adaugă case 9:
masa = 1*Ca + 1*C + 3*O;(CaCO₃) - Verifică: Glucoză=180, NaCl=58, CaCO₃=100
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.
if(masa[0] > masa[1]) cout << "Substanta 1 e mai grea";Pași de rezolvare
- FOR
s = 0..1: citește elementele fiecărei substanțe - Acumulează:
masa[s] += cant * me; - Compară:
if(masa[0] > masa[1])→ substanța 1 e mai grea
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;
}