PDA

View Full Version : Giải phương trình bậc hai



ngoctam1011
16-03-2008, 22:21
Mọi người xem giùm đi,tui viết sao nó ra kết wã sai.
Ai bít làm chỉ zới, mà cho hỏi luôn,cái hàm lấy căn bậc hai trong C là gì zậy?
Thanks

#include<stdio.h>
#include<conio.h>
#include<math.h>
main()
{
clrscr();
int a,b,c; //delta = b*b-4*a*c
printf("ax^2+bx+c=0\n");//in ra phuong trinh bac hai
printf("nhap a:"); scanf("%d",&a);
printf("nhap b:"); scanf("%d",&b);
printf("nhap c:"); scanf("%d",&c);
if(a==0)
if(b==0)
if(c==0)
printf("phuong trinh luon dung\n");
else
printf("phuong trinh vo nghiem\n");
else
printf("\nx=%d",-b/a);
else
if((b*b-4*a*c)<0)
printf("phuong trinh vo nghiem");
if((b*b-4*a*c)==0)
printf("x1=x2=%d",-b/(2*a));
else
{printf("x1=%d",(-b-sqrt(b*b-4*a*c))/(2*a));
printf("\nx2=%d",(-b+sqrt(b*b-4*a*c))/(2*a));}

getch();
}

ngoctam1011
16-03-2008, 22:24
Nhờ mọi người tìm lỗi giúp
Ai bít giải thì chỉ giùm đi

vtienuit
16-03-2008, 22:35
Nhìn mấy cái if else của bạn đau cả mắt . Thứ 2 hàm main lên có kiểu trả về void cũng được . Thứ 3 các câu lện if else lên có ngoặc phân rõ và chia trường hợp đơn giản trước cho dễ xử lý . Lên dùng các biến tạm như trong trường hợp này là delta , x,x1,x2 có kiểu float là phù hợp !! Bài này là căn bản bạn xem lại !!

chiati
16-03-2008, 22:39
xem lại phần làm tròn và ép kiểu trong C. Kết quả của bạn sai là do ép kiểu tự động sẽ làm tròn trong phép khai căn và phép chia /(2*a)
Thử đổi a, b, c thành kiểu float xem sao?

superman2007
16-03-2008, 22:49
Làm kiểu này đi bạn ơi


#include<stdio.h>
#include<conio.h>
#include<math.h>

double delta(float a,float b,float c)
{
return b*b-4*a*c;
}
main()
{
float a,b,c;
printf("GIAI PHUONG TRINH BAC HAI DUNG HAM\n");
printf("Nhap cac gia tri tuong ung cua he so\n");
printf("a , b , c = ");
scanf("&f","%f","%f",&a,&b,&c);
printf("Ket qua tren man hinh\n");

if (delta(a,b,c)<0)
{
printf("Phuong trinh vo nghiem thuc\n");
}

if(delta(a,b,c)==0)
{
printf("Phuong trinh co nghiem kep\n");
printf("x1 = x2 = %f",-b/(2*a));
}
if (delta(a,b,c)>0)
{
printf("Phuong trinh co 2 nghiem phan biet la\n");
printf("x1 = %f",(-b-sqrt(delta(a,b,c)))/(2*a));
printf("x2 = %f",(-b+sqrt(delta(a,b,c)))/(2*a));
}
}

ngoctam1011
17-03-2008, 03:26
Thanks mọi người.
Cách làm của mình rắc rối thật!
Thanks superman2007 nhìu lắm!

jbminhtan
06-04-2008, 22:28
Làm kiểu này đi bạn ơi


#include<stdio.h>
#include<conio.h>
#include<math.h>

double delta(float a,float b,float c)
{
return b*b-4*a*c;
}
main()
{
float a,b,c;
printf("GIAI PHUONG TRINH BAC HAI DUNG HAM\n");
printf("Nhap cac gia tri tuong ung cua he so\n");
printf("a , b , c = ");
scanf("&f","%f","%f",&a,&b,&c);
printf("Ket qua tren man hinh\n");

if (delta(a,b,c)<0)
{
printf("Phuong trinh vo nghiem thuc\n");
}

if(delta(a,b,c)==0)
{
printf("Phuong trinh co nghiem kep\n");
printf("x1 = x2 = %f",-b/(2*a));
}
if (delta(a,b,c)>0)
{
printf("Phuong trinh co 2 nghiem phan biet la\n");
printf("x1 = %f",(-b-sqrt(delta(a,b,c)))/(2*a));
printf("x2 = %f",(-b+sqrt(delta(a,b,c)))/(2*a));
}
}

bạn ơi cách của bạn làm hay đó. nhưng chẳng may a=0 phuong trinh trở về phương trình bậc 1 thì sao.

[=========> Bổ sung bài viết <=========]


