Pagina Modulului 5
Ora 28 - Modulul 5

Rezolvarea ecuației de gradul I

Algoritmul pentru ax + b = 0, tratarea cazurilor speciale, implementare C++ și aplicații practice – ediție extinsă

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

Ce vei învăța astăzi?

După această lecție, vei putea scrie un program care rezolvă o ecuație de gradul I, tratând corect toate cazurile posibile. Vei înțelege nu doar cum să scrii codul, ci și de ce funcționează și cum să îl testezi.

Forma generală a ecuației de gradul I
Algoritmul de rezolvare pas cu pas
Cazurile speciale (a=0, b=0 etc.)
Implementarea în C++ cu if/else
Testarea programului cu diverse date
Depanarea greșelilor comune
Aplicații în matematică și fizică

Dicționar: Ecuația de gradul I ↔ C++

Cum traducem fiecare element matematic în cod C++:

Concept matematicSemnificațieÎn C++
ax + b = 0„ecuație de gradul I"if (a != 0) x = -b/a;
a, b (coeficienți)„numerele date"float a, b;
x (necunoscuta)„ce trebuie să aflăm"float x = -b / a;
a ≠ 0„a este diferit de zero"if (a != 0)
a = 0, b = 0 → ∞ soluții„orice x e soluție"cout << "Infinitate";
a = 0, b ≠ 0 → imposibil„contradicție: b = 0 fals"cout << "Imposibil";
Afișare cu zecimale„arată x cu 2 zecimale"fixed << setprecision(2)

Ce este o ecuație de gradul I?

Forma generală: ax + b = 0, unde a și b sunt numere reale (coeficienți), iar x este necunoscuta.

Soluția: Dacă a ≠ 0, atunci x = -b / a.

Matematică: x = −b / a (dacă a ≠ 0)
C++: x = -b / a;
„x egal minus b împărțit la a"

Cazuri speciale:

  • Dacă a = 0 și b = 0, ecuația devine 0 = 0 (identitate) → infinitate de soluții.
  • Dacă a = 0 și b ≠ 0, ecuația devine b = 0 → imposibil → nici o soluție.

Vizualizare: Imaginează-ți ecuația ca o balanță. În stânga ai ax + b, în dreapta ai 0. Trebuie să afli cât trebuie să fie x pentru ca balanța să fie echilibrată. Dacă a = 0, atunci nu mai depinde de x – balanța este fie mereu echilibrată (dacă b = 0), fie niciodată (dacă b ≠ 0).

Exemple detaliate:

Ecuația a b Soluție Explicație
2x + 4 = 0 2 4 x = -2 2 ≠ 0 → x = -4/2 = -2
-3x + 9 = 0 -3 9 x = 3 -3 ≠ 0 → x = -9/(-3) = 3
0·x + 5 = 0 0 5 imposibil 0·x + 5 = 5 ≠ 0, deci ecuația e falsă pentru orice x
0·x + 0 = 0 0 0 infinitate 0 = 0, adevărat pentru orice x
1.5x - 3 = 0 1.5 -3 x = 2 x = -(-3)/1.5 = 3/1.5 = 2

Algoritmul de rezolvare (pseudocod și diagramă)

// Pseudocod: Ecuația de gradul I CITEȘTE a, b DACĂ a 0 ATUNCI x -b / a SCRIE x ALTFEL DACĂ b = 0 ATUNCI SCRIE "Infinitate de soluții" ALTFEL SCRIE "Nu există soluție"
Pașii algoritmului:
  1. Citește coeficienții a și b.
  2. Dacă a ≠ 0 atunci
    • calculează x = -b / a
    • afișează "Soluția este x = " + x
  3. Altfel (a = 0)
    • Dacă b = 0 atunci afișează "Infinitate de soluții"
    • Altfel afișează "Nu există soluție"
Implementare în C++ (cu comentarii)
#include <iostream>
using namespace std;

int main() {
    float a, b, x;   // folosim float pentru a permite numere reale
    
    cout << "Introdu coeficientii a si b: ";
    cin >> a >> b;
    
    if (a != 0) {
        // cazul standard: soluție unică
        x = -b / a;
        cout << "Solutia este x = " << x;
    } else {
        // a = 0, deci verificăm b
        if (b == 0) {
            cout << "Infinitate de solutii";
        } else {
            cout << "Nu exista solutie";
        }
    }
    
    return 0;
}

Atenție: Împărțirea la zero este interzisă! De aceea verificăm mai întâi dacă a != 0 înainte de a face -b/a.

Atenție la împărțirea la zero! În matematică, împărțirea la zero este nedefinită. În programare, încercarea duce la erori de execuție sau valori infinite. De aceea, verificăm întotdeauna if (a != 0) înainte de a calcula x = -b / a.

