编辑一个c语言程序,定义一个表示分数的结构体类型,并求两个分数相加之和
来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/14 21:21:59
编辑一个c语言程序,定义一个表示分数的结构体类型,并求两个分数相加之和
我了个CAO,还真没想到全功能版本会这么多内容……已编译运行通过.已经实现了绝大部分内容,包括自动识别正负数,可以直接输入整数而不是分数,会把整数转换为分数来计算,同样,如果得数正好是整数的,也会输出为整数样式.会自动约分到最简模式,可以说只差以下几点就能算彻底完成了:1、当分母为0时,自动转化显示为无限大,但是在和的无限大的正负符号上,做了几回都没得出正确结果,所以暂时恒定为正了(输入的分数已经可以判断正负号了).2、本来想做分母上带符号也能正常显示负数的符号,就就是说“3/-5“会自动识别为“-3/5”的功能,结果没出效果……可能是scanf的限制吧,考虑到不合平常使用习惯,所以没继续做.3、要不要显示时自动分号对齐?似乎没必要吧.加一运行效果图片:#include<stdio.h>#include<string.h>#include<stdlib.h>typedef struct{ //分数数型 unsigned int denominator; //分母 unsigned int numerator; //分子 unsigned int negative; //正负号,0为正号,1为负号} fraction;fraction fraction_Get(int x1,int x2) { //由分子分母生成分数 fraction x; if(x1<0) { //判断正负和提取分子 x.negative=1; x.numerator=0-x1; } else x.numerator=x1; if(x2<0) { //判断正负和提取分母 x.negative=(x.negative==0)?1:0; x.denominator=0-x2; } else x.denominator=x2; return x;}void fraction_Show(fraction x) { //分数显示 if(x.negative==1) printf("-"); else printf(" "); if(x.denominator==0) { //如果分母是0,显示无限大 printf("∞"); } else { printf("%d",x.numerator); if(x.denominator>=2) printf("/%d",x.denominator); }}fraction fraction_reduction(fraction x) { //分数约分 int i,j; //循环控制和临时变量 int x_d,x_n; fraction y; //定义得数储存属性 x_d=x.denominator; //取得分数x的分母和分子 x_n=x.numerator; if(x_d==0||x_n==1) //分母为0或分子为0/1时不约分 return x; if(x_n==0) { //如果分子是0,则分母为1,返回 x.denominator=1; return x; } for(i=1;i<=(x_d<x_n?x_d:x_n);i++) //求分子分母最大公约数 if(x_d%i==0&&x_n%i==0) j=i; x_d/=j; //约分 x_n/=j; y.denominator=x_d; //结果复制到y y.numerator=x_n; y.negative=x.negative; //正负号不变 return y;}fraction fraction_Add(fraction x,fraction y) { //分数相加 int x_d,x_n,y_d,y_n; //x、y两分数的分母和分子 fraction z; //定义得数储存属性 int z_d,z_n; //定义得数的分母和分子 x_d=x.denominator; //取得分数x、y的分母和分子 x_n=x.numerator; y_d=y.denominator; y_n=y.numerator; if(x_d==0||y_d==0) { //为分母为0的情况单独计算 z.denominator=0; z.negative=0; z.numerator=1; return z; } if(x.negative==1) x_n=0-x_n; //将正负号添加到分子中 if(y.negative==1) y_n=0-y_n; z_d=x_d*y_d; //求得数分母 z_n=x_n*y_d+y_n*x_d; //求得数分子 if (z_n<0) { //判断得出分数的正负 z_n=0-z_n; z.negative=1; } else z.negative=0; z.denominator=z_d; //复制得数分母分子到分数z z.numerator=z_n; z=fraction_reduction(z); //调用函数约分 return z;}void main() { fraction x,y,z; int x1,x2,y1,y2; x2=y2=1; printf("请输入 x:"); //获取分数x,由键盘输入 scanf("%d/%d",&x1,&x2); //用“/”表示分号 x=fraction_Get(x1,x2); printf("请输入 y:"); //获取分数x,由键盘输入 scanf("%d/%d",&y1,&y2); //用“/”表示分号 y=fraction_Get(y1,y2); printf("输入的 x= "); //计算和输出 fraction_Show(x); printf("\n约分后 x= "); x=fraction_reduction(x); fraction_Show(x); printf("\n"); printf("输入的 y= "); fraction_Show(y); printf("\n约分后 y= "); y=fraction_reduction(y); fraction_Show(y); printf("\n"); z=fraction_Add(x,y); printf("计算 x+y= "); fraction_Show(z); printf("\n");}
编辑一个c语言程序,定义一个表示分数的结构体类型,并求两个分数相加之和
C语言程序:请定义一个表示向量(即一个整数系列)的结构体,并编写一个模块化的程序来完成以下任务
C语言 定义一个能够表示复数的结构类型,一个复数包括实数与虚数两个部分
C语言编程:输出满足“一个偶数总能表示为两个素数之和.”的数,自己定义一个范围.
C语言 定义一个复数结构,求两个复数的和与积
编写一个c语言程序 求两个整数的最大公约数
C语言编写程序 求一个整数各位数字之和.
C语言有一个数列 C程序 有一个分数数列2\1 ,3\2 ,4\3 ,5\4 ,6\5 ,7\6..用编程求前二十项之和
C语言编辑 任意输入一个偶数,请将它分解为两个素数之和.
定义一个分数类fraction,重载运算符+,-,x,使之能用于分数的加减乘,编写程序,实现两个分数的和差积
接收一个四位整.编写一个程序,将该数的每一位数字相加并显示结果.(C语言)
编辑一个C语言程序,求n个整数的和(n是任意的整数).