编辑一个c语言程序,定义一个表示分数的结构体类型,并求两个分数相加之和

来源:学生作业帮助网 编辑:作业帮 时间:2024/11/07 16:43:06

编辑一个c语言程序,定义一个表示分数的结构体类型,并求两个分数相加之和
编辑一个c语言程序,定义一个表示分数的结构体类型,并求两个分数相加之和

编辑一个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语言程序,求n个整数的和(n是任意的整数). 求矩阵三阶矩阵主副对角线和的C语言程序编辑,要求只要一个for循环 C语言编辑一个程序.要求在屏幕上显示一个图形时钟(用程序绘制一个与时钟样式相似即可),时间与系统时间 求c语言程序:用一个函数求N个数的最大值和最小值.用一个函数 来定义! 在C程序的函数中可以定义另外一个函数吗?二级C语言的题 数据结构定义一个栈并实现入栈和出栈操作的程序c语言完整版 以下叙述中正确的是( )A C语言程序总是从第一个定义的函数开始执行 B 在C语言程序中,要调用的函数必须在main函数中定义C C语言程序总是从main函数开始执行 D C语言程序中的main函数必须放 求一个幻方的C语言程序.C C语言程序:请定义一个表示向量(即一个整数系列)的结构体,并编写一个模块化的程序来完成以下任务(a)创建一个向量.(b)修改给定元素的值;(c)乘以一个比例值;(d)按如下形式显示向量(10,20,3 下面这两句话错在哪,为什么?1.c语言程序总是从第一个定义的函数开始执行2.在c语言程序中,要调用的函数必须在main()函数中定义 C语言,编辑一个函数fun统计给定数组中奇数和偶数的个数 怎样用C语言编辑一个判断可以同时被3和5整除的数? 编辑C语言程序,使a,b,c三个数按从小到大的顺序输出 求一个C语言程序:交换三个数的值. 用c语言编写一个求三角形面积的程序 C语言中,定义了一个数组,例如 int a[3]={1,2,3},在之后的程序中该如何描述这个数组整体?直接写a[3]好像是超标的写法,并不是表示数组整体. C语言里如果要输出一个带有双引号的程序,应该在printf()里怎样表示?