代码没有输出,但它正在运行。 [C]

时间:2017-03-17 19:02:24

标签: c debugging runtime output

代码功能:这是俄罗斯农民增殖计算器 的代码:

#include <stdio.h>
#include <math.h>

main(){
  int ier, product = 0, check, i = 1; //var to store numbers
  float cand; //Var to store decimal numbers

  while(i != 0){
    printf("\nInput only whole numbers!"); //Ask user for number to be multiplied
    printf("\nMultiplier: ");
    scanf("%d", &ier);
    printf("Multiplicand: ");
    scanf("%d", &cand);

    while(i != 0){
      if((ier == 0  && cand > 0) || (ier > 0 && cand == 0) || (ier == 0  && cand < 0) || (ier < 0 && cand == 0)){//Regulations for the code
        printf("Product: 0");
        printf("\n\nInput only whole numbers!");
        printf("\nMultiplier: ");
        scanf("%d", &ier);
        printf("Multiplicand: ");
        scanf("%d", &cand);
      }
      if((ier > 0 && cand > 0) || (ier < 0  && cand > 0) || (ier > 0 && cand < 0) || (ier < 0 && cand < 0)){
        break;
      }
      if(ier == 0 && cand == 0){//If user inputs 0 and 0, end code
        return 0;
      }
    }

    while(i != 0){
      if((ier < 0  && cand > 0) || (ier > 0 && cand < 0) || (ier < 0 && cand < 0)){//Regulations for the code
        printf("Values must not be negative");
        printf("\n\nInput only whole numbers!");
        printf("\nMultiplier: ");
        scanf("%d", &ier);
        printf("Multiplicand: ");
        scanf("%d", &cand);
      }
      if((ier > 0 && cand > 0) || (ier == 0  && cand > 0) || (ier > 0 && cand == 0) || (ier == 0  && cand < 0) || (ier < 0 && cand == 0)){
        break;
      }
      if(ier == 0 && cand == 0){//If user inputs 0 and 0, end code
        return 0;
      }
    }

    if(ier > 0 && cand > 0){
      printf("Calculating Product:");//It should print this, but it isn't for some reason.
      while(i != 0){
        if(fmod(cand, 2) != 0){
          if(fmod(cand, 1) != 0){
            product = product + floor(cand);
            cand = floor(cand);
            printf("%d \t%f", ier, cand);
          }
          else{
            product = product + cand;
            printf("%d \t%f", ier, cand);
          }
        }
        if(cand == 1){
          printf("Product: %d", product);
          break;
        }
        ier *= 2;
        cand /= 2;
      }
    }
  }
}

问题:当我运行代码并输入例如5和2时,它会继续运行而不输出任何内容。我认为代码中的问题是fmod()。我只使用fmod,因为你不能在浮点变量上使用模数运算符% 我做过的事情:我将fmod更改为模数运算符%并将cand变为整数。这工作,但现在我有一个小数的问题,因为整数圆十进制数。所以我回到了fmod输入

gcc version 4.6.3
Input only whole numbers!
Multiplier:  5
Multiplicand:  2
/*Runtime: infinite*/

我想要的输出

Multiplier: 57
Multiplicand: 86
Calculating product:
114 43
228 21    
912 5    
3648 1
Product: 4902
Multiplier: 48
Multiplicand: -36
Values must not be negative
Multiplier: 27
Multiplicand: 0
Product: 0
Multiplier: 0
Multiplicand: 0

P.S:这是我第一次使用fmodfloor()

2 个答案:

答案 0 :(得分:1)

您的代码进入无限循环的原因不是因为fmod()函数,而是因为您已将cand初始化为float值,而不是int 1}}价值。将cand更改为int值可让代码继续打印出结果:

所以,改变:

float cand;

要:

int cand;

这至少可以防止代码挂起,就像@WeatherVane指出的那样,它还修复了编译器应为以下行生成的警告:

scanf("%d", &cand); // "cand" is a float, but your format specifier says that it is an int.

答案 1 :(得分:1)

阅读完代码后,我发现您错误地使用了scanf功能。在第一个while循环后的代码中,您执行了以下操作:

while(i != 0){
    printf("\nInput only whole numbers!"); //Ask user for number to be multiplied
    printf("\nMultiplier: ");
    scanf("%d", &ier);
    printf("Multiplicand: ");
    scanf("%d", &cand);

如果你看一下这句话上面的scanf,你可以看到你做了(正如@MartinR指出的那样):

scanf("%d", &cand);

您需要将代码更改为以下内容:

scanf("%f", &cand);

这将修复您的无限运行时。此外,@ ABusyProgrammer可能已经首先写了回复(这是正确的),他/她没有正确阅读帖子。 正在使用需要浮动的fmod。因此,您需要使用我上面写的scanf。 @ABusyProgrammer只有在使用%运算符时才会正确。