Announcement

Collapse
No announcement yet.

Giúp mình: Lỗi nạp chồng toán tử??

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [C++] Giúp mình: Lỗi nạp chồng toán tử??

    Mình đã mất rất nhiều thời gian với bài nảy! Mong những ai đọc nó hãy góp ý giúp mình ..... cảm ơn các bạn!

    Mình có hàm nạp chồng so sánh như sau::
    Code:
    int PhanSo::operator>(PhanSo *M)
    {
        float i, j;
        i = float(this->tuso);
        j = float(M->tuso);
        if(float(i/mauso) > float(j/(M->mauso)) )
           return 1;
        else
           return 0;
    }
    Sau đó mình sử dụng nó trong hàm này::
    Code:
    void SapXep()
    {
            PhanSo *a, *b;
            float i,j;
            a = first;             
            b = NULL;
            while(a!=NULL)
            {
               b = a->lnext();
               while(b!=NULL)
               {
                   if(a>b)
                      Doi(a, b);
                   b = b->lnext();
               }
               a = a->lnext();
            }
    }
    Kết quả là Doi(a, b) trong hàm SapXep() không bao giờ xảy ra??? Nhưng nếu sửa thành::
    Code:
    void SapXep()
    {
            PhanSo *a, *b;
            float i,j;
            a = first;             
            b = NULL;
            while(a!=NULL)
            {
               b = a->lnext();
               while(b!=NULL)
               {
                   i = float(a->tuso);
                   j = float(b->tuso);
                   if(float(i/(a->mauso)) > float(j/(b->mauso) ))
                      Doi(a, b);
                   b = b->lnext();
               }
               a = a->lnext();
            }
    }
    thì bài code run tốt! Vậy lỗi là do đâu?? Với cách gọi if(a>b) thì trình biên dịch có vấn đề gì làm Doi(a, b) ko thực thi được??

    ĐÂY LÀ TOÀN BÀI CODE CỦA MÌNH:::
    Code:
    #include<iostream.h>
    #include<conio.h>
    
    class PhanSo
    {
          private:
                  int tuso;
                  int mauso;
                  PhanSo *next;
          public:
                 PhanSo()
                 {
                         next = NULL;
                         tuso = 0;
                 }
                 void ltuso(int tuso)
                 {
                      this->tuso = tuso;
                 }
                 void lmauso(int mauso)
                 {
                      this->mauso = mauso;
                 }
                 friend istream& operator>>(istream &in, PhanSo *&M);
                 friend ostream& operator<<(ostream &out, PhanSo *&M);
                 friend int USCLN(PhanSo *M);
                 friend void SapXep();
                 friend void Doi(PhanSo *M, PhanSo *N);
                 int operator>(PhanSo *M);
                 PhanSo* operator+(PhanSo *M);
                 void dnext(PhanSo *M){ this->next = M; }
                 PhanSo* lnext(){ return this->next; }
      
      
                 
    };
    
    
    PhanSo *first, *last, *p;
    char c;
    
    int PhanSo::operator>(PhanSo *M)
    {
        float i, j;
        i = float(this->tuso);
        j = float(M->tuso);
        if(float(i/mauso) > float(j/(M->mauso)) )
           return 1;
        else
           return 0;
    }
    PhanSo* PhanSo::operator+(PhanSo *M)
    {
            PhanSo *a;
            a->tuso = this->tuso*M->mauso + M->tuso*this->mauso;
            a->mauso = this->mauso*M->mauso;
            return a;
    }
    istream& operator>>(istream &in, PhanSo *&M)
    {
             cout<<"Nhap vao phan so: ";
             in>>M->tuso>>c>>M->mauso;
             return in; 
    }
    ostream& operator<<(ostream &out, PhanSo *&M)
    {
             if(M->tuso == M->mauso) 
                out<<"1"<<endl;
             else
             {
                if(USCLN(M) == M->mauso)
                   out<<M->tuso/USCLN(M)<<endl;
                else
                   out<<M->tuso/USCLN(M)<<"/"<<M->mauso/USCLN(M)<<endl; 
             }
                return out;   
    } 
    
    int USCLN(PhanSo *M)
    {
        int temp;
        int i;
        if(M->tuso < M->mauso)
           temp = M->tuso;
        else
           temp = M->mauso;
           
        for(i=temp; i>=1; --i)
        {
           if(M->tuso % i ==0 && M->mauso % i ==0)
           break;
        }
        return i;
    }
    void Nhap()
    {
         do
         {
               p = new PhanSo;
               cin>>p;
               if(first == NULL)
               {
                        first = p;
                        last = p;
               }
               else
               {
                   last->dnext(p);
                   last=p;
               }
               cout<<"Ban co muon nhap tiep khong?? c/k";
               c = getch();
               cout<<endl;
         }while(c!='k');
    }
    void Xuat()
    {
         PhanSo *a;
         a = first;
         while(a!=NULL)
         {
            cout<<a;
            a = a->lnext();
         }
    }
    void Doi(PhanSo *M, PhanSo *N)
    {
         int temp;
         temp = M->tuso;
         M->ltuso(N->tuso);
         N->ltuso(temp);
       
         temp = M->mauso;
         M->lmauso(N->mauso);
         N->lmauso(temp);
    }
    void SapXep()
    {
            PhanSo *a, *b;
            float i,j;
            a = first;             
            b = NULL;
            while(a!=NULL)
            {
               b = a->lnext();
               while(b!=NULL)
               {
                   if(a>b)
                      Doi(a, b);// ĐOẠN NÀY ĐÂY??
               }
               a = a->lnext();
            }
    }
    
    main()
    {
        first = NULL;
        Nhap();
        SapXep();
        Xuat();
        getch();
    }

  • #2
    void SapXep()
    {
    PhanSo *a, *b;
    float i,j;
    a = first;
    b = NULL;
    while(a!=NULL)
    {
    b = a->lnext();
    while(b!=NULL)
    {
    if(a>b)
    Doi(a, b);// ĐOẠN NÀY ĐÂY??
    }
    a = a->lnext();
    }
    }

    Nhìn sơ qua thì sai chỗ này:
    a và b là 2 con trỏ , không phải 2 đối tượng lớp phân số .
    Nên khi bạn viết if(a>b ) thì đơn giản đây chỉ là so sánh giá trị 2 con trỏ ( đia chỉ thực ra cũng là số nguyên)

    Nếu bạn viết thành (*a)>b thì OK.

    Im a british accent lover

    Comment

    LHQC

    Collapse
    Working...
    X