面向對象程式設計_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;
}