C++只提供了整数类和浮点数类,但是没有有理数类,所以需要自己写一个有理数类。
我们将使用分数来表示一个有理数。即Rational类有两个数据域,分子叫做 numerator,分母叫做denominator,且分母不能为0。
同时,一个有理数可能又很多表现形式,比如1/3可以表示为2/6,3/9等,我们统一用化简后的形式表示这个数,比如1/3。
Rational.h
#ifndef RATIONAL_H
#define RATIONAL_H
#include <string>
using namespace std;
class Rational{
public:
//无参构造函数
Rational();
//有参构造函数,两个参数分别是分子和分母
Rational(int numerator, int denominator);
//获取分子
int getNumerator() const;
//获取分母
int getDenominator() const;
//两数求和,返回Rational类对象
Rational add(const Rational& secondRational) const;
//两数求差,返回Rational类对象
Rational subtract(const Rational& secondRational) const;
//两数相乘,返回Rational类对象
Rational multiply(const Rational& secondRational) const;
//两数相除,返回Rational类对象
Rational divide(const Rational& secondRational) const;
//比较两个有理数
int compareTo(const Rational& secondRational) const;
//若两个有理数相等,则返回true;否则,返回false
bool equals(const Rational& secondRational) const;
//返回一个整型数
int intValue() const;
//返回一个浮点数
double doubleValue() const;
//返回一个字符串
string toString() const;
private:
//分子
int numerator;
//分母
int denominator;
//求公因数,用于约分
static int gcd(int n, int d);
};
#endif // RATIONAL_H
Rational.cpp
#include "Rational.h"
#include <sstream>
#include <cstdlib>
Rational::Rational() {
//构造一个值为0的对象
this->numerator = 0;
this->denominator = 1;
}
Rational::Rational(int numerator, int denominator) {
int temp = gcd(numerator, denominator);
this->numerator = ((denominator > 0) ? 1 : -1) * numerator / temp;
this->denominator = abs(denominator) / temp;
}
int Rational::getNumerator() const {
return this->numerator;
}
int Rational::getDenominator() const{
return this->denominator;
}
int Rational::gcd(int n, int d) {
int n1 = abs(n);
int n2 = abs(d);
int gcd = 1;
for (int i = 1; i <= n1 && i <= n2; i ++) {
if (n1 % i == 0 && n2 % i == 0) {
gcd = i;
}
}
return gcd;
}
Rational Rational::add(const Rational& secondRational) const {
int n = numerator * secondRational.getDenominator() + denominator * secondRational.getNumerator();
int d = denominator * secondRational.getDenominator();
return Rational(n, d);
}
Rational Rational::subtract(const Rational& secondRational) const {
int n = numerator * secondRational.getDenominator() - denominator * secondRational.getNumerator();
int d = denominator * secondRational.getDenominator();
return Rational(n, d);
}
Rational Rational::multiply(const Rational& secondRational) const {
int n = numerator * secondRational.getNumerator();
int d = denominator * secondRational.getDenominator();
return Rational(n, d);
}
Rational Rational::divide(const Rational& secondRational) const {
int n = numerator * secondRational.getDenominator();
int d = denominator * secondRational.getNumerator();
return Rational(n, d);
}
int Rational::compareTo(const Rational& secondRational) const {
//作差法比较大小
Rational temp = subtract(secondRational);
if (temp.getNumerator() < 0) {
//小于
return -1;
} else if (temp.getNumerator() == 0) {
//等于
return 0;
} else {
//大于
return 1;
}
}
bool Rational::equals(const Rational& secondRational) const {
if(compareTo(secondRational) == 0) {
return true;
} else {
return false;
}
}
int Rational::intValue() const {
return getNumerator()/getDenominator();
}
double Rational::doubleValue() const {
return 1.0 * getNumerator()/getDenominator();
}
string Rational::toString() const {
stringstream ss;
ss << numerator;
if(denominator > 1) {
ss << "/" <<denominator;
}
return ss.str();
}
main.cpp
#include <iostream>
#include "Rational.h"
using namespace std;
int main()
{
Rational r1(4, 2);
Rational r2(2, 3);
cout << "r1的值为" << r1.toString() << endl << "r2的值为" << r2.toString() << endl;
cout << "-------------------------------" << endl;
cout << r1.toString() << " + " << r2.toString() << " = " << r1.add(r2).toString() << endl;
cout << r1.toString() << " - " << r2.toString() << " = " << r1.subtract(r2).toString() << endl;
cout << r1.toString() << " * " << r2.toString() << " = " << r1.multiply(r2).toString() << endl;
cout << r1.toString() << " / " << r2.toString() << " = " << r1.divide(r2).toString() << endl;
cout << "-------------------------------" << endl;
cout << "r2向下取整:" << r2.intValue() << endl;
cout << "r2转换为小数:" << r2.doubleValue() << endl;
cout << "-------------------------------" << endl;
cout << "r1.compareTo(r2)的返回值是:" << r1.compareTo(r2) << endl;
cout << "r2.compareTo(r1)的返回值是:" << r2.compareTo(r1) << endl;
cout << "r1.compareTo(r1)的返回值是:" << r1.compareTo(r1) << endl;
cout << "-------------------------------" << endl;
cout << "r1.equals(r1)的返回值是:" << r1.equals(r1) << endl;
cout << "r1.equals(r2)的返回值是:" << r1.equals(r2) << endl;
cout << "-------------------------------" << endl;
return 0;
}
运行结果:
原文链接: https://www.cnblogs.com/bwjblogs/p/12982908.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/198050
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!