Rational 有理数表示(运算符操作)
2013-11-10 22:49
330 查看
Rational.h
Rational.cpp
#ifndef RATIONAL_H
#define RATIONAL_H
/** @file
* @brief rational和其操作符函数的完整定义
*/
/** @mainpage 有理数表示
* 合并所有的rantional的所有操作
* 该程序可以用于满足所有的运算符操作
* 源文件:@link Rational.h Rational.cpp @endlink
* @date 2013-11-10
* @author Alex Lin
* @version 1.0
*/
#include <cassert>
#include <cstdlib>
#include <istream>
#include <ostream>
#include <sstream>
/**
* @brief The Rational class
* 有理数操作
*/
class Rational
{
public:
Rational();
Rational(int num);
Rational(int num, int den);
Rational(double r);
Rational& operator = (Rational const& that);
float as_float();
double as_double();
long double as_long_double();
void assign(int num, int den);
void reduce();
friend Rational abs(Rational const & r);
friend Rational operator-(Rational const& r);
friend Rational operator+(Rational const& lhs, Rational const& rhs);
friend Rational operator-(Rational const& lhs, Rational const& rhs);
friend Rational operator*(Rational const& lhs, Rational const& rhs);
friend Rational operator/(Rational const& lhs, Rational const& rhs);
friend bool operator==(Rational const& a, Rational const& b);
friend bool operator!=(Rational const& a, Rational const& b);
friend bool operator<(Rational const& a, Rational const& b);
friend bool operator<=(Rational const& a, Rational const& b);
friend bool operator>(Rational const& a, Rational const& b);
friend bool operator>=(Rational const& a, Rational const& b);
friend std::istream& operator>>(std::istream& in, Rational& rat);
friend std::ostream& operator<<(std::ostream& out, Rational const& rat);
public:
static int gcd(int n, int m);
static int GCD( int n, int m );
static int LCM(int a, int b);
private:
int numerator; //< 分子
int denominator; //< 分母
};
#endif // RATIONAL_H
Rational.cpp
#include "Rational.h"
///使用欧几里德算法计算最大公约数
int Rational::gcd(int n, int m)
{
n = std::abs(n);
while ( m != 0){
int tmp(n%m);
n = m;
m = tmp;
}
return n;
}
///利用递归计算最大公约数
int Rational::GCD( int n, int m )
{
if ( n % m == 0 )
return m;
else
return GCD(m, n % m);
}
///求两个数的最小公倍数
int Rational::LCM(int a, int b)
{
int temp_lcm;
temp_lcm = a*b/GCD(a, b);//最小公倍数等于两数之积除以最大公约数
return temp_lcm;
}
Rational::Rational()
: numerator(0), denominator(1)
{/*空*/}
Rational::Rational(int num)
: numerator(num), denominator(1)
{/*空*/}
Rational::Rational(int num, int den)
: numerator(num), denominator(den)
{
reduce();
}
Rational::Rational(double r)
: numerator(static_cast<int>(r * 10000)), denominator(10000)
{
reduce();
}
Rational& Rational::operator =(Rational const& that)
{
this->numerator = that.numerator;
this->denominator = that.denominator;
return *this;
}
float Rational::as_float()
{
return static_cast<float>(numerator) / denominator;
}
double Rational::as_double()
{
return static_cast<double>(numerator) / denominator;
}
long double Rational::as_long_double()
{
return static_cast<long double>(numerator) / denominator;
}
///为分子、分母赋值并约分
void Rational::assign(int num, int den)
{
numerator = num;
denominator = den;
reduce();
}
///约分
void Rational::reduce()
{
assert(denominator!=0);
if(denominator < 0)
{
denominator = -denominator;
numerator = -numerator;
}
int div(gcd(numerator, denominator));
numerator = numerator / div;
denominator = denominator / div;
}
///有理数的绝对值
Rational abs(Rational const & r)
{
return (std::abs(r.numerator), r.denominator);
}
///将有理数取反的单目操作
Rational operator-(Rational const& r)
{
return Rational(-r.numerator, r.denominator);
}
///有理数相加
Rational operator+(Rational const& lhs, Rational const& rhs)
{
return Rational(lhs.numerator*rhs.denominator+rhs.numerator*lhs.denominator,
lhs.denominator*rhs.denominator);
}
///有理数想减
Rational operator-(Rational const& lhs, Rational const& rhs)
{
return Rational(lhs.numerator*rhs.denominator-rhs.numerator*lhs.denominator,
lhs.denominator*rhs.denominator);
}
///有理数相乘
Rational operator*(Rational const& lhs, Rational const& rhs)
{
return Rational(lhs.numerator*rhs.numerator, lhs.denominator*rhs.denominator);
}
///有理数相除
///检测除零错误
Rational operator/(Rational const& lhs, Rational const& rhs)
{
return Rational(lhs.numerator*rhs.denominator, lhs.numerator*rhs.numerator);
}
///比较两个有理数是否相等
bool operator==(Rational const& a, Rational const& b)
{
return a.numerator == b.numerator and a.denominator == b.denominator;
}
///比较两个有理数是否不等
bool operator!=(Rational const& a, Rational const& b)
{
return not (a == b);
}
///比较两个有理数是否小于关系
bool operator<(Rational const& a, Rational const& b)
{
return a.numerator*b.denominator < b.numerator*a.denominator;
}
///比较两个有理数是否是小于等于关系
bool operator<=(Rational const& a, Rational const& b)
{
return not (b < a);
}
///比较两个有理数是否是大于关系
bool operator>(Rational const& a, Rational const& b)
{
return b < a;
}
///比较两个有理数是否是大于等于关系
bool operator>=(Rational const& a, Rational const& b)
{
return not (b > a);
}
///读取有理数
///格式为@em 整数 @c / @em 整数
std::istream& operator >>(std::istream& in, Rational& rat)
{
int n(0), d(0);
char sep('\0');
if (not (in >> n >> sep))
// 读取分子或分隔符出错
in.setstate(in.failbit);
else if (sep !='/')
{
// 成功读取分子,但其后无/。
// 将读取的sep放回输入流,以备下次读取。
in.unget();
rat.assign(n, 1);
}
else if (in >> d)
// 成功读取分子、分隔符及分母
rat.assign(n, d);
else
in.setstate(in.failbit);
return in;
}
///写出有理数
///格式为@em 分子 @c / @em 分母
std::ostream& operator<<(std::ostream& out, Rational const& rat)
{
std::ostringstream tmp;
tmp << rat.numerator << '/' << rat.denominator;
out << tmp.str();
return out;
}
相关文章推荐
- 实现一个用分子分母的格式来表示有理数的结构体rational以及相关的函数,rational结构体之间可以做加减乘除运算,运算的结果仍然是rational
- swift 初见-4运算符与字符串操作
- matlab矩阵的表示和简单操作
- 我也要学C语言-第四章:数据的表示与位的操作
- Day5之操作运算符
- 设a,b,c三个元素的进栈次序是a,b,c,符号PUSH与POP分别表示对堆栈进行一次进栈操作与一次出栈操作
- ES6—数组的扩展操作(扩展运算符)
- C# DataTable中Compute方法用法集锦(数值/字符串/运算符/表等操作)(转载)
- 位操作运算符
- 客户端如何调用 Rational CM API 实现 Rational ClearCase 的相关操作
- 两个常见位操作面试题 不用加减乘除运算符计算两数之和及a=b*3
- T-SQL 数据语言操作(运算符),笔记
- mysql 时间操作大全 注意本文从网上收集运算符坑得很!!!
- UML面向对象设计基础 chapter 3 类,属性和操作的基本表示法
- Fileatream表示文件流,它能够打开和关闭文件,并对文件进行单字节的读写操作。 StreamReader和StreamWriter以文本方式对流进行读写操作。建立一个文本文件,分别使用上面两种方
- C语言 6种位操作运算符
- 数据结构5:线性表的链式表示和相关的12个操作
- 基类指针使用重载输入输出运算符函数操作派生类
- as殿堂之路 使用运算符操作xml数据
- Linux下用数字表示文件的操作权限