有理数类型 - 1. 创建项目
有理数类型 - 2. 有理数标准化
有理数类型 - 3. 有理数的设置
有理数类型 - 4. 有理数的读取
有理数类型 - 5. 有理数的输入
有理数类型 - 6. 有理数的输出
有理数类型 - 7. 有理数的加法
有理数类型 - 8. 有理数的减法
有理数类型 - 9. 有理数的乘法
有理数类型 - 10. 有理数的除法
有理数类型 - 11. 有理数的比较
有理数类型 - 12. 交换有理数
有理数类型 - 13. 综合应用(主菜单)
Fraction.c 文件源码如下
#include
#include
#include "Fraction.h"
// 有理数标准化
void Reduct(FRACTION *fraction)
{
int i,k=0;
if(fraction->num == 0)
{
fraction->den = 1;
}
else
{
if((fraction->den < 0 && fraction->num > 0) || (fraction->num < 0 && fraction->den > 0))
{
k = 1;
}
fraction->num = abs(fraction->num);
fraction->den = abs(fraction->den);
i = Gcd(fraction->num, fraction->den);
fraction->num /= i;
fraction->den /= i;
if(k)
{
fraction->num = -fraction->num;
}
}
}
// 设置有理数
void FractionSet(FRACTION *fraction, int num, int den)
{
if(den == 0)
{
printf("Divided by zero!\n");
}
else
{
fraction->num = num;
fraction->den = den;
Reduct(fraction);
}
}
// 读取有理数
void FractionGet(const FRACTION *fraction, int *num, int *den)
{
*num = fraction->num;
*den = fraction->den;
}
// 输入有理数(基础版)
void FractionInput(FRACTION *fraction)
{
int num,den;
scanf("%d/%d",&num,&den);
if(den == 0)
{
printf("Divided by zero!\n");
fraction->num = 0;
fraction->den = 1;
}
else
{
fraction->num = num;
fraction->den = den;
Reduct(fraction);
}
}
// 输出有理数
void FractionOutput(const FRACTION *fraction)
{
printf("%d/%d",fraction->num,fraction->den);
}
// 有理数加法
FRACTION FractionAdd(const FRACTION *x, const FRACTION *y)
{
FRACTION r;
int a;
a = Lcm(x->den,y->den);
r.den = a;
r.num = (a/x->den)*x->num + (a/y->den)*y->num;
Reduct(&r);
return r;
}
// 有理数减法
FRACTION FractionSub(const FRACTION *x, const FRACTION *y)
{
FRACTION r;
int a;
a = Lcm(x->den,y->den);
r.den = a;
r.num = (a/x->den)*x->num - (a/y->den)*y->num;
Reduct(&r);
return r;
}
// 有理数乘法
FRACTION FractionMul(const FRACTION *x, const FRACTION *y)
{
FRACTION z;
int a,b;
a=Gcd(x->num,y->den);
b=Gcd(x->den,y->num);
z.num = (x->num/a) * (y->num/b);
z.den = (x->den/b) * (y->den/a);
Reduct(&z);
return z;
}
// 有理数除法
FRACTION FractionDiv(const FRACTION *x, const FRACTION *y)
{
FRACTION r;
int a,b;
if(y->num==0)
{
printf("Divided by zero!\n");
r.num = 0;
r.den = 1;
return r;
}
else
{
a = Gcd(x->num,y->num);
b = Gcd(x->den,y->den);
r.num = (x->num/a)*(y->den/b);
r.den = (x->den/b)*(y->num/a);
Reduct(&r);
return r;
}
}
// 判断大于
int FractionGt(const FRACTION *x, const FRACTION *y)
{
FRACTION r;
r = FractionSub(x,y);
return r.num > 0;
}
// 判断大于等于
int FractionGe(const FRACTION *x, const FRACTION *y)
{
FRACTION r;
r = FractionSub(x,y);
return r.num >= 0;
}
// 判断小于
int FractionLt(const FRACTION *x, const FRACTION *y)
{
FRACTION r;
r = FractionSub(x,y);
return r.num < 0;
}
// 判断小于等于
int FractionLe(const FRACTION *x, const FRACTION *y)
{
FRACTION r;
r = FractionSub(x,y);
return r.num <= 0;
}
// 判断等于
int FractionEq(const FRACTION *x, const FRACTION *y)
{
FRACTION r;
r = FractionSub(x,y);
return r.num == 0;
}
// 判断不等于
int FractionNe(const FRACTION *x, const FRACTION *y)
{
FRACTION r;
r = FractionSub(x,y);
return r.num != 0;
}
// 交换有理数
void FractionSwap(FRACTION *x, FRACTION *y)
{
IntSwap(&x->num , &y->num);
IntSwap(&x->den , &y->den);
}
Fraction.h 文件源码如下
#ifndef _Fraction_h_
#define _Fraction_h_
#include "Integer.h"
// 定义有理数类型
typedef struct
{
// 分子, 分母
int num, den;
} FRACTION;
// 有理数标准化
void Reduct(FRACTION *fraction);
// 设置有理数
void FractionSet(FRACTION *fraction, int num, int den);
// 读取有理数
void FractionGet(const FRACTION *fraction, int *num, int *den);
// 输入有理数(基础版)
void FractionInput(FRACTION *fraction);
// 输出有理数
void FractionOutput(const FRACTION *fraction);
// 有理数加法
FRACTION FractionAdd(const FRACTION *x, const FRACTION *y);
// 有理数减法
FRACTION FractionSub(const FRACTION *x, const FRACTION *y);
// 有理数乘法
FRACTION FractionMul(const FRACTION *x, const FRACTION *y);
// 有理数除法
FRACTION FractionDiv(const FRACTION *x, const FRACTION *y);
// 判断大于
int FractionGt(const FRACTION *x, const FRACTION *y);
// 判断大于等于
int FractionGe(const FRACTION *x, const FRACTION *y);
// 判断小于
int FractionLt(const FRACTION *x, const FRACTION *y);
// 判断小于等于
int FractionLe(const FRACTION *x, const FRACTION *y);
// 判断等于
int FractionEq(const FRACTION *x, const FRACTION *y);
// 判断不等于
int FractionNe(const FRACTION *x, const FRACTION *y);
// 交换有理数
void FractionSwap(FRACTION *x, FRACTION *y);
#endif
涉及到部分函数参见整数类型!
综合应用(主菜单)
运行效果如下:
Add Sub Mul Div Quit > T
Incorrect choice!
Add Sub Mul Div Quit > a
2669/654 -3361/822
-116/14933
Add Sub Mul Div Quit > S
2371/1788 1963/2220
12179/27565
Add Sub Mul Div Quit > m
20397/24899 -21991/22956
-149516809/190527148
Add Sub Mul Div Quit > d
-9019/86784 -18497/2063
18606197/1605243648
Add Sub Mul Div Quit > D
3828099/28150511 0/1812157781
Divided by zero!
Add Sub Mul Div Quit > Q
功能要求:
#include
#include "Fraction.h"
int main()
{
int ok = 1;
char c;
FRACTION a, b, z;
while (ok)
{
printf("Add Sub Mul Div Quit > ");
scanf("%c", &c);
switch (c)
{
case 'A':
case 'a':
FractionInput(&a);
FractionInput(&b);
z = FractionAdd(&a, &b);
FractionOutput(&z);
putchar('\n');
break;
case 'S':
case 's':
FractionInput(&a);
FractionInput(&b);
z = FractionSub(&a, &b);
FractionOutput(&z);
putchar('\n');
break;
case 'M':
case 'm':
FractionInput(&a);
FractionInput(&b);
z = FractionMul(&a, &b);
FractionOutput(&z);
putchar('\n');
break;
case 'D':
case 'd':
FractionInput(&a);
FractionInput(&b);
if (b.num)
{
z = FractionDiv(&a, &b);
FractionOutput(&z);
}
else
{
printf("Divided by zero!");
}
putchar('\n');
break;
case 'Q':
case 'q':
ok = 0;
break;
default :
puts("Incorrect choice!");
break;
}
scanf("%*c");
}
return 0;
}
欢迎指教!