代码功能:这是俄罗斯农民增殖计算器 的代码:
#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:这是我第一次使用fmod
和floor()
。
答案 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只有在使用%
运算符时才会正确。