我了个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语言程序,定义一个表示分数的结构体类型,并求两个分数相加之...
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.d...
c语言怎么编写一个文本型求和的程序?
1、第一首先打开c语言编辑项目软件。再创建项目。2、然后创建结构体。再设置结构体的两个数据域。3、然后创建一个函数。再创建结构体数组,添加到函数。4、然后定义三个变量i,j,sum。再用i变量进行循环。5、然后用scanf语句进行输入。再用结构体数组进行接收。6、第六然后打开指定文件。再用fwrite语...
C语言:分数的计算
=y.s){if(x.s == 1) {y.s = 1;return Sub(x, y);}else{x.s = 1;return Sub(y, x);}}r.s = x.
求助c语言代码
首先,我们需要定义一个结构体来存储学生的成绩信息,然后创建一个二维数组来存储20个班的40名学生的5门课程的成绩。接着,我们需要编写一个函数来生成随机成绩,并计算每个班、每门课程的平均分。最后,我们需要对平均分进行排序并输出结果。include <stdio.h> include <stdlib.h> include \/\/ 定义...
C语言程序 用结构体编写一个程序,实现输入两个数,求出平均数
include<stdio.h>typedef struct stt{ float num;}STT;int main( ){ STT stt1,stt2; scanf("%f%f",&stt1.num,&stt2.num); printf("平均值:%f\\n",(stt1.num+stt2.num)\/2); return 0;}
c语言编程两个整数相加
C语言代码如下:include<stdio.h> int main(){ int a,b;printf("please enter two number:"); ---两个数字用空格隔开,以回车键结束输入。scanf("%d %d",&a,&b);if(a>b)printf("The max is %d",a);else if(b>a)printf("The max is %d",b);else printf("The two Numbers...
c语言,设计一个学生结构体,输入三个成绩并求成绩最大值
这就是最基本的结构体操作。include<stdio.h>typedef struct s{ char name[32]; int score;}student;int main(void){ student a,b,c; int max; scanf("%s%d", a.name, &a.score); scanf("%s%d", b.name, &b.score); scanf("%s%d", c.name, &c.score); ...
分数加法计算问题的c语言程序
你可以用结构体来做,用两个整数,分别存储分子和分母。加减法就是通分,加减,再化简。就可以了 找一个求两个整数最大公约数的,就可以化简了。
C语言程序编程题,求大神帮帮忙
{ int id;char name[11];int a,b,c;} t,st[5];int i,j;FILE *fp1,*fp2;if((fp1=fopen("d:\\\\stud.dat","r"))==NULL){ printf("f1 open error!\\n");return 1;} if((fp2=fopen("d:\\\\studsort.dat","w"))==NULL){ printf("f2 open error!\\n");return 2;} for(...
C语言作业编写一个程序输入学生分数,统计及格人数和算平均分
include<stdio.h>#include <stdlib.h>typedef struct list{ char number[10]; float mark;}COUNT;int main(){ COUNT aa[100]; int i; int count =0; float sum=0; for(i=1;i<=10;i++) { scanf("%s",aa[i].number); scanf("%g",&aa[i].mark)...