面向对象程序设计_04_分数类
此文件属于课堂作业
头文件 <pch.h>
#ifndef PCH_H
#define PCH_H
class Fraction
{
private:
int numerator;//分子
int denominator;//分母
int gcd(int x, int y)const;//最小公倍数
int lcm(int x, int y)const;//最大公约数
void fixup();//维护分母始终为正数
public:
Fraction();//缺省构造函数
Fraction(int numerator); //分母默认值为1
Fraction(int numerator, int denominator);//控制输入
friend const Fraction operator + (const Fraction &x, const Fraction &y);
friend const Fraction operator - (const Fraction &x, const Fraction &y);
friend const Fraction operator * (const Fraction &x, const Fraction &y);
friend const Fraction operator / (const Fraction &x, const Fraction &y);
const Fraction operator - ();
const Fraction simplify()const; //化简
const Fraction reciprocal()const;//倒数
friend bool operator > (const Fraction &x, const Fraction &y);
friend bool operator >= (const Fraction &x, const Fraction &y);
friend bool operator < (const Fraction &x, const Fraction &y);
friend bool operator <= (const Fraction &x, const Fraction &y);
friend bool operator != (const Fraction &x, const Fraction &y);
friend bool operator == (const Fraction &x, const Fraction &y);
Fraction& operator = (const Fraction &x);
//输出
void print()const;
};
#endif //PCH_H
源文件<分数类.cpp>
#include "pch.h"
#include <iostream>
#include <cassert>
using namespace std;
int a = 0, b = 0, c = 0, d = 0;//记录+-*/的运算次数
Fraction::Fraction()//缺省构造函数
{
}
Fraction::Fraction(int x) : numerator(x), denominator(1)//分母默认值为1
{
}
Fraction::Fraction(int x, int y) : numerator(x), denominator(y)
{
assert(y != 0);//assert防止分母为0
}//构造函数控制输入
int Fraction::gcd(int x, int y)const
{
int n = lcm(x, y);
return x * y / n;
}
int Fraction::lcm(int x, int y)const
{
//欧几里得算法
while (y) {
int t = y;
y = x % y;
x = t;
}
return x;
}
void Fraction::fixup()
{
//如果分母为负,将分子分母同时取负
if (denominator < 0) {
denominator = -denominator;
numerator = -numerator;
}
assert(denominator != 0);
}
const Fraction Fraction::simplify()const//化简
{
Fraction ans;
int n = lcm(numerator, denominator);//得到最小公倍数
ans.denominator = denominator / n;//分子分母同时除以最小公倍数
ans.numerator = numerator / n;
return ans;
}
const Fraction operator +(const Fraction &x, const Fraction &y)
{
int n = x.gcd(x.denominator, y.denominator);//得到最大公约数
Fraction ans;
//将分母化为相同的再对分子进行加法运算
ans.numerator = n / x.denominator*x.numerator + n / y.denominator*y.numerator;
ans.denominator = n;
a++;
return ans.simplify();
}
const Fraction operator -(const Fraction &x, const Fraction &y)
{
int n = x.gcd(x.denominator, y.denominator);//得到最大公约数
Fraction ans;
//将分母化为相同的再对分子进行减法运算
ans.numerator = n / x.denominator*x.numerator - n / y.denominator*y.numerator;
ans.denominator = n;
b++;
return ans.simplify();
}
const Fraction operator *(const Fraction &x, const Fraction &y)
{
Fraction ans;
Fraction tmp_x = x.simplify();
Fraction tmp_y = y.simplify();
//分子分母对应相乘
ans.numerator = tmp_x.numerator*tmp_y.numerator;
ans.denominator = tmp_x.denominator*tmp_y.denominator;
c++;
return ans.simplify();
}
const Fraction operator /(const Fraction &x, const Fraction &y)
{
Fraction ans;
Fraction tmp_x = x.simplify();
Fraction tmp_y = y.simplify();
assert(tmp_y.denominator != 0);//分子为0不能作为除数
//分子乘分母,分母乘分子
ans.numerator = tmp_x.numerator*tmp_y.denominator;
ans.denominator = tmp_x.denominator*tmp_y.numerator;
ans = ans.simplify();
ans.fixup();
d++;
return ans;
}
const Fraction Fraction::operator -()
{
//分子变为相反数
Fraction x;
x.numerator = -numerator;
x.denominator = denominator;
return x;
}
Fraction& Fraction::operator =(const Fraction &x)
{
if (this != &x) {
numerator = x.numerator;
denominator = x.denominator;
}
return *this;
}
bool operator >(const Fraction &x, const Fraction &y)
{
if ((x - y).numerator > 0)return true;
else return false;
}
bool operator >=(const Fraction &x, const Fraction &y)
{
if ((x - y).numerator >= 0)return true;
else return false;
}
bool operator <(const Fraction &x, const Fraction &y)
{
if ((x - y).numerator < 0)return true;
else return false;
}
bool operator <=(const Fraction &x, const Fraction &y)
{
if ((x - y).numerator <= 0)return true;
else return false;
}
bool operator !=(const Fraction &x, const Fraction &y)
{
if ((x - y).numerator != 0)return true;
else return false;
}
bool operator ==(const Fraction &x, const Fraction &y)
{
if ((x - y).numerator == 0)return true;
else return false;
}
const Fraction Fraction::reciprocal()const
{
return 1 / (*this);
}
void Fraction::print()const
{
if (numerator%denominator)printf("%d/%d\n", numerator, denominator);
else printf("%d\n", numerator / denominator);
}
int main()
{
int m, n, j, k;
cout << "输入分子1: ";
cin >> m;
cout << "输入分母1: ";
cin >> n;
cout << "输入分子2: ";
cin >> j;
cout << "输入分母2: ";
cin >> k;
Fraction x(m, n), y(j, k);
//error:Fraction t(1,0);
int v = 1;
//测试分数运算
Fraction ans1 = x + y; a++;
Fraction ans2 = x - y; b++;
Fraction ans3 = x * y; c++;
Fraction ans4 = x / y; d++;
Fraction ans5 = -x;
Fraction ans6 = x.reciprocal();
printf("x+y=");//使用printf更简洁
ans1.print();
printf("x-y=");
ans2.print();
printf("x*y=");
ans3.print();
printf("x/y=");
ans4.print();
printf("-x=");
ans5.print();
printf("1/x=");
ans6.print();
printf("\nx>y? ");
printf("%d\n", x > y);
printf("x<y? ");
printf("%d\n", x < y);
printf("x==y? ");
printf("%d\n", x == y);
printf("x!=y? ");
printf("%d\n", x != y);
printf("x>=y? ");
printf("%d\n", x >= y);
printf("x<=y? ");
printf("%d\n", x <= y);
printf("\n");
cout << a << endl;
cout << b << endl;
cout << c << endl;
cout << d << endl;
return 0;
}