Programul complet: Ecuația de gradul I

Traseu de execuție: a = 2, b = 4
PasInstrucțiuneabxEcran
1cin >> a >> b24
2if (a != 0) → DA24
3x = -4 / 224-2
4cout << x24-2-2.00
Traseu de execuție: a = 0, b = 5
PasInstrucțiuneabxEcran
1cin >> a >> b05
2if (a != 0) → NU05
3if (b == 0) → NU05
4cout << "Nu există"05imposibil
Rezolvarea ecuației ax + b = 0 cu toate cazurile
#include <iostream>
using namespace std;

int main() {
    float a, b, x;
    cout << "Introdu a si b: ";
    cin >> a >> b;
    if (a != 0) {
        x = -b / a;
        cout << "Solutia: " << x;
    } else {
        if (b == 0) {
            cout << "Infinitate de solutii";
        } else {
            cout << "Nu exista solutie";
        }
    }
    return 0;
}

Testează cu aceste date: (a=2, b=4) → x=-2; (a=0, b=0) → infinitate; (a=0, b=5) → imposibil. Dacă nu obții aceste rezultate, verifică ordinea condițiilor if/else.

Greșeli frecvente și cum să le eviți

Greșeală Exemplu greșit Corect Explicație
Nu verificăm a ≠ 0 înainte de împărțire x = -b / a; fără if if (a != 0) x = -b / a; Dacă a = 0, programul se oprește sau dă NaN.
Confundăm cazurile când a = 0 Tratăm doar a=0 fără a verifica b if (a==0) { if (b==0) ... else ... } Trebuie să decidem între infinitate și imposibil.
Folosim tip int pentru coeficienți int a,b; apoi x = -b/a (împărțire întreagă) float a,b; Cu int, -3/2 = -1, nu -1.5. Pierdem precizie.
Operator = în loc de == în condiții if (a = 0) în loc de if (a == 0) if (a == 0) a = 0 este atribuire, nu comparație.
Nu folosim fixed și setprecision pentru afișare cout << x; poate afișa 2e+000 cout << fixed << setprecision(2) << x; Pentru a controla formatul numeric.
Sfaturi de depanare:
  • Rulează programul cu date de test cunoscute (de exemplu, a=2, b=4 ar trebui să dea -2).
  • Adaugă temporar cout << "a=" << a << " b=" << b; pentru a verifica ce ai citit.
  • Testează toate cazurile: a≠0, a=0,b=0, a=0,b≠0.
  • Dacă ai erori de compilare, citește cu atenție mesajul – de multe ori indică linia și problema.

Verificare cunoștințe (cu feedback detaliat)

1. Ce va afișa programul pentru a = 0, b = 5?

2. Ce va afișa programul pentru a = 2, b = -4?

3. Ce va afișa programul pentru a = 0, b = 0?

4. (Opțional) Ce tip de date ar trebui să folosim pentru a și b dacă dorim să păstrăm precizia?

Întrebări frecvente (FAQ) extins

De ce trebuie să tratăm separat cazul a = 0?
Pentru că împărțirea la zero nu este definită matematic. Chiar dacă în matematică spunem că ecuația 0·x + b = 0 nu are soluție (sau are infinitate), în programare trebuie să oprim împărțirea și să afișăm un mesaj corespunzător. Dacă nu am face această verificare, la execuție programul s-ar opri cu o eroare („division by zero”).
Ce tip de date să folosesc pentru a și b?
De obicei, coeficienții pot fi numere reale. Cel mai bine este să folosești float sau double pentru a păstra precizia. Dacă știi sigur că sunt numere întregi, poți folosi int, dar atunci împărțirea va fi întreagă și vei pierde partea fracționară. De exemplu, pentru a=2, b=3, soluția corectă este -1.5, dar cu int ai obține -1 (prin trunchiere).
Cum testez programul pentru toate cazurile?
Rulează programul cu cel puțin trei seturi de date:
  • unul cu a ≠ 0 (de exemplu a=2, b=4) → soluție unică -2
  • unul cu a=0, b=0 → infinitate
  • unul cu a=0, b≠0 (de exemplu a=0, b=5) → imposibil
Verifică că afișează mesajele corecte. Poți adăuga și cazuri cu numere negative, fracționare etc.
Ce înseamnă „infinitate de soluții” în practică?
Înseamnă că orice valoare a lui x satisface ecuația. De exemplu, ecuația 0·x + 0 = 0 este adevărată pentru orice x. În programare, nu vom calcula nimic, ci vom afișa un mesaj care să informeze utilizatorul că nu există o singură soluție.
Pot folosi else if în loc de if în interior?
Da, poți scrie:
if (a != 0) { ... }
else if (b == 0) { ... }
else { ... }
Este mai concis și la fel de corect.

