Ce vei învăța astăzi?
După această lecție, vei putea calcula diverse expresii matematice folosind elementele unui vector.
Ce înseamnă calculul unor expresii?
Definiție: Calculul expresiilor pe vectori înseamnă parcurgerea vectorului și aplicarea unor operații matematice asupra elementelor sale.
Exemplu: Pentru vectorul [2, 4, 6, 8]:
✓ Suma: 2 + 4 + 6 + 8 = 20
✓ Produsul: 2 × 4 × 6 × 8 = 384
✓ Media: (2 + 4 + 6 + 8) ÷ 4 = 5
Demonstrație: Calculul sumei pentru vectorul [3, 7, 2, 9, 4]
Analogii pentru a înțelege calculele pe vectori:
Ca și cum ai aduna toate notele din catalog pentru a calcula media clasei.
Ca și cum ai face suma tuturor produselor din coșul de cumpărături.
Ca și cum ai calcula temperatura medie pe parcursul unei săptămâni.
Algoritmi pentru calculul expresiilor
Regula de aur: Întotdeauna inițializezi suma cu 0. Dacă inițializezi cu altceva, rezultatul va fi greșit!
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
const int MAX = 1000;
int v[MAX];
// Citire vector
for (int i = 0; i < n; i++) {
cin >> v[i];
}
// Calcul suma
int suma = 0; // Inițializare CRUCIALĂ cu 0
for (int i = 0; i < n; i++) {
suma = suma + v[i]; // Adunăm fiecare element
// Echivalent: suma += v[i];
}
cout << "Suma elementelor este: " << suma << endl;
return 0;
}
Suma simplă
Suma cu condiție
Important: Produsul se inițializează cu 1, nu cu 0! Dacă ai 0 × ceva = 0, deci totul ar fi 0.
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
const int MAX = 1000;
int v[MAX];
// Citire vector
for (int i = 0; i < n; i++) {
cin >> v[i];
}
// Calcul produs
int produs = 1; // Inițializare cu 1
for (int i = 0; i < n; i++) {
produs = produs * v[i]; // Înmulțim fiecare element
// Echivalent: produs *= v[i];
}
cout << "Produsul elementelor este: " << produs << endl;
return 0;
}
Atenție la overflow! Dacă produsul devine prea mare, poate depăși limita tipului de date. Pentru numere mari, folosește long long sau double.
Precizie: Pentru media exactă (cu zecimale), folosește tipul float sau double și împărțirea reală.
#include <iostream>
#include <iomanip> // Pentru setprecision
using namespace std;
int main() {
int n;
cin >> n;
if (n == 0) {
cout << "Nu se poate calcula media pentru vector gol!" << endl;
return 0;
}
const int MAX = 1000;
int v[MAX];
// Citire vector
for (int i = 0; i < n; i++) {
cin >> v[i];
}
// Calcul suma
int suma = 0;
for (int i = 0; i < n; i++) {
suma += v[i];
}
// Calcul media (cu zecimale)
double media = (double)suma / n; // Conversie la double pentru împărțire reală
cout << fixed << setprecision(2); // Afișăm cu 2 zecimale
cout << "Media aritmetica este: " << media << endl;
return 0;
}
Formula matematică: Media aritmetică = (x₁ + x₂ + ... + xₙ) / n
Caz special: Pentru n=0 (vector gol), media nu este definită. Trebuie să tratăm acest caz.
Aplicații: Suma pătratelor este folosită în statistică, fizică și algoritmi de machine learning.
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
const int MAX = 1000;
int v[MAX];
// Citire vector
for (int i = 0; i < n; i++) {
cin >> v[i];
}
// Calcul suma pătratelor
int sumaPatrate = 0;
for (int i = 0; i < n; i++) {
sumaPatrate += v[i] * v[i]; // Adunăm pătratul fiecărui element
}
cout << "Suma patratelor este: " << sumaPatrate << endl;
// Varianta pentru suma cuburilor
int sumaCuburi = 0;
for (int i = 0; i < n; i++) {
sumaCuburi += v[i] * v[i] * v[i];
}
cout << "Suma cuburilor este: " << sumaCuburi << endl;
return 0;
}
Suma pătratelor
Suma cuburilor
Exercițiu de completare - Calculul sumei:
Completează TOATE spațiile libere din codul C++ pentru calculul sumei elementelor unui vector:
Bancă de cuvinte:
Instrucțiuni:
1. Click pe un spațiu liber (______)
2. Click pe cuvântul corect din bancă
Test de înțelegere: Care este valoarea inițială corectă?
Test rapid - inițializarea variabilelor:
Pentru fiecare calcul, alege valoarea inițială corectă:
Suma elementelor
Produsul elementelor
Suma pătratelor
Expresii complexe și combinații
Calculul unor expresii mai complexe:
// Calcul media ponderată: suma(nota[i] * pondere[i]) / suma(pondere[i])
double sumaProduse = 0;
double sumaPonderi = 0;
for (int i = 0; i < n; i++) {
sumaProduse += nota[i] * pondere[i];
sumaPonderi += pondere[i];
}
double mediaPonderata = sumaProduse / sumaPonderi;
cout << "Media ponderata: " << mediaPonderata << endl;
Măsoară împrăștierea datelor față de medie.
// Calcul deviație standard: sqrt(suma((x[i] - media)^2) / n)
double suma = 0;
for (int i = 0; i < n; i++) {
suma += v[i];
}
double media = suma / n;
double sumaPatrateDiferente = 0;
for (int i = 0; i < n; i++) {
double diferenta = v[i] - media;
sumaPatrateDiferente += diferenta * diferenta;
}
double deviatieStandard = sqrt(sumaPatrateDiferente / n);
cout << "Deviatia standard: " << deviatieStandard << endl;
Sfaturi practice pentru calcule pe vectori
Suma → 0, Produsul → 1, Numărătoarea → 0
Pentru sume mari → long long, pentru medii cu zecimale → double
Verifică întotdeauna dacă n > 0 înainte de a calcula media.
suma += v[i] este mai eficient și mai clar decât suma = suma + v[i]
Încălzire (2 minute)
Test rapid - calcul expresii: Pentru vectorul [2, 5, 3, 8], calculează:
- Suma → verifică
- Produsul → verifică
- Media → verifică
- Suma pătratelor → verifică
Regulă: Suma = 2+5+3+8, Produsul = 2×5×3×8, Media = suma/4, Suma pătratelor = 2+5+3+8
PbInfo #... - Suma elementelor unui vector
Enunț:
Cerință: Se citește un număr n și apoi n numere întregi. Să se calculeze suma tuturor elementelor.
Date de intrare:
Programul citește de la tastatură numărul n, apoi n numere întregi.
Date de ieșire:
Programul va afișa pe ecran suma elementelor.
Exemplu:
Intrare:
5 10 20 5 30 15
Ieșire:
80
Explicație: 10 + 20 + 5 + 30 + 15 = 80
Cum gândim soluția:
- Citim n și cele n elemente
- Inițializăm o variabilă
sumacu 0 - Parcurgem vectorul și pentru fiecare element:
- Adăugăm elementul la sumă:
suma += v[i]
- Adăugăm elementul la sumă:
- Afișăm suma
Execuție pentru n=4 cu valori 7, 2, 9, 4:
Ce trebuie să verifici mereu?
- Inițializarea sumei cu 0 (foarte important!)
- Citirea corectă a tuturor elementelor
- Folosirea tipului de date potrivit (dacă suma poate fi mare, folosește
long long) - Parcurgerea corectă a vectorului (de la 0 la n-1)
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
const int MAX = 1000;
int v[MAX];
// Citire elemente
for (int i = 0; i < n; i++) {
cin >> v[i];
}
// Calcul suma
int suma = 0; // Inițializare CRUCIALĂ cu 0
for (int i = 0; i < n; i++) {
suma += v[i]; // Adunăm fiecare element la sumă
}
// Afișare rezultat
cout << suma << endl;
return 0;
}
Varianta cu tip de date mai mare:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
// Dacă n este mare sau numerele sunt mari, folosim long long
const int MAX = 100000;
int v[MAX];
for (int i = 0; i < n; i++) {
cin >> v[i];
}
long long suma = 0; // long long pentru sume foarte mari
for (int i = 0; i < n; i++) {
suma += v[i];
}
cout << suma << endl;
return 0;
}
Ce învățăm din această problemă:
- Structura de bază a calculului sumei: inițializare, parcurgere, acumulare
- Importanța inițializării: suma trebuie începută de la 0
- Alegerea tipului de date: pentru sume mari, folosim
long long - Operatorul compus +=: mai eficient și mai clar
- Parcurgerea completă: de la primul la ultimul element
PbInfo #... - Media aritmetică
Problemă care calculează media elementelor unui vector
Enunț:
Cerință: Se citește un număr n și apoi n numere întregi. Să se calculeze media aritmetică a elementelor.
Date de intrare:
Programul citește de la tastatură numărul n, apoi n numere întregi.
Date de ieșire:
Programul va afișa pe ecran media aritmetică, cu exact două zecimale.
Exemplu:
Intrare:
5 10 20 5 30 15
Ieșire:
16.00
Explicație: (10 + 20 + 5 + 30 + 15) / 5 = 80 / 5 = 16.00
Cum gândim soluția:
- Citim n și cele n elemente
- Calculăm suma elementelor (ca la problema anterioară)
- Calculăm media ca
suma / n - Atenție: Pentru media cu zecimale, trebuie să facem împărțire reală:
double media = (double)suma / n;- Sau folosim
sumacadoublede la început
- Afișăm media cu 2 zecimale
Cum funcționează pentru n=4 cu valori 7, 2, 9, 4:
De ce trebuie conversie la double?
Pentru că împărțirea a două numere întregi în C++ dă rezultat întreg (partea întreagă). Pentru a obține zecimale, trebuie să convertim cel puțin un operand la tip real (float sau double).
Formula cheie: double media = (double)suma / n;
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <iomanip> // Pentru setprecision
using namespace std;
int main() {
int n;
cin >> n;
// Verificăm cazul n=0
if (n == 0) {
cout << "Nu se poate calcula media pentru vector gol!" << endl;
return 0;
}
const int MAX = 1000;
int v[MAX];
// Citire elemente
for (int i = 0; i < n; i++) {
cin >> v[i];
}
// Calcul suma
int suma = 0;
for (int i = 0; i < n; i++) {
suma += v[i];
}
// Calcul media (cu conversie la double pentru zecimale)
double media = (double)suma / n;
// Afișare cu 2 zecimale
cout << fixed << setprecision(2);
cout << media << endl;
return 0;
}
Varianta cu suma ca double:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int n;
cin >> n;
if (n == 0) {
cout << "0.00" << endl; // Convenție: media vectorului gol este 0
return 0;
}
const int MAX = 1000;
int v[MAX];
for (int i = 0; i < n; i++) {
cin >> v[i];
}
// Folosim double pentru sumă de la început
double suma = 0;
for (int i = 0; i < n; i++) {
suma += v[i];
}
double media = suma / n; // Nu mai e nevoie de conversie
cout << fixed << setprecision(2);
cout << media << endl;
return 0;
}
Ce învățăm din această problemă:
- Calculul mediei: suma / număr_elemente
- Importanța conversiei la tip real: pentru a obține zecimale
- Tratarea cazului n=0: împărțirea la 0 este eroare
- Formatarea afișării: cu
fixedșisetprecision - Precizia calculelor: folosirea
doublepentru calcule exacte
PbInfo #... - Suma pătratelor
Problemă care calculează suma pătratelor elementelor
Enunț:
Cerință: Se citește un număr n și apoi n numere întregi. Să se calculeze suma pătratelor elementelor.
Date de intrare:
Programul citește de la tastatură numărul n, apoi n numere întregi.
Date de ieșire:
Programul va afișa pe ecran suma pătratelor elementelor.
Exemplu:
Intrare:
4 1 2 3 4
Ieșire:
30
Explicație: 1 + 2 + 3 + 4 = 1 + 4 + 9 + 16 = 30
Cum gândim soluția:
- Citim n și cele n elemente
- Inițializăm o variabilă
sumaPatratecu 0 - Parcurgem vectorul o singură dată:
- Pentru fiecare element, calculăm pătratul:
v[i] * v[i] - Adăugăm pătratul la sumă:
sumaPatrate += v[i] * v[i]
- Pentru fiecare element, calculăm pătratul:
- Afișăm suma pătratelor
- Observație: Atenție la overflow! Pătratele cresc rapid.
Execuție pentru n=3 cu valori 2, 3, 4:
De ce este important tipul de date?
Pătratul unui număr crește mult mai repede decât numărul însuși. De exemplu, pătratul lui 100.000 este 10.000.000.000, care depășește limita tipului int (2 miliarde).
Regula de siguranță: Pentru sume de pătrate, folosește întotdeauna long long.
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
const int MAX = 1000;
int v[MAX];
// Citire elemente
for (int i = 0; i < n; i++) {
cin >> v[i];
}
// Calcul suma pătratelor
long long sumaPatrate = 0; // long long pentru a evita overflow
for (int i = 0; i < n; i++) {
// Calculăm pătratul ca long long pentru siguranță
long long patrat = (long long)v[i] * v[i];
sumaPatrate += patrat;
// SAU direct: sumaPatrate += (long long)v[i] * v[i];
}
// Afișare rezultate
cout << sumaPatrate << endl;
return 0;
}
Varianta pentru suma cuburilor:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
const int MAX = 1000;
int v[MAX];
for (int i = 0; i < n; i++) {
cin >> v[i];
}
// Calcul suma cuburilor (și mai rapidă creștere!)
long long sumaCuburi = 0;
for (int i = 0; i < n; i++) {
// Calculăm cubul ca long long
long long cub = (long long)v[i] * v[i] * v[i];
sumaCuburi += cub;
}
cout << sumaCuburi << endl;
return 0;
}
Ce învățăm din această problemă:
- Calculul puterilor: pătrate (), cuburi (), etc.
- Problema overflow-ului: puterile cresc rapid, necesită tipuri de date mai mari
- Conversia sigură:
(long long)v[i] * v[i]asigură că înmulțirea se face pe 64 de biți - Aplicații practice: statistica, fizică, algoritmi de optimizare
- Generalizarea: aceeași structură pentru orice expresie calculată pe elemente
Exercițiul Practic: Calculatoare statistice
Sarcini de lucru
Completează următoarele sarcini pentru a-ți consolida cunoștințele despre calculul expresiilor pe vectori
Sarcina 1: Analiză și corectare cod
Analizează următorul cod și găsește greșelile:
#include <iostream>
using namespace std;
int main() {
int n = 5;
int vector[5] = {8, 3, 10, 2, 7};
// Calcul suma
int suma = 1; // începem cu 1
for (int i = 0; i < n; i++) {
suma = suma * vector[i]; // înmulțim în loc să adunăm
}
// Calcul produs
int produs = 0; // începem cu 0
for (int i = 0; i < n; i++) {
produs = produs + vector[i]; // adunăm în loc să înmulțim
}
cout << "Suma: " << suma << endl;
cout << "Produs: " << produs << endl;
return 0;
}
Soluție pentru Sarcina 1:
Greșeli identificate și corecții:
- 1. Inițializare greșită a sumei:
int suma = 1;este greșit pentru suma.
Corect:int suma = 0; - 2. Operație greșită în bucla sumei:
suma = suma * vector[i];este înmulțire, nu adunare.
Corect:suma = suma + vector[i];sausuma += vector[i]; - 3. Inițializare greșită a produsului:
int produs = 0;este greșit pentru produs.
Corect:int produs = 1; - 4. Operație greșită în bucla produsului:
produs = produs + vector[i];este adunare, nu înmulțire.
Corect:produs = produs * vector[i];sauprodus *= vector[i];
Cod corectat:
#include <iostream>
using namespace std;
int main() {
int n = 5;
int vector[5] = {8, 3, 10, 2, 7};
// Calcul suma CORECT
int suma = 0; // CORECT: începem cu 0
for (int i = 0; i < n; i++) {
suma += vector[i]; // CORECT: adunăm
}
// Calcul produs CORECT
int produs = 1; // CORECT: începem cu 1
for (int i = 0; i < n; i++) {
produs *= vector[i]; // CORECT: înmulțim
}
cout << "Suma: " << suma << endl;
cout << "Produs: " << produs << endl;
return 0;
}
Sarcina 2: Implementare completă
Cerință: Scrie un program care citește n, apoi n numere. Programul calculează și afișează: 1. Suma elementelor 2. Produsul elementelor (atenție la overflow) 3. Media aritmetică (cu 2 zecimale) 4. Suma pătratelor elementelor 5. Suma elementelor pare 6. Media elementelor pozitive
Soluție pentru Sarcina 2:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int n;
cin >> n;
if (n == 0) {
cout << "Vectorul este gol!" << endl;
return 0;
}
const int MAX = 1000;
int v[MAX];
// 1. Citire elemente
for (int i = 0; i < n; i++) {
cin >> v[i];
}
// 2. Calcul suma
long long suma = 0;
for (int i = 0; i < n; i++) {
suma += v[i];
}
// 3. Calcul produs (cu verificare overflow)
long long produs = 1;
bool overflow = false;
for (int i = 0; i < n; i++) {
// Verificăm dacă produsul va depăși limita
if (produs > LLONG_MAX / v[i]) {
overflow = true;
break;
}
produs *= v[i];
}
// 4. Calcul media
double media = (double)suma / n;
// 5. Calcul suma pătratelor
long long sumaPatrate = 0;
for (int i = 0; i < n; i++) {
sumaPatrate += (long long)v[i] * v[i];
}
// 6. Calcul suma elementelor pare
long long sumaPare = 0;
int numarPare = 0;
for (int i = 0; i < n; i++) {
if (v[i] % 2 == 0) {
sumaPare += v[i];
numarPare++;
}
}
// 7. Calcul media elementelor pozitive
long long sumaPozitive = 0;
int numarPozitive = 0;
for (int i = 0; i < n; i++) {
if (v[i] > 0) {
sumaPozitive += v[i];
numarPozitive++;
}
}
double mediaPozitive = (numarPozitive > 0) ? (double)sumaPozitive / numarPozitive : 0;
// Afișare rezultate
cout << fixed << setprecision(2);
cout << "1. Suma elementelor: " << suma << endl;
if (overflow) {
cout << "2. Produsul: OVERFLOW (prea mare)" << endl;
} else {
cout << "2. Produsul elementelor: " << produs << endl;
}
cout << "3. Media aritmetica: " << media << endl;
cout << "4. Suma patratelor: " << sumaPatrate << endl;
cout << "5. Suma elementelor pare: " << sumaPare << endl;
cout << "6. Media elementelor pozitive: " << mediaPozitive << endl;
return 0;
}
Explicații importante:
- Tipuri de date: Folosim
long longpentru sume și produse mari,doublepentru medii. - Verificare overflow: Pentru produs, verificăm dacă înmulțirea va depăși limita.
- Operator ternar:
(conditie ? val1 : val2)pentru calculul condițional al mediei. - Parcurgeri multiple: Fiecare calcul are propria buclă. Putem optimiza parcurgând o singură dată, dar pentru claritate este mai bine să separăm.
- Teste recomandate:
- n=5, valori: 1 2 3 4 5
- n=4, valori: 10 -5 8 -3 (testează elemente negative)
- n=3, valori: 1000 1000 1000 (testează overflow)