结构体存储的有理数加减乘除

有理数的加减乘除运算

我们知道,有理数和无理数是两个相对的概念。我对有理数的理解即分数。当然这里的分母不能为0,要考虑排除这种情况。

首先定义一个结构体用于存储分子分母。

typedef struct
{
	int molecule;/* 分子 */
	int denominator;/* 分母 */
}ranumber;

然后我们看看题目的要求,有“加减乘除”这四则运算。加减函数很好写,如下。

ranumber add(ranumber a,ranumber b)     /* 加法函数 */
{
	ranumber c = {a.molecule*b.denominator + a.denominator*b.molecule,a.denominator*b.denominator};
	simple(c);
	return c;
}
ranumber minus(ranumber a,ranumber b)   /* 减法函数 */
{
	ranumber c = {a.molecule*b.denominator - a.denominator*b.molecule,a.denominator*b.denominator};
	simple(c);
	return c;
}

上面有一个simple函数用于化简。如下:

void simple(ranumber &c)/* 化简函数 */
{
	int d = reduction(c);
	c.molecule /= d;
	c.denominator /= d;
}

而在化简之前我们得先求分子分母的最大公约数,因此我们需要GCD(求最大公约数)函数。
我考虑了很多情况,分母小于0,分子小于0,分子分母同时小于0,都要将它们转化为正整数,因为求最大公约数只能对正整数进行操作。

int reduction(ranumber &c)/* 约分函数 */
{
	int temp;
	int a = c.denominator,b = c.molecule;/* a为分母,b为分子 */

	if(a < 0) a = -a;
	else if(b < 0) b = -b;
	else if(a < 0 && b < 0) 
	{
		a = -a;
		b = -b;
	}/* 求绝对值 */

	if(a < b) SWAP(a,b);
	while(b != 0)
	{
		temp = a % b;
		a = b;
		b = temp;
	}
	return a;/* 返回最大公约数 */
}

有了上面的铺垫,那么接下来的乘除法函数也很好写了:

ranumber multiple(ranumber a,ranumber b)  /* 乘法函数 */
{
	ranumber c = {a.molecule*b.molecule,a.denominator*b.denominator};
	simple(c);
	return c;
}
ranumber divide(ranumber a,ranumber b)  /* 除法函数 */
{
	ranumber c = {a.molecule*b.denominator,a.denominator*b.molecule};
	simple(c);
	return c;
}

你以为这样就结束了吗?不,没有,我们首先得告诉程序你要计算的两个分数分别是什么,因此我加了一个录入函数,也考虑了分子分母的正负数情况。

ranumber input(int a,int b) /* 录入函数 */
{
	if(b == 0)
	{
		a = 0;
		b = 1;
	}
	else if(b < 0)
	{
		a = -a;
	    b = -b;
	}
	ranumber temp = {a,b};
	simple(temp);
	return temp;
}

为了方便起见,我们可以借助一个输出函数,下面是我写的一个输出函数。

ranumber print(ranumber c)/* 输出函数 */
{
	int a = c.denominator,b = c.molecule;
	printf("%d%c%d",b,'/',a);
	return c;
}

第一次发表文章,可能有许多不足之处,还望大家见谅,这次主要就是想带大家分析题意,选择合适的函数,尽可能化简代码。

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C语言中,可以使用结构体来表示复数,并实现加减乘除运算。首先,我们可以定义一个结构体来表示复数,包括实部和虚部。例如: ```c typedef struct { double real; double imag; } Complex; ``` 接下来,我们可以实现复数的加减乘除运算。对于加法和减法,我们只需要将两个复数的实部和虚部分别相加减即可。对于乘法,根据公式(a+bi)(c+di)=ac-bd+(ad+bc)i,我们可以计算出乘积的实部和虚部。对于除法,根据公式(a+bi)/(c+di)=(ac+bd)/(cc+dd)+(bc-ad)/(cc+dd)i,我们可以计算出商的实部和虚部。 在实现过程中,需要注意输出格式,考虑虚部为复数和虚部为0的情况。可以使用switch语句由用户自己选择要进行的操作,并使用do...while循环实现多次运算。 参考资料: \[1\]思路: 1复数的表示:用结构体实现 2复数的加减法:实部虚部分别相加减 复数的乘法:(a+bi)(c+di)=ac-bd+(ad+cb)i 复数的除法:(a+bi)(c+di)=(ac+bd)(cc+dd)+(bc-ad)(cc+d*d) 考虑分母为0的情况 3注意输出格式,考虑虚部为复数和虚部为0的情况 4用switch语句由用户自己选择要进行的操作 5用do…while循环实现多次运算。 \[2\]这段代码用到了一个新的函数,就是 scanf。scanf 和 printf 的功能相反,printf 用来输出数据,scanf 用来读取数据。此处,scanf 会从控制台读取两个整数,并分别赋值给 a 和 b。关于 scanf 的具体用法,我们将在《C语言从键盘输入数据》一节中详细讲解,这里大家只要知道它的作用就可以了,不必求甚解。 \[3\]然而,编译器对这个错误一般无能为力,很多情况下,编译器在编译阶段根本无法计算出除数的值,不能进行有效预测,“除数为 0”这个错误只能等到程序运行后才能发现,而程序一旦在运行阶段出现任何错误,只能有一个结果,那就是崩溃,并被操作系统终止运行。 #### 引用[.reference_title] - *1* [复数的加减乘除C语言实现](https://blog.csdn.net/zf111212/article/details/120925457)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [C语言加减乘除运算](https://blog.csdn.net/weixin_42502860/article/details/114040925)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值