一、学习要点:
1.将分数定义为一个类,简化处理过程,面向对象的思维,不仅有数据,还可以对一个分数进行操作,比如约分操作,加减乘除操作.
2.类的私有成员只能通过成员函数进行访问.
3.分数的约分过程是分子和分母同时除以分子和分母的最大公约数.求两个数的最大公约数用的是欧几里得辗转相除的原理.
二、实现代码
#include<iostream>
#include<math.h>
#include<stdlib.h>
using namespace std;
class Rational{
public:
Rational(int num,int denomi);//构造器
Rational operator+(Rational x);//运算符重载函数
Rational operator-(Rational x);
Rational operator*(Rational x);
Rational operator/(Rational x);
void print();
private:
int numerator;
int denominator;
void normalize();//归一化处理,比如将2/16变成1/8;
};
Rational::Rational(int num,int denomi){
numerator=num;
denominator=denomi;
normalize();
}
void Rational::normalize(){
if(denominator<0)//负号放在分母上
{
numerator=-numerator;
denominator=-denominator;
}
//欧几里得算法
int t;
int a=abs(numerator);
int b=abs(denominator);
if(a>b){
t=a%b;
while(t){
a=b;
b=t;
t=a%b;
}
a=b;
}
else{
t=b%a;
while(t){
b=a;
a=t;
t=b%a;
}
}
numerator/=a;
denominator/=a;
}
Rational Rational::operator+(Rational x){
int a=numerator;
int b=denominator;
int c=x.numerator;
int d=x.denominator;
int e=a*d+b*c;
int f=b*d;
return Rational(e,f);
}
Rational Rational::operator-(Rational x){
int a=numerator;
int b=denominator;
int c=x.numerator;
int d=x.denominator;
int e=a*d-b*c;
int f=b*d;
return Rational(e,f);
}
Rational Rational::operator*(Rational x){
int a=numerator;
int b=denominator;
int c=x.numerator;
int d=x.denominator;
int e=a*c;
int f=b*d;
return Rational(e,f);
}
Rational Rational::operator/(Rational x){
int a=numerator;
int b=denominator;
int c=x.numerator;
int d=x.denominator;
int e=a*d;
int f=b*c;
return Rational(e,f);
}
void Rational::print(){
if(numerator%denominator==0){
cout<<numerator/denominator;
}else{
cout<<numerator<<'/'<<denominator;
}
}
int main()
{
Rational f1(2,16);
Rational f2(7,8);
//加的过程
Rational resadd=f1+f2;
f1.print();
cout<<'+';
f2.print();
cout<<'=';
resadd.print();
cout<<'\n';
//减的过程
Rational ressub=f1-f2;
f1.print();
cout<<'-';
f2.print();
cout<<'=';
ressub.print();
cout<<'\n';
//乘的过程
Rational resmul=f1*f2;
f1.print();
cout<<'*';
f2.print();
cout<<'=';
resmul.print();
cout<<'\n';
//除的过程
Rational resc=f1/f2;
f1.print();
cout<<'/';
f2.print();
cout<<'=';
resc.print();
cout<<'\n';
system("pause");
return 0;
}
三、运行结果图如下:
四、如有错误,请指教,相互交流学习。