Ce vei învăța astăzi?
Vom aplica cunoștințele din matematică pentru a calcula distanța, perimetrul, aria (Heron) și verificarea coliniarității — totul tradus pas cu pas din formulă matematică în cod C++.
Dicționar: Matematică ↔ C++
Înainte de orice formulă, învață cum se „traduce" fiecare simbol matematic în C++:
| Simbol matematic | Cum se citește | În C++ | Bibliotecă |
|---|---|---|---|
| √x | „radical din x" | sqrt(x) | <cmath> |
| x | „x la pătrat" | x*x sau pow(x,2) | <cmath> pt pow |
| |x| | „modul / valoare absolută" | fabs(x) | <cmath> |
| π | „pi" (3.14159...) | M_PI | <cmath> |
| Δ (delta) | „discriminant / diferență" | delta (variabilă) | — |
| ≈ 0 | „aproximativ zero" | < 0.001 (epsilon) | — |
| x₁, x₂ | „x indice 1, x indice 2" | x1, x2 | — |
Regulă de aur: În C++, indicii se scriu ca cifre lipite de nume (x1, y2), nu ca subscript. Iar „la pătrat" se scrie cel mai simplu ca x*x.
Analogie: GPS și hărți
Gândește-te la Google Maps: Când cauți distanța dintre casa ta și școală, aplicația calculează exact ce vom învăța noi: folosește coordonatele celor două puncte și aplică o formulă de distanță.
La scară mică (un oraș), formula funcționează ca Pitagora pe un plan. Fiecare punct are coordonate (x, y) și distanța e „linia dreaptă" — exact ca o riglă pe hartă.
Formula distanței dintre două puncte
Definiție: Dacă avem A(x₁, y₁) și B(x₂, y₂), distanța este:
Derivă din Teorema lui Pitagora aplicată triunghiului dreptunghic format de cele două puncte.
Greșeli frecvente
- Uitarea lui
sqrt()— fără rădăcină obții distanța la pătrat pow(x2-x1, 2)vs(x2-x1)*(x2-x1)— ambele corecte, dar varianta cu înmulțire e mai rapidă- Folosirea
intîn loc dedouble— coordonatele pot fi zecimale!
Exemplu pas cu pas: A(1,2) B(4,6)
| Pas | Operație manuală | Variabilă C++ | Valoare |
|---|---|---|---|
| 1 | Δx = x₂ − x₁ = 4 − 1 | x2-x1 | 3 |
| 2 | Δy = y₂ − y₁ = 6 − 2 | y2-y1 | 4 |
| 3 | Δx = 3 = 9 | (x2-x1)*(x2-x1) | 9 |
| 4 | Δy = 4 = 16 | (y2-y1)*(y2-y1) | 16 |
| 5 | Sumă = 9 + 16 = 25 | 9 + 16 | 25 |
| 6 | d = √25 = 5 | sqrt(25) | 5.00 |
#include <iostream>
#include <cmath> // pentru sqrt()
#include <iomanip> // pentru setprecision()
using namespace std;
int main() {
double x1, y1, x2, y2;
cout << "Introdu coordonatele A(x1, y1): ";
cin >> x1 >> y1;
cout << "Introdu coordonatele B(x2, y2): ";
cin >> x2 >> y2;
// Formula: d = sqrt((x2-x1)^2 + (y2-y1)^2)
double d = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
cout << fixed << setprecision(2);
cout << "Distanta AB = " << d;
return 0;
}
Perimetrul triunghiului
Trei puncte A(x₁,y₁), B(x₂,y₂), C(x₃,y₃) → calculăm laturile:
Formula lui Heron pentru arie
Formula lui Heron calculează aria doar din lungimile laturilor, fără înălțime!
2.0 nu 2, ca să nu avem împărțire întreagă!Exemplu complet — A(0,0), B(4,0), C(0,3)
| Variabilă | Formulă | C++ | Valoare |
|---|---|---|---|
| a (BC) | √((4-0)+(0-3)) | sqrt(16+9) | 5.00 |
| b (AC) | √((0-0)+(3-0)) | sqrt(9) | 3.00 |
| c (AB) | √((4-0)+(0-0)) | sqrt(16) | 4.00 |
| P | 5 + 3 + 4 | a + b + c | 12.00 |
| s | 12 / 2 | P / 2.0 | 6.00 |
| aria | √(6·1·3·2) = √36 | sqrt(6*1*3*2) | 6.00 |
✓ Verificare: triunghi dreptunghic 3-4-5 → Aria = 3·4/2 = 6 ✓
Verificare coliniaritate: Dacă aria ≈ 0, punctele sunt coliniare.
Algoritmul complet (Pseudocod)
Algoritmul complet — de la citire la afișare — în pseudocod (keywords engleză, comentarii română):
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
// FUNCTION dist → sqrt(...)
double distanta(double x1, double y1, double x2, double y2) {
return sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
}
int main() {
double x1, y1, x2, y2, x3, y3;
// READ coordonatele
cout << "Coordonatele A: "; cin >> x1 >> y1;
cout << "Coordonatele B: "; cin >> x2 >> y2;
cout << "Coordonatele C: "; cin >> x3 >> y3;
// SET a, b, c — laturile
double a = distanta(x2, y2, x3, y3); // BC
double b = distanta(x1, y1, x3, y3); // AC
double c = distanta(x1, y1, x2, y2); // AB
// SET P, s, aria
double P = a + b + c;
double s = P / 2.0; // IMPORTANT: 2.0 nu 2
double aria = sqrt(s * (s-a) * (s-b) * (s-c)); // Heron
cout << fixed << setprecision(2);
cout << "Latura a (BC) = " << a << endl;
cout << "Latura b (AC) = " << b << endl;
cout << "Latura c (AB) = " << c << endl;
cout << "Perimetrul = " << P << endl;
cout << "Aria = " << aria << endl;
// IF aria < 0.001 → coliniare
if (aria < 0.001) {
cout << "Punctele sunt coliniare!";
} else {
cout << "Triunghi valid.";
}
return 0;
}
Rezumat: Matematică → C++
| Ce calculăm | Formula matematică | În C++ | Cum se citește |
|---|---|---|---|
| Distanța AB | d = √((x₂−x₁)+(y₂−y₁)) | sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)) | radical din suma pătratelor diferențelor |
| Perimetrul | P = a + b + c | P = a + b + c | P egal suma laturilor |
| Semiperimetru | s = P / 2 | s = P / 2.0 | s egal P supra 2 (cu .0!) |
| Aria (Heron) | √(s·(s−a)·(s−b)·(s−c)) | sqrt(s*(s-a)*(s-b)*(s-c)) | radical din s ori factorii |
| Coliniaritate | Aria ≈ 0 | aria < 0.001 | aria mai mică decât epsilon |
Atenție: Nu compara aria == 0 cu double. Folosește aria < 0.001 — virgula mobilă are erori de rotunjire.
Verificare cunoștințe
1. Care este distanța dintre A(0,0) și B(3,4)?
2. Ce reprezintă semiperimetrul s?
3. Dacă aria unui triunghi este ≈ 0, ce înseamnă?
4. De ce comparăm aria < 0.001 și nu aria == 0?
5. Ce linie C++ calculează corect distanța?
Întrebări frecvente (FAQ)
Da, pow(x2-x1, 2) funcționează. Dar (x2-x1)*(x2-x1) este mai rapid. La examen, ambele sunt acceptate.
Formula funcționează perfect! Diferența se ridică la pătrat → mereu pozitiv. Distanța este mereu ≥ 0.
Dacă P e int, P/2 face împărțire întreagă (trunchiază): 13/2 = 6. Cu 2.0 forțăm împărțire reală: 13/2.0 = 6.5.
Inegalitatea triunghiului: a+b > c && a+c > b && b+c > a. Echivalent cu aria ≠ 0 din Heron.
PbInfo - Distanta dintre doua puncte
Formula distantei
Enunț:
Cerință: Se citesc coordonatele a doua puncte. Afiseaza distanta dintre ele cu doua zecimale.
Date de intrare:
x1 y1 x2 y2.
Date de ieșire:
Distanta dintre puncte.
Exemplu:
Intrare:
0 0 3 4
Ieșire:
5.00
Explicație: Distanta este sqrt(3^2+4^2)=5.
Cum gândim soluția:
- Calculam dx=x2-x1 si dy=y2-y1.
- Aplicam sqrt(dx*dx+dy*dy).
- Afisam cu doua zecimale.
Tip: Foloseste double si iomanip.
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int main() {
double x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
double d = sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
cout << fixed << setprecision(2) << d;
}
PbInfo - Aria Heron
Triunghi din laturi
Enunț:
Cerință: Se citesc trei laturi. Daca formeaza triunghi, afiseaza aria prin formula lui Heron.
Date de intrare:
a b c.
Date de ieșire:
Aria sau mesajul Imposibil.
Exemplu:
Intrare:
3 4 5
Ieșire:
6.00
Explicație: Semiperimetrul este 6, aria este 6.
Cum gândim soluția:
- Verificam inegalitatile triunghiului.
- Calculam s=(a+b+c)/2.
- Aplicam sqrt(s*(s-a)*(s-b)*(s-c)).
Tip: Nu aplica Heron inainte sa verifici triunghiul.
Scrie soluția în C++:
Soluție corectă:
#include < iostream >
#include < iomanip >
#include < cmath >
using namespace std;
int main() {
double a, b, c;
cin >> a >> b >> c;
if (a + b <= c||a + c <= b||b + c <= a) {
cout << "Imposibil";
return 0;
}
double s = (a + b + c) / 2;
cout << fixed << setprecision(2) << sqrt(s * (s - a) * (s - b) * (s - c));
}
PbInfo - Coliniaritate
Arie zero
Enunț:
Cerință: Se citesc trei puncte. Afiseaza DA daca sunt coliniare, altfel NU.
Date de intrare:
Coordonatele celor trei puncte.
Date de ieșire:
DA sau NU.
Exemplu:
Intrare:
0 0 1 1 2 2
Ieșire:
DA
Explicație: Punctele sunt pe aceeasi dreapta.
Cum gândim soluția:
- Calculam determinantul.
- Daca determinantul este 0, aria este 0.
- Afisam DA/NU.
Tip: Pentru coordonate intregi poti compara determinantul exact cu 0.
Scrie soluția în C++:
Soluție corectă:
#include <iostream>
using namespace std;
int main() {
long long x1, y1, x2, y2, x3, y3;
cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
long long det = x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2);
cout << (det == 0?"DA":"NU");
}
Exercițiul Practic: Distanța dintre puncte
Aplică formulele geometriei analitice pentru distanțe, perimetre și clasificarea triunghiurilor.
Sarcina 1: Distanța maximă dintre n puncte
Citește n puncte și afișează distanța maximă dintre oricare două.
Pași de rezolvare:
- Citește
n, apoi coordonatele în vectoriix[100], y[100] - Inițializează
maxD = 0 - Două for-uri imbricate:
i=0..n-1,j=i+1..n-1 - Calculează
d = sqrt((x[j]-x[i])+(y[j]-y[i])) - Dacă
d > maxD→ actualizează - Afișează
maxDcu 2 zecimale
double d = sqrt((x[j]-x[i])*(x[j]-x[i]) + (y[j]-y[i])*(y[j]-y[i]));De ce funcționează? Parcurgem fiecare pereche de puncte (i, j) fără repetiție (j pornește de la i+1). Pentru fiecare pereche calculăm distanța cu sqrt() și păstrăm doar cea mai mare valoare în maxD.
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main(){
int n; cin >> n; // nr. de puncte
double x[100], y[100]; // coordonatele punctelor
for(int i=0;i<n;i++) cin >> x[i] >> y[i];
double maxD = 0; // distanța maximă găsită
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++){ // fiecare pereche (i,j)
double d = sqrt((x[j]-x[i])*(x[j]-x[i]) // formula distanței
+ (y[j]-y[i])*(y[j]-y[i]));
if(d > maxD) maxD = d; // actualizăm maximul
}
cout << fixed << setprecision(2) << maxD; // 2 zecimale
return 0;
}
Sarcina 2: Clasificare triunghi
Clasifică triunghiul: echilateral, isoscel sau scalen.
Pași de rezolvare:
- Calculează a, b, c cu formula distanței
- Definește
eps = 0.001 - Compară cu
fabs(a-b) < eps— nu cu==! - a ≈ b ≈ c → echilateral; 2 egale → isoscel; altfel → scalen
fabs(a - b) < epsDe ce funcționează? Nu comparăm numere reale cu == (erori de precizie!). Folosim fabs(a-b) < eps — dacă diferența e „aproape zero", considerăm laturile egale. Ordinea: verificăm întâi echilateral (3 egale), apoi isoscel (2 egale).
#include <iostream>
#include <cmath>
using namespace std;
int main(){
double x1,y1,x2,y2,x3,y3;
cin>>x1>>y1>>x2>>y2>>x3>>y3;
double a=sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)); // latura a
double b=sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1)); // latura b
double c=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); // latura c
double eps=0.001; // toleranță pt comparare reali
// fabs() = valoare absolută pt double
if(fabs(a-b)<eps && fabs(b-c)<eps) // toate 3 egale?
cout<<"Echilateral";
else if(fabs(a-b)<eps || fabs(b-c)<eps || fabs(a-c)<eps) // 2 egale?
cout<<"Isoscel";
else
cout<<"Scalen";
return 0;
}