蓝桥杯-C++ CH08 01

25 篇文章 0 订阅

题目大意:求分数的最简形式和判断大小

分析:由于题目中已经给我们写好了部分函数,所以我们只要将运算符重载的几个友元函数补充完整即可。

值得注意的是,在比较分数大小时,要将其中的某个数转化成float型,否则会强制转化为int型,导致部分数据出错。

第二个运算符>>,好像对于解答题目没什么用处。 主函数中的输入>>并没有使用重载的形式。

代码展示:

ostream& operator<<(std::ostream& os, const zrf_Ratio& zrf){
	os<<zrf.num<<"/"<<zrf.den;
} 

bool operator==(const zrf_Ratio& zrf, const zrf_Ratio& ssh){
 	if(zrf.num==ssh.num && zrf.den==ssh.den)
 		return 1;
 	else 
 		return 0;
}

bool operator<(const zrf_Ratio& zrf,const zrf_Ratio& ssh){
	if(float(zrf.num)/zrf.den<float(ssh.num)/ssh.den)
		return 1;
	else 
		return 0;
}

完整代码展示:

#include <iostream> 
#include <cassert> 
using namespace std;
class zrf_Ratio
{
     friend std::ostream& operator<<(std::ostream&, const zrf_Ratio&);
     friend std::istream& operator>>(std::istream&, zrf_Ratio&);
     friend bool operator==(const zrf_Ratio&, const zrf_Ratio&);
     friend bool operator<(const zrf_Ratio&, const zrf_Ratio&);
public:
     zrf_Ratio(int=0,int=1);
     zrf_Ratio(const zrf_Ratio&);
 
private:
     int num;
     int den;
     void reduce();//化为最简分数
};
//补充完整构造函数
 
ostream& operator<<(std::ostream& os, const zrf_Ratio& zrf){
	os<<zrf.num<<"/"<<zrf.den;
} 

bool operator==(const zrf_Ratio& zrf, const zrf_Ratio& ssh){
 	if(zrf.num==ssh.num && zrf.den==ssh.den)
 		return 1;
 	else 
 		return 0;
}

bool operator<(const zrf_Ratio& zrf,const zrf_Ratio& ssh){
	if(float(zrf.num)/zrf.den<float(ssh.num)/ssh.den)
		return 1;
	else 
		return 0;
}

//公有成员函数:
zrf_Ratio::zrf_Ratio(int num, int den) : num(num), den(den)
{
     reduce();
}
 
zrf_Ratio::zrf_Ratio(const zrf_Ratio& r) : num(r.num), den(r.den)
{
 
}
 
//私有成员函数:
void swap(int &m, int &n)
{   
     int t;       
     t=m;    
     m=n;    
     n=t;
}
 
int zrf_Gcd(int m, int n)
{
     if (m<n)
         swap(m,n);
     assert(n>=0);
     while (n>0) 
     {
         int r=m%n;  
         m = n;   
         n = r;
     }
     return m;
}
 
void zrf_Ratio::reduce()
{
     if (num == 0 || den == 0) 
     {
         num = 0;  
         den = 1;  
         return; 
     }
     if (den < 0)
     {
         den *= -1;  
         num *= -1;
     }
     if (num == 1)
         return;
     int sgn = (num<0?-1:1);
     int g = zrf_Gcd(sgn*num,den);
     num /= g; 
     den /= g;
}
 
int main()
{
     int a = 0, b = 0, c = 0, d = 0;
     cin >> a >> b >> c >> d;
     zrf_Ratio zrf(a, b),ssh(c, d);
     cout<<"zrf is:"<<zrf<<"; ssh is:"<<ssh<<endl;
     cout<<"(zrf==ssh) is:"<<(zrf==ssh)<<"; (zrf<ssh) is:"<<(zrf<ssh) <<endl;
     return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值