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

Đề tài: vấn đề với chương trình biểu diễn phân số!!!

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

    Mặc định vấn đề với chương trình biểu diễn phân số!!!

    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <math.h>
    #include <process.h>
    
    char *kh;
    int rutgon(int *a,int *b)
    {
        int c=abs(*a),d=abs(*b),uc;
        while(c!=0&&d!=0)
        {
        if(c>d)c=c%d;
        if(d>c)d=d%c;
        }
        if(c==0)uc=d;
        if(d==0)uc=c;
        *a/=uc;
        *b/=uc;
    }  
    void in(int a,int b,int c,int d,int ts,int ms)
    {
         if(ms==1||ts==0)printf("\n(%d/%d) %s (%d/%d) = %d",a,b,kh,c,d,ts);
         else if(ts*ms>0)printf("\n(%d/%d) %s (%d/%d) = %d/%d",a,b,kh,c,d,abs(ts),abs(ms));
         else if(ts*ms<0&&ts>ms)printf("\n(%d/%d) %s (%d/%d) = %d/%d",a,b,kh,c,d,-1*ts,-1*ms);
         else if(ts*ms<0&&ts<ms)printf("\n(%d/%d) %s (%d/%d) = %d/%d",a,b,kh,c,d,ts,ms);
    }   
    void cong(int a,int b,int c,int d)
    {
        int ts,ms;
        ts=a*d+b*c;
        ms=b*d;
        rutgon(&ts,&ms);
        in(a,b,c,d,ts,ms);
    }
    void tru(int a,int b,int c,int d)
    {
        int ts,ms;
        ts=a*d-b*c;
        ms=b*d;
        rutgon(&ts,&ms);
        in(a,b,c,d,ts,ms);
    }
    void nhan(int a,int b,int c,int d)
    {
        int ts,ms;
        ts=a*c;
        ms=b*d;
        rutgon(&ts,&ms);
        in(a,b,c,d,ts,ms);
    }
    void chia(int a,int b,int c,int d)
    {
        int ts,ms;
        ts=a*d;
        ms=b*c;
        rutgon(&ts,&ms);
        in(a,b,c,d,ts,ms);
    }
    void main()
    {
         int a,b,c,d,chon;
         printf("\nNhap tu so phan so thu 1: ");
         scanf("%d",&a);
         do
         {
         printf("\nNhap mau so phan so thu 1: ");
         scanf("%d",&b);
         }while(b==0);
         printf("\nNhap tu so phan so thu 2: ");
         scanf("%d",&c);
         do
         {
         printf("\nNhap mau so phan so thu 2: ");
         scanf("%d",&d);
         }while(d==0);
         printf("\n1-Cong  2-Tru  3-Nhan  4-Chia  5-Thoat");
         do
         {
         printf("\nChon menu: ");
         scanf("%d",&chon);
         while(chon<1||chon>5)
         {
         printf("\nHay chon lai: ");
         scanf("%d",&chon);
         }
         switch(chon)
         {
                     case 1: kh="+";
                             cong(a,b,c,d);
                             break;
                     case 2: kh="-";
                             tru(a,b,c,d);
                             break;
                     case 3: kh="x";
                             nhan(a,b,c,d);
                             break;
                     case 4: kh="/";
                             chia(a,b,c,d);
                             break;
                     case 5: exit(0);
                             break;
         }
         getch();
         }while(chon>0&&chon<5);
    }
    M viết code như vậy, không hiểu tại sao lại có những trường hợp khiến cho chuơng trình xảy ra lỗi khi chạy. v/dụ m nhập (1/2) và (3/4) (a=1,b=2,c=3,d=4), chuơng trình bị lỗi khi m muốn thực hiện phép chia (chon=4). nếu m nhập (1/2) và (-2/7) thì chuơng trình lại có lỗi ở cả phép trừ (chon=2) và phép chia (chon=4)....
    Ai chỉ giúp m sai ở đâu vs :(

  2. #2
    Ngày gia nhập
    12 2009
    Nơi ở
    Thanh Xuan, HN, Vietnam
    Bài viết
    42

    Mình phát hiện ra lỗi ở phép chia cho 0 trong phần rút gọn:
    Code:
    int rutgon(int *a,int *b)
    {
        int c=abs(*a),d=abs(*b),uc;
        while(c!=0&&d!=0)
        {
        if(c>d)c=c%d;// dk1
        if(d>c)d=d%c;// dk2
        }
        if(c==0)uc=d;
        if(d==0)uc=c;
        *a/=uc;
        *b/=uc;
    }
    giả sử trong hàm có c=3, d=4
    Kí hiệu dk1 là lệnh if thứ 1
    dk2 là lệnh if thứ 2
    Khi đó trong vòng lặp
    d>c nên dk2 thực hiện cho ra d=4%3=1
    sang vòng kế tiếp: c=3, d=1
    Do c>d nên dk1 thực hiện cho ra c=3%1=0
    Do c=0<d=1 nên dk2 được thực hiện ngay sau thực hiện dk1 d=1%0==>lỗi
    Nghĩa là vòng lặp chưa chạy hết các câu lệnh đã gặp trường hợp c=0 và bị lỗi trước khi kiểm tra điều kiện lặp cho lượt lặp tiếp theo

    Full name: Nguyễn Đăng Quang
    Skype: mr.quanga3
    Gmail: dangquangk53a3@gmail.com
    Mobile: 0166.978.6636

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

    Thanks. M hiểu rồi. Vậy thì thay chỗ if(d>c) đó bằng else là ổn nhỉ :-p

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