第八周任务三 运算符重载 分数

本文介绍了一个使用C++实现的分数类,通过运算符重载实现了分数的加、减、乘、除等基本运算,并提供了分数比较的功能。该类还支持输入、输出以及分数的化简。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/* (程序头部注释开始)
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生 
* All rights reserved.
* 文件名称:                              
* 作    者:   姜雅明                              
* 完成日期:   2012     年   04    月    10    日
* 版 本 号:   1.0      

* 对任务及求解方法的描述部分
* 输入描述: 分数
* 问题描述: 运算符重载,分数的计算和比较
* 程序输出: 计算后的分数
* 程序头部的注释结束
*/

#include<iostream>
using namespace std;

class CFraction
{private:
int nume;  // 分子
int deno;  // 分母
public:
	CFraction(int nu=0,int de=1);   //构造函数,初始化用
	void Set(int nu=0,int de=1);    //置值,改变值时用
	void input();				//按照"nu/de"的格式,如"5/2"的形式输入
	void Simplify();            //化简(使分子分母没有公因子)
	CFraction operator + (CFraction &f);
	CFraction operator - (CFraction &f);
	CFraction operator * (CFraction &f);			
	CFraction operator / (CFraction &f);
	CFraction operator - ();
	bool operator > (CFraction &f);
	bool operator < (CFraction &f);
	bool operator >= (CFraction &f);
	bool operator <= (CFraction &f);
	bool operator == (CFraction &f);
	bool operator != (CFraction &f);
	void output(int style=0);		//输出:以8/6为例,style为0时,输出8/6;
	//style为1时,输出4/3;
	//style为2时,输出1(1/3),表示一又三分之一;
	//不给出参数和非1、2,认为是方式0
};

CFraction:: CFraction(int nu,int de): nume(nu), deno(de){}

void CFraction:: Set(int nu,int de)
{
	nume = nu;
	deno = de;
}

void CFraction:: input()
{
	char ch = '/';

	cout << "请输入分数值(nu/de):";

	cin >> nume >> ch >> deno;

	while(1)
	{
		if (ch != '/')
		{
			cout << "格式错误,请重新输入:";
			cin >> nume >> ch >> deno;
		}
		else 
		{
			break;
		}
	}
}

void CFraction:: Simplify()
{
	int i, j;

	for (i = 2; i <= nume; ++i)
	{
		for(j = 2; j <= deno; ++j)
		{
			if (nume % j == 0 && deno % j == 0)
			{
				nume = nume / j;

				deno = deno / j;
			}
		}
	}
}

CFraction CFraction:: operator + (CFraction &f)
{
	CFraction f1;
	f1.deno = f.deno * deno;
	f1.nume = f.deno * nume + f.nume * deno;

	return f1;
}

CFraction CFraction::  operator - (CFraction &f)
{
	CFraction f1;
	f1.deno = f.deno * deno;
	f1.nume = f.deno * nume - f.nume * deno;

	return f1;
}

CFraction CFraction:: operator * (CFraction &f)
{
	CFraction f1;
	f1.deno = f.deno * deno;
	f1.nume = f.nume * nume;

	return f1;
}

CFraction CFraction:: operator / (CFraction &f)
{
	CFraction f1;
	f1.nume = f.deno * nume;
	f1.deno = f.nume * deno;

	return f1;
}

CFraction CFraction:: operator - ()
{
	CFraction f1;
	f1.deno = deno;
	f1.nume = -nume;

	return f1;
}

bool CFraction:: operator > (CFraction &f)
{
	nume = nume * f.deno;
	f.nume = f.nume * deno;
	if(nume > f.nume)
		return true;
	else
		return false;
}

bool CFraction:: operator < (CFraction &f)
{
	nume = nume * f.deno;
	f.nume = f.nume * deno;
	if(nume < f.nume)
		return true;
	else
		return false;
}

bool CFraction:: operator >= (CFraction &f)
{
	nume = nume * f.deno;
	f.nume = f.nume * deno;
	if(nume > f.nume || nume == f.nume)
		return true;
	else
		return false;
}

bool CFraction:: operator <= (CFraction &f)
{
	nume = nume * f.deno;
	f.nume = f.nume * deno;
	if(nume < f.nume || nume == f.nume)
		return true;
	else
		return false;
}

bool CFraction:: operator == (CFraction &f)
{
	nume = nume * f.deno;
	f.nume = f.nume * deno;
	if(nume == f.nume)
		return true;
	else
		return false;
}

