Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Kiểm tra có phải là tam giác hay không, chạy sai kết quả khi so với lí thuyết tính toán

  1. #1
    Ngày gia nhập
    11 2011
    Bài viết
    32

    Mặc định Kiểm tra có phải là tam giác hay không, chạy sai kết quả khi so với lí thuyết tính toán

    mình làm 1 bài tập về mảng cấu trúc: kiểm tra 3 điểm nhập vào có tạo thành tam giác ko, nhưng khi nhập 3 điểm A(0,1) B(1,2) B(3,4) thì chương trình báo là lập thành tam giác( mình qui định là return 1), nhưng mà 3 điểm này lại nẳm trên đường thẳng y = x+1 thì sao mà lập thành tam giác được. Nhưng mà nếu thử lải với 3 điểm A(1,2) B(2,3) C(3,4) thì nó lại báo ko tạo thành tam giác - đúng vì cũng cùng nằm trên dt y =x+1

    code của mình đây

    C Code:
    1. #include "stdio.h"
    2. #include "conio.h"
    3. #include "math.h"
    4.  
    5. struct diem
    6. {
    7.     float x;
    8.     float y;
    9. };
    10. typedef struct diem DIEM;
    11.  
    12. struct tamgiac
    13. {
    14.     DIEM A;
    15.     DIEM B;
    16.     DIEM C;
    17. };
    18. typedef struct tamgiac TAMGIAC;
    19.  
    20. void Nhap(DIEM &);
    21. void Nhap(TAMGIAC &);
    22. void Xuat(DIEM &);
    23. void Xuat(TAMGIAC &);
    24. float KhoangCach(DIEM, DIEM );
    25. int KiemTra(TAMGIAC);
    26. float ChuVi(TAMGIAC);
    27.  
    28. void main()
    29. {
    30.     DIEM m;
    31.     TAMGIAC tg;
    32.     Nhap(tg);
    33.     //float Cv = ChuVi(tg);
    34.     int kq = KiemTra(tg);
    35.     printf("%d\n",kq);
    36.  
    37. }
    38.  
    39. void Nhap(DIEM &P)
    40. {
    41.     float temp;
    42.     printf("Nhap x: ");
    43.     scanf("%f",&temp);
    44.     P.x = temp;
    45.     printf("Nhap y: ");
    46.     scanf("%f",&temp);
    47.     P.y = temp;
    48. }
    49.  
    50. void Xuat(DIEM &P)
    51. {
    52.     printf("(%f , %f)",P.x,P.y);
    53. }
    54.  
    55. void Nhap(TAMGIAC &t)
    56. {
    57.     printf("Nhap A: \n");
    58.     Nhap(t.A);
    59.     printf("Nhap B: \n");
    60.     Nhap(t.B);
    61.     printf("Nhap C: \n");
    62.     Nhap(t.C);
    63. }
    64.  
    65. void Xuat(TAMGIAC t)
    66. {
    67.     printf("\nA: ");
    68.     Xuat(t.A);
    69.     printf("\nB: ");
    70.     Xuat(t.B);
    71.     printf("\nC: ");
    72.     Xuat(t.C);
    73. }
    74.  
    75. float KhoangCach(DIEM P, DIEM Q)
    76. {
    77.     return sqrt((P.x-Q.x)*(P.x-Q.x) + (P.y-Q.y)*(P.y-Q.y));
    78. }
    79.  
    80. int KiemTra(TAMGIAC t)
    81. {
    82.     float a=KhoangCach(t.B,t.C);
    83.     float b=KhoangCach(t.C,t.A);
    84.     float c=KhoangCach(t.A,t.B);
    85.     if (a+b>c && b+c>a && a+c>b)
    86.         return 1;
    87.     return 0;
    88. }
    89.  
    90. float ChuVi(TAMGIAC t)
    91. {
    92.     float a=KhoangCach(t.B,t.C);
    93.     float b=KhoangCach(t.C,t.A);
    94.     float c=KhoangCach(t.A,t.B);
    95.     return (a+b+c);
    96. }

    Mong các bạn giúp đỡ !!!!
    Đã được chỉnh sửa lần cuối bởi kitti : 06-12-2011 lúc 05:30 PM. Lý do: đưa code vào tag code

  2. #2
    Ngày gia nhập
    12 2011
    Bài viết
    2

    Nhìn bài của bạn dài dòng quá. Theo t viết thế này nhá

    #include <stdio.h>
    #include <math.h>
    typedef struct{
    float x, y;
    }Point;

    float kc(Point A, Point B){
    return sqrt(pow(A.x-B.x,2)+pow(A.y-B.y,2));
    }
    void main(){
    Point A, B, C;
    float AB,BC,CA;
    printf("Toa do A (x,y) :"); scanf("%f%f",&A.x,&A.y);
    printf("Toa do B (x,y) :"); scanf("%f%f",&B.x,&B.y);
    printf("Toa do C (x,y) :"); scanf("%f%f",&C.x,&C.y);
    AB = kc(A,B); BC = kc(B,C); CA = kc(C,A);
    ......
    }

  3. #3
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Thử gọi hàm xuất xem dữ liệu nhập vào có đúng không

    hảm khoảng cách viết như vậy là đúng rồi. Dùng x*x để diến đạt bình phương là cách đúng đắn nhất. Dùng hàm pow để tính bình phương trông có vẻ ngắn gọn nhưng thật ra chậm hơn và nhiều sai số hơn.

  4. #4
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Có thể do sai số của các phép tính trên số thực đó bạn
    Giờ thay vì bạn kiểm tra khoảng cách (có thêm phép sqrt). Thì cái hàm tính khoảng cách viết lại là tính Bình phương khoảng cách(ko return sqrt nữa). (Chứ đừng căn xong rồi bình phương lại mất công )
    Rồi ta đi so sánh mấy cái bình phương khoảng cách này là nó sẽ ít sai số hơn đấy.

    Ngoài ra :
    Kiểm tra vector trùng phương xem thử đi bạn
    Kiểm tra cái này nhẹ nhàng khỏi phải tính khoảng cách. Vậy ta bớt đi phép mũ 2 và phép sqrt .
    Sẽ ra kết quả chính xác hơn đấy. Thử xem sao
    Um Mani Padme Hum...!!

  5. #5
    Ngày gia nhập
    11 2011
    Bài viết
    32

    thks mọi người, đã chuyển wa kiểm tra vecto có cùng phương hay ko để kết luận => chạy đúng
    chắc do cái sai số như bạn clchicken nói

Các đề tài tương tự

  1. Trả lời: 0
    Bài viết cuối: 15-06-2012, 11:03 AM
  2. Phần Euler và phần duyệt theo chiều rộng (DFS) chạy sai kết quả?
    Gửi bởi hoangde102 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 09-05-2012, 09:37 AM
  3. Lập trình C Chỉ giúp mình cái hàm này có trong phần lý thuyết nào với
    Gửi bởi hoangvantu trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 30-03-2012, 11:15 PM
  4. Lưu đồ duyệt thành phần liên thông(lý thuyết đồ thị)
    Gửi bởi kaka391989 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 14-11-2010, 08:45 PM
  5. [Lý thuyết]Công nghệ phần mềm và CMMI
    Gửi bởi huynguyen trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 8
    Bài viết cuối: 01-01-2009, 02:28 PM

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