⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 program.c

📁 数据结构是编程的基础
💻 C
字号:
#include <stdio.h>

#include <stdlib.h>

#include "quotient.h"



//----- 有理数四则运算的实现 -----

Status QuotientInit(QuotientPtr &Q, int numerator, int denominator)

{

	if (denominator == 0) {	//合法性检查

	printf("Invalid denominator, it should be a non-zero integer.\n");

	return ERROR;

	}

	Q = (QuotientPtr)malloc(sizeof(Quotient)); 

	if (!Q) exit(OVERFLOW);	//存储分配失败

	Q->numerator = numerator;

	Q->denominator = denominator;



	QuotientReduction(Q);



	return OK;

}



Status QuotientDestroy(QuotientPtr &Q)

{

	if (Q) free(Q);		//合法性检查

	Q = NULL;



	return OK;

}



//得到分子

Status GetNumerator(QuotientPtr Q, int &numerator)

{

	if (!Q) return ERROR;



	numerator = Q->numerator;

	return OK;

}



//得到分母

Status GetDenominator(QuotientPtr Q, int &denominator)

{

	if (!Q) return ERROR;



	denominator = Q->denominator;

	return OK;

}



//有理数加法

Status QuotientAddition(QuotientPtr &Q, QuotientPtr Q1, QuotientPtr Q2)

{

	if (!Q || !Q1 || !Q2) return ERROR; //合法性检查

	Q->numerator = Q1->numerator * Q2->denominator + Q2->numerator * Q1->denominator;

	Q->denominator = Q1->denominator * Q2->denominator;



	QuotientReduction(Q);



	return OK;

}



//有理数减法

Status QuotientSubtraction(QuotientPtr &Q, QuotientPtr Q1, QuotientPtr Q2)

{

	if (!Q || !Q1 || !Q2) return ERROR; //合法性检查

	Q->numerator = Q1->numerator * Q2->denominator - Q2->numerator * Q1->denominator;

	Q->denominator = Q1->denominator * Q2->denominator;



	QuotientReduction(Q);



	return OK;

}



//有理数乘法

Status QuotientMultiplication(QuotientPtr &Q, QuotientPtr Q1, QuotientPtr Q2)

{

	if (!Q || !Q1 || !Q2) return ERROR; //合法性检查

	Q->numerator = Q1->numerator * Q2->numerator;

	Q->denominator = Q1->denominator * Q2->denominator;



	QuotientReduction(Q);



	return OK;

}



//有理数除法

Status QuotientDivision(QuotientPtr &Q, QuotientPtr Q1, QuotientPtr Q2)

{

	Quotient q;			// 避免在 Q = Q1 或 Q = Q2 的情形出错;



	if (!Q || !Q1 || !Q2) return ERROR; //合法性检查

	if (Q2->numerator == 0) {

	printf("Divide 0 error.\n");

	return ERROR;

	}



	q.numerator = Q1->numerator * Q2->denominator; //存放中间结果

	q.denominator = Q1->denominator * Q2->numerator; //存放中间结果

	Q->numerator = q.numerator;	

	Q->denominator = q.denominator;



	QuotientReduction(Q);



	return OK;

}



//有理数的约分及化简

Status QuotientReduction(QuotientPtr &Q)

{

	int gcd;



	if (!Q) return ERROR;		//合法性检查

	gcd = FindGCD(Q->numerator, Q->denominator); //求分子、分母的最大公因子

	Q->numerator = Q->numerator / gcd;

	Q->denominator = Q->denominator / gcd;



	//assure that the denominator always is positive.

	if( Q->denominator<0 )

	{

		Q->numerator = -(Q->numerator);

		Q->denominator = -(Q->denominator);

	}



	return OK;

}



//求最大公约数

int FindGCD(int m, int n)

{

	int r;

	r = m % n;

	m = m / n;

	while(r)

	{

	  m = n;

	  n = r;

	  r = m % n;

	}



	return n;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -