需求概述

(1)设计一个分数计算器,进行分数的算术运算和逻辑运算。
(2)能够像使用基本数据的对象一样,对分数进行“+”、“-”、“*”和“/”等算术运算和比较两个分数的大小。
(3)以a/b的形式输入输出分数,允许输入输出整数这种特殊形式。
(4)对不是约化型的分数进行约化,避免分母为负数。
(5)如果分数的分母为0、除数为0或输入时格式有错,采用异常处理机制解决。

输入

以分数的形式输入。(如1/2)

若分母为0会抛出异常,重新输入。
菜单页面

RationalNumber.h(头文件)

#ifndef RATIONAL_NUMBER_H
#define RATIONAL_NUMBER_Hclass RationalNumber
{public:RationalNumber( int = 0, int = 1 ); // 默认构造函数RationalNumber &operator+(const RationalNumber&);RationalNumber operator-(const RationalNumber&);RationalNumber operator*(const RationalNumber&);RationalNumber operator/(const RationalNumber&);// 关系运算符bool operator>(const RationalNumber&)const;bool operator<(const RationalNumber&)const;bool operator>=(const RationalNumber&)const;bool operator<=(const RationalNumber&)const;// 判等运算符bool operator==(const RationalNumber&)const;bool operator!=(const RationalNumber&)const;void printRational() const; // 以分数形式显示
private:int numerator; // 私有变量 分子int denominator; //私有变量 分母void reduction(); // 分数约分
}; // end class RationalNumber#endif

RationalNumber.cpp

#include <cstdlib>
#include <iostream>
using namespace std;#include "RationalNumber.h"// RationalNumber 构造函数设置a和b并经行约分
RationalNumber::RationalNumber(int a, int b)
{if (b <= 0)b = 1;numerator = a;denominator = b;reduction();
}
//重载+运算符
RationalNumber &RationalNumber::operator+(const RationalNumber &right)
{RationalNumber temp;if(denominator==right.denominator){temp.numerator=numerator+right.numerator;temp.denominator=denominator;}else{temp.numerator=numerator*right.denominator+denominator*right.numerator;temp.denominator=denominator*right.denominator;}temp.reduction();return temp;
}
// 重载-运算符
RationalNumber RationalNumber::operator-(const RationalNumber& right)
{RationalNumber temp;if(denominator==right.denominator){temp.numerator=numerator-right.numerator;temp.denominator=denominator;}else{temp.numerator=numerator*right.denominator-denominator*right.numerator;temp.denominator=denominator*right.denominator;}temp.reduction();return temp;
}
// 重载 * 运算符
RationalNumber RationalNumber::operator*(const RationalNumber& right)
{RationalNumber temp;temp.numerator=numerator*right.numerator;temp.denominator=denominator*right.denominator;temp.reduction();return temp;
}
// 重载 / 运算符
RationalNumber RationalNumber::operator/(const RationalNumber& right)
{RationalNumber temp;if(right.numerator==0)cout<<"denominator cannot be 0"<<endl;else{temp.numerator=numerator*right.denominator;temp.denominator=denominator*right.numerator;}temp.reduction();return temp;
}
// 重载 > 运算符
bool RationalNumber::operator>(const RationalNumber& right)const
{double a=numerator/denominator;double b=right.numerator/right.denominator;return a>b;
}
// 重载 < 运算符
bool RationalNumber::operator<(const RationalNumber& right)const
{return !(*this>=right);
}
// 重载 >= 运算符
bool RationalNumber::operator>=(const RationalNumber& right)const
{return (*this>right||*this==right);
}
//重载 <= 运算符
bool RationalNumber::operator<=(const RationalNumber& right)const
{return !(*this>right);
}
// 重载 == 运算符
bool RationalNumber::operator==(const RationalNumber& right)const
{double a=numerator/denominator;double b=right.numerator/right.denominator;return a==b;
}
// 重载 != 运算符
bool RationalNumber::operator!=(const RationalNumber& right)const
{return !(*this==right);
}
// printRational 函数
void RationalNumber::printRational() const
{if ( numerator == 0 ) // 将分数打印为0cout << numerator;else if ( denominator == 1 ) // 将分数打印为整数cout << numerator;elsecout << numerator << '/' << denominator;
} // end function printRational// 约分函数
void RationalNumber::reduction()
{int largest, gcd = 1;  // 最大公约数largest = ( numerator > denominator ) ? numerator: denominator;for ( int loop = 2; loop <= largest; loop++ )if ( numerator % loop == 0 && denominator % loop == 0 )gcd = loop;numerator /= gcd;denominator /= gcd;
} // end function reduction

