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.
Dicționar: Ecuația de gradul I ↔ C++
Cum traducem fiecare element matematic în cod C++:
| Concept matematic | Semnificaț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.
Cazuri speciale:
- Dacă
a = 0șib = 0, ecuația devine0 = 0(identitate) → infinitate de soluții. - Dacă
a = 0șib ≠ 0, ecuația devineb = 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ă)
Pașii algoritmului:
- Citește coeficienții a și b.
- Dacă a ≠ 0 atunci
- calculează x = -b / a
- afișează "Soluția este x = " + x
- Altfel (a = 0)
- Dacă b = 0 atunci afișează "Infinitate de soluții"
- Altfel afișează "Nu există soluție"
#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
| Pas | Instrucțiune | a | b | x | Ecran |
|---|---|---|---|---|---|
| 1 | cin >> a >> b | 2 | 4 | — | |
| 2 | if (a != 0) → DA | 2 | 4 | — | |
| 3 | x = -4 / 2 | 2 | 4 | -2 | |
| 4 | cout << x | 2 | 4 | -2 | -2.00 |
Traseu de execuție: a = 0, b = 5
| Pas | Instrucțiune | a | b | x | Ecran |
|---|---|---|---|---|---|
| 1 | cin >> a >> b | 0 | 5 | — | |
| 2 | if (a != 0) → NU | 0 | 5 | — | |
| 3 | if (b == 0) → NU | 0 | 5 | — | |
| 4 | cout << "Nu există" | 0 | 5 | — | imposibil |
#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
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).
- 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
else if în loc de if în interior?
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
a = 0, b = 0
a = 0, b = 7
a = -2, b = 8
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?
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:
- Daca a != 0, x = -b/a.
- Daca a == 0 si b == 0, exista infinitate de solutii.
- 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:
- Folosim for cu 5 pasi.
- Pentru fiecare pereche aplicam algoritmul de gradul I.
- 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:
- Calculam expresia a*x+b.
- Daca rezultatul este 0, x verifica ecuatia.
- 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++:
- Citești coeficienții a și b
- Verifici dacă a ≠ 0 (altfel nu poți împărți!)
- Dacă da:
x = -b / ași afișezi - Dacă a = 0: verifici b — dacă b = 0 → infinitate, altfel → imposibil
- Testezi cu 3 seturi de date: (a≠0), (a=0,b=0), (a=0,b≠0)
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."
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."
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;
}