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

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

#include<iostream>
#include<stdlib.h>           //头文件
#include<cstdio>
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 << "\\"<<r.denominator;
        return out;
}

int main()
{
    Rational tmpr1(1,1);										// 因为类没有定义无参构造函数,只能这样声明对象
    Rational tmpr2(1,1);
    Rational r1(7, 8);
    Rational r2(3, 4);
    Rational r3(9, 7);
    int n, peace = 0;
    char q;
    cout << "please input numerator and denominator.\n";
    cout << "first number:";
    cin >>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= "<<r3 << endl;
            break;
        case 4:
            r3 = r1 * r2;
            cout <<" r1 * r2= "<< r3 << endl;
            break;
        case 5:
            r3 = r1 / r2;
            cout << " r1 / r2= "<<r3 << endl;
            break;
        case 6:
            equeal(r1, r2);											//调用判断相等函数
            break;
        case 7:
            tmpr1 = r1.normalize1();
            tmpr2 = r2.normalize1();
            cout <<tmpr1 << endl;									//输出最简的分数
            cout << tmpr2 << endl;
            break;
        case 8:
            cout << "r1 = ";
            printReal(r1);											//输出实数
            cout << "r2 = ";
            printReal(r2);
            break;
        case 9:
            peace = 1;
            break;
        default:
            if (n != 1, 2, 3, 4, 5, 6, 7, 8, 9)						//进行输出有效值简单判断
                cout << "输入有误" << endl;
            break;

            if (peace)
            {
                cout << "谢谢使用";
                break;
            }
        }
        printf("\n                        要继续选择吗(Y/N)?\n");
        do {
            cin >> q;
        } while (q != 'Y'&&q != 'y'&& q != 'N'&&q != 'n');			//是程序实现多次运行,进行判断是否继续进行操作


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

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

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是一个C语言实现的有理数计算器,可以进行加、减、乘、除四则运算,支持任意精度的有理数计算: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { long long numerator; // 分子 long long denominator; // 分母 } Rational; // 求最大公约数 long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); } // 化简有理数 void simplify(Rational *r) { long long g = gcd(r->numerator, r->denominator); r->numerator /= g; r->denominator /= g; } // 加法 Rational add(Rational a, Rational b) { Rational r; r.numerator = a.numerator * b.denominator + b.numerator * a.denominator; r.denominator = a.denominator * b.denominator; simplify(&r); return r; } // 减法 Rational sub(Rational a, Rational b) { Rational r; r.numerator = a.numerator * b.denominator - b.numerator * a.denominator; r.denominator = a.denominator * b.denominator; simplify(&r); return r; } // 乘法 Rational mul(Rational a, Rational b) { Rational r; r.numerator = a.numerator * b.numerator; r.denominator = a.denominator * b.denominator; simplify(&r); return r; } // 除法 Rational div(Rational a, Rational b) { Rational r; r.numerator = a.numerator * b.denominator; r.denominator = a.denominator * b.numerator; simplify(&r); return r;} // 输出有理数 void print_rational(Rational r) { printf("%lld/%lld", r.numerator, r.denominator); } int main() { Rational a, b, r; char op; // 读入第一个有理数 scanf("%lld/%lld", &a.numerator, &a.denominator); // 读入操作符 scanf(" %c", &op); // 读入第二个有理数 scanf("%lld/%lld", &b.numerator, &b.denominator); // 根据操作符进行计算 switch (op) { case '+': r = add(a, b); break; case '-': r = sub(a, b); break; case '*': r = mul(a, b); break; case '/': r = div(a, b); break; default: printf("Invalid operator\n"); return 1; } // 输出结果 print_rational(a); printf(" %c ", op); print_rational(b); printf(" = "); print_rational(r); printf("\n"); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

threecat.up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值