📄 program.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 + -