类型转换函数练习题-Rational
题目
- 有理数类 Rational 定义了两个数据成员:分子Numerator 和分母 Denominator。
- 有三个构造函数可以用不同形式的初值构造对象:
- 构造一个初值为0的有理数,
- 用分子、分母构造有理数,
- 以及用实数构造有理数。
- 带参数构造函数 同时具备 把基本数据类型参数转换成 Rational 类型 的功能。?
- 一个类型转换的成员函数 可以把 Rational 类对象转换为 double 型数据。
- 还有两个友元函数:重载运算符“+”用于两个有理数的求和,重载运算符“<<” 用于输出有理数。
gcd
函数求最大公约数,用于对有理数进行约分。
#include <iostream>
using namespace std;
class Rational{
int Numerator,Denominator;//定义了两个数据成员:分子Numerator 和分母 Denominator。
public:
Rational(){ //构造一个初值为0的有理数
Numerator=0;
Denominator=0;
}
Rational(int N,int D){ //用分子、分母构造有理数
if(D==1)
{ Numerator=N;Denominator=D;}
else
{
int g=gcd(N,D);
Numerator=N/g;
Denominator=D/g;
};
}
/*怎么判断是否为有理数?*/
Rational(double I){ //用实数构造有理数
int x,y,g;
x=int(I*1e3);
y=int(1e3);
g=gcd(x,y);
Numerator=x/g;
Denominator=y/g;
}
operator double(){ //一个类型转换的成员函数 可以把 Rational 类对象转换为 double 型数据。
return double (Numerator)/ double (Denominator);
}
//重载运算符“+”用于两个有理数的求和
friend Rational operator +(const Rational &a,const Rational &b);//得有两个对象参数啊,是两个对象相加!
//重载运算符“<<” 用于输出有理数
friend ostream& operator <<(ostream &output, const Rational &a);
};
int gcd(int a,int b){//求最大公约数(Greatest common Divisor)的算法
int g;
if (b==0) g=a;
else g=gcd(b,a%b);
return g;
}
Rational operator +(const Rational &a, const Rational &b){
Rational X;
int x,y,g;
x=a.Numerator*b.Denominator+a.Denominator*b.Numerator;
y=a.Denominator*b.Denominator;
g=gcd(x,y);
X.Numerator=x/g;
X.Denominator=y/g;
}
ostream& operator <<(ostream & output,const Rational &a){
output<<a.Numerator;
if(a.Denominator!=1) output<<"/"<<a.Denominator;
return output;
}
int main()
{
Rational a(2,4);
Rational b=0.3;//用构造函数进行类型转换
Rational c=a+b;//调用重载运算符+和默认的重载运算符=
cout<<double(a)<<"+"<<double(b)<<"="<<double(c)<<endl;//实数形式输出
cout<<a<<"+"<<b<<"="<<c<<endl;//分数形式输出
double x=b;//将b从Rational变成double
c=x+1+0.6;//将double变成Rational
}
语法规范
1.在尽量只进行函数声明,在类外面再进行函数的定义
2.简单的函数体,尽量放在一行写 for instance:
{ Numerator=0; Denominator=0; }
3**.重载运算符函数尽量用友元函数**,而且重载输入流输出流函数只能用友元函数定义
4.参数尽量用常引用
5.用户定义的类型转换函数只能在无二义性的情况下才能够隐性使用
题目收获
- 实数->double
- 先让可能是小数的double变成整数:
int(x*1e5)
- 再进
if(d!==1) 要进行判断是否为最简分数->调用gcd函数
- 先让可能是小数的double变成整数:
- 注意最大公约数:也就是说构造的分数必须是最简分数,所以要对输入的参数进行判断
- if(d==1) 按原来的走就行,因为已经是最简分数
- if(d!==1) 要进行判断是否为最简分数->调用gcd函数
- Rational转化为double的时候
- 不需要新建一个double temp去存储转化结果,直接return就行!
- 因为分子分母是int型,最好先将int转换为double
- so:
return double(Numerator)/double (Denominator)
;
- 输出有理数的时候,要先判断分母是否等于1,总不能输出1/1这么笨的数