#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
最新资源
- 计算机网络学习资源汇总
- office visio 图标库
- pytorch安装包 windows 1.8.0 python 3.7
- 有彩色装饰物的小型圣诞树的python代码
- Java通用 Jar包启动脚本
- 【格林大华期货-2024研报】研究院专题报告:四季度中国经济增速回升可期.pdf
- 【格林期货-2024研报】三油两粕早盘提示.pdf
- 【格林期货-2024研报】市场快讯:红枣仍以偏空思路对待.pdf
- 【格林期货-2024研报】四季度中国经济增速回升可期.pdf
- 数据库课程设计 社区管理系统 使用mysql实现,包含运行结果图(未进行前端页面的设计)
- 【中信期货-2024研报】贵金属策略日报:除非特朗普政策预期扭转,否则短期贵金属估值仍偏高.pdf
- 【中邮证券-2024研报】业绩稳健增长,国产替代持续推进.pdf
- 【中信期货-2024研报】股市情绪回调,债市供给担忧仍存.pdf
- 【中邮证券-2024研报】Q3业绩高增,臂式产品有望持续放量.pdf
- 【中信期货-2024研报】中信期货晨报20241115:商品期货多数收跌,有色金属板块全面走低.pdf
- 【中原证券-2024研报】长安汽车(000625):公司点评报告:Q3毛利率环比改善,新能源订单表现亮眼.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