第一次发文章哈哈哈就是我(相)最(爱)喜(相)欢(杀)的C++。C艹虐我千百遍,我待C艹如初恋……
以防万一有比我这种小白还白的小小白,我们从新建项目开始,想要代码的话在后面可以直接跳过前面。代码是超级完整的代码嗷,可能没有大佬的优化好,但是初学者(像我)应该挺好理解的!求个赞赞嘛
首先我们点击最下面的新建项目。并选择空项目(右边上面第一个)。给他一个你喜欢的名字,这里是有咯书我们就叫Rational好了。
然后右键头文件如图,新建两个文件:一个是Rational.h用于编写类的内容,一个是Rational.cpp用于类的成员函数的实现(还有友元函数和其他函数)。同样右键源文件添加一个test.cpp用于写main函数(也可以在这里定义其他的函数,不过我习惯放在Rational.cpp)
好,让我们上代码!
有一些变量名很奇怪(捂脸)是因为翻译过来实在有点长,然后拼音又感觉不够专业,结果最后还不如拼音……就凑合看看吧!如果要直接copy我的代码记得改一个好一点的变量名!注释都有解释说是什么的。
首先是Rational.h
//Ratinal.h
#ifndef RATIONAL_H
#define RATIONAL_H
#include <iostream>
#include<cstring>
using namespace std;
class Rational {
public:
Rational();
Rational(int);
Rational(int, int);
~Rational();
void simplify(); //约分
friend void sameDenomination(Rational a, Rational b); //通分
friend ostream& operator << (ostream&, Rational&);
friend istream& operator >> (istream&, Rational&);
bool operator == (const Rational&);
bool operator < (const Rational&);
bool operator <= (const Rational&);
bool operator > (const Rational&);
bool operator >= (const Rational&);
friend Rational operator + (Rational&, Rational&); //因为要通分所以不能const
friend Rational operator - (Rational&, Rational&); //因为要通分所以不能const
friend Rational operator * (const Rational&, const Rational&);
friend Rational operator / (const Rational&, const Rational&);
private:
int numerator; //分子
int denominator; //分母
};
#endif
然后是Rational.cpp,其中最大公约数是欧几里得算法,参考连接如下,这里有证明和解释大家可以看看:C++求最大公约数(欧几里得算法) - Forceco - 博客园 (cnblogs.com)
#include <iostream>
#include"rational.h"
#include<cstring>
using namespace std;
Rational::Rational() {
numerator = 0;
denominator = 1;
}
Rational::Rational(int a) {
numerator = a;
denominator = 1;
}
Rational::Rational(int a, int b) {
numerator = a;
denominator = b;
}
Rational::~Rational(){}
//求最大公约数
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
//约分
void Rational::simplify() {
int maxSim = gcd(max(denominator, numerator), min(denominator, numerator)); //最大公约数
if (maxSim > 1) {
numerator = numerator / maxSim;
denominator = denominator / maxSim;
}
}
//通分
void sameDenomination(Rational a, Rational b) {
if (a.denominator != b.denominator) {
int maxSim = gcd(max(a.denominator, b.denominator), min(a.denominator, b.denominator)); //最大公约数
int minSame = a.denominator * b.denominator / maxSim; //最小公倍数
a.numerator = a.numerator * (minSame / a.denominator);
b.numerator = b.numerator * (minSame / b.denominator);
a.denominator = minSame;
b.denominator = minSame;
}
}
//输出(含约分)
ostream& operator << (ostream& os, Rational& a) {
a.simplify();
if (a.numerator == a.denominator)
cout << 1 << endl;
else if (a.numerator == 0)
cout << 0 << endl;
else
os << a.numerator << "/" << a.denominator << endl;
return os;
};
//输入
istream& operator >> (istream& is, Rational& a) {
int n, m, r = 1;
while (r) {
cin >> n >> m;
if (m != 0) {
a.numerator = n;
a.denominator = m;
r = 0;
}
else
cout << "分母不能为0!请重新输入" << endl;
}
return is;
};
//需要在函数体外先约分
bool Rational::operator == (const Rational& b) {
if (numerator == b.numerator && denominator == b.denominator)
return 1;
else
return 0;
};
//需要先通分
bool Rational::operator < (const Rational& b) {
if (numerator < b.numerator)
return 1;
else
return 0;
};
bool Rational::operator <= (const Rational& b) {
if (numerator <= b.numerator)
return 1;
else
return 0;
};
bool Rational::operator > (const Rational& b) {
if (numerator > b.numerator)
return 1;
else
return 0;
};
bool Rational::operator >= (const Rational& b) {
if (numerator >= b.numerator)
return 1;
else
return 0;
};
Rational operator + (Rational& a, Rational& b) {
sameDenomination(a, b);
Rational tmp(a.numerator + b.numerator, a.denominator);//咱统一在输出的时候约分,不然总是存储最简分数没必要
return tmp;
};
Rational operator - (Rational& a, Rational& b) {
sameDenomination(a, b);
Rational tmp(a.numerator - b.numerator, a.denominator);
return tmp;
};
Rational operator * (const Rational& a, const Rational& b) {
Rational tmp(a.numerator * b.numerator, a.denominator * b.denominator);
return tmp;
};
Rational operator / (const Rational& a, const Rational& b) {
Rational tmp(a.numerator * b.denominator, a.denominator * b.numerator);//并不会出现小数
return tmp;
};
最后是test.cpp
#include <iostream>
#include"rational.h"
#include<cstring>
using namespace std;
int main() {
int n, m, r = 1;
Rational A;
cout << "请按照分子、分母的顺序输入第一个分数,分子分母必须分别为整数。示例:1/3应输入1 3" << endl;
while (r) {
cin >> n;
cin >> m;
if (m != 0) {
A = Rational(n, m); //使用构造函数初始化
r = 0;
}
else
cout << "分母不能为0!请重新输入" << endl;
}
cout << "请按照分子、分母的顺序输入第二个分数,分子分母必须分别为整数。示例:1/3应输入1 3" << endl;
Rational B(0, 1);
cin >> B; //使用重载输入运算符
//输出并判断大小
cout << "你输入的两个分数分别是:" << endl;
cout << "A:" << A << "B:" << B << endl;
if (A == B) //输出的时候已经约分过了,可以直接判断相等
cout << "A == B" << endl;
else {
sameDenomination(A, B); //判断大小前先通分
if (A < B)
cout << "A < B" << endl;
if (A <= B)
cout << "A <= B" << endl;
else { //小了就不用再判断大了
if (A > B)
cout << "A > B" << endl;
if (A >= B)
cout << "A >= B" << endl;
}
}
Rational C(1,1);
C = A + B;
cout << "A + B =" << C;
C = A - B;
cout << "A - B =" << C;
C = A * B;
cout << "A * B =" << C;
C = A / B;
cout << "A / B =" << C;
return 0;
}
最后是测试
希望有所帮助!有什么问题欢迎留言!萌新求赞嘻嘻
后续更新Complex复数类、Date日历类、Clock时钟类等,
另外可能还会更新matlab的作业代码、SQL、遥感实验报告(ENVI、Arcgis)、GNSS星历计算卫星轨道什么的,有同专业的同学可以一起学习呀!