Bạn đăng cách viết với if-else cho mọi người xem với, rồi sẽ có ai đó chuyển sang switch-case giúp bạn.
bài tập của em là viết chương trình giải phương trình bậc 2, em đã viết được khi dùng if else r nhưng thầy yêu cầu dùng thêm switch case nữa, em mò cả ngày mà vẫn không khai báo được điều kiện của switch, anh chị có thể giúp em được không ạ, em cảm ơn.
Bạn đăng cách viết với if-else cho mọi người xem với, rồi sẽ có ai đó chuyển sang switch-case giúp bạn.
code của em đây ạ có gì mọi người giúp em viết bằng switch case với e cảm ơn
C Code:
#include<stdio.h> #include<math.h> int main() { float a, b, c, delta; if (a == 0) { if (b == 0) { if (c == 0) else //c!=0 } else // b!=0 { if (c == 0) else //c!=0 } } else //a!=0 { delta = b * b - 4 * a * c; if (delta > 0) else if (delta < 0) else //delta =0 } return 0; }
Đã được chỉnh sửa lần cuối bởi MHoang : 10-05-2018 lúc 05:16 PM. Lý do: Chỉnh khung mã C
Em đã viết sai chứ không phải viết được
, viết đúng:C Code:
Kiểm thử với a != 1 cho rõ ràng.
dạ em cảm ơn anh đã chỉ ra lỗi sai, anh có thể hướng dẫn em viết bằng switch case được không ạ
Sửa lại cho đúng trước đi; không ai giúp thì tôi sẽ giúp.
em đã thử code switch case rồi các anh chị giúp e chỉ ra lỗi sai và khắp phục lỗi sai giúp em code đúng với ạ, em cảm ơn
delta=b*b-4*a*c
switch (delta <0){
case true :
printf("phuong trinh vo nghiem");
break;
case false :
switch(delta==0) {
case true :
printf("phuong trinh co nghiem kep : %f",(-b/(2*a)));
break;
default :
printf("phuong trinh co hai nghiem phan biet : %f %f",(-b+sqrt(delta))/(2*a),(-b-sqrt(delta))/(2*a));
break;
}
break;
}
Ở cái diễn đàn cơ vi ét này, cứ vài bữa thì lại gặp cái loại code if (a==0). Hổng biết đến chừng nào các vị giảng dạy môn này mới chịu khó dạy số thực cho đúng đắn.
Xin nhắc lại cho quý vị hoc sinh môn lập trình được rõ: toán giải phương tình là toán số thực. Số thực không so sánh trực tiếp được. Hai số được chấp nhận là bằng nhau khi hiệu của chúng là một số có trị tuyệt đối rất nhỏ. Một số đuọc coi là bằng o khi trị tuyệt đối của nó nhỏ hơn epsilon (sai số chấp nhận).
Trần tình số thực xong, bây giờ là đề bài. Vị giáo viên giảng dạy nào ra bài này có thể đựoc coi là dạng nếu không ngu thì cũng khùng. Bài giải phương trình mà bắt dùng switch/case là bắt chó kéo cày. Cấu trúc switch/case trong C chỉ hiệu quả khi sự chọn lựa nằm ở dạng trị rời rạc; điển hình là số nguyên.
Xác định như vậy rồi, bây giờ phải tìm cách đẽo nhỏ cái cày để mắc vào vai chó. Túm lại là ta có hai cong việc:
1. thiết kế cách so sánh 2 số thực
2. chuyển lô gic true/false thành số nguyên
Code:// macro so sánh 2 số thực, kết quả: X < Y -> -1; X = Y -> 0; X > Y -> 1 // lưu ý rằng fabs cần math.h #define SOSANH(X, Y) ( fabs((X)-(Y)) < 1E-10? 0: (X)>(Y)? 1: -1 ) switch (SOSANH(a, 0)) { case 0: // a==0 thì là phương trình bậc 1, xét tiếp nếu b != 0 thì 1 nghiệm, vv... switch (SOSANH(b, 0)) { ... } ... break; default: // a!= 0 d = b*b - 4*a*c; switch (SOSANH(d, 0)) { case 0: // 1 nghiệm ... break; case 1: // 2 nghiệm ... break; default: // 0 nghiệm .... } }
tầm bậy, 10^-20 với 10^-22 hiệu của chúng là 9.9x10^-21, vậy 10^-20 và 10^-22 là bằng nhau à? Trong khi 1 số lớn hơn số kia 100 lần. So kiểu này là so giá trị tuyệt đối, vẫn ko đúng, còn có so giá trị tương đối nữa. So sánh gần bằng mà chỉ lấy fabs(a-b) < epsilon thì chỉ tạm đúng khi a và b gần bằng 1. Nếu a, b bự thì thành ra epsilon so với a b là cực kì nhỏ, ví dụ a=1 triệu tỷ lẻ 1 và b = 1 triệu tỷ, thì có thể coi a ~ b, nhưng a - b = 1 là cực lớn so với epsilon. Ngược lại, a,b nhỏ thì epsilon so với a,b lại cực kì bự như ví dụ 10^-20...Hai số được chấp nhận là bằng nhau khi hiệu của chúng là một số có trị tuyệt đối rất nhỏ.
hơn nữa kiểu so sánh gần bằng này cũng có vấn đề: nếu a ~ b và b ~ c, vậy a ~ c có đúng ko? Câu trả lời là ko, ví dụ a - b = 0.5epsilon, b - c = 0.6epsilon, vậy a - c = 1.1epsilon, hay a !~ c. Như vậy so sánh gần bằng kiểu này mất quan hệ bắc cầu
hay a ~ b nhưng 10a !~ 10b vì 10a - 10b = 5epsilon chẳng hạn
v.v...
nói chung số thực rất là đau đầu, đúng là ko có vụ so sánh bằng nhau triệt để, nhưng cũng ko có vụ so sánh gần bằng triệt để. Đừng vội "dạy" người ta so sánh gần bằng vì nó giải quyết 1 vấn đề nhỏ nhưng đẻ ra vô số vấn đề lớn khác...
edit: Google test nó xài ULP https://github.com/google/googletest...int-comparison
Đã được chỉnh sửa lần cuối bởi INTP : 12-05-2018 lúc 01:40 AM.
dạ em cảm ơn các anh đã giúp em ạ