#include<iostream>
#include<fstream>
using namespace std;
class Integer //整数类
{
protected:
int fz;
int fm;
public:
Integer(int a=0,int b=1):fz(a),fm(b){}
~Integer(){}//析构函数
void display();
};
class Fraction:public Integer //分数类,由整数类派生
{
public:
Fraction(int a=0,int b=1):Integer(a,b){}//分数类成员
friend istream & operator>>(istream &input,Fraction &); //重载输入流 //运算符"<<"重载为友元函数
friend ostream & operator<<(ostream &output,Fraction &); //重载输出流
Fraction operator+(Fraction &c);//重载+运算符(分数和分数)
Fraction operator+(int n);//重载+运算符(整数与分数)
Fraction operator-(Fraction &c);//重载-运算符(分数与分数)
Fraction operator-(int n);//重载-运算符(整数与分数)
friend Fraction operator-(int n,Fraction &c);
Fraction operator*(Fraction &c);//重载*运算符(分数与分数)
Fraction operator*(int n);//重载*运算符(整数与分数)
Fraction operator/(Fraction &c);//重载/运算符(分数与分数)
Fraction operator/(int n);//重载/运算符(整数与分数)
friend Fraction operator/(int n,Fraction &c);
Fraction predigest();//约分函数
void display();//输出函数
};
void Integer::display()
{
cout<<"************************************"<<endl;
cout<<"* 分数计算器 *"<<endl;
cout<<"* 请选择功能: *"<<endl;
cout<<"* 1 分数与整数的四则运算 *"<<endl;
cout<<"* 2 整数与分数的四则运算 *"<<endl;
cout<<"* 3 分数与分数的四则运算 *"<<endl;
cout<<"* 0 输入0退出 *"<<endl;
cout<<"************************************"<<endl;
}
/*
约分函数
*/
Fraction Fraction::predigest()//定义约分分数
{
int n,d,t,sign=1;
Fraction temp;
if(fz<0&&fm<0){//分子分母都小于0
fz=-fz;
fm=-fm;
}
if(fz>0&&fm<0){//分子大于0,分母小于0
fm=-fm;
sign=-1;
}
if(fz<0&&fm>0){//分子小于0,分母大于0
fz=-fz;
sign=-1;
}
n=fz;//分子
d=fm;//分母
int r;
if(n<d){//辗转相除,求分子n与分母d的最大公约数
t=n;
n=d;
d=t;
}
r=n%d;//取模
while(r!=0){
n=d;
d=r; //n为最大公约数
r=n%d;
}
temp.fz=sign*(fz/d);
temp.fm=fm/d;
return temp;
}
/*
重载两个分数的加法运算符
*/
Fraction Fraction::operator+(Fraction &c)
{
Fraction temp;
temp.fz=fz*c.fm+fm*c.fz;
temp.fm=fm*c.fm;
return temp;
}
/*
重载分数与整数的运算符
*/
Fraction Fraction::operator+(int n)
{
Fraction temp;
temp.fz=fm*n+fz;
temp.fm=fm;
return temp;
}
Fraction operator-(int n,Fraction &c)
{
Fraction temp;
temp.fz=c.fm*n-c.fz;
temp.fm=c.fm;
return temp;
}
/*
重载分数与分数的减法运算符
*/
Fraction Fraction::operator-(Fraction &c)
{
Fraction temp;
temp.fz=fz*c.fm-fm*c.fz;
temp.fm=fm;
return temp;
}
/*
重载分数减整数的的减法运算运算符
*/
Fraction Fraction::operator-(int n)
{
Fraction temp;
temp.fz=fz-fm*n;
temp.fm=fm;
return temp;
}
/*
重载两个分数的乘法运算符
*/
Fraction Fraction::operator*(Fraction &c)
{
Fraction temp;
temp.fz=fz*c.fz;
temp.fm=fm*c.fm;
return temp;
}
/*
重载整数与分数的乘法运算符
*/
Fraction Fraction::operator*(int n)
{
Fraction temp;
temp.fz=fz*n;
temp.fm=fm;
return temp;
}
/*
重载两个分数的除法运算符
*/
Fraction Fraction::operator/(Fraction &c)
{
Fraction temp;
temp.fz=fz*c.fm;
temp.fm=fm*c.fz;
return temp;
}
/*
重载分数除以整数的除法运算符
*/
Fraction Fraction::operator/(int n)
{
Fraction temp;
temp.fz=fz;
temp.fm=fm*n;
return temp;
}
Fraction operator/(int n,Fraction &c)
{
Fraction temp;
temp.fz=n*c.fm;
temp.fm=c.fz;
return temp;
}
/*
重载输出运算符,输出分数
*/
ostream& operator<<(ostream &output,Fraction &t)
{
int a,b,c;
a=t.fz;
b=t.fm;
if(a==0||b==0)//当分子,或者分母为0时,输出0
cout<<"0";
if(b==1)//当分母为1时,输出分子
cout<<a;
if(a>b&&b!=1){//判断分数为假分数
c=a/b;
a=a%b;
cout<<c;
if(a!=0)
cout<<"又"<<a<<'/'<<b;
}
if(a<0&&-a>b&&b!=1){//当分数为负时,判断为假分数
c=-a/b;
a=-a%b;
c=-c;
cout<<'='<<c;
if(a!=0)
cout<<"又"<<a<<'/'<<b<<endl;
}
if(t.fz>0&&t.fz<t.fm&&t.fm!=0&&t.fm!=1)//判断为真分数
output<<t.fz<<'/'<<t.fm;
if(t.fz<0&&-t.fz<t.fm&&t.fm!=0&&t.fm!=1)
output<<"("<<t.fz<<'/'<<t.fm<<")";
return output;
}
/*
重载输入运算符, 输入分数
*/
istream& operator>>(istream &input,Fraction &t)
{
int a,c;
char b;
input>>a>>b>>c;
if(b=='/'&&c!=0){
t.fz=a;
t.fm=c;
}else
cout<<"错误!!!输入格式错误或分母为0!请重新输入!";
return input;
}
int main(){
Integer dis;
Fraction a,b,result,real;
int m=1,z;
char c;//数据类型
dis.display();
while(m!=0){
cout<<"请输入:(0-3):";
cin>>m;
if(m==1){//分数与整数的运算
cout<<endl<<"请输入一个分数: ";
cin>>a;
cout<<endl<<"请输入运算符: ";
cin>>c;
cout<<endl<<"请输入一个整数: ";
cin>>z;
if(c=='+')
result=a+z;
if(c=='-')
result=a-z;
if(c=='*')
result=a*z;
if(c=='/')
result=a/z;
real=result.predigest();
cout<<"运算式规范为:"<<a<<c<<z<<"="<<real<<endl;
}
if(m==2){//整数与分数的运算
cout<<endl<<"请输入一个正整数: ";
cin>>z;
cout<<endl<<"请输入运算符: ";
cin>>c;
cout<<endl<<"请输入一个分数: ";
cin>>b;
if(c=='+')
result=b+z;
if(c=='-')
result=z-b;
if(c=='*')
result=b*z;
if(c=='/')
result=z/b;
real=result.predigest();
cout<<z<<c<<b<<"="<<real<<endl;
}
if(m==3){//分数与分数的运算
cout<<endl<<"请输入一个分数: ";
cin>>a;
cout<<endl<<"请输入运算符: ";
cin>>c;
cout<<endl<<"请输入一个分数: ";
cin>>b;
if(c=='+')
result=a+b;
if(c=='-')
result=a-b;
if(c=='*')
result=a*b;
if(c=='/')
result=a/b;
real=result.predigest();
cout<<a<<c<<b<<"="<<real<<endl;
}
}
return 0;
}
double_lifly
- 粉丝: 325
- 资源: 16
最新资源
- (源码)基于Spring Boot和Vue的后台管理系统.zip
- 用于将 Power BI 嵌入到您的应用中的 JavaScript 库 查看文档网站和 Wiki 了解更多信息 .zip
- (源码)基于Arduino、Python和Web技术的太阳能监控数据管理系统.zip
- (源码)基于Arduino的CAN总线传感器与执行器通信系统.zip
- (源码)基于C++的智能电力系统通信协议实现.zip
- 用于 Java 的 JSON-RPC.zip
- 用 JavaScript 重新实现计算机科学.zip
- (源码)基于PythonOpenCVYOLOv5DeepSort的猕猴桃自动计数系统.zip
- 用 JavaScript 编写的贪吃蛇游戏 .zip
- (源码)基于ASP.NET Core的美术课程管理系统.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