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

Đề tài: Các phép toán của phân số trong hướng đối tượng

  1. #1
    Ngày gia nhập
    12 2010
    Nơi ở
    Hanoi, Vietnam, Vietnam
    Bài viết
    688

    Mặc định Các phép toán của phân số trong hướng đối tượng

    các anh xem giúp em với :
    cái bài này của em nó chạy sai với các trường hợp 2 phân số = nhau
    PHP Code:
    #include<iostream>
    #include<math.h>
    using namespace std;
    class 
    phanso {
             private : 
                    
    int tu;
                    
    int mau;
             public :
                    
    phanso(){
                        
    tu=0,mau=0;
                    }
                    
    phansoint tu1int mau1){
                        
    tu1 =tu;
                        
    mau1=mau;
            }
                 ~
    phanso(){
                        
    this->tu=0;
                        
    this->mau=0;
                    }
                    
    void nhap ();
                    
    void output();
                    
    void rutgon();
                    
    phanso cong(phanso b);
                    
    phanso tru(phanso b);
                    
    phanso nhan(phanso b);
                    
    phanso chia(phanso b);
                                };
     
    void phanso::nhap()
     {
                 
    cout<<" nhap tu so :";
                 
    cin>> tu;
                 
    cout<<" nhap mau so :";
                 
    cin>>mau;
                            }
                            
        
    void  phanso::output(){
              
    cout<< tu << " / " << mau;
                }
        
    void phanso::rutgon(){
                  
    int c abs(tu);// lay tri tuyet doi cua tu so
                 
    int d abs(mau);   // lay  tri tuyet doi cua  mau so 
        
    while(!= d)                           
                if(
    dcd;     
                else 
    c;
           
    tu tu c;
           
    mau mau c;
                }
                
    // dinh nghi phuong thuc cua ham cong phan so
     
    phanso phanso::cong(phanso b){
               
    phanso kq;
        
    kq.tu tu b.mau mau b.tu;  // Quy dong phan so
        
    kq.mau mau b.mau;
        
    kq.rutgon();  // Rut gon phan so Tong 
        
    return kq;  // Roi tra ve phan so

    // dinh nghia phuong thuc cua ham nhan phan so
    phanso phanso::nhan(phanso b){
          
    phanso kq;
          
    kq.tu =  tu*b.tu;// tinh tu cau pahn so
          
    kq.mau =    mau*b.mau;    
          
    kq.rutgon();
          return 
    kq;
                    }
                    
    // dinh nghia cua ham hieu 2 phan so 
    phanso phanso::truphanso b){
            
    phanso kq;
             
    kq.tu tu*b.mau b.tu*mau;
             
    kq.mau mau*b.mau;
             
    kq.rutgon(); // su dung phuong thuc rut gon cho kq
             
    return kq;// tra ve ket qua 
            
    }
            
    // dinh nghia ham chia phan  so
    phanso phanso::chiaphanso b){
                            
    phanso kq;
                             
    kq.tu=tu*b.mau;
                             
    kq.mau=mau*b.tu;
                             
    kq.rutgon();
                             return 
    kq;
                            }
    int main(){
               
    phanso a,b;
               
    phanso kq;
              
    cout<<" nhap phan so a=\n";
               
    a.nhap();
               
    cout<<" nhap phan so b=\n";
               
    b.nhap();
               
    phanso tong ,hieu ,tich,thuong;
                     
    tong a.cong(b);
                     
    thuonga.chia(b);
                     
    tich a.nhan(b);
                     
    hieu=a.tru(b);
                     
    cout<<" tong 2 phan so la :";
                     
    tong.output();
                     
    cout<<endl;
                     
    cout<<" tich 2 phan so la :";
                     
    tich.output();
                     
    cout<<endl;
                     
    cout<<" thuong 2 phan so la :";
                     
    thuong.output();
                     
    cout<<endl;
                     
    cout<<" hieu";
                                                        
                     
    hieu.output();
                    
    cout<<endl;
                     
    system("pause");
                     return 
    0;


  2. #2
    Ngày gia nhập
    08 2010
    Nơi ở
    Moscow, Russia Federation
    Bài viết
    913

    Cái gì chạy sai với hai phân số bằng nhau? Phép toán so sánh, phép cộng, phép trừ, phép nhân, phép chia hay là cái gì hả em?
    Mời các bạn ghé thăm blog cá nhân của tôi

  3. #3
    Ngày gia nhập
    12 2010
    Nơi ở
    Hanoi, Vietnam, Vietnam
    Bài viết
    688

    Trích dẫn Nguyên bản được gửi bởi mp121209 Xem bài viết
    Cái gì chạy sai với hai phân số bằng nhau? Phép toán so sánh, phép cộng, phép trừ, phép nhân, phép chia hay là cái gì hả em?
    khi nhập 2 phân số = nhau thì nó ko chạy ra kết quả anh ạ ! còn nếu mà 2 phân số đó khác nhau thì lại chạy đc và ra kết quả đúng ! em ko hiểu tại sao lại như thế !

  4. #4
    Ngày gia nhập
    01 2011
    Nơi ở
    Sài Gòn
    Bài viết
    2

    Chương trình của bạn sai vài chỗ.

    Sai vế phép gán:
    C++ Code:
    1. phanso( int tu1, int mau1){
    2.     tu1 =tu;
    3.     mau1=mau;

    Do bạn chưa dùng tới hàm khởi tạo này nên chưa thấy có lỗi. Song mai mốt đụng tới nó, bạn sẽ biết tay với nó! Sửa lại như sau:
    C++ Code:
    1. phanso( int tu1, int mau1){
    2. tu = tu1;
    3. mau = mau1;

    Cú pháp chết người:
    C++ Code:
    1. while(c != d)                            
    2.             if(c > d) c= c - d;      
    3.             else d = d - c;
    4.        tu = tu / c;
    5.        mau = mau / c;

    Khi hai phân số bằng nhau, bạn sẽ bị kẹt ở phép trừ. Thí dụ, 1/2 - 1/2 bạn cho ra 0/4 (theo giải thuật bạn dùng). Khi vào while để rút gọn, bạn sẽ không bao giờ ra khỏi nó, vì:

    c == 0, d == 4.
    (c > d)?
    c < d ==> d = d - c == 4 - 0 == 4.
    ==> c luôn luôn khác d, while không bao giờ ngắt.

    Nếu có phép thần nào cho while tự nhiên ngắt thì bạn cũng sẽ chết dở với tu = tu / c. Đó là lỗi chia cho 0.

    Vậy, ngay từ đầu bạn nên kiểm tra tu. Nếu nó bằng 0 thì return luôn.
    "In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." - Bjarne Stroustrup

  5. #5
    Ngày gia nhập
    12 2010
    Nơi ở
    Hanoi, Vietnam, Vietnam
    Bài viết
    688

    Trích dẫn Nguyên bản được gửi bởi alexanderdna Xem bài viết
    Chương trình của bạn sai vài chỗ.

    Sai vế phép gán:
    C++ Code:
    1. phanso( int tu1, int mau1){
    2.     tu1 =tu;
    3.     mau1=mau;

    Do bạn chưa dùng tới hàm khởi tạo này nên chưa thấy có lỗi. Song mai mốt đụng tới nó, bạn sẽ biết tay với nó! Sửa lại như sau:
    C++ Code:
    1. phanso( int tu1, int mau1){
    2. tu = tu1;
    3. mau = mau1;

    Cú pháp chết người:
    C++ Code:
    1. while(c != d)                            
    2.             if(c > d) c= c - d;      
    3.             else d = d - c;
    4.        tu = tu / c;
    5.        mau = mau / c;

    Khi hai phân số bằng nhau, bạn sẽ bị kẹt ở phép trừ. Thí dụ, 1/2 - 1/2 bạn cho ra 0/4 (theo giải thuật bạn dùng). Khi vào while để rút gọn, bạn sẽ không bao giờ ra khỏi nó, vì:

    c == 0, d == 4.
    (c > d)?
    c < d ==> d = d - c == 4 - 0 == 4.
    ==> c luôn luôn khác d, while không bao giờ ngắt.

    Nếu có phép thần nào cho while tự nhiên ngắt thì bạn cũng sẽ chết dở với tu = tu / c. Đó là lỗi chia cho 0.

    Vậy, ngay từ đầu bạn nên kiểm tra tu. Nếu nó bằng 0 thì return luôn.
    thank anh nhé ! em tìm mãi mà ko biết sai ở đâu !

  6. #6
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,918

    Mặc định Các phép toán của phân số trong hướng đối tượng

    @xuyenit55:
    Lúc mới học C++ với class thì nếu là biến của class. Khi ra rõ ràng
    C++ Code:
    1. this->x
    sẽ dễ hiểu hơn.

    Coi thêm:
    - constness của hàm trong lớp
    - cú pháp khởi tạo bằng dấu : cho constructor.
    - quá tải toán tử

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