main.cpp
这里的循环写的太恶心了,时间复杂度直接爆炸,暂时还没想到好的解决办法(其实就是懒的改)

#include <iostream>
#include <cstdlib>
#include <iomanip>
using namespace std;#include "RationalNumber.h"int main()
{cout << "欢迎使用分数计算器" << endl;while (1){int above, blow;       //分子分母cout << endl;cout << "请输入第一个分数:" << endl;while (1){cin >> above;getchar();              //吃“/”符号cin >> blow;try{if (blow == 0)throw - 1;   //抛出int类型异常else{cout << "该分数为:" << endl;break;}}catch (int){cout << "分母不能为0,请重新输入" << endl;      //异常处理cout << endl;}}RationalNumber a(above, blow);        //将分子分母存储为RationalNumber类a.printRational();cout << endl;cout << endl;RationalNumber x;int select;while (1){system("pause");system("cls");cout << setw(20) << "==========================" << endl;cout << setw(20) << "1. 加法运算" << endl;cout << setw(20) << "2. 减法运算" << endl;cout << setw(20) << "3. 乘法运算" << endl;cout << setw(20) << "4. 除法运算" << endl;cout << setw(20) << "5. 关系判别" << endl;cout << setw(20) << "6. 重新输入" << endl;cout << setw(20) << "0. 退出    " << endl;cout << setw(20) << "==========================" << endl;cout << setw(20) << "请输入菜单项" << endl;cin >> select;if (select == 6)break;if (select == 0)return 0;cout << endl;cout << "请输入第二个分数:" << endl;while (1){cin >> above;getchar();cin >> blow;try{if (blow == 0)throw - 1;   //抛出int类型异常else{cout << "该分数为:" << endl;break;}}catch (int){cout << "分母不能为0,请重新输入" << endl;cout << endl;}}RationalNumber b(above, blow);b.printRational();cout << endl;switch (select){case 1:x = a + b;cout << endl;cout  << "相加结果为: ";a.printRational();cout << "+";b.printRational();cout << "=";x.printRational();a = x;cout << endl;cout << endl;break;case 2:x = a - b;cout << endl;cout << "相减结果为: ";a.printRational();cout << "-";b.printRational();cout << "=";x.printRational();a = x;cout << endl;break;case 3:x = a * b;cout << endl;cout << "相乘结果为: ";a.printRational();cout << "*";b.printRational();cout << "=";x.printRational();a = x;cout << endl;cout << endl;break;case 4:x = a / b;cout << endl;cout << "相除结果为: ";a.printRational();cout << "/";b.printRational();cout << "=";x.printRational();a = x;cout << endl;cout << endl;break;case 5:cout << endl;cout << "判定结果为: ";cout << endl;a.printRational();cout << ((a > b) ? "  > " : "  <= ");b.printRational();cout << endl;a.printRational();cout << ((a != b) ? "  != " : "  == ");b.printRational();cout << endl;cout << endl;break;case 6:break;case 0:return 0;}}}
} // end main

分数计算器(C++课设)相关推荐

  1. C51简易计算器微机课设

    目前实现功能: 1.末尾数置0 2.加减乘的五位数计算 3.计算结果溢出时,报错"ERROR" 4.有删除键 #include <REGX52.H> int digit ...

  2. 一元稀疏多项式计算器 【 数据结构课设作业 】 带界面,无bug,可以直接运行

    一元稀疏多项式计算器 问题描述 设计一个一元稀疏多项式简单计算器. 基本要求 (1)输入并建立多项式. (2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,-,cn,en,其中n是多项式 ...

  3. Java课设-百行代码实现简易计算器

    成绩: __________ Java程序设计 工程实践 --简易计算器的设计 院. 系 计算机与软件学院 专业 信息安全 姓 名 指导教师 2022年 6 月 11 日 目录: 一. 设计简介 2 ...

  4. 计算机组成原理设计一个累加和,组成原理课设关于累加器.doc

    组成原理课设关于累加器 沈阳航空航天大学 课 程 设 计 报 告 课程设计名称:计算机组成原理课程设计 课程设计题目:COP2000实现数据累加 院(系):计算机学院 专 业:计算机科学与技术 班 级 ...

  5. c语言学生成绩查询课设报告,C语言课设报告(学生考试成绩查询程序)【荐】.doc...

    C语言课设报告(学生考试成绩查询程序)[荐].doc 学生考试成绩查询程序 学号:******** 姓名:***** 完成日期:****年月 通过键盘输入学生的考试信息,包括:学号.姓名.课程名称.学 ...

  6. 分数计算器java报告_20182307 2019-2020-1 《数据结构与面向对象程序设计》实验四报告...

    20182307 2019-2020-1 <数据结构与面向对象程序设计>实验四报告 课程:<程序设计与数据结构> 班级: 1823 姓名: 陆彦杰 学号:20182307 实验 ...

  7. c语言学生学籍管理修改,C语言课设之学生学籍管理系统.doc

    C语言课设之学生学籍管理系统.doc 题目学生学籍管理系统 目录一.个人简介.二.报告摘要.三.报告目录.四.报告正文. 1.系统需求分析 2.系统总体设计 3.系统详细设计六.总结. 二.报告摘要 ...

  8. QT五子棋游戏课设及源码(连接mysql数据库含打开并运行程序的教程)

    gdut大一下学期c++课设(得分:95) 实验报告及源码压缩包百度云下载: 链接:https://pan.baidu.com/s/1zO5ofMz09fiWihxCcZcFbg 提取码:ddav 首 ...

  9. 大学期间所有课设及大作业源代码

    程序员练成记 出处:牟尼的专栏 http://blog.csdn.net/u012027907 记得刚上大一时,那时对这个专业(软件工程)很陌生,甚至对电脑都很陌生,有时还有点儿害怕,因为我在进入大学 ...

最新文章

  1. Boost boost_1_63_0安装 gcc4.8 gcc5.4
  2. unity3d世界坐标系和本地坐标系
  3. Jenkins-Pipeline 流水线发布
  4. 像素级复制!荣威R品牌“撞车”小鹏P7剪刀门,还是手动的?
  5. Spring Security Oauth2 之密码模式
  6. 栈Stack的相关操作(java)
  7. java并发学习--线程池(一)
  8. 银联网关支付接口规范
  9. 手把手教如何制作数字证书并进行程序的数字签名
  10. wincc远程服务器配置,如何配置WINCC作为OPC服务器?
  11. 开源推荐:可用于生产的java聚合支付系统
  12. java的重载和重写实例_java中重写和重载的区别
  13. network secruity studay day3
  14. 人工智能兴起的条件_跟我说规矩。 AI受虐狂的兴起
  15. PostgreSQL 13新特性:fetch first with ties
  16. r语言是高级编程语言_什么是R编程?
  17. IDEA中 单元测试@Test的使用
  18. 罗技推出可蓝牙连接的5.1环绕立体声扬声器
  19. Sybase ASE 查询当前版本和所有数据库
  20. UC Berkeley AI Project -MindsDB 学习

热门文章

  1. 最流行的双线水平条形图,怎么画的?Horizontal bar chart by python and matplotlib
  2. python加权求和_在Python中计算加权的成对距离矩阵
  3. Tikhonov正则化选取的方法
  4. 抖音快手最新版抓包模块免费送
  5. Python - SciPy - ECG信号的谱分析及数字滤波
  6. python——一个投票器
  7. 如何更改手机屏幕上的待机快捷键...
  8. 简单的建立一个网络电视直播软件
  9. 华硕无畏Pro14和 联想小新pro14参数对比 哪个好
  10. PB级区块链开源存储引擎“泓”Huge