实验目的:接第八周任务3,定义分数类中的<<和>>运算符的重载,实现输入和输出,改造原程序中对结果的显示方式,是程序度起来更自然。
实验代码:
#include<iostream>
using namespace std;
class CFraction
{
private:
int nume; // 分子
int deno; // 分母
public:
void Simplify(); //化简(使分子分母没有公因子)
CFraction operator + (CFraction &c);
CFraction operator - (CFraction &c);
CFraction operator * (CFraction &c);
CFraction operator / (CFraction &c);
CFraction operator + ();
CFraction operator - ();
bool operator > (CFraction &c);
bool operator < (CFraction &c);
bool operator >= (CFraction &c);
bool operator <= (CFraction &c);
bool operator == (CFraction &c);
bool operator != (CFraction &c);
friend ostream& operator << (ostream&, CFraction&);
friend istream& operator >> (istream&, CFraction&);
};
ostream& operator << (ostream& output, CFraction& cf)
{
cout << cf.nume << "/" << cf.deno << endl;
return output;
}
istream& operator >> (istream& input, CFraction& cf)
{
cout << "请输入要置分数的分子和分母:";
input >> cf.nume >> cf.deno;
return input;
}
void main()
{
CFraction cf1, cf2, cf3;
cin >> cf1 >> cf2;
cout << "cf1 = " << cf1;
cout << "cf2 = " << cf2;
cf3 = cf1 + cf2;
cout << "cf1 + cf2 = " ;
cf3.Simplify();
cf3 = cf1 - cf2;
cout << "cf1 - cf2 = " ;
cf3.Simplify();
cf3 = cf1 * cf2;
cout << "cf1 * cf2 = ";
cf3.Simplify();
cf3 = cf1 / cf2;
cout << "cf1 / cf2 = ";
cf3.Simplify();
cout << "对cf1取正得: ";
cf1 = + cf1;
cout << "对cf2取反得: ";
cf2 = - cf2;
if(cf1 > cf2) cout << "cf1 > cf2" << endl;
if(cf1 < cf2) cout << "cf1 < cf2" << endl;
if(cf1 == cf2) cout << "cf1 = cf2" << endl;
if(cf1 != cf2) cout << "cf1 ≠ cf2" << endl;
if(cf1 >= cf2) cout << "cf1 ≥ cf2" << endl;
if(cf1 <= cf2) cout << "cf1 ≤ cf2" << endl;
system("pause");
}
void CFraction::Simplify()
{
int a[10], j = 0;
for(int i = 1; i <= nume; i++)
{
if(nume % i == 0)
{
a[j] = i;
j++;
}
}
//定义a[10]数组用于存储nume的因数
int b[10], m = 0;
for(int n = 1; n <= deno; n++)
{
if(deno % n == 0)
{
b[m] = n;
m++;
}
}
//定义b[10]数组用于存储deno的因数
for(int k = 0; k <= (j - 1); k++)
{
for(int p = 0; p <= (m - 1); p++)
{
if(a[k] == b[p])
{
nume = nume / a[k];
deno = deno / a[k];
}
}
}
cout << nume << "/" << deno << endl;
}
CFraction CFraction::operator + (CFraction &c)
{
CFraction C;
C.deno = deno * c.deno;
C.nume = nume * c.deno + c.nume * deno;
return C;
}
CFraction CFraction::operator - (CFraction &c)
{
CFraction C;
C.deno = deno * c.deno;
if(nume * c.deno < c.nume * deno)
{
C.nume = -(c.nume * deno - nume * c.deno);
}
else
C.nume = nume * c.deno - c.nume * deno;
return C;
}
CFraction CFraction::operator * (CFraction &c)
{
CFraction C;
C.deno = deno * c.deno;
C.nume = nume * c.nume;
return C;
}
CFraction CFraction::operator / (CFraction &c)
{
CFraction C;
C.deno = deno * c.nume ;
C.nume = nume * c.deno;
return C;
}
CFraction CFraction::operator - ()
{
CFraction C;
C.deno = deno;
C.nume = nume;
cout << "-(" << C.nume << "/" << C.deno << ")" << endl;
return C;
}
CFraction CFraction::operator + ()
{
CFraction C;
C.deno = deno;
C.nume = nume;
cout << "+(" << C.nume << "/" << C.deno << ")" << endl;
return C;
}
bool CFraction::operator > (CFraction &c)
{
deno = deno * c.deno;
c.deno = deno;
if((nume * c.deno) > (c.nume * deno))
return true;
else
return false;
}
bool CFraction::operator < (CFraction &c)
{
deno = deno * c.deno;
c.deno = deno;
if((nume * c.deno) < (c.nume * deno))
return true;
else
return false;
}
bool CFraction::operator == (CFraction &c)
{
deno = deno * c.deno;
c.deno = deno;
if((nume * c.deno) == (c.nume * deno))
return true;
else
return false;
}
bool CFraction::operator != (CFraction &c)
{
deno = deno * c.deno;
c.deno = deno;
if((nume * c.deno) == (c.nume * deno))
return false;
else
return true;
}
bool CFraction::operator >= (CFraction &c)
{
if((nume * c.deno) >= (c.nume * deno))
return true;
else
return false;
}
bool CFraction::operator <= (CFraction &c)
{
if((nume * c.deno) <= (c.nume * deno))
return true;
else
return false;
}
实验结果截图:
实验心得:
还是考察<<和>>运载符的重载,看来老师真的是太想我们掌握这一语法了,才会一而再,再而三的在实验中反复考察我们,也好,编程本来就是枯燥的事情,很多时候是要重复工作的,现在提前锻炼一下自己的耐性也是件好事。