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

Đề tài: bài này sai gì nhỉ..toán tử operator

  1. #1
    Ngày gia nhập
    07 2008
    Bài viết
    30

    Smile bài này sai gì nhỉ..toán tử operator

    bài về phân số(complier VSC++2005)
    Code:
    #include<iostream>
    #include<conio.h>
    using namespace std;
    class phanso
    {
    	int tu;
    	int mau;
    public:
    	phanso()
    	{
    		tu=0;
    		mau=1;
    	}
    	/*	~phanso()
         {
                tu=0;
                mau=1;
         }  */
    	int uscln()
    	{
    		if(tu*mau==0) return 1;
    		else
    			while (tu!=mau)
    			{
    				if (tu>mau) tu-=mau;
    				else mau-=tu;
    			}
    		return tu;
    	}
    	friend istream& operator>>(istream& is,phanso& p);  //  toan tu nhap
    	friend ostream& operator<<(ostream& os,phanso p);   //toan tu xuat
    	friend phanso operator + (phanso p1,phanso p2);		//cac ham toan tu
    	friend phanso operator - (phanso p1,phanso p2);
    	friend phanso operator * (phanso p1,phanso p2);
    	friend phanso operator /(phanso p1,phanso p2);
    	friend phanso rutgon(phanso *ps);
    };
    istream& operator>>(istream& is,phanso& p)
    {
    	do
    	{
    		cout<<"\n nhap tu so"<<endl;
    		is>>p.tu;
    		cout<<"nhap mau so"<<endl;
    		is>>p.mau;
    	}while(p.mau==0);
    	return is;
    }
    ostream& operator<<(ostream& os,phanso p)
    {
    	cout<<"("<<p.tu<<"/"<<p.mau<<")"<<endl;
    	return os;
    }
    phanso operator + (phanso p1,phanso p2)
    {
    	phanso q;
    	q.tu=p1.tu*p2.mau + p2.tu*p1.mau;
    	q.mau=p1.mau* p2.mau;
    	rutgon(&q);
    	return q;
    }
    phanso operator - (phanso p1,phanso p2)
    {
    	phanso q;
    	q.tu=p1.tu*p2.mau + p2.tu*p1.mau;
    	q.mau=p1.mau* p2.mau;
    	rutgon(&q);
    	return q;
    }
    phanso operator * (phanso p1,phanso p2)
    {
    	phanso q;
    	q.tu=p1.tu*p2.tu;
    	q.mau=p1.mau*p2.mau;
    	rutgon(&q);
    	return q;
    }
    phanso operator / (phanso p1,phanso p2)
    {
    	phanso q;
    	q.tu=p1.tu*p2.mau;
    	q.mau=p1.mau*p2.tu;
    	rutgon(&q);
    	return q;
    }
    phanso rutgon(phanso *p)
    {
    	int x=p->uscln();
    	p->tu=p->tu/x;
    	p->mau=p->mau/x;
    	return p;
    }
    int main()
    {
    	phanso q,p,a;
    	cout<<"nhap phan so"<<endl;
    	cin>>q;
    	cout<<q<<endl;
    	cin>>p;
    	cout<<p<<endl;
    	cin>>a;
    	cout<<a<<endl;
    	phanso l=q+p+a;
    	rutgon(&l);
    	cout<<"\n ket qua la : " <<l;
    	_getch();
    	return 0;
    }
    bài này mình dùng đa số là con trỏ.....mình không biết sai chỗ nào cả ..htlp mình với thanks
    có vấn đề chỗ operator nhập xuất thì ok
    Đã được chỉnh sửa lần cuối bởi thanhlinhhue : 28-02-2009 lúc 04:22 PM.

  2. #2
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Mình đánh dấu phần đã sửa.
    C Code:
    1. #include<iostream>
    2. #include<conio.h>
    3. using namespace std;
    4.  
    5. class phanso
    6. {
    7.     int tu;
    8.     int mau;
    9. public:
    10.     phanso()
    11.     {
    12.         tu=0;
    13.         mau=1;
    14.     }
    15.     /*  ~phanso()
    16.      {
    17.             tu=0;
    18.             mau=1;
    19.      }  */
    20.     int uscln(int tu, int mau)  /////////////////////
    21.     {
    22.         if (mau==0) return tu;
    23.         return uscln(mau,tu%mau);
    24.     }
    25.     friend phanso rutgon(phanso *ps);
    26.     friend istream& operator>>(istream& is,phanso& p);  //  toan tu nhap
    27.     friend ostream& operator<<(ostream& os,phanso p);   //toan tu xuat
    28.     friend phanso operator + (phanso p1,phanso p2);     //cac ham toan tu
    29.     friend phanso operator - (phanso p1,phanso p2);
    30.     friend phanso operator * (phanso p1,phanso p2);
    31.     friend phanso operator /(phanso p1,phanso p2);
    32.  
    33. };
    34.  
    35. istream& operator>>(istream& is,phanso& p)
    36. {
    37.     do
    38.     {
    39.         cout<<"\n nhap tu so"<<endl;
    40.         is>>p.tu;
    41.         cout<<"nhap mau so"<<endl;
    42.         is>>p.mau;
    43.     }while(p.mau==0);
    44.     return is;
    45. }
    46. ostream& operator<<(ostream& os,phanso p)
    47. {
    48.     os<<"("<<p.tu<<"/"<<p.mau<<")"<<endl;  ////////
    49.     return os;
    50. }
    51. phanso operator + (phanso p1,phanso p2)
    52. {
    53.     phanso q;
    54.     q.tu=p1.tu*p2.mau + p2.tu*p1.mau;
    55.     q.mau=p1.mau* p2.mau;
    56.     rutgon(&q);
    57.     return q;
    58. }
    59.  
    60. //Nhung tru lam vay khong on, lam mot cai lay doi
    61. //roi lam mot cai tru bang + cua no voi doi cai thu 2
    62. phanso operator - (phanso p1,phanso p2)
    63. {
    64.     phanso q;
    65.     q.tu=p1.tu*p2.mau - p2.tu*p1.mau;   //////////
    66.     q.mau=p1.mau* p2.mau;
    67.     rutgon(&q);
    68.     return q;
    69. }
    70. phanso operator * (phanso p1,phanso p2)
    71. {
    72.     phanso q;
    73.     q.tu=p1.tu*p2.tu;
    74.     q.mau=p1.mau*p2.mau;
    75.     rutgon(&q);
    76.     return q;
    77. }
    78. phanso operator / (phanso p1,phanso p2)// dieu kien khac 0 nhe'
    79. {
    80.     phanso q;
    81.     q.tu=p1.tu*p2.mau;
    82.     q.mau=p1.mau*p2.tu;
    83.     rutgon(&q);
    84.     return q;
    85. }
    86. phanso rutgon(phanso *p)
    87. {
    88.     int x=p->uscln(p->tu,p->mau);
    89.     p->tu=p->tu/x;
    90.     p->mau=p->mau/x;
    91.     return *p;
    92. }
    93. int main()
    94. {
    95.     phanso q,p,a;
    96.     cout<<"nhap phan so"<<endl;
    97.     cin>>q;
    98.     cout<<q<<endl;
    99.     cin>>p;
    100.     cout<<p<<endl;
    101.     cin>>a;
    102.     cout<<a<<endl;
    103.     phanso l=q+p+a;
    104.     rutgon(&l);
    105.     cout<<"\n ket qua la : " <<l;
    106.     //_getch();
    107.     return 0;
    108. }

  3. #3
    Ngày gia nhập
    07 2008
    Bài viết
    30

    ý bạn là mình ko nên làm toán tử - như vậy hả..làm như thế thì có lợi gì so với cách của bạn là
    Code:
    PhanSo operator - (PhanSo ps)
    {
        ps.tu *= -1;
        ps.RutGon();
        return ps;
    }
    
    PhanSo operator - (PhanSo ps, PhanSo _ps)
    {
        return ps + (-_ps);
    }

  4. #4
    Ngày gia nhập
    07 2008
    Bài viết
    30

    Quang Hoang ơi...đây là VD của mình về con trỏ
    Code:
    #include<iostream.h>
    #include<conio.h>
    class phanso
    {
    	int tu,mau;
    public:
    	void nhap()
    	{
    		cin>>tu>>mau;
    	}
    	int uscln()
    	{
    		while(tu!=mau)
    		{
    			if(tu>mau) tu-=mau;
    			else mau-=tu;
    		}
    		return tu;
    	}
    	friend void nhap(phanso *p,phanso *q)
    	{
    	cout<<"\n+nhap q";
    	q->nhap();
    	cout<<endl;
    	cout<<"\n+nhap p:\n";
    	p->nhap();
    	cout<<endl;
    	cout<<"\n p:"<<endl;
    	cout<<p->uscln();
    	cout<<endl;
    	cout<<"\n q:"<<endl;
    	cout<<q->uscln();
    	}
    };
    void main()
    {
    	clrscr();
    	phanso p,q;
    	nhap(&p,&q);
    	getch();
    
    }
    phần in đậm là cách truyền bằng con trỏ....
    trong hàm
    Code:
    int uscln()
    	{
    		while(tu!=mau)
    		{
    			if(tu>mau) tu-=mau;
    			else mau-=tu;
    		}
    		return tu;
    	}
    khong can phai
    Code:
    int uscln(phanso tu,phanso mau)
    khi nhập p={2,8} q{3,9} thi nó cũng trả về kết quả USCLN của p và q là chính xác
    còn trong bài toán tử đầu tiên của mình
    Code:
    phanso rutgon(phanso *p)
    {
    	int x=p->uscln();
    	p->tu=p->tu/x;
    	p->mau=p->mau/x;
    	return p;
    }
    cái hàm USCLN
    Code:
    int uscln()
    	{
    		if(tu*mau==0) return 1;
    		else
    			while (tu!=mau)
    			{
    				if (tu>mau) tu-=mau;
    				else mau-=tu;
    			}
    		return tu;
    	}
    thì nó lại sai..ví dụ của mình thì nó trả về đúng USCLN của P và q còn cái bài toán tử của mình .. nếu ko truyền tham số vào hàm USCLN
    Code:
    int uscln(int tu,int mau)
    thì nó lại sai tại sao vậy trả lời hộ mình với thanks

  5. #5
    Ngày gia nhập
    07 2008
    Bài viết
    30

    ah mình hiểu rồi...nếu mình ko truyền tham số tới uscln() thì cả tử và mẫu sẽ thay đổi..khi đó sẽ cho kết quả hoàn toàn sai có phải vậy không ..? sau khi Debug mình thấy vậy...góp ý nha

  6. #6
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Mặc định bài này sai gì nhỉ..toán tử operator

    ý bạn là mình ko nên làm toán tử - như vậy hả..làm như thế thì có lợi gì so với cách của bạn là
    Làm như mình thì bạn có thể lấy đối -a chẳng hạn, và tận dụng luôn phép toán cộng. Nếu thích thì cả nhân chia cũng làm vậy luôn, rất hay mà.

    Còn cái bài trên cùng của cậu, phần tính UCLN bị sai, nên mình lấy cái code sẵn có của mình cho vào, nhưng nó là đệ quy nên phải truyền giá trị vào như này:
    int uscln(phanso tu,phanso mau)

    Code trên dùng con trỏ, nhưng với C++ bạn nên dùng tham chiếu dễ hiểu hơn con trỏ chứ.

    Còn tìm UCLN có rất nhiều cách, nhưng mình thấy cách chia % và / là hay nhất, bạn tham khảo thêm.
    C Code:
    1. #include <stdio.h>
    2.  
    3. int UCLN(int a, int b) //voi a,b khac 0
    4. {
    5.     while (b!=0)
    6.     {
    7.         int ucln = b;
    8.         b = a%b;
    9.         a = ucln;
    10.     }
    11.     return a;
    12. }
    13.  
    14. int main()
    15. {
    16.     printf("%d",UCLN(10,10));
    17. }

  7. #7
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    ah mình hiểu rồi...nếu mình ko truyền tham số tới uscln() thì cả tử và mẫu sẽ thay đổi..khi đó sẽ cho kết quả hoàn toàn sai có phải vậy không ..? sau khi Debug mình thấy vậy...góp ý nha
    Uh, vậy thì phải.
    Mà hàm UCLN đâu liên quan gì tới class phân số, ý mình là cậu cho hàm đó độc lập ở ngoài cũng chẳng sao.

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

  1. Hỏi về toán tử gán(operator=)
    Gửi bởi tung_ct trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 5
    Bài viết cuối: 04-12-2011, 10:25 PM
  2. sử khác biệt giữ String::operator += ()va String::operator +() khi sử dung char *p
    Gửi bởi sasadudu trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 3
    Bài viết cuối: 08-04-2011, 03:28 PM
  3. toán tử Operator>> và Operator<< trên VC++6.0?
    Gửi bởi newbie.blind 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: 05-10-2010, 03:43 PM
  4. cho mình hỏi về toán tử operator???
    Gửi bởi cat_street447 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 15
    Bài viết cuối: 11-05-2010, 10:16 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