Pagina Modulului 5
Ora 31 - Modulul 5

Distanța dintre două puncte

Aria și perimetrul triunghiului cu formula lui Heron, verificare coliniaritate

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

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++.

Formula distanței → sqrt() în C++
Perimetrul = suma laturilor → P = a + b + c
Formula lui Heron → sqrt(s*(s-a)*(s-b)*(s-c))
Coliniaritate: aria ≈ 0 → aria < 0.001

Dicționar: Matematică ↔ C++

Înainte de orice formulă, învață cum se „traduce" fiecare simbol matematic în C++:

Simbol matematicCum 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:

Matematică: d = √((x₂ − x₁) + (y₂ − y₁))
C++: double d = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
Se citește: „d egal radical din (x2 minus x1) la pătrat plus (y2 minus y1) la pătrat"

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 de double — coordonatele pot fi zecimale!
Exemplu pas cu pas: A(1,2) B(4,6)
PasOperație manualăVariabilă C++Valoare
1Δx = x₂ − x₁ = 4 − 1x2-x13
2Δy = y₂ − y₁ = 6 − 2y2-y14
3Δx = 3 = 9(x2-x1)*(x2-x1)9
4Δy = 4 = 16(y2-y1)*(y2-y1)16
5Sumă = 9 + 16 = 259 + 1625
6d = √25 = 5sqrt(25)5.00
Implementare C++ — Distanța
#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:

a = dist(B,C), b = dist(A,C), c = dist(A,B)
double a = sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
„a este distanța B-C = radical din diferențele la pătrat"
Perimetrul P = a + b + c
double P = a + b + c;
„P egal cu suma celor trei laturi"

Formula lui Heron pentru arie

Formula lui Heron calculează aria doar din lungimile laturilor, fără înălțime!

s = P / 2 (semiperimetrul)
double s = P / 2.0;
„s egal P împărțit la 2" — Atenție: scriem 2.0 nu 2, ca să nu avem împărțire întreagă!
Aria = √(s · (s−a) · (s−b) · (s−c))
double aria = sqrt(s * (s-a) * (s-b) * (s-c));
„aria egal radical din s ori (s minus a) ori (s minus b) ori (s minus c)"
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
P5 + 3 + 4a + b + c12.00
s12 / 2P / 2.06.00
aria√(6·1·3·2) = √36sqrt(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.

Dacă Aria ≈ 0 → punctele sunt coliniare
if (aria < 0.001) cout << "Coliniare";
„dacă aria este mai mică decât epsilon (0.001), atunci coliniare"

Algoritmul complet (Pseudocod)

Algoritmul complet — de la citire la afișare — în pseudocod (keywords engleză, comentarii română):

// Algoritmul: Distanță, Perimetru, Arie (Heron), Coliniaritate FUNCTION dist(x1, y1, x2, y2): RETURN sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)) READ x1, y1, x2, y2, x3, y3 // citește coordonatele SET a dist(x2,y2,x3,y3) // latura BC SET b dist(x1,y1,x3,y3) // latura AC SET c dist(x1,y1,x2,y2) // latura AB SET P a + b + c // perimetrul SET s P / 2.0 // semiperimetrul (2.0 nu 2!) SET aria sqrt(s*(s-a)*(s-b)*(s-c)) // formula Heron IF aria < 0.001 THEN // aria ≈ 0 → coliniare PRINT "Coliniare" ELSE PRINT P, aria // afișează perimetrul și aria END IF
Programul C++ complet (corespunde pseudocodului)
#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ămFormula matematicăÎn C++Cum se citește
Distanța ABd = √((x₂−x₁)+(y₂−y₁))sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))radical din suma pătratelor diferențelor
PerimetrulP = a + b + cP = a + b + cP egal suma laturilor
Semiperimetrus = P / 2s = P / 2.0s 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
ColiniaritateAria ≈ 0aria < 0.001aria 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)

Pot folosi pow() în loc de înmulțire manuală?

Da, pow(x2-x1, 2) funcționează. Dar (x2-x1)*(x2-x1) este mai rapid. La examen, ambele sunt acceptate.

Ce se întâmplă dacă coordonatele sunt negative?

Formula funcționează perfect! Diferența se ridică la pătrat → mereu pozitiv. Distanța este mereu ≥ 0.

De ce scriem P / 2.0 și nu P / 2?

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.

Cum verific dacă laturile formează triunghi valid?

Inegalitatea triunghiului: a+b > c && a+c > b && b+c > a. Echivalent cu aria ≠ 0 din Heron.

PROBLEME PBINFO - 15 minute

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:
  1. Calculam dx=x2-x1 si dy=y2-y1.
  2. Aplicam sqrt(dx*dx+dy*dy).
  3. 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:
  1. Verificam inegalitatile triunghiului.
  2. Calculam s=(a+b+c)/2.
  3. 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:
  1. Calculam determinantul.
  2. Daca determinantul este 0, aria este 0.
  3. 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ȚII PRACTICE - 2 sarcini / 20 minute

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:
  1. Citește n, apoi coordonatele în vectorii x[100], y[100]
  2. Inițializează maxD = 0
  3. Două for-uri imbricate: i=0..n-1, j=i+1..n-1
  4. Calculează d = sqrt((x[j]-x[i])+(y[j]-y[i]))
  5. Dacă d > maxD → actualizează
  6. Afișează maxD cu 2 zecimale
d = √((x₂−x₁) + (y₂−y₁))
double d = sqrt((x[j]-x[i])*(x[j]-x[i]) + (y[j]-y[i])*(y[j]-y[i]));
„d egal radical din suma pătratelor diferențelor coordonatelor"
READ n FOR i 0 TO n-1: READ x[i], y[i] SET maxD 0 FOR i 0 TO n-2: FOR j i+1 TO n-1: // fiecare pereche, fără repetiție SET d dist(x[i],y[i],x[j],y[j]) IF d > maxD THEN SET maxD d PRINT maxD

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:
  1. Calculează a, b, c cu formula distanței
  2. Definește eps = 0.001
  3. Compară cu fabs(a-b) < eps — nu cu ==!
  4. a ≈ b ≈ c → echilateral; 2 egale → isoscel; altfel → scalen
|a − b| < ε → laturi „egale" (comparare reali)
fabs(a - b) < eps
„valoarea absolută a diferenței lui a și b mai mică decât epsilon"
SET a,b,c laturile SET eps 0.001 IF fabs(a-b) < eps AND fabs(b-c) < eps THEN PRINT "Echilateral" ELSE IF fabs(a-b)<eps OR fabs(b-c)<eps OR fabs(a-c)<eps THEN PRINT "Isoscel" ELSE PRINT "Scalen" END IF

De 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;
}

Descarcă toate exercițiile și soluțiile