有理数类

内容:设计并实现抽象数据类型“有理数”,有理数的基本操作包括:两个有理数的加、减、乘、除等(包括有理数的创建和输出)。
同时
(1)有理数的类型,我们可以构造成一个结构体类型,这个结构体由两个整数构成,分别表示有理数的分子和分母。
(2)在初始化或创建一个有理数时,可以给出有理数的分子和分母来创建一个有理数;也可以给出一个小数形式的有理数,来计算对应的分子分母来创建一个有理数(可设置一个允许的计算误差)。
(3)以分数形式创建有理数时,要处理分母为零的异常情况。
(4)输出不能有类似于4/4、3/6这样的结果数据。
(5)要有能根据用户输入选择不同运算的菜单选择界面。
代码如下:

#include<iostream>
#include<stdlib.h>           //头文件
#include<cstdio>
using namespace std;//分数形式
class fractionsForm          //定义一个有理数类
{public:fractionsForm(int numerator, int denominator);                   //构造函数,参数整数分子,分母friend fractionsForm operator+(fractionsForm r1, fractionsForm r2);      //重载加法运算符,参数为类的引用friend fractionsForm operator-(fractionsForm r1, fractionsForm r2);     //重载减法,除法,乘法运算符friend fractionsForm operator*(fractionsForm r1, fractionsForm r2);friend fractionsForm operator/(fractionsForm r1, fractionsForm r2);friend istream& operator>>(istream& in, fractionsForm& r);     //重载流输入运算符friend ostream& operator<<(ostream& out, fractionsForm& r);     //重载流输出运算符fractionsForm normalize1();                                      // 定义一个分数化简函数
private:void normalize();                                       //私有成员函数,化简函数int numerator;                                          //私有数据int denominator;
};fractionsForm::fractionsForm(int num, int denom)
{numerator = num;if (denominator != 0)   denominator = denom;                // 分母不能为0,在流输入运算符重载中也有定义else denominator = 1;normalize();
}
//标准化
void fractionsForm::normalize()
{//求出分子和分母的最大公约数,用欧几里得算法int a = abs(numerator);int b = abs(denominator);while (b > 0){int t = a % b;a = b;b = t;}numerator /= a;denominator /= a;
}fractionsForm fractionsForm::normalize1()                                  // 增加一个分数化简函数
{                                                               //求出分子和分母的最大公约数,用欧几里得算法int a = abs(numerator);int b = abs(denominator);while (b > 0){int t = a % b;a = b;b = t;}fractionsForm R(numerator / a, denominator / a);return R;
}fractionsForm operator+(fractionsForm r1, fractionsForm r2)                   //重载加法运算符,分数的加法
{int a = r1.numerator;int b = r1.denominator;int c = r2.numerator;int d = r2.denominator;int e = a * d + b * c;int f = b * d;fractionsForm R(e, f);return R;
}fractionsForm operator-(fractionsForm r1, fractionsForm r2)                    //重载减法运算符,函数结构和加法一致,返回加法运算
{r2.numerator = -r2.numerator;return operator+(r1, r2);
}fractionsForm operator*(fractionsForm r1, fractionsForm r2)                    //重载乘法运算符,调用初始化类是化简了分数
{int a = r1.numerator;int b = r1.denominator;int c = r2.numerator;int d = r2.denominator;int e = a * c;int f = b * d;fractionsForm R(e, f);return R;
}fractionsForm operator/(fractionsForm r1, fractionsForm r2)                    //返回乘法运算函数体
{int t = r2.numerator;r2.numerator = r2.denominator;r2.denominator = t;return operator*(r1, r2);
}istream& operator>>(istream& in, fractionsForm& r)                   //流输入运算符
{in >> r.numerator >> r.denominator;                            //避免除0错误,进行判断,分母为0时程序结束if (r.denominator != 0)return in;else{cout << "输入有误";exit(0);}
}ostream& operator<<(ostream& out, fractionsForm& r)                  //流输出运算符
{if (r.numerator % r.denominator == 0)                            //进行判断,当为一个整数时,改变输出out << r.numerator / r.denominator;elseout << r.numerator << "\\" << r.denominator;return out;
}
//**************************************************************************************************************************//小数类型
class decimalsForm
{public:float m_Num1 = 0.0;float m_Num2 = 0.0;float m_Num3 = 0.0;};decimalsForm C;int main()
{cout << "正在使用有理数计算程序" << endl;cout << "请选择所需要进行的任务" << endl;cout << "1.分数形式运算" << endl;cout << "2.小数形式运算" << endl;cout << "0.退出程序" << endl;int choice = 0;cin >> choice;fractionsForm tmpr1(1, 1);                                        // 因为类没有定义无参构造函数,只能这样声明对象fractionsForm tmpr2(1, 1);fractionsForm r1(7, 8);fractionsForm r2(3, 4);fractionsForm r3(9, 7);int n, peace = 0;//**********************************************************************************************************float decimalsForm::* ptr1;ptr1 = &decimalsForm::m_Num1;float decimalsForm::* ptr2;ptr2 = &decimalsForm::m_Num2;switch (choice){case 1:cout << "请依次输入有理数的分子和分母\n";cout << "第一个有理数为:";cin >> r1;cout << "第二个有理数为:";cin >> r2;cout << "-----请选择所需要的有理数运算----\n";cout << " ---1.有理数加法运算-------------\n";cout << " ---2.有理数减法运算-------------\n";cout << " ---3.有理数乘法运算-------------\n";cout << " ---4.有理数除法运算-------------\n";cout << " ---0.结束程序-------------------\n";cout << "---------请输入你的选择----------\n";cin >> n;switch (n)                                         //利用switch结构实现程序功能的选择{case 1:r3 = r1 + r2;cout << "r1 + r2= " << r3 << endl;break;case 2:r3 = r1 - r2;cout << " r1 - r2= " << r3 << endl;break;case 3:r3 = r1 * r2;cout << " r1 * r2= " << r3 << endl;break;case 4:r3 = r1 / r2;cout << " r1 / r2= " << r3 << endl;break;case 0:peace = 1;break;default:if (n != 1, 2, 3, 4, 5, 6, 7, 8, 9)                     //进行输出有效值简单判断cout << "输入有误" << endl;break;if (peace){cout << "使用结束";break;}}case 2:{cout << "依次输入两个有理数" << endl;cout << "第一个有理数为:" << endl;cin >> C.m_Num1;cout << "第二个有理数为:" << endl;cin >> C.m_Num2;cout << "-----请选择所需要的有理数运算----\n";cout << " ---1.有理数加法运算-------------\n";cout << " ---2.有理数减法运算-------------\n";cout << " ---3.有理数乘法运算-------------\n";cout << " ---4.有理数除法运算-------------\n";cout << " ---0.结束程序-------------------\n";cout << "---------请输入你的选择----------\n";cin >> n;switch (n){case 1:C.m_Num3 = C.m_Num1 + C.m_Num2;cout << C.m_Num1 << "+" << C.m_Num2 << "=" << C.m_Num3 << endl;break;case 2:C.m_Num3 = C.m_Num1 - C.m_Num2;cout << C.m_Num1 << "-" << C.m_Num2 << "=" << C.m_Num3 << endl;break;case 3:C.m_Num3 = C.m_Num1 * C.m_Num2;cout << C.m_Num1 << "*" << C.m_Num2 << "=" << C.m_Num3 << endl;break;case 4:C.m_Num3 = C.m_Num1 / C.m_Num2;cout << C.m_Num1 << "/" << C.m_Num2 << "=" << C.m_Num3 << endl;break;case 0:cout << "欢迎下次使用" << endl;system("pause");exit(0);//调用该内置函数 程序退出break;}}case 0:{cout << "欢迎下次使用" << endl;system("pause");exit(0);//调用该内置函数 程序退出}}system("pause");return 0;                                                     //程序结束
}

