【问题标题】:Custom Struct-returning function stuck on input?自定义结构返回功能卡在输入上?
【发布时间】:2014-01-15 17:28:04
【问题描述】:

我想用结构创建一个函数来简化有理数,
一个成员是分子(int),另一个是分母(int),但程序卡在输入! 我知道 scanf() 有点冒险,但我认为它只是几个整数!

#include <stdio.h>
#include <stdlib.h>

typedef struct rational{
    int num;
    int den;
}rational;

rational makerational(int num,int den);
void printrational(rational r);
int main()
{
    int a,b;
    printf("\n\n Input integers for fraction:");
    scanf(" %d%d",&a,&b);
    printrational(makerational(a,b));
}
rational makerational(int a,int b){
    int live=1; 
    rational r;
    r.num=a;
    r.den=b;
  while(live){  
    if(!(r.num%2 && r.den%2)){
        r.num/=2;
        r.den/=2;
    }else if(!(r.num%3 && r.den%3)){
        r.num/=3;
        r.den/=3;
    }else if(!(r.num%5 && r.den%5)){
        r.num/=5;
        r.den/=5;
    }else if(!(r.num%7 && r.den%7)){
        r.num/=7;
        r.den/=7;
    }else live--;
  }
    return r;
}
void printrational(rational r){
    printf("\nFRACTION -> %d/%d\n",r.num,r.den);
}

【问题讨论】:

  • 您提供什么输入?例如,如果您提供2 3,程序将运行。我认为对于您的输入,您正在进入一个无限循环。做一些调试!每次循环打印 r.num 和 r.den 的值/
  • 如果我使用 7 10 或 8 20
  • 请停止使用制表符来缩进(并且只使用空格);它会导致这里和其他地方一团糟。
  • 为什么是inf循环?如果模不是 0 , !(1&&1)=0 对吗?
  • @meaning-matters ok 我应该按空格 2-4 次每个嵌套命令来缩进吗? (有点不切实际)

标签: c struct scanf modulo rational-numbers


【解决方案1】:

你在这里陷入了无限循环:

while(live){  
    if(!(r.num%2 && r.den%2)){
        r.num/=2;
        r.den/=2;
    }

    …
}

例如,当r.num == 1r.den == 2 时,考虑发生了什么:

迭代 1

r.num % 2 == 1 % 2 == 1
r.den % 2 == 2 % 2 == 0
!(1 && 0) == 1

r.num / 2 == 1 / 2 == 0
r.den / 2 == 2 / 2 == 1

迭代 2

r.num % 2 == 0 % 2 == 0
r.den % 2 == 1 % 2 == 1
!(0 && 1) == 1

r.num / 2 == 0 / 2 == 0
r.den / 2 == 1 / 2 == 0

迭代 3 到无穷大甚至更远……

r.num % 2 == 0 % 2 == 0
r.den % 2 == 0 % 2 == 0
!(0 && 0) == 1

r.num / 2 == 0 / 2 == 0
r.den / 2 == 0 / 2 == 0

将分支语句中的表达式更改为以下内容以更正您的逻辑:

while(live)
{
    if((r.num % 2 == 0) && (r.den % 2 == 0))
    {
        r.num /= 2;
        r.den /= 2;
    }

    …
}

【讨论】:

  • 因为当余数不是 0 时,它不需要 1(或那样处理)对吧?
  • 现在肯定更清楚了;检查 'r.num/den!=0' 是否足够的一个条件......?
  • 如果我不使用!完全例如程序将输出 0/0 作为输入,例如 1/2 对吗?
  • @nick 如果你拿走了!,输入是4/2,例如,你的最终答案是2/1,这就是你想要的,对吧?
  • @nick 查看我的新评论。忽略关于||的那一条。
【解决方案2】:

问题是,当你输入 8 20 时,数字会像休耕一样变化;

4 10

2 5

1 2

0 1

0 0

原因是,整数向下取整,对于数字达到0的情况应该添加控制语句

【讨论】:

  • 我想我搞砸了逻辑表达这一点:4/8->1/2
  • 有点困惑,假设的操作方式是,如果两个成员都分开然后做简化 else check other ... else live=0 exit。
  • 您没有同时检查两个成员。您的 if 语句仅检查 1 个数字,例如,您有 2 5; if(!(r.num%2 && r.den%2)) // 这行变成了 this; if(!(0 && 1)) if(!0) if(1) 你应该在没有 ! 的情况下使用它
猜你喜欢
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 2016-12-22
  • 2013-03-21
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
相关资源
最近更新 更多