IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 基于C++实现分数类 -> 正文阅读

[C++知识库]基于C++实现分数类

????????该代码为基于c++实现分数类,是我大学oop课程的一个小作业,目前我并不很熟练编程,想通过分享的方式来让大佬们对这个代码提出一些修改建议。

? ? ? ? 该分数类的将分子和分母设置为int类型,将正负号设置为char类型,然后在共有部分为该类提供了取负运算、倒数运算、约分、小数转分数、字符串转分数,加减乘除,关系判断运算,输出等功能。

#include "iostream"
#include "math.h"
using namespace std;
class fraction { //分数类
public:
	//构造函数部分
	fraction() {sign = '+'; nu = 0; de = 1; } //构造函数,无参数
	fraction(int _nu, int _de = 1); //构造函数,正常输入,默认分母为1
	fraction(double _nu, double _de = 1, int n = 5) { DtoF(_nu, _de, n); } //构造函数,double情况,默认分母为1,默认精度为1e-5
	fraction(string x) {StoF(x); }; //构造函数,字符串情况
	//输出功能部分
	void printint() { cout << sign << nu << "/" << de; } //输出分数
	void printdouble() { cout << sign << double(nu) / de; }//输出小数
	//单目运算部分
	void Inverse() { sign == '+' ? sign = '-' : sign = '+'; } //取负运算
	void Reciprocal() { int t; t = nu; nu = de; de = t; } //求倒数功能
	int CommonDivisor(int a, int b);//求最大公约数功能
	int Reduction(); //约分功能
	void DtoF(double x, double _de, int n );//将double转换为分数
	void StoF(string x);//将字符串转换为分数
	//双目算数运算部分
	fraction operator+(fraction a);//加法
	fraction operator-(fraction a);//减法
	fraction operator*(fraction a);//乘法
	fraction operator/(fraction a);//除法
	//双目关系运算部分
	bool operator>(fraction a);
	bool operator<(fraction a);
	bool operator>=(fraction a);
	bool operator<=(fraction a);
	bool operator==(fraction a);
	bool operator!=(fraction a);
private:
	int nu, de;//分子和分母
	char sign='+';//正负号
};
fraction::fraction(int _nu, int _de)//构造函数,正常输入
{
	if (_de == 0) //若输入分母为0,则分数不合法,暂停程序
	{
		cout << "Illegal fraction:"<<_nu<<"/"<<_de;
		system("pause");
	}
	if (_nu * _de < 0) sign = '-'; //若分子分母异号,则分数为负
	nu = abs(_nu); de = abs(_de); //存入的分子分母皆为正数
	Reduction();
}
int fraction::CommonDivisor(int a, int b)//利用辗转相除法求最大公约数
{
	int t;
	if (a < b) // 交换两个数,使大数放在a的位置上。
	{
		t = a;
		a = b;
		b = t;
	}
	while (b != 0)// 利用辗转相除法,直到b为0为止。
	{
		t = a % b;
		a = b;
		b = t;
	}
	return a;
}
int fraction::Reduction() //约分功能
{
	int cd;
	if (nu == de) { nu = 1; de = 1; }//分子分母相等,直接约分为1
	else if (nu == 0) { de = 1; return 0; }//分子为0,则不须约分,将分母置为1,结束函数
	else if (nu == 1 || nu == 0 ) { return 0; }//分子分母有一个为1或分子为0,则不需要约分直接结束函数
	else if (nu % de == 0) { nu /= de; de = 1; }//分母为分子的因数
	else if (de % nu == 0) { de /= nu; nu = 1; }//分子为分母的因数
	else
	{
		cd = CommonDivisor(nu, de);//求分子和分母的最大公约数
		nu /= cd; de /= cd;
	}
	return 0;
}
void fraction::DtoF(double _nu, double _de, int n)//将double转换为分数
{
	de = 1;
	double x = _nu / _de;
	if (x < 0) { sign = '-'; x = -x; }//若x<0,则修改符号
	nu = x * pow(10, n);
	de *= pow(10, n);
	Reduction();
}
void fraction::StoF(string x)//将字符串转换为分数
{
	int i=0,n=0; nu = 1, de = 1;//如果不给出分母或分子,则默认为1
	if (x[0] == '-') { sign = '-'; i++; n = i; }//如果有负号,则将符号设置为负
	else if (x[0] == '+') { i++; n = i; }//如果有正号,则跳过
	for (; x[i] != '/' && x[i] != '\0'; i++)//转换分子
	{
		if (i == n) nu--;//如果给出了分子,则将nu置为0
		if (i != n) nu *= 10;
		nu += (x[i] - '0');
	}
	n = i;//记录此时的i
	for (; x[i] != '\0'; i++)//转换分母
	{
		if (i != n) de *= 10;
		de += (x[i] - '0');
	}
}
fraction fraction::operator+(fraction a)//加法
{
	fraction sum; int cde,nu1,nu2;
	sum.sign = sign;
	sum.de = de;
	if (de != a.de)//若分母不相等,则先通分
	{
		cde = de * a.de / CommonDivisor(de, a.de);//求两个分母的最小公倍数
		sum.de = cde;//分母等于最小公倍数
		nu1 = nu * cde / de;
		nu2 = a.nu * cde / a.de;
	}
	sign == a.sign ? sum.nu = nu1 + nu2 : sum.nu = nu1 - nu2;
	if (sum.nu < 0)//若分子为负,则修改结果的符号,并将分子置为正数
	{
		sum.Inverse();
		sum.nu *= -1;
	}
	sum.Reduction();
	return sum;
}
fraction fraction::operator-(fraction a)//减法
{
	fraction result, b = a;
	b.Inverse();//构造一个新的a的相反数,与前项相加
	result = operator+(b);
	return result;
}
fraction fraction::operator*(fraction a)//乘法
{
	fraction result;
	result.nu = nu * a.nu;
	result.de = de * a.de;
	if (sign != a.sign) result.sign = '-';//若两分数异号,则置为负
	result.Reduction();
	return result;
}
fraction fraction::operator/(fraction a)//除法
{
	fraction result, b = a;
	b.Reciprocal();//构建一个新的倒数
	result = operator*(b);
	return result;
}
bool fraction::operator>(fraction a)
{
	if (sign != a.sign)//若异号,则正数一定大
	{
		if (sign == '+')return true;
		else return false;
	}
	if (de == a.de)//若分母相同,直接比较
	{
		return nu > a.nu;
	}
	//若不同则转换为小数对比
	return (double(nu) / de) > (double(a.nu) / a.de);
}
bool fraction::operator<(fraction a)
{
	if ((sign == a.sign) && (nu == a.nu) && (de == a.de)) return false;//若相等,直接返回0
	else return !operator>(a);//返回大于的相反结果
}
bool fraction::operator>=(fraction a)
{
	if ((sign == a.sign) && (nu == a.nu) && (de == a.de)) return true;//若相等,直接返回1
	else return operator>(a);//返回大于的结果
}
bool fraction::operator<=(fraction a)
{
	if ((sign == a.sign) && (nu == a.nu) && (de == a.de)) return true;//若相等,直接返回1
	else return operator<(a);//返回小于的结果
}
bool fraction::operator==(fraction a)
{
	return ((sign == a.sign) && (nu == a.nu) && (de == a.de));
}
bool fraction::operator!=(fraction a)
{
	return !((sign == a.sign) && (nu == a.nu) && (de == a.de));
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-25 11:28:13  更:2021-07-25 11:30:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 6:27:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码