翎未眠 2023-04-02 11:20 采纳率: 50%
浏览 13

抽象数据类型-分数四则运算

抽象数据类型-分数四则运算

怎么解决结果为负数的数进行约分(第二个减法有问题)

main.cpp
#include <stdio.h>
#include "Fraction.h"

int main()
{

    Fraction op1, op2, res;
    int type=0;

    printf("请输入第一个分数:");
    scanf("%d/%d",&op1.z,&op1.m);
    while(op1.m==0)
    {
        printf("分母不能为0,请重新输入第一个分数的分母:");
        scanf("%d",&op1.m);
    }

    printf("\n");

    printf("请输入第二个分数:");
    scanf("%d/%d",&op2.z,&op2.m);
    while(op2.m==0)
    {
        printf("分母不能为0,请重新输入第二个分数的分母:");
        scanf("%d",&op2.m);
    }

    printf("\n");

    while(1)
    {
        printf("请选择你想执行的操作(1--add, 2--sub, 3--mul, 4--except, 5--point, 6--exit):\n");
        scanf("%d",&type);
        if(type==6)
            break;
        else
        {
            switch(type)
            {
                case 1:
                    res=add(op1,op2);
                    point(res);
                    prt(res);
                    break;
                case 2:
                    res=sub(op1,op2);
                    point(res);            //这里的约分只能当结果为正数的时候成立,否则无法约分 
                    prt(res);    
                    break;
                case 3:
                    res=multi(op1,op2);
                    point(res);
                    prt(res);
                    break;
                case 4:
                    res=except(op1,op2);
                    point(res);
                    prt(res);
                    break;
                case 5:
                    point(op1);//假设是对op1进行约分
                    prt(op1);
                    point(op2);//假设是对op2进行约分
                    prt(op2);
                    break;
            }            
        }
    }
    return 0;
}

Fraction.h
#include <stdio.h>
typedef struct{
    int z;//分子 
     int m;//分母 
}Fraction;

Fraction add(Fraction x,Fraction y){
    Fraction c;
    if(x.m != 0 && y.m != 0)
    { 
          c.z = x.z * y.m + y.z * x.m;
          c.m = x.m * y.m;
      //return c;  这条语句写在if里面的话,只有if条件满足的时候函数
      //才有返回值
    }
    return c;

}

Fraction sub(Fraction x,Fraction y){
    Fraction c;
    if(x.m != 0 && y.m != 0)
    {
        c.z = x.z * y.m - y.z * x.m;
          c.m = x.m * y.m;
    }
    return c;     
}

Fraction multi(Fraction x,Fraction y){
    Fraction c;
    if(x.m != 0 && y.m != 0){
          c.z = x.z * y.z;
          c.m = x.m * y.m;
    }
    return c;
}

Fraction except(Fraction x,Fraction y){
    Fraction c;
    if(x.m != 0 && y.m != 0 && y.z != 0)
    {
          c.z = x.z * y.m;
          c.m = x.m * y.z; 
    }
    return c;
}

//函数不带参数的话,Fraction c无法从外面得到值
void point(Fraction &c){ //形参是引用,让形参的改变可以影响到实参
    //Complex c;
    int x = c.z;
    int y = c.m;
    int temp;
    while(y > 0){
      temp = x % y;
      x = y;
      y = temp;
    }
    c.z /= x;
    c.m /= x;
} 


void prt(const Fraction c){
    printf("分数为:%d/%d\n",c.z, c.m);
}

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-04-02 14:18
    关注
    • 你可以看下这个问题的回答https://ask.csdn.net/questions/649553
    • 这篇博客你也可以参考下:用深搜解决图论四连通检测问题
    • 除此之外, 这篇博客: 数据结构 哈夫曼编码中的 四、调试分析 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 1.建立哈夫曼树的第i个结点需要在前i-1个结点中挑选出两个无双亲且根结点权值最小的子树。
      2.对每个字符求编码,是从树叶结点出发自下而上搜索至根结点的过程。
      3.译码过程是自上而下搜索的过程,搜索到树叶结点时则确定了二进制电文对应的一个字符。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月2日

悬赏问题

  • ¥50 微信野豹球杆小程序数据
  • ¥15 Linux系统的命令行窗口回车变成了换行,无法执行命令了
  • ¥15 vb6.0调用ImageMagick进行图片转换问题
  • ¥15 安卓组件化工程引入Arouter报错there's no route matched path[/login/LoginActivity,如何解决?
  • ¥50 如何进行点云姿态调整优化
  • ¥20 关于c++的问题 如何用qt完成
  • ¥15 台达变频器MS300与伺服驱动器B3系列的抱闸与电路设计如何实现
  • ¥20 C++通过HICON获取argb像素数组
  • ¥15 如何利用支持向量机提高分类器正确率和筛选理想分类器
  • ¥15 Pygame坦克大战游戏开发实验报告