Hiển thị kết quả từ 1 đến 10 / 14
Chủ đề: Giải phương trình bậc hai
-
16-03-2008 22:21 #1
Giải phương trình bậc hai
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
Code:#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(); }
-
16-03-2008 22:24 #2
Nhờ mọi người tìm lỗi giúp
Ai bít giải thì chỉ giùm đi
-
16-03-2008 22:35 #3
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 !!
Được sửa bởi vtienuit lúc 22:51 ngày 16-03-2008
-
16-03-2008 22:39 #4
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?
-
16-03-2008 22:49 #5
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));
}
}
-
17-03-2008 03:26 #6
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!
-
06-04-2008 22:28 #7
Registered User
- Tham gia
- 29-12-2007
- Bài viết
- 15
- Like
- 0
- Thanked 0 Times in 0 Posts
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 <=========]
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ểĐược sửa bởi jbminhtan lúc 22:33 ngày 06-04-2008 Reason: Bổ sung bài viết
-
07-04-2008 07:31 #8
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:
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!Code: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);
2.Còn khi thực hiện trong phần này:
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.Code: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)); }
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.
-
07-04-2008 12:00 #9
Registered User
- Tham gia
- 27-12-2007
- Bài viết
- 52
- Like
- 0
- Thanked 0 Times in 0 Posts
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 .
-
07-04-2008 12:45 #10
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!


Quote

Bookmarks