Exercițiu: Alege cazul corect

Pentru fiecare pereche (a,b), alege tipul soluției:

a = 3, b = 6

Soluție unică
Infinitate
Imposibilă

a = 0, b = 0

Soluție unică
Infinitate
Imposibilă

a = 0, b = 7

Soluție unică
Infinitate
Imposibilă

a = -2, b = 8

Soluție unică
Infinitate
Imposibilă

Aplicații practice ale ecuațiilor de gradul I

Ecuațiile de gradul I apar peste tot în viața de zi cu zi. Iată câteva exemple:

  • Economie: Calculul prețului după reducere: prețFinal = prețInitial - reducere. Dacă știm prețul final și reducerea, putem afla prețul inițial.
  • Fizică: Mișcarea rectilinie uniformă: distanța = viteză × timp. Dacă știm distanța și viteza, putem afla timpul.
  • Bucătărie: Rețete: dacă o rețetă pentru 4 persoane necesită 200g făină, pentru n persoane vom folosi (200/4)*n grame.
  • Conversii: Transformarea dintr-o unitate în alta: de exemplu, grade Celsius în Fahrenheit: F = 1.8*C + 32. Dacă știm F, putem afla C.

În toate aceste cazuri, putem scrie un program care să rezolve o ecuație de gradul I pentru a găsi necunoscuta.

Întrebări pentru examen: Ce se întâmplă dacă a=0 și b=0? Dar dacă sunt foarte mari (10^9)? Cum ai modifica programul pentru mx + n = p (trei parametri)? De ce folosim float și nu double?

PROBLEME PBINFO - 15 minute

PbInfo - Ecuatia ax+b=0

Rezolvare cu cazuri

Enunț:

Cerință: Se citesc a si b. Rezolva ecuatia ax+b=0.

Date de intrare:

Doua numere reale a si b.

Date de ieșire:

Solutia sau un mesaj pentru caz special.

Exemplu:

Intrare:

2 -6

Ieșire:

3

Explicație: 2*x-6=0, deci x=3.

Cum gândim soluția:
  1. Daca a != 0, x = -b/a.
  2. Daca a == 0 si b == 0, exista infinitate de solutii.
  3. Daca a == 0 si b != 0, nu exista solutie.

Tip: Verifica a==0 inainte de impartire.

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

int main() {
    double a, b;
    cin >> a >> b;
    if (a != 0) cout << - b / a;
    else if (b == 0) cout << "Infinitate de solutii";
    else cout << "Nu are solutie";
    return 0;
}

PbInfo - Cinci ecuatii

Repetarea aceleiasi reguli

Enunț:

Cerință: Se citesc 5 perechi a b. Pentru fiecare, afiseaza solutia ecuatiei ax+b=0 sau mesajul potrivit.

Date de intrare:

5 linii, fiecare cu a si b.

Date de ieșire:

Cate un raspuns pe linie.

Exemplu:

Intrare:

2 -4
0 0
0 5
1 3
-2 8

Ieșire:

2
Infinitate
Imposibil
-3
4

Explicație: Fiecare pereche se trateaza independent.

Cum gândim soluția:
  1. Folosim for cu 5 pasi.
  2. Pentru fiecare pereche aplicam algoritmul de gradul I.
  3. Afisam raspunsul si trecem la linia urmatoare.

Tip: Poti transforma rezolvarea intr-o functie.

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

int main() {
    for (int i = 1; i <= 5; i++) {
        double a, b;
        cin >> a >> b;
        if (a != 0) cout << - b / a;
        else if (b == 0) cout << "Infinitate";
        else cout << "Imposibil";
        cout << '\n';
    }
    return 0;
}

PbInfo - Verifica solutia

Testare prin substitutie

Enunț:

Cerință: Se citesc a, b si x. Afiseaza DA daca x este solutie pentru ax+b=0, altfel NU.

Date de intrare:

a, b si x.

Date de ieșire:

DA sau NU.

Exemplu:

Intrare:

2 -6 3

Ieșire:

DA

Explicație: 2*3-6=0.

Cum gândim soluția:
  1. Calculam expresia a*x+b.
  2. Daca rezultatul este 0, x verifica ecuatia.
  3. Pentru reale folosim o toleranta mica.

Tip: Pentru double evita comparatia directa cu 0.

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