Mọi người xem giùm đi,tui viết sao nó ra kết wã sai.
Ai bít làm chỉ zới, mà cho hỏi luôn,cái hàm lấy căn bậc hai trong C là gì zậy?
Thanks

#include<stdio.h>
#include<conio.h>
#include<math.h>
main()
{
clrscr();
int a,b,c; //delta = b*b-4*a*c
printf("ax^2+bx+c=0\n");//in ra phuong trinh bac hai
printf("nhap a:"); scanf("%d",&a);
printf("nhap b:"); scanf("%d",&b);
printf("nhap c:"); scanf("%d",&c);
if(a==0)
if(b==0)
if(c==0)
printf("phuong trinh luon dung\n");
else
printf("phuong trinh vo nghiem\n");
else
printf("\nx=%d",-b/a);
else
if((b*b-4*a*c)<0)
printf("phuong trinh vo nghiem");
if((b*b-4*a*c)==0)
printf("x1=x2=%d",-b/(2*a));
else
{printf("x1=%d",(-b-sqrt(b*b-4*a*c))/(2*a));
printf("\nx2=%d",(-b+sqrt(b*b-4*a*c))/(2*a));}

getch();
}

cách của bạn làm được đó nhưng sửa lại phần tính dlta cho nó khỏe. mình chỉ sửa lại tí xíu thôi nghen rồi tham khảo:
bạn đặt
delta=b*b-4ac
sau đó thay b*b-4ac bằng delta cho nó dể

trhthong
07-04-2008, 07:31
Bài trên của bạn mô tả cách dùng các lệnh if lồng nhau, tôi thấy dùng bài "Giải phương trình bậc 2" là ổn rồi. Tuy nhiên, bạn vẫn chưa nắm rõ cách thức hoạt động của If - Control Flow cùng với việc sử dụng chưa chính xác các cấu trúc dữ liệu nên dẫn tới sai thôi. Tôi xin mạn phép được đưa ra ý kiến riêng như sau:
1. Chỗ sau đây:


if(a==0)
if(b==0)
if(c==0)
printf("phuong trinh luon dung\n");
else
printf("phuong trinh vo nghiem\n");
else
printf("\nx=%d",-b/a);

thì khi thực hiện tới dòng cuối cùng, giá trị của a phải là 0 (trường hợp phương trình bậc nhất). Như vậy, bạn coi thử chia cho a có được không hen!

2.Còn khi thực hiện trong phần này:


else
if((b*b-4*a*c)<0)
printf("phuong trinh vo nghiem");
if((b*b-4*a*c)==0)
printf("x1=x2=%lf",-b/(2*a));
else
{
printf("x1=%d",(-b-sqrt(b*b-4*a*c))/(2*a));
printf("\nx2=%d",(-b+sqrt(b*b-4*a*c))/(2*a));
}

Bạn nhìn thử xem, chương trình có hoạt động như bạn mong muốn không. Tôi mô tả thế này nhé: Cái else ngoài cùng, chỉ thực hiện đến khi gặp dấu ; đầu tiên thôi. Nhưng bạn mong muốn là nó phải bao toàn bộ đoạn code trên, ứng với trường hợp phương trình bậc 2. Như vậy, có lẽ bạn phải đặt thêm dấu {} cho phần else ngoài cùng đó hen.

3. Còn chỗ này, hàm sqrt có dạng như sau: double sqrt(double). Nghĩa là nó nhận vào một giá trị double và trả về một giá trị double. Việc nhận giá trị double là ổn rồi, vì bạn truyền cho nó kiểu int, thì tự động, trình biên dịch sẽ chuyển thành double. Còn vì nó trả về double, nên bạn dùng toán tử %d (dành cho kiểu decimal integer) thì có ổn không? Tôi đề xuất dùng %lf thay cho %d.

Theo tôi, bạn cứ dùng giải thuật trên của mình. Giải thuật đó có giá trị hơn các giải thuật khác. Với lại chú ý, nên khai báo thêm biến, gán giá trị các biểu thức cho nó, để cải thiện tốc độ làm việc của chương trình.

Chúc bạn thành công. Nếu ai thấy mình sai chỗ nào, hay thiếu chỗ nào thì chỉ dùm hen. Cảm ơn.

chuot_jery
07-04-2008, 12:00
Hôm trước các bác trên 4rom đều ý kiến rồi,chắc bạn này vào sau quá ta, và cả nhà cũng nhất trí cao là như vậy, những bài cơ bản không lên viết quá nhiều, và cũng không lên phân tích quá nhiều như vầy. Đấy là ý kiến của tập thể, no phải của mình .

trhthong
07-04-2008, 12:45
Hôm trước các bác trên 4rom đều ý kiến rồi,chắc bạn này vào sau quá ta, và cả nhà cũng nhất trí cao là như vậy, những bài cơ bản không lên viết quá nhiều, và cũng không lên phân tích quá nhiều như vầy. Đấy là ý kiến của tập thể, no phải của mình .

