53-C++ CH08 01
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&);
(zrf==ssh) is:0; (zrf<ssh) is:1
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<<'\n' ;
std::cout<<"(zrf==ssh) is:"<<(zrf==ssh)<<"; (zrf<ssh) is:"<<(zrf<ssh) <<endl;
return 0; }
53-C++ CH08 01的更多相关文章
- Dotnet文件格式解析
0x0.序 解析过程并没有介绍对pe结构的相关解析过程,网上此类相关资料很多可自行查阅,本文只介绍了网上资料较少的从pe结构的可选头中的数据目录表中获取dotnet目录的rva和size,到完全解析d ...
- 十几张表的join(千万级/百万级表) 7hours-->5mins
================START============================== 来了一个mail说是job跑得很慢,调查下原因 先来看下sql: SELECT h.order_ ...
- Neutron 理解 (7): Neutron 是如何实现负载均衡器虚拟化的 [LBaaS V1 in Juno]
学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...
- 如何通过pid快速找出进程的路径
[carlton@oc3408554812 Desktop]$ top top - 09:35:06 up 32 min, 2 users, load average: 1.49, 1.56, 1 ...
- index merge的一次优化
手机微博4040端口SQL优化 现象 某端口常态化延迟,通过使用pt-query-digest发现主要由于一条count(*)语句引发,具体如下: # .5s .58M rss, .84M vsz # ...
- 【转载】linux环境下tcpdump源代码分析
linux环境下tcpdump源代码分析 原文时间 2013-10-11 13:13:02 CSDN博客 原文链接 http://blog.csdn.net/han_dawei/article/d ...
- 【多媒体封装格式详解】---MKV
http://blog.csdn.net/tx3344/article/details/8162656# http://blog.csdn.net/tx3344/article/details/817 ...
- linux环境下tcpdump源代码分析
Linux 环境下tcpdump 源代码分析 韩大卫@吉林师范大学 tcpdump.c 是tcpdump 工具的main.c, 本文旨对tcpdump的框架有简单了解,只展示linux平台使用的一部分 ...
- WCF简单教程
WCF是DotNet体系中很重要的一项技术,但是组内很多组员通过书籍自学的时候 感觉涉及面太广.配置文件太复杂,新名词太多.抓不到头绪,有感于此,决定进行一次组内技术培训,顺便把培训讲义整理到blog ...
随机推荐
- video4linux(v4l)使用摄像头的实例基础教程与体会(转)
1. video4linux基础相关 1.1 v4l的介绍与一些基础知识的介绍 I.首先说明一下video4linux(v4l). 它是一些视频系统.视频软件.音频软 ...
- Ubuntu secuerCRT连接失败,The remote system refused the connection.
新安装的ubuntu系统,securtCRT连接失败,出现下面结果,这是因为ubuntu没有安装工具. The remote system refused the connection. 解决办法: ...
- 以图文解锁 HTTPS原理***
我们先不了聊HTTP,HTTPS,我们先从一个聊天软件说起,我们要实现A能发一个hello消息给B: 如果我们要实现这个聊天软件,本文只考虑安全性问题,要实现: A发给B的hello消息包,即使被中间 ...
- Ubuntu---samba(安装、配置、使用)OK
安装 [xt@butbueatiful ~]$ sudo apt-get install samba 创建共享目录 [xt@butbueatiful ~]$ mkdir /home/xt/share ...
- C++ 命名空间解释
using关键字 如果在程序中需要多次引用某个命名空间的成员,那么按照之前的说法,我们每次都要使用范围解析符来指定该命名空间,这是一件很麻烦的事情.为了解决这个问题,人们引入了using关键字.usi ...
- 关于INTEL FPGA设计工具DSP Builder
一段时间以来,MathWorks一直主张使用Matlab和Simulink开发工具进行基于模型的设计,因为好的设计技术使您能够在更短的时间内开发更高质量的复杂软件.基于模块的设计采用了数学和可视化的方 ...
- socket 阻塞,同步、I/O模型
1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步: 所谓同步,就是在发出一个功能调用时, ...
- js正则表达式验证大全--转载
转载来源:http://www.cnblogs.com/hai-ping/articles/2997538.html#undefined //判断输入内容是否为空 function IsNull(){ ...
- 北京师范大学第十六届程序设计竞赛决赛 C萌萌哒身高差
链接:https://www.nowcoder.com/acm/contest/117/C来源:牛客网 萌萌哒身高差 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他 ...
- 20181103_C#线程初探, BeginInvoke_EndInvoke
在C#中学习多线程之前, 必须要深刻的理解委托; 基本上所有的多线程都在靠委托来完成 一. 进程和线程: a) 进程和线程都是计算机的概念, 跟程序语言没有任何关系 b) 进程和线程都属于计算机操 ...