Giải thuật giải phương trình bậc 2

Xác định bài toán:•- Input: Các số thực a, b, c (a≠0).- Output: Các số thực X thoả mãn ax2 + bx + c = 0.- Ý tưởng:- Tính d = b2 - 4ac.- Lần lượt xét ba trường hợp cho giá trị d:nếu  d <0 thì pt vô nghiệmnếu d = 0 thì kết luận phương trình có một nghiệm x =-b/2anếu d > 0 thì kết luận phương trình có hai nghiệm phân biệt là:x - (-b± √ d ) / 2a.Thuật toán:Mô tả thuật toán bằng cách liệt kê:Bước I. Nhập ba số a, b, c;Bước 2. d 4-(b*b - 4*a*c);Bước 3.nếu d < 0 thì đưa ra thông báo phương trình vô nghiệm rồi kết thúc;nếu d = 0 thì đưa ra thông báo phương trình có một nghiệm và tính nghiệmx = -b/(2*a), rồi kết thúc;

nếu (d> 0 thì đưa ra thông báo phương trình có hai nghiệm phân biệt, tính nghiệm X/= (-b + -√ d) / (2*a) và x2 = (-b - √ d ) / (2*a), rồi kết thúc;


Đề bài

Mô tả thuật toán tìm nghiệm của phương trình bậc hai tổng quát bằng cách liệt kê hoặc bằng sơ đồ khối.

Lời giải chi tiết

• Xác định bài toán:


- Input: Các số thực a, h, c (a≠0).

- Output: Các số thực X thoả mãn ax2 + bx + c = 0.

Xem thêm: V I Love Music - Vietnam'S Next Top Model

Cách giải phương trình bậc 2 thì chúng ta đã được học ở lớp dưới rồi phải không nào ? Vậy giải phương trình bậc 2 trong C/C++ thì sẽ như thế nào ? Hôm nay chúng ta sẽ cùng tìm hiểu.

Cách giải phương trình bậc 2

Giải thuật giải phương trình bậc 2
                  Phương trình bậc 2

Phương trình bậc 2 là phương trình có dạng: ax² +bx + c = 0. (a≠0)  (1)

Ở các lớp dưới ta đã có phương pháp giải bằng cách tính delta:

  • Đầu tiên tính delta = b² – 4ac
  • Nếu delta < 0 thì kết luận vô nghiệm
  • Nếu delta = 0 thì có nghiệm kép
  • Nếu delta > 0 thì sẽ có 2 nghiệm phân biệt

Ý tưởng

  • Dùng một vòng do while để nhập a, b, c nếu a = 0, thì nhập lại.
  • Chúng ta 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.
  • Chúng ta tạo hàm giaiPT trả về kiểu int chính là số nghiệm của phương trình (1).
  • Chúng ta sẽ đưa tham chiếu 2 biến x1 , x2 vào hàm giaiPT để gán giá trị hai nghiệm.
  • Nếu pt (1) vô nghiện thì giaiPT sẽ trả về 0 , đồng thời gán x1 = x2 =0 .
  • Nếu pt (1) có nghiệm kép thì giaiPT sẽ trả về 1 , đồng thời gán x1 = x2 = -b/2a .
  • Nếu pt (1) có 2 nghiệm thì giaiPT sẽ trả về 2 , gán x1 = (-b+√delta ) / 2a  x = (-b-√delta ) / 2a .

Code C

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

#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("Nhap a (a!=0): ");

        scanf("%f",&a);

        printf("Nhap b: ");

        scanf("%f",&b);

        printf("Nhap 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("Phuong trinh da cho vo nghiem");

    }

    else if(numNo == 1){

        printf("Phuong trinh da cho co nghiem kep x=%.4f",x1);

    }

    else{

        printf("Phuong trinh da cho co hai nghiem phan biet\nx1=%.4f \nx2=%.4f",x1,x2);

    }

}

Nhap a (a!=0): 3

Nhap b: -5

Nhap c: 2

Phuong trinh da cho co hai nghiem phan biet

x1=1.0000

x2=0.6667

Code C++

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

#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<<"Nhap a (a!=0): ";

        cin>>a;

        cout<<"Nhap b: ";

        cin>>b;

        cout<<"Nhap c: ";

        cin>>c;

    }

    while(!a);

        int numNo = giaiPT(a,b,c,x1,x2);

    if(numNo ==0 ) {

        cout<<"Phuong trinh da cho vo nghiem";

    }

    else if(numNo==1){

        cout<<"Phuong trinh da cho co nghiem kep x=%.4f" << x1;

    }

    else{

        cout<<"Phuong trinh da cho co hai nghiem phan biet"<<endl;

        cout<< "x1=" << x1<<endl;

        cout<< "x2=" << x2<<endl;

    }

}

Nhap a (a!=0): 3

Nhap b: -5

Nhap c: 2

Phuong trinh da cho co hai nghiem phan biet

x1=1

x2=0.666667

Bài học của mình đến đây là kết thúc.