首先定义了Euclid函数,采用欧几里得算法用来求最大公约数,方便后续用在分数的化简与通分上。
定义了fraction类
私有数据成员:
int nume (分母) int deno (分子)
共有函数
构造函数三个分别用于整形分数,double小数,文本类型来构造分数
复制构造函数一个
化简函数 simplify
输出函数 display
运算符重载±*/采用友元函数在类外定义
主函数用于测试
#include<iostream>
#include<string>
#include <stdlib.h>
using namespace std;
int Euclid(int a,int b){//欧几里得求最大公约数
int r;
while(b!=0){
r=a%b;
a=b;
b=r;
}
return a;
}
class fraction{//定义分数类
public:
fraction(int n=0,int d=1):nume(n),deno(d){simplify();};
fraction(double d);//double类型转化fraction 类外详细定义
fraction(const string str); //string类型转化fraction 类外详细定义
fraction(const fraction& f):nume(f.nume),deno(f.deno) {};//复制构造函数
void simplify(); //化简
void display();//输出
friend fraction operator +(fraction a,fraction b);
friend fraction operator -(fraction a,fraction b);
friend fraction operator *(fraction a,fraction b);
friend fraction operator /(fraction a,fraction b);
private:
int nume;//分子
int deno;//分母
};
fraction::fraction(double d):nume(d),deno(1){//nume是整形,d为double故这里强制类型转化nume取了d的整数部分
d=d-nume;//d取小数部分
while(int(d*10)!=0){
nume=nume*10+int(d*10);
deno=deno*10;
d=d*10-int(d*10);
} ;
simplify();
}
fraction::fraction(const string str):nume(0),deno(1){
char buf[200];
int i=str.find('/');
str.copy(buf,i,0);//string.copy函数(指向存放位置的指针,复制函数的个数,从第几位开始复制)
buf[i]=0;
nume=atoi(buf);
int j=str.length()-i-1;
str.copy(buf,j,i+1);
buf[j]=0;
deno=atoi(buf);
simplify();
}
void fraction::simplify(){//欧几里得算法找到最大公约数
int n,d,r,s=1;//s为符号位
if(deno<0)s=-s,deno=-deno;
if(nume<0)s=-s,nume=-nume;
int t=Euclid(nume,deno) ;
nume=s*nume/t;
deno=deno/t;
}
void fraction::display(){
if(deno!=0){
cout<<nume<<"/"<<deno<<endl;
}
else cout<<"the deno must not be 0"<<endl;
}
fraction operator *(fraction a,fraction b){
fraction c;
c.deno=a.deno*b.deno;
c.nume=a.nume*b.nume;
c.simplify();
return c;
}
fraction operator /(fraction a,fraction b){
fraction c;
c.deno=a.deno*b.nume;
c.nume=a.nume*b.deno;
c.simplify();
return c;
}
fraction operator +(fraction a,fraction b){
fraction c;
int r=Euclid(a.deno,b.deno);
c.nume=a.nume*(b.deno/r)+b.nume*(a.deno/r);
c.deno=a.deno*b.deno/r;
c.simplify();
return c;
}
fraction operator -(fraction a,fraction b){
fraction c;
int r=Euclid(a.deno,b.deno);
c.nume=a.nume*(b.deno/r)-b.nume*(a.deno/r);
c.deno=a.deno*b.deno/r;
c.simplify();
return c;
}
int main(){
fraction a(-1,2);
a.display();
fraction b(-0.23);
b.display();
fraction c("-3/8");
c.display();
c=a*b;
c.display();
c=b/a;
c.display();
c=b+a;
c.display();
c=a-b;
c.display();
return 0;
}