bool CFraction:: operator != (CFraction &f)
{
	nume = nume * f.deno;
	f.nume = f.nume * deno;
	if(nume != f.nume)
		return true;
	else
		return false;
}

void CFraction:: output(int style)	
{
	int i;

	if (style == 0)
	{
		cout << nume << "/" << deno << endl;
	}
	else if (style == 1)
	{
		Simplify();
		if(nume % deno == 0)
		{
			cout << nume;
			cout << endl;
		}
		else
		{
			cout << nume << "/" << deno << endl;
		}
	}
	else 
	{
		if (nume > deno)
		{				
			while(nume > deno)
			{	
				if(nume % deno == 0)
				{
					cout << nume;
					cout << endl;
					break;
				}
				else
				{
					i = nume % deno;
					nume = nume /deno;

					++i;
					cout << i - 1 << "(" <<nume << "/" << deno << ")" << endl;
				}
			}				
		}
		else
		{
			cout << nume << "/" << deno << endl;
		}
	}
}

void main()
{
	CFraction cf1;

	CFraction cf2;
	cf2.Set(8, 6);
	cout << "cf2=";
	cf2.output(1);

	CFraction cf3;
	cf3.Set(2,3);
	cout << "cf3=";
	cf3.output(1);

	cf1 = cf2 + cf3;
	cout << "cf2+cf3=";
	cf1.output(1);

	cf1 = cf2 - cf3;
	cout << "cf2-cf3=";
	cf1.output(1);

	cf1 = cf2 * cf3;
	cout << "cf2*cf3=";
	cf1.output(1);

	cf1 = cf2 / cf3;
	cout << "cf2/cf3=";
	cf1.output(1);

	cf1 = cf2;
	cf1 = -cf1;
	cout << "-cf2=";
	cf1.output(1);

	if (cf2>cf3) cout<<"cf2>cf3"<<endl;
	if (cf2<cf3) cout<<"cf2<cf3"<<endl;
	if (cf2==cf3) cout<<"cf2=cf3"<<endl; 
	if (cf2!=cf3) cout<<"cf2≠cf3"<<endl;
	if (cf2>=cf3) cout<<"cf2≥cf3"<<endl;
	if (cf2<=cf3) cout<<"cf2≤cf3"<<endl;

	system("PAUSE");
}



C++ 在 分数类基础上,采用运算符重载的方法,实现分数类相关成员函数,在主 函数完成一系列测试。 class Fraction{ int numerator; //分子 int denominator; //分母 void Reduction(); //约分 void MakeCommond(Fraction &); //通分 public: Fraction(int=0,int=1); //缺省构造函数 Fraction(double num); //按分子除以分母的商构造 Fraction(const Fraction &a); //拷贝构造函数 ~Fraction(); //析构函数 int GetNumerator () const; //获取分子 int GetDenominator ()const; //获取分母 void SetNumerator (int a); //设置分子 void SetDenominator (int b); //设置分母 //采用成员函数, 实现运算符重载:= == > 前置++ //前置++: 将分子、分母都增加 1 Fraction & operator=(const Fraction &); //赋值 bool operator==(const Fraction &) const; //比较相等运算 //完善代码 1:采用成员函数,实现前置++ //采用友元函数, 实现运算符重载:+ - * / friend Fraction operator+(const Fraction &, const Fraction &); //完善代码 2:采用友元函数,实现运算符重载- * / //重载运算符<<,实现分数输出 friend ostream& operator<<(ostream& os, const Fraction&); }; 1) 完善主函数,实现测试类 Fraction 的正确性。main 函数部分代码如下: int main() { Fraction f(0.45); //完善代码3:测试分数f的前置++运算,及结果输出 //测试:= Fraction f1, f2; f1 = f2 = f; cout << "test =: f1 = "<< f1 << "\tf2 = " << f2 << endl ; //完善代码 4:实现一组分数的+ - * / 比较运算,及结果输出 return 0; } 2) 新增从 double 构造 Fraction 。此处需要采用合适的算法来寻找分子分母。 3) 从键盘输入数据,以输入两个零(第一个分数的分子/分母都为 0)结束,完成下面 分数的各种运算(加、减、乘、除、比较等)测试: a) 2/3 与 3/4 b) 8/6 与 5/-7 c) 5/6 与 0/2 d) 1/2-3/-6 将fraction类的定义写成头文件,类函数实现部分写在另一个cpp文件里
03-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值