Anh vui lòng nói rõ hơn đi anh. Không hiểu rõ lắm ý của anh nữa.
Tại vì em thấy bài về phương trình bậc hai này nằm ở trang nhất của subforum C++ nên vào đóng góp chút ý kiến cỏn con của em thôi (và có ghi chú sãn là nếu có gì thiếu xót, mong được những người như anh đóng góp ý kiến, nhưng đóng góp ý kiến về chủ để này, còn chuyện khác, thì vui lòng đừng đả động đến). Còn chuyện các bác trên 4rum đã "thống nhất" như thế nào, thì em chịu, không hiểu nữa.

Em chỉ có ý tốt là phân tích thuật toán và cấu trúc của If - Control Flow thôi mà. Tại em thấy ý kiến đó chưa ai nói. Chưa ai nói tức là có người còn chưa hiểu. Em không dám nói là em hiểu cặn kẽ, nhưng em hiểu hơn thì em nói để người chưa hiểu họ hiểu thêm thôi mà, làm gì mà anh chỉ trích em như vậy?

Anh chuotjery thông cảm cho em nghen, em cũng còn dở lắm, nên cũng ráng tham gia gởi bài cho hiểu biết thêm thôi. Còn anh Pro rồi, thì chỉ cho em với. Cảm ơn anh hen!

chuot_jery
07-04-2008, 12:56
Đấy không phải là chỉ trích, đã nói là ý kiến của tập thể.
http://ddth.com/showthread.php?t=175467

trhthong
07-04-2008, 18:13
hic... Em bó tay với anh chuot_jery rồi...

Nghe anh nói vậy, em chỉ còn biết lắc... mông mà ngán ngẫm. Anh ơi! Anh có đọc hết bài và hiểu hết những ý mà các anh khác đã nói trong topic mà anh đưa cho em xem không vậy? Em thấy trong đó mỗi người một quan điểm rõ ràng mà. Còn chuyện "thống nhất" như anh nói, em chẳng thấy ai nói cả... có lẽ em dở... suy luận (hay đoán mò gì đó, em quên mất nghĩa rồi) hơn anh. Có gì anh thông cảm cho em nghen.

Đáng lẽ những dòng dưới này, em phải viết bên topic anh mới đưa, nhưng thôi, anh cho phép em xì pam một bài ngoài chủ đề của topic này nghen. Cảm ơn anh trước.

Thế này anh à, em đồng ý với ý kiến của anh vuongchieuquan. Nhiêu đó là anh hiểu rồi chứ. (nếu chưa hiểu thì anh quay lại topic trước mà coi hen).

Riêng em, em nghĩ thêm thế này: em chẳng thấy bài C nào là dễ cả... kể cả bài "Hello, world!". Bài này em học đầu tiên, và phải có thầy chỉ, em mới hiểu toàn bộ cách thức hoạt động của chương trình. Em nói vậy, là em thấy rằng, với người chưa biết, thì cái gì cũng khó cả, và cũng không phải ai cũng có điều kiện được chỉ dạy, hay có nhiều tài liệu tham khảo, hay có khả năng tìm thông tin giỏi như anh. Nên họ lên diễn đàn hỏi là chuyện bình thường. Mà hỏi mà không ai chịu chỉ thì hỏi làm gì. Anh cứ nghĩ mà xem, nếu anh đưa ra một chủ đề hỏi, mà ai vô cũng hét lên là "cái đó dễ mà hỏi, biến!", thì anh cảm thấy thế nào?

Với lại thế này anh ạ, một người viết chương trình, chạy đúng rồi, nhưng chưa chắc đã hiểu hết những "tinh hoa" trong chương trình đó. Như vậy, ai biết thì đưa ra ý kiến, để mọi người cùng tìm hiểu, cùng nâng cao kiến thức, có sao đâu? Còn em trả lời bài, là mong mình tìm ra được những cái mà mình chưa biết (biết rõ mới dám nói chứ, còn chưa biết rõ, thì nói ra, dễ bị ăn chửi lắm).

Nếu em có lời nào quá, xin anh bỏ quá cho, và cũng mong anh đừng có ép em xì pam bài nữa! Chân thành cảm ơn!

chuot_jery
07-04-2008, 20:51
Đề nghị khi nói nói ngắn gọn, chắt lọc, dân CNTT tránh dài dòng.
Tôi theo dõi diễn đàn một thời gian, thấy các pro ngày càng ít xuất hiện, mà cũng đúng, chả có pro nào thích ghé qua một rum mà toàn hỏi về giải pt bậc 2, câu lệnh if, else,...hoạt động thế nào... Còn tùy bạn suy nghĩ.

hoa2707
29-04-2009, 07:19
ai có giải phương trình bậc hai bằng visual basic không post lên cho anh em đi