程序頭部註釋開始
* 程序的版權和版本聲明部分
* Copyright (c) 2011, 煙臺大學計算機學院學生
* All rights reserved.
* 文件名稱: 分數類運算符重載
* 作 者: 郭廣建
* 完成日期: 2012年 04 月 22 日
* 版 本 號: 1.0
源程序:
#include <iostream>
using namespace std;
class CFraction
{
private:
int nume; // 分子
int deno; // 分母
public:
friend istream &operator >>(istream &input, CFraction &c2);
friend ostream &operator <<(ostream &output, CFraction &c2);
CFraction(int nu = 0, int de = 1); //構造函數,初始化用
CFraction operator+(CFraction &c2); //運算符的重載
CFraction operator-(CFraction &c2);
CFraction operator*(CFraction &c2);
CFraction operator/(CFraction &c2);
void Simplify(); //化簡
};
int gcd(int de1,int de2); //求最大公約數
istream &operator >>(istream &input, CFraction &c2)
{
char c;
while(1)
{
cout << "請按'分子/分母'順序輸入:" <<endl;
input >> c2.nume>> c >> c2.deno;
if(c != '/')
{
continue;
}
if(c2.deno == 0)
{
continue;
}
else
{
break;
}
}
return input;
}
ostream &operator <<(ostream &output, CFraction &c2)
{
output <<'(' << c2.nume <<','<<c2.deno<<')';
return output;
}
CFraction::CFraction(int nu , int de)
{
if(de != 0)
{
nume = nu;
deno = de;
}
else
{
cout << "輸入錯誤!" <<endl;
exit(0);
}
}
CFraction CFraction::operator+(CFraction &c2)
{
CFraction c;
int Max_r = gcd(deno, c2.deno);
c.deno = (deno / Max_r) * (c2.deno / Max_r);
c.nume = (nume * (c.deno / deno)) + (c2.nume * (c.deno / c2.deno));
return c;
}
CFraction CFraction::operator-(CFraction &c2)
{
CFraction c;
int Max_r = gcd(deno, c2.deno);
c.deno = (deno / Max_r) * (c2.deno / Max_r);
c.nume = (nume * (c.deno / deno)) - (c2.nume * (c.deno / c2.deno));
return c;
}
CFraction CFraction::operator*(CFraction &c2)
{
return CFraction(nume * c2.nume , deno * c2.deno);
}
CFraction CFraction::operator/(CFraction &c2)
{
return CFraction(nume * c2.deno , deno * c2.nume);
}
void CFraction::Simplify()
{
int m, n, r;
m = abs(nume);
n = abs(deno);
r = gcd(m, n);
deno /= r;
nume /= r;
if(deno < 0)
{
deno = -deno;
nume = -nume;
}
}
void main()
{
CFraction c1, c2,c3;
cin >> c1 >> c2;
cout << "c1 = " ;
cout << c1 <<endl;
cout << "c2 = " ;
cout << c2 <<endl;
c2.Simplify();
cout << "c2化簡得:";
cout << c2 <<endl;
c3 = c1 + c2;
cout << "c1 + c2 = " ;
cout << c3 <<endl;
c3 = c1 - c2;
cout << "c1 - c2 = " ;
cout << c3 <<endl;
c3 = c1 * c2;
cout << "c1 * c2 = " ;
cout << c3 <<endl;
c3 = c1 / c2;
cout << "c1 / c2 = " ;
cout << c3 <<endl;
system("pause");
}
int gcd(int de1,int de2)
{
int r;
if(de1 < de2)
{
r = de1; de1 = de2; de2 = r;
}
while(r = de1 % de2)
{
de1 = de2;
de2 = r;
}
return de2;
}
運行結果:
知識積累:
1. 通過對3種不同類的輸入、輸出符的重載,熟悉了運算符重載的很多細節的知識
2. 這幾週一直在做關於運算符重載的項目,從單目運算符、雙目運算符到輸入輸出運算符,感覺這些知識大體框架差不多,知識要注意裏面的細節問題,比如說重載時參數的知識,很值得注意
3. 不斷地用友元函數,對其掌握的已經比以前好多了,學習C++,就應該對裏面的很多知識重複使用,就自然而然的能夠熟練的掌握。