<数据结构>创建一个有理数类相关推荐

  1. 以下为一个有理数类,一个有理数由分子和分母组成,目前定义了一个输出函数 十七、编写一个加法函数,可以接收另一个有理数,与自身的值相加 十八、编写一个乘法函数,同理接收另一个有理数,与自身的值相乘

    以下为一个有理数类,一个有理数由分子和分母组成,目前定义了一个输出函数 十七.编写一个加法函数,可以接收另一个有理数,与自身的值相加 十八.编写一个乘法函数,同理接收另一个有理数,与自身的值相乘 十九 ...

  2. 《JAVA练习题目9》 创建一个Person类和一个Family类。(这次的OJ实在写的没有状态,被样例搞崩了,这次代码还有好多代码复制等一系列不良现象,就是为了过OJ写的。。大家凑活看一下吧)

    题目内容: 创建一个Person类和一个Family类.其中, Person类包含编号id(整型).名字name(字符串).性别gender(字符串)三个属性,和一个初始化对象所有属性的有参构造方法, ...

  3. 【MATLAB统计分析与应用100例】案例009:创建一个RandStream类对象,调用其randn方法生成标准正态分布随机数

    文章目录 1. 创建一个RandStream类对象s,其随机数生成器的算法为'mlfg6331_64',初始种子为10 2. 调用对象s的randn方法生成10行10列的随机数矩阵x,其元素服从标准正 ...

  4. java订单类_基于Java创建一个订单类代码实例

    这篇文章主要介绍了基于Java创建一个订单类代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 需求描述 定义一个类,描述订单信息 订单id 订 ...

  5. python计算长方体体积编程_计算体积 编程创建一个Box类(长方体) 联合开发网 - pudn.com...

    计算体积 所属分类:Windows编程 开发工具:Java 文件大小:4KB 下载次数:0 上传日期:2019-12-08 16:53:01 上 传 者:洛水天依- 说明:  编程创建一个Box类(长 ...

  6. Android自定义控件学习(四)------创建一个视图类

    创建一个视图类 精心设计的自定义视图与其他精心设计的类非常相似.它使用易于使用的界面封装了一组特定的功能,它可以高效地使用CPU和内存,等等.不过,作为一个设计良好的设计,自定义视图应该: 符合And ...

  7. android自定义View学习(一)----创建一个视图类

    创建一个视图类 精心设计的自定义视图与其他精心设计的类非常相似.它使用易于使用的界面封装了一组特定的功能,它可以高效地使用CPU和内存,等等.不过,作为一个设计良好的班级,自定义视图应该: 符合And ...

  8. java订单类_使用Java创建一个订单类代码实例

    这篇文章主要简介了使用Java创建一个订单类代码实例,文中通过示例代码简介的非常具体,对大家的学习或者工作具有一定的参考学习网上卖,需要的朋友可以学习下 需求描述 定义一个类,描述订单信息 订单id ...

  9. java创建一个图形类getv_java建立类和对象分糖果

    10个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14块,第十个小孩2 ...

最新文章

  1. 大型企业网络运维,ACL,VTP,NAT,vlan.总合。
  2. 微信公众号中ip白名单用谁的ip
  3. SQLServer 中存储过程返回的三种方式( 包括存储过程的创建, 在存储过程中调用, 在VS中调用的方法)...
  4. 工欲善其事,必先利其器 _SUBLIME TEXT 3_使用心得(上篇)
  5. PHP45个方便的工具
  6. 走出海量数据及访问量压力困境收藏[转]
  7. JAVA 23种开发模式详解(代码举例)
  8. 承担集团数万应用、研发人员日常工作,阿里持续交付平台的设计、迭代之道... 1
  9. UML之一综合设计例题
  10. Java基础-学习笔记(六)——类的封装性
  11. 在内容也中寻找母板页中的控件
  12. IDEA配置TeaVM插件
  13. FIT2CLOUD云管平台完成华为云鲲鹏云服务兼容性认证
  14. android闹钟设置功能吗,Android编程闹钟设置方法详解
  15. 二叉树的前序序列、中序序列、后序序列、层次序列
  16. ODOO 开源 ERP 和 CRM
  17. 正交试验设计例题及答案_【正交试验设计法是】试验设计与分析试题及答案
  18. java与es8实战之五:SpringBoot应用中操作es8(带安全检查:https、账号密码、API Key)
  19. CFile、CStdioFile、FILE和其他文件操作
  20. 图像处理中的傅里叶变换

热门文章

  1. 视频质量感知评价指标
  2. 质量的衡量要多点考虑客户的“感知质量”
  3. 基于图像重建损失的无监督变化检测
  4. Storm大数据处理
  5. 章鱼网络进展月报 | 2022.2.1-2.28
  6. Android线性布局
  7. adobe illustrator最新版,Illustrator 2022 mac(矢量图制作软件)26.3.1
  8. 驱动程序开发:SPI设备驱动
  9. 2017全国大学生电子设计大赛B题 | 板球控制系统(四)机械设计相关
  10. 互联哇大厂薪酬福利职级哪家最吸引你