有理数计算器设计(C++)

我们做了一个c++的课程设计的主要内容,认真做的话可以从代码里面学到很多哦
【问题描述】
有理数是一个可以化为一个分数的数,在C++中,并没有预先定义有理数,请定义一个有理数类,将有理数的分子和分母分别存放在两个整型变量中。对有理数的各种操作都可以用重载运算符来实现。
【功能要求】
(1)定义并实现一个有理数类。
(2)输入/输出:重载<<和提取>>运算符,使得对有理数可以直接输入输出。
设有理数输入格式为:分子 分母
有理数输出格式为:分子/分母
(3)计算功能:通过重载运算符+、-、
、/对有理数进行算术运算,通过重载运算符==实现判定两个有理数是否相等。还要定义一个将有理数转换为实数的函数。
(4)化简功能:写一个优化函数使保存的有理数分子和分母之间没有公约数(除去1以外)。
(5)菜单功能:每种功能的操作都是在菜单中进行相应选择。*

#include
#include           //头文件
#include
using namespace std;
class Rational          //定义一个有理数类
{
public:
    Rational(int numerator, int denominator);                   //构造函数,参数整数分子,分母
    friend Rational operator+(Rational r1, Rational r2);		//重载加法运算符,参数为类的引用
    friend Rational operator-(Rational r1, Rational r2);		//重载减法,除法,乘法运算符
    friend Rational operator*(Rational r1, Rational r2);
    friend Rational operator/(Rational r1, Rational r2);
    friend istream &operator>>(istream &in, Rational& r);		//重载流输入运算符
    friend ostream &operator<<(ostream &out, Rational& r);		//重载流输出运算符
    friend void equeal(Rational &r1, Rational &r2);				//定义一个判断两个有理数是否相等的函数,参数为类的引用
    friend void printReal(Rational &r);							//定义一个将有理数化成实数并且输出该实数的函数
    Rational normalize1();                                      // 定义一个分数化简函数
private:
        void normalize();										//私有成员函数,化简函数
        int numerator;											//私有数据
        int denominator;
};

void equeal(Rational &r1, Rational &r2)
{
    Rational tmpr1 = r1.normalize1();                           //调用化简函数将r1,r2的分子分母化简最简,并初始化给新的类
    Rational tmpr2 = r2.normalize1();
    if ((tmpr1.denominator == tmpr2.denominator) && (tmpr1.numerator == tmpr2.numerator))
        cout << "两数相等" << endl;                             //输出有理数
    else
        cout << "两数不相等" << endl;
}

void printReal(Rational &r)                                     //输出实数
{
    double n = double(r.numerator) / double(r.denominator);		// 先强制转换成实型数,再进行除法运算
    cout << n << endl;
}

Rational::Rational(int num, int denom)
{
    numerator = num;
    if (denominator != 0)   denominator = denom;				// 分母不能为0,在流输入运算符重载中也有定义
    else denominator = 1;
    normalize();
}
																//标准化
void Rational::normalize()
{

																//求出分子和分母的最大公约数,用欧几里得算法
    int a = abs(numerator);
    int b = abs(denominator);
    while (b > 0)
    {
        int t = a % b;
        a = b;
        b = t;
    }
    numerator /= a;
    denominator /= a;
}

Rational Rational::normalize1()									// 增加一个分数化简函数
{																//求出分子和分母的最大公约数,用欧几里得算法
    int a = abs(numerator);
    int b = abs(denominator);
    while (b > 0)
    {
        int t = a % b;
        a = b;
        b = t;
    }
    Rational R(numerator / a, denominator / a);
    return R;
}

Rational operator+(Rational r1, Rational 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;
    Rational R(e, f);
    return R;
}

Rational operator-(Rational r1, Rational r2)					//重载减法运算符,函数结构和加法一致,返回加法运算
{
    r2.numerator = -r2.numerator;
    return operator+(r1, r2);
}

Rational operator*(Rational r1, Rational 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;
    Rational R(e, f);
    return R;
}

Rational operator/(Rational r1, Rational r2)					//返回乘法运算函数体
{
    int t = r2.numerator;
    r2.numerator = r2.denominator;
    r2.denominator = t;
    return operator*(r1, r2);
}

istream &operator>>(istream &in, Rational& r)					//流输入运算符
{
    in >> r.numerator>> r.denominator;							//避免除0错误,进行判断,分母为0时程序结束
    if (r.denominator != 0)
        return in;
    else
    {
        cout << "输入有误";
        exit(0);
    }
}

ostream &operator<<(ostream &out, Rational& r)					//流输出运算符
{
    if (r.numerator%r.denominator == 0)							//进行判断,当为一个整数时,改变输出
        out << r.numerator / r.denominator;
    else
        out << r.numerator << "\\"<>r1 ;
    cout << "last number:";
    cin >> r2;
    do														  //实现多次的运算,用do-whlie循环
    {
		cout << "-欢迎使用有理数计算器,请选择功能-\n";
        cout << " ---1.改变分子和分母-------------\n";
        cout << " ---2.有理数加法运算-------------\n";
        cout << " ---3.有理数减法运算-------------\n";
        cout << " ---4.有理数乘法运算-------------\n";
        cout << " ---5.有理数除法运算-------------\n";
        cout << " ---6.判断有理数相等-------------\n";
        cout << " ---7.化简有理数-----------------\n";
        cout << " ---8.有理数变成实数-------------\n";
        cout << " ---9.结束程序-------------------\n";
        cout << "----Please input a choose:";
        cin >> n;
        switch (n)											//利用switch结构实现程序功能的选择
        {
        case 1:
            cout << "first number r1:";
            cin >> r1;
            cout << "last number r2:";
            cin >> r2;
            break;
        case 2:
            r3 = r1 + r2;
            cout <<"r1+r2= "<< r3 << endl;
            break;
        case 3:
            r3 = r1 - r2;
            cout << " r1 - r2= "<> q;
        } while (q != 'Y'&&q != 'y'&& q != 'N'&&q != 'n');			//是程序实现多次运行,进行判断是否继续进行操作


    } while (q == 'Y' || q == 'y');
    return 0;													   //程序结束
}

@如果有程序方面的优化,请告诉我哦,谢谢。

你可能感兴趣的:(编程语言_C/C++)