int main() {
    double a, b, x;
    cin >> a >> b >> x;
    if (fabs(a * x + b) < 0.0001) cout << "DA";
    else cout << "NU";
    return 0;
}
Cum rezolvi o ecuație de gradul I în C++:
  1. Citești coeficienții a și b
  2. Verifici dacă a ≠ 0 (altfel nu poți împărți!)
  3. Dacă da: x = -b / a și afișezi
  4. Dacă a = 0: verifici b — dacă b = 0 → infinitate, altfel → imposibil
  5. Testezi cu 3 seturi de date: (a≠0), (a=0,b=0), (a=0,b≠0)
EXERCIȚII PRACTICE - 2 sarcini / 20 minute

Exercițiul Practic: Ecuația de gradul I

Aplică algoritmul pentru ax + b = 0, tratează cazurile speciale și exersează implementarea cu decizii.

Sarcina 1: Analiză cod

Următorul cod conține mai multe greșeli. Găsește-le și corectează-le.

#include <iostream>
using namespace std;

int main() {
    float a, b;
    cin >> a >> b;
    if (a = 0) {
        if (b = 0) cout << "infinit";
        else cout << "imposibil";
    } else {
        cout << -b/a;
    }
    return 0;
}

Regulă: Operatorul de comparație în C++ este ==, nu = (care este atribuire).

C++: if (a == 0) verifică, if (a = 0) atribuie 0 lui a!

Citim: „Semnul egal simplu (=) dă o valoare, dublu (==) compară două valori."

// Pseudocod: Ecuație corectă (ce trebuia scris) CITEȘTE a, b DACĂ a = 0 ATUNCI // atenție: == în C++! DACĂ b = 0 ATUNCI SCRIE "infinit" ALTFEL SCRIE "imposibil" ALTFEL x b / a SCRIE x // cu setprecision(2) SFÂRȘIT DACĂ

De ce funcționează? Folosirea = în loc de == este una din cele mai frecvente erori în C++. a = 0 atribuie 0 lui a și returnează 0 (fals), deci ramura if nu se execută niciodată — programul sare direct la else și încearcă -b/a cu a=0, ceea ce duce la eroare la rulare (împărțire la zero).

Greșeli: if (a = 0) în loc de if (a == 0); if (b = 0) în loc de if (b == 0); lipsă fixed/setprecision pentru afișare; posibilă împărțire la zero dacă a=0 nu e tratată corect (de fapt, a=0 duce la else? – nu, pentru că a = 0 este atribuire, condiția devine falsă? – de fapt a = 0 returnează 0, deci condiția e falsă, se duce în else și împarte la 0). Corect:

#include <iostream>
#include <iomanip>    // pentru fixed, setprecision
using namespace std;

int main() {
    float a, b, x;       // declarăm variabilele
    cin >> a >> b;       // citim coeficienții
    if (a == 0) {         // == (comparație!), nu = (atribuire!)
        if (b == 0) cout << "infinit";   // 0·x + 0 = 0
        else cout << "imposibil";        // 0·x + b = 0, b≠0
    } else {
        x = -b / a;       // formula: x = −b/a
        cout << fixed << setprecision(2) << x;  // afișăm cu 2 zecimale
    }
    return 0;
}
Sarcina 2: Implementare pentru 5 perechi

Scrie un program care citește 5 perechi (a,b) și afișează pentru fiecare soluția (sau mesajul corespunzător), fiecare pe o linie nouă.

Matematică: Repetăm rezolvarea ax + b = 0 de 5 ori — aceeași formulă, date diferite.

C++: Punem totul într-un for(int i=1; i<=5; i++) — bucla rezolvă automat fiecare pereche.

Citim: „Pentru fiecare pereche, citim a și b, apoi aplicăm algoritmul standard."

// Pseudocod: Rezolvare ecuație pentru 5 perechi PENTRU i 1 LA 5 EXECUTĂ CITEȘTE a, b DACĂ a 0 ATUNCI x b / a SCRIE x // cu 2 zecimale ALTFEL DACĂ b = 0 ATUNCI SCRIE "infinit" ALTFEL SCRIE "imposibil" SFÂRȘIT PENTRU

De ce funcționează? Bucla for repetă de 5 ori citirea și rezolvarea. La fiecare iterație, variabilele a și b sunt suprascrise cu valorile noi. Algoritmul din corpul buclei este identic cu cel de la PbInfo #123.

#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    float a, b, x;
    for (int i = 1; i <= 5; i++) {  // repetăm de 5 ori
        cin >> a >> b;              // citim perechea curentă
        if (a != 0) {                // ecuație propriu-zisă
            x = -b / a;             // formula standard
            cout << fixed << setprecision(2) << x << endl;
        } else if (b == 0) {
            cout << "infinit" << endl;    // 0·x + 0 = 0
        } else {
            cout << "imposibil" << endl;  // 0·x + b = 0
        }
    }
    return 0;
}

Descarcă toate exercițiile și soluțiile