有理数类
内容:设计并实现抽象数据类型“有理数”,有理数的基本操作包括:两个有理数的加、减、乘、除等(包括有理数的创建和输出)。
同时
(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;