Bạn đã từng học cách giải phương trình bậc 2 ở lớp trước đúng không? Vậy còn cách giải phương trình bậc 2 trong C/C++ thì sao? Hôm nay chúng ta sẽ cùng tìm hiểu.
Cách giải phương trình bậc 2
Phương trình bậc 2 có dạng: ax² + bx + c = 0 (với a≠0). Trong các lớp trước, chúng ta đã học cách giải bằng cách tính delta.
- Đầu tiên, tính delta = b² – 4ac
- Nếu delta < 0, phương trình vô nghiệm
- Nếu delta = 0, phương trình có nghiệm kép
- Nếu delta > 0, phương trình có 2 nghiệm phân biệt
Ý tưởng
- Sử dụng vòng lặp do while để nhập a, b, c. Nếu a = 0, nhập lại.
- Sử dụng hàm sqrt() trong thư viện math.h để tính căn delta hoặc tính căn không dùng hàm sqrt() tại đây.
- Tạo hàm giaiPT trả về kiểu int là số nghiệm của phương trình (1).
- Đưa tham chiếu 2 biến x1, x2 vào hàm giaiPT để gán giá trị hai nghiệm.
- Nếu phương trình vô nghiệm, hàm giaiPT sẽ trả về 0 và gán x1 = x2 = 0.
- Nếu phương trình có nghiệm kép, hàm giaiPT sẽ trả về 1 và gán x1 = x2 = -b/2a.
- Nếu phương trình có 2 nghiệm, hàm giaiPT sẽ trả về 2 và gán x1 = (-b+√delta) / 2a, x2 = (-b-√delta) / 2a.
Code C
#include<stdio.h>
#include<math.h>
int giaiPT(float a, float b, float c, float &x1, float &x2){
float delta = b*b - 4*a*c;
if(delta < 0){
x1 = x2 = 0.0;
return 0;
} else if(delta == 0){
x1 = x2 = -b/(2*a);
return 1;
} else{
delta = sqrt(delta);
x1 = (-b + delta) / (2*a);
x2 = (-b - delta) / (2*a);
return 2;
}
}
int main(){
float a, b, c;
float x1, x2;
do{
printf("Nhập a (a!=0): ");
scanf("%f", &a);
printf("Nhập b: ");
scanf("%f", &b);
printf("Nhập c: ");
scanf("%f", &c);
} while(!a); //Nếu a=0 thì nhập lại
int numNo = giaiPT(a, b, c, x1, x2);
if(numNo == 0) {
printf("Phương trình đã cho vô nghiệm");
} else if(numNo == 1){
printf("Phương trình đã cho có nghiệm kép x=%.4f", x1);
} else{
printf("Phương trình đã cho có hai nghiệm phân biệtn");
printf("x1=%.4fn", x1);
printf("x2=%.4fn", x2);
}
}
Nhập a (a!=0): 3
Nhập b: -5
Nhập c: 2
Phương trình đã cho có hai nghiệm phân biệt
x1=1.0000
x2=0.6667
Code C++
#include<iostream>
#include<math.h>
using namespace std;
int giaiPT(float a, float b, float c, float &x1, float &x2){
float delta = b*b - 4*a*c;
if(delta < 0){
x1 = x2 = 0.0;
return 0;
} else if(delta == 0){
x1 = x2 = -b/(2*a);
return 1;
} else{
delta = sqrt(delta);
x1 = (-b + delta) / (2*a);
x2 = (-b - delta) / (2*a);
return 2;
}
}
int main(){
float a, b, c;
float x1, x2;
do{
cout << "Nhập a (a!=0): ";
cin >> a;
cout << "Nhập b: ";
cin >> b;
cout << "Nhập c: ";
cin >> c;
} while(!a);
int numNo = giaiPT(a, b, c, x1, x2);
if(numNo == 0) {
cout << "Phương trình đã cho vô nghiệm";
} else if(numNo == 1){
cout << "Phương trình đã cho có nghiệm kép x=" << x1;
} else{
cout << "Phương trình đã cho có hai nghiệm phân biệt" << endl;
cout << "x1=" << x1 << endl;
cout << "x2=" << x2 << endl;
}
}
Nhập a (a!=0): 3
Nhập b: -5
Nhập c: 2
Phương trình đã cho có hai nghiệm phân biệt
x1=1
x2=0.6667
Bài học của chúng ta đến đây là kết thúc.