第九周实验报告(任务3)

程序头部注释开始
* 程序的版权和版本声明部分
* 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++,就应该对里面的很多知识重复使用,就自然而然的能够熟练的掌握。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值