C语言项目 - 有理数类型

有理数类型 - 1. 创建项目

有理数类型 - 2. 有理数标准化

有理数类型 - 3. 有理数的设置

有理数类型 - 4. 有理数的读取

有理数类型 - 5. 有理数的输入

有理数类型 - 6. 有理数的输出

有理数类型 - 7. 有理数的加法

有理数类型 - 8. 有理数的减法

有理数类型 - 9. 有理数的乘法

有理数类型 - 10. 有理数的除法

有理数类型 - 11. 有理数的比较

有理数类型 - 12. 交换有理数

有理数类型 - 13. 综合应用(主菜单)

Fraction.c 文件源码如下

#include <stdio.h>
#include <stdlib.h>
#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

功能要求:

  • 若用户输入A或a,则输入两个有理数,然后计算并输出两个有理数的和;
  • 若用户输入S或s,则输入两个有理数,然后计算并输出两个有理数的差;
  • 若用户输入M或m,则输入两个有理数,然后计算并输出两个有理数的积;
  • 若用户输入D或d,则输入两个有理数,然后判断第二个有理数是否为零。若第二个有理数不为零,则计算并输出两个有理数的商,否则报告错误;
  • 若用户输入Q或q,则退出主菜单,程序结束;
  • 若用户输入其它字符,则报告错误;
  • 程序反复显示主菜单,供用户反复使用,直到用户选择Q或q为止。
#include <stdio.h>
#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;
 }

欢迎指教!

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值