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

2023-11-16

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

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

要求

  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;     
        } 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构:设计实现抽象数据类型“有理数”内容 的相关文章

  • 软件工程:(四)概要设计

    一 定义 概要设计是一个设计师根据用户交互过程和用户需求来形成交互框架和视觉框架的过程 其结果往往以反映交互控件布置 界面元素分组以及界面整体板式的页面框架图的形式来呈现 这是一个在用户研究和设计之间架起桥梁 使用户研究和设计无缝结合 将对
  • KNN实现手写数字识别

    其他实现手写数字识别的方法 1 聚类 K means 实现手写数字识别 2 卷积神经网络 CNN 实现手写数字识别 3 全连接神经网络实现手写数字识别 4 聚类 K means 实现手写数字识别 2 实验数据是老师收集了所有人的手写数字图片
  • jeesite快速开发平台(一)----简介

    以下内容来自官网 一 平台简介 JeeSite是基于多个优秀的开源项目 高度整合封装而成的高效 高性能 强安全性的开源Java EE快速开发平台 JeeSite是您快速完成项目的最佳基础平台解决方案 JeeSite是您想学习Java平台的最

随机推荐

  • 寄存器的基本原理

    参考大神博客 https blog csdn net qq 37340753 article details 80935423 https blog csdn net u012493828 article details 53439226
  • kali工具的使用

    一 netcat简介与使用 nc的全称为NetCat 它能够建立并接受传输控制协议 TCP 和用户数据报协议 UDP 的连接 Netcat可在这些连接上读写数据 直到连接关闭为止 它可以通过手工或者脚本与应用层的网络应用程序或服务进行交互
  • openblas 第二弹: openblas Android版调用和编译

    1 编译 如果需要在Android下使用openblas 则需要编译Android版本的openblas a文件进行调用 1 openblas的编译时主要参考链接 参考链接一 参考链接二 具体细节太久了 已经忘了 下面是编译好的时候的环境变
  • Linux中普通用户和ROOT用户对Java JDK的配置

    Linux中对对各种工具文件不需要想Windows中似的 还要先一步一步的安装 有的还需要配置环境变量 比如Windows对Java的安装过程 在Linux中 使用指令 tar zxvf 文件名 注意空格 解压完 tar gz 文件 或使用
  • Spring事务实现原理

    Spring事务的原理是基于AOP实现的 所以流程也可以理解为与AOP一样分为3步 解析切面 织入通知和运行时增强 1 解析切面 Srping事务的是通过 EnableTransactionManagement注解开启的 该注解往IoC容器
  • 【逆向】使用CE查找Android中变量的偏移

    0x00 准备工作下载Cheat Engine以及调试器服务端 https www cheatengine org index php 夜神模拟器 https www yeshen com 下载安装贪婪洞窟 梦境模式 http a 4399
  • 【华为OD机试】路灯照明问题 (C++ Python Java)2023 B卷

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 题目描述 在一条笔直的公路上安装了N个路灯 从位置0开始安装 路灯之间间距固定为100米 每个路灯都有
  • oracle修改块大小设置,oracle性能调整(1)

    1调整数据库服务器的性能Oracle数据库服务器是整个系统的核心 它的性能高低直接影响整个系统的性能 为了调整Oracle数据库服务器的性能 主要从以下几个方面考虑 1 1Oracle 调整操作系统以适合Oracle数据库服务器运行数据库服
  • 利用PicGo+Gitee配置图床

    引言 配置图床 方便我们的使用 比如 我们利用typora写的笔记 直接把发送给别人也可以正常使用 不再会有由于本地图片 而加载不出来图片的情况 此外 图片文件遗失亦可以正常加载出来 因为图片已上传 这里已 Typora Gitee Pic
  • java String(一)—— Java中的String类型

    一 需要理解的代码 import java lang reflect Array import java util ArrayList import java util Arrays import java util HashMap imp
  • DNS服务器正向/反向解析配置

    第四次作业 题目 配置DNS正反向解析 一 正向解析 1 装包 2 配置服务 3 配置服务器 4 测试 1 yum install bind y 2 vim etc named conf 监听53号端口 访问的是本机ip 129 168 2
  • c++命名空间

    命名空间 主要解决全局变量的冲突 内部不允许私有变量 所有变量都是公有的 namespace data int x 10 data x 为域作用符 直接使用等同于使用全局变量 不存在就是0 不包含匿名命名空间内变量 同一个文件引用stati
  • 相见恨晚的办公插件合集(二)

    之前有分享过一些办公的插件 如不坑盒子 打工人插件 易用宝等 下面就简单的介绍一下上面的几个神器后再补充一些其它办公神器吧 不坑盒子 word wps 这是一个非常好用的插件工具 专门应用在Word文档和wps 支持Office 2010以
  • 拓数派入选中国信通院 “铸基计划”「高质量数字化转型产品及服务全景图」

    7 月 27 日 由中国信息通信研究院 以下简称 中国信通院 主办的 2023 数字生态发展大会 暨中国信通院 铸基计划 年中会议在京召开 本次大会深度展示了中国信通院在数字化领域的工作成果 并正式发布了 高质量数字化转型产品及服务全景图
  • GUI基础知识

    GUI编程 1 简介 图形用户界面 Graphical User Interface 又称图形用户接口 是指采用图形方式显示的计算机操作用户界面 GUI的核心技术 AWT Swing 2 Awt 2 1 AWT简介 AWT Abstract
  • springboot报错Could not autowire. No beans of ‘RedisConnectionFactory‘ type found

    这个报错提示是因为springboot升级到2 6 9以后版本就会出现 报错界面 其实上面报错不影响程序使用 但是总是觉得别扭 提供3种解决方式 第一种方案 springboot版本降到2 6 9或以下 第二种方案 通过idea设置不提示该
  • Unity&Webform(2):自定义LifetimeManager和TypeConverter使Unity从HttpContext中取值注入WebForm页面...

    上一篇 Unity WebForm 1 自定义IHttpHandlerFactory使用Unity对ASP NET Webform页面进行依赖注入中让Unity和WebForm结合在一起 通过使用HttpHandlerFactory实现了对
  • 模式匹配算法

    下面分别介绍 朴素模式匹配算法 和 改进模式匹配算法 KMP 朴素模式匹配算法思想 从目标S中的第一个字符开始和模式T中的的第一个比较 用 i 和 j 分别指示S串和T串中正在比较字符的位置 若相等 则继续逐个比较后续字符 否则 从S 的第
  • 【PYTHON】conda/pip一些命令记录

    查看环境 conda info env conda env list 删除某环境 conda remove n
  • 数据结构:设计实现抽象数据类型“有理数”内容

    题目 设计实现抽象数据类型 有理数 内容 设计并上机实现抽象数据类型 有理数 有理数的基本操作包括 两个有理数的加 减 乘 除等 包括有理数的创建和输出 要求 有理数的类型 我们可以构造成一个结构体类型 这个结构体由两个整数构成 分别表示有