53-C++ CH08 01

      算法训练 C++ CH08 01  
时间限制:1.0s   内存限制:256.0MB
    
问题描述
  已知一个有理数类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&);
测试
  测试时主程序会输入四个整数a, b, c, d,表示两个分数a/b和c/d。要求输出最简分数以及两个分数相等和大小的比较结果。
样例输入
1 7 26 25
样例输出
zrf is:1/7; ssh is:26/25
(zrf==ssh) is:0; (zrf<ssh) is:1
 
思路:就是补充四个重载函数,纯c++内容,只需提交一下代码:
ostream& operator<<(ostream& os, const zrf_Ratio& zrf_Ratio){
	os << zrf_Ratio.num << "/" << zrf_Ratio.den;
	return os;
}

istream& operator>>(istream& in, zrf_Ratio& zrf_Ratio){
	in >> zrf_Ratio.num >> zrf_Ratio.den;
	return in;
}
bool operator==(const zrf_Ratio& z1, const zrf_Ratio& z2){
	if(z1.num == z2.num && z1.den == z2.den)
		return true;
	return false;
}
bool operator<(const zrf_Ratio& z1, const zrf_Ratio& z2){
	if(z1.num * z2.den < z2.num * z1.den)
		return true;
	return false;
}

  完整的程序:

#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<<(ostream& os, const zrf_Ratio& zrf_Ratio){
	os << zrf_Ratio.num << "/" << zrf_Ratio.den;
	return os;
}

istream& operator>>(istream& in, zrf_Ratio& zrf_Ratio){
	in >> zrf_Ratio.num >> zrf_Ratio.den;
	return in;
}
bool operator==(const zrf_Ratio& z1, const zrf_Ratio& z2){
	if(z1.num == z2.num && z1.den == z2.den)
		return true;
	return false;
}
bool operator<(const zrf_Ratio& z1, const zrf_Ratio& z2){
	if(z1.num * z2.den < z2.num * z1.den)
		return true;
	return false;
}
//公有成员函数:
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);
     std::cout<<"zrf is:"<<zrf<<"; ssh is:"<<ssh<<'
' ;
     std::cout<<"(zrf==ssh) is:"<<(zrf==ssh)<<"; (zrf<ssh) is:"<<(zrf<ssh) <<endl;
     return 0;
 
}

  

原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/8457832.html