困难:2

描写叙述 编写一个C程序,实现两个分数的加减法

输入 输入包括多行数据

每行数据是一个字符串,格式是"a/boc/d"。

当中a, b, c, d是一个0-9的整数。o是运算符"+"或者"-"。


数据以EOF结束

输入数据保证合法 输出 对于输入数据的每一行输出两个分数的运算结果。

注意结果应符合书写习惯。没有多余的符号、分子、分母,而且化简至最简分数 例子输入

1/8+3/8
1/4-1/2
1/3-1/3

例子输出

1/2
-1/4
0
解题思路:
求分数加减法应该注意下面几个问题:
1.分母同样,将分子直接相加,若分母不同,先通分,再将分子分母相加。
2.若分子为零。则加减之后的值为0。
3.若分子是分母的N倍,则结果为一。
4.若分子分母不是最简,先将分子分母化简再输出结果。
仅仅要将以上几个点划分来做,就能实现将分数相加减。另外须要注意的是。应该尽量使用自己定义函数,这样代码的调理比較清晰。而且主函数不会显得杂乱无章。
程序代码:
#include<stdio.h>
void funs(int *a,int *b,char *o,int *c,int *d,int *fz,int *fm);
void fun(int *a,int *b);
int main()
{
int fz,fm,a,b,c,d;
char o;
while(scanf("%d/%d%c%d/%d",&a,&b,&o,&c,&d)!=EOF)
{
funs(&a,&b,&o,&c,&d,&fz,&fm);
fun(&fz,&fm);
// printf("fz = %d,fm = %d\n",fz,fm);
if(fz==0)
printf("0\n");
else if(fz%fm==0)
printf("%d\n",fz/fm);
else
printf("%d/%d\n",fz,fm);
}
return 0;
}
void funs(int *a,int *b,char *o,int *c,int *d,int *fz,int *fm)//求出分子和分母
{
switch(*o){
case'+':
{
if((*b)==(*d)){
(*fz) = *a + *c;
(*fm) = *d;
}
else
{
(*fz)=*a * *d + *c * *b;
(*fm)=*b * *d;
}
break;

}
case'-':
{
if(*b==*d){
(*fz) = *a - *c;
(*fm) = *b;
}
else
{
(*fz)=*a * *d - *c * *b;
(*fm)=*b * *d;
}
break;
}
}
}
void fun(int *a,int *b)//分子和分母的简化
{
int k=(*a),i;
if(k<0)
k=-k;
for(i=2;i<=k;i++)
{
while((*a%i==0)&&(*b%i==0)){
(*a)/=i;
(*b)/=i;
}
}
}