Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 18 kết quả

Đề tài: dùng cấu trúc switch case viết chương trình giải phương trình bậc 2

  1. #1
    Ngày gia nhập
    05 2018
    Bài viết
    0

    Mặc định dùng cấu trúc switch case viết chương trình giải phương trình bậc 2

    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.

  2. #2
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    867

    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.

  3. #3
    Ngày gia nhập
    05 2018
    Bài viết
    0

    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:
    1. #include<stdio.h>
    2. #include<math.h>
    3.  
    4. int main()
    5. {
    6.     float a, b, c, delta;
    7.     printf("nhap vao a,b,c");
    8.     scanf("%f%f%f", &a, &b, &c);
    9.     if (a == 0)
    10.     {
    11.         if (b == 0)
    12.         {
    13.             if (c == 0)
    14.                 printf("phuong trinh vo so nghiem");
    15.             else //c!=0
    16.                 printf("phuong trinh vo nghiem");
    17.         }
    18.         else // b!=0
    19.         {
    20.             if (c == 0)
    21.                 printf("phuong trinh co nghiem bang 0");
    22.             else //c!=0
    23.                 printf("phuong trinh co nghiem la : %f \n", -c / b);
    24.         }
    25.     }
    26.     else //a!=0
    27.     {
    28.         delta = b * b - 4 * a * c;
    29.         if (delta > 0)
    30.             printf("phuong trinh co hai nghiem phan biet : %f %f \n ", (-b + sqrt(delta)) / 2 * a, (-b - sqrt(delta)) / 2 * a);
    31.         else if (delta < 0)
    32.             printf("phuong trinh vo nghiem");
    33.         else //delta =0
    34.             printf("phuong trinh co nghiem kep : %f", -b / 2 * a);
    35.     }
    36.     return 0;
    37. }
    Đã đượ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

  4. #4
    Ngày gia nhập
    08 2017
    Bài viết
    1,870

    Em đã viết sai chứ không phải viết được
    C Code:
    1.         if (delta > 0)
    2.             printf("phuong trinh co hai nghiem phan biet : %f %f \n ", (-b + sqrt(delta)) / 2 * a, (-b - sqrt(delta)) / 2 * a);
    , viết đúng:
    Công thức toán học Latex

    Kiểm thử với a != 1 cho rõ ràng.

  5. #5
    Ngày gia nhập
    05 2018
    Bài viết
    0

    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 ạ

  6. #6
    Ngày gia nhập
    08 2017
    Bài viết
    1,870

    Mặc định dùng cấu trúc switch case viết chương trình giải phương trình bậc 2

    Sửa lại cho đúng trước đi; không ai giúp thì tôi sẽ giúp.

  7. #7
    Ngày gia nhập
    05 2018
    Bài viết
    0

    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;
    }

  8. #8
    Ngày gia nhập
    02 2016
    Bài viết
    299

    Ở 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
            ....
        }
    }

  9. #9
    Ngày gia nhập
    07 2011
    Bài viết
    473

    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ỏ.
    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...

    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.

  10. #10
    Ngày gia nhập
    05 2018
    Bài viết
    0

    dạ em cảm ơn các anh đã giúp em ạ

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn