天天看点

面向对象程序设计_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;
}