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

Đề tài: Lỗi nạp chồng toán tử kì lạ!!!

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

    Mặc định Lỗi nạp chồng toán tử kì lạ!!!

    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. #2
    Ngày gia nhập
    11 2010
    Bài viết
    589

    C++ Code:
    1. if(a>b)

    a và b đều là con trỏ trỏ để các đối tượng PhanSo A, B nào đó. Phép so sánh a>b tương đương với số sánh (&A)>(&B), theo như code của bạn thì b = a->lnext(), tức là b trỏ tới đối tượng được cấp phát sau đối tượng mà a trỏ tới, nên a thường nhỏ hơn b.
    Nó hoàn toàn không liên quan gì đến phép chồng toán tử > mà bạn đã định nghĩa cả. Nếu muốn dùng nó thì làm như sau:
    C++ Code:
    1. if((*a)>b)
    Đã được chỉnh sửa lần cuối bởi boss14420 : 19-02-2012 lúc 05:25 PM. Lý do: nhầm

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

    Nếu a thuong lớn hơn b như bạn nói thì Doi(a, b) phải xảy ra vài lần chứ!!! Mà bạn giải thix cho mình
    if((*a)>b) có nghĩa là gì được ko?

  4. #4
    Ngày gia nhập
    11 2010
    Bài viết
    589

    À, mình nhầm. Phải là nhỏ hơn mới đúng. Đây là cơ chế cấp phát bộ nhớ của HDH.

    Về cái khoản kia: a là con trỏ của PhanSo nên muốn gọi đến operator> của class PhanSo thì phải dùng toán tử tham chiếu thôi. Không thì thế này: if(a->operator>(b))

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

    @boss14420:
    Phải nhìn nhận là bạn siêng thật. Mấy bài dài mà không có chú thích (comments) thế này tôi đọc không nổi.

  6. #6
    Ngày gia nhập
    03 2009
    Nơi ở
    Ở địa ngục
    Bài viết
    667

    Mặc định Lỗi nạp chồng toán tử kì lạ!!!

    Trích dẫn Nguyên bản được gửi bởi nguyennhutbinh Xem bài viết
    Nếu a thuong lớn hơn b như bạn nói thì Doi(a, b) phải xảy ra vài lần chứ!!! Mà bạn giải thix cho mình
    if((*a)>b) có nghĩa là gì được ko?
    Code:
    if((*a)>b)
    là so sánh phân số mà a đang trỏ đến với con trỏ b????????
    thêm dấu * nữa nha.

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