天天看點

面向對象程式設計_04_分數類面向對象程式設計_04_分數類

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