数据结构:设计实现抽象数据类型“有理数”内容

题目:设计实现抽象数据类型“有理数”

内容:设计并上机实现抽象数据类型“有理数”,有理数的基本操作包括:两个有理数的加、减、乘、除等(包括有理数的创建和输出)。

要求

  1. 有理数的类型,我们可以构造成一个结构体类型,这个结构体由两个整数构成,分别表示有理数的分子和分母。  //int fz; int fm;
  2. 在初始化或创建一个有理数时,可以给出有理数的分子和分母来创建一个有理数;也可以给出一个小数形式的有理数,来计算对应的分子分母来创建一个有理数(可设置一个允许的计算误差)。
  3. 以分数形式创建有理数时,要处理分母为零的异常情况。
  4. 输出不能有类似于4/4、3/6这样的结果数据。
  5. 要有能根据用户输入选择不同运算的菜单选择界面。

#include<stdio.h>
#include<math.h>
struct fraction{
    int molecule;
    int denominator;
}f[2];
int reduction(int m,int n){
    int max,min,i,largest_reduction=1;
    if(m<0)m=abs(m);
    if(n<0)n=abs(n);
    if(m>=n){
        max=m,min=n;
    }
    else{
        max=n,min=m;
    
    }
    for(i=2;i<=min;i++){
        if(max%i==0&&min%i==0){
            max/=i;
            min/=i;
            largest_reduction*=i;
            i=1;
        }
    }
    return largest_reduction;
}


int decimal(float n){
    int time=0;
    while(n-int(n)!=0){
        time++;
        n*=10;
    }
    return time;
}

int bigger(int time,float n){
    int i;
    for(i=0;i<time;i++){
        n*=10;
    }
    return n; 
} 

void print(int n,int m){
    if(n==0){
        printf("0\n");
    }
    else{
        if(abs(n)==abs(m)){
            if(m!=n){
                printf("-1\n");
            }
            else{
                printf("1\n");
            }
        }
        else{
            printf("%d/%d\n",n,m);
        }
        
    }
}
int main(int argc,char*argv[])
{ 
    struct fraction f[2];
    int choose,work=0,i,j,k=0;
    float molecule[2]={0},denominator[2]={1,1};
    int mol,den;
    for(i=0;i<2;i++){ 
    printf("***********************************\n");
    printf("*            菜单                 *\n");
    printf("* 1:输入一个分数                  *\n"); 
    printf("* 2:输入一个小数                  *\n");
    printf("***********************************\n");
    printf("输入想要进行操作的序号:"); 
    scanf("%d",&choose);
    
    if(choose==1){
        printf("输入分子和分母(空格隔开):\n"); 
        scanf("%d %d",&f[i].molecule,&f[i].denominator);
        while(f[k].denominator==0){
            printf("分母不合法!请重新输入分母:");
            scanf("%d",&f[i].denominator); 
            }
        
        }
    
    else if(choose==2){
        printf("输入小数:\n");
        scanf("%f",&molecule[i]);
            f[i].molecule=bigger(decimal(molecule[i]),molecule[i]);
            f[i].denominator=bigger(decimal(molecule[i]),1);
            
    }
    else{
        printf("无效的操作!请重新输入:");
        i--;
        }
    }
    
   for(i=0;i<1;i++){
        printf("*******************************\n");
        printf("*            菜单             *\n");
        printf("* 1:加法            2:减法    *\n"); 
        printf("* 3:乘法            4:除法    *\n");
        printf("* 5:结束                      *\n");
        printf("*******************************\n");
        printf("输入想要进行操作的序号:"); 
        scanf("%d",&choose);
        if(choose==1){
                    mol=f[0].molecule*f[1].denominator+f[1].molecule*f[0].denominator;
                    den=f[1].denominator*f[0].denominator;
                    printf("%d/%d + %d/%d=",f[0].molecule,f[0].denominator,f[1].molecule,f[1].denominator);
                    print(mol/reduction(mol,den),den/reduction(mol,den));
                    i--;
                }
                
                else if(choose==2){
                    mol=f[0].molecule*f[1].denominator-f[1].molecule*f[0].denominator;
                    den=f[1].denominator*f[0].denominator;
                    printf("%d/%d - %d/%d=",f[0].molecule,f[0].denominator,f[1].molecule,f[1].denominator);
                    print(mol/reduction(mol,den),den/reduction(mol,den));
                    i--;
                }
                
                else if(choose==3){
                    mol=f[0].molecule*f[1].molecule;
                    den=f[1].denominator*f[0].denominator;
                    printf("%d/%d * %d/%d=",f[0].molecule,f[0].denominator,f[1].molecule,f[1].denominator);
                    print(mol/reduction(mol,den),den/reduction(mol,den));
                    i--;
                }
                
                else if(choose==4){
                    mol=f[0].molecule*f[1].denominator;
                    den=f[1].molecule*f[0].denominator;
                    printf("%d/%d / %d/%d=",f[0].molecule,f[0].denominator,f[1].molecule,f[1].denominator);
                    print(mol/reduction(mol,den),den/reduction(mol,den));
                    i--;
                }
                
                else if(choose==5){
                    return 0;
                }
                
                else{
                    printf("无效的操作!请重新输入:");
                    i--;
                }
            }
            return 0;     
        } 

  • 5
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淬炼之火

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值