我的C代码计算k的最小值,其和大于用户输入n,这并没有给我预期的结果?
我正在为即将到来的考试练习编写C代码。提示为:我的C代码计算k的最小值,其和大于用户输入n,这并没有给我预期的结果?,c,loops,trace,C,Loops,Trace,我正在为即将到来的考试练习编写C代码。提示为: 编写一个程序来计算k的最小值,对于该值,下面的和大于n。获取用户输入n并编写一个循环来计算和。请注意,n可以是一个浮点数 (1/1+1/2+1/3+…+1/k)>n 因此n=2.0应该返回k=4,因为(1/1+1/2+1/3+1/4)=2.08>2 我不确定我做错了什么,因为当我运行程序时,它不会打印任何内容 #include <stdio.h> #include <math.h> int main() { int
#include <stdio.h>
#include <math.h>
int main()
{
int k=1;
double n, sum;
printf("Enter a value ");
scanf("%lf", &n); //n=2
while(sum>=0 && sum<=n) //when n=2, 1=<1<2
{
sum= (1/k);
sum=sum++;
k++; //when sum= 0 -> sum = 1 , k=1
//when sum= 1 -> sum = 1+ 1/2 = 1.5, k=2
//when sum= 1.5 -> sum = 1.5 + 1/3 = 1.83, k=3
//when sum= 1.83 -> sum = 1.83 +1/4 = 2.8, k=4
//sum is now 2.8
//2.8>2 , k=4 so loop terminates
}
printf("%d\n", k); //4 but it doesn't print anything???
return 0;
}
#包括
#包括
int main()
{
int k=1;
双n,和;
printf(“输入值”);
scanf(“%lf”,&n);//n=2
而(sum>=0&&sum=1.5+1/3=1.83,k=3
//当sum=1.83->sum=1.83+1/4=2.8时,k=4
//总和现在是2.8
//2.8>2,k=4,因此循环终止
}
printf(“%d\n”,k);//4但它不打印任何内容???
返回0;
}
除了我的代码之外,我还在注释中写下了我的预期结果。您的程序有很多错误:
- 在
条件下,程序读取while
的值,但该变量以前从未初始化过 此错误已经意味着您没有将编译器警告设置得足够高。现代编译器可以全面分析此情况并向您发出警告sum
这会将总和初始化为0.0,因为k的类型为sum=1/k
int
由于在一条语句中向sum=sum++
变量写入两个值,因此再次出现未定义的行为sum
作为一般建议,除了C之外,还有其他编程语言可以通过拒绝运行此程序来防止上述所有错误。最好先用这样一种安全的语言编写程序,完成后将其翻译成C。(Java、Go、Kotlin是更安全的编程语言的示例。)您的程序有许多错误:
- 在
条件下,程序读取while
的值,但该变量以前从未初始化过 此错误已经意味着您没有将编译器警告设置得足够高。现代编译器可以全面分析此情况并向您发出警告sum
这会将总和初始化为0.0,因为k的类型为sum=1/k
int
由于在一条语句中向sum=sum++
变量写入两个值,因此再次出现未定义的行为sum
作为一般建议,除了C之外,还有其他编程语言可以通过拒绝运行此程序来防止上述所有错误。最好先用这样一种安全的语言编写程序,完成后将其翻译成C。(Java、Go、Kotlin是更安全的编程语言的示例。)您的代码有几个问题
sum=(1/k);
计算1除以k的整数,它总是给出0。将其转换为double以获得正确的值
sum=sum++;
不确定您想做什么。sum++
表示已经sum=sum+1
也许你想做的是
sum=sum+(1.0/k)
1.0确保除法的结果是双精度的
sum缺少初始化
另外,您还计算了一次额外的迭代。最好从k=0开始,并在循环开始时递增
#include <stdio.h>
#include <math.h>
int main()
{
int k=0;
double n, sum=0.0;
printf("Enter a value ");
scanf("%lf", &n); //n=2
while(sum>=0 && sum<=n) //when n=2, 1=<1<2
{
k++;
sum+=(1.0/k);
//when sum= 0 -> sum = 1 , k=1
//when sum= 1 -> sum = 1+ 1/2 = 1.5, k=2
//when sum= 1.5 -> sum = 1.5 + 1/3 = 1.83, k=3
//when sum= 1.83 -> sum = 1.83 +1/4 = 2.8, k=4
//sum is now 2.8
//2.8>2 , k=4 so loop terminates
}
printf("%d\n", k); //4 but it doesn't print anything???
return 0;
}
#包括
#包括
int main()
{
int k=0;
双n,和=0.0;
printf(“输入值”);
scanf(“%lf”,&n);//n=2
而(sum>=0&&sum=1.5+1/3=1.83,k=3
//当sum=1.83->sum=1.83+1/4=2.8时,k=4
//总和现在是2.8
//2.8>2,k=4,因此循环终止
}
printf(“%d\n”,k);//4但它不打印任何内容???
返回0;
}
您的代码有几个问题
sum=(1/k);
计算1除以k的整数,它总是给出0。将其转换为double以获得正确的值
sum=sum++;
不确定您想做什么。sum++
表示已经sum=sum+1
也许你想做的是
sum=sum+(1.0/k)
1.0确保除法的结果是双精度的
sum缺少初始化
另外,您还计算了一次额外的迭代。最好从k=0开始,并在循环开始时递增
#include <stdio.h>
#include <math.h>
int main()
{
int k=0;
double n, sum=0.0;
printf("Enter a value ");
scanf("%lf", &n); //n=2
while(sum>=0 && sum<=n) //when n=2, 1=<1<2
{
k++;
sum+=(1.0/k);
//when sum= 0 -> sum = 1 , k=1
//when sum= 1 -> sum = 1+ 1/2 = 1.5, k=2
//when sum= 1.5 -> sum = 1.5 + 1/3 = 1.83, k=3
//when sum= 1.83 -> sum = 1.83 +1/4 = 2.8, k=4
//sum is now 2.8
//2.8>2 , k=4 so loop terminates
}
printf("%d\n", k); //4 but it doesn't print anything???
return 0;
}
#包括
#包括
int main()
{
int k=0;
双n,和=0.0;
printf(“输入值”);
scanf(“%lf”,&n);//n=2
而(sum>=0&&sum=1.5+1/3=1.83,k=3
//当sum=1.83->sum=1.83+1/4=2.8时,k=4
//总和现在是2.8
//2.8>2,k=4,因此循环终止
}
printf(“%d\n”,k);//4但它不打印任何内容???
返回0;
}
我已经一年多没学过java了。我要花很长时间才能把所有事情都弄清楚。这是你的选择。如果你继续用C语言那样编程,你会无数次地自食其果。请注意。我已经一年多没学过java了。我要花很长时间才能把所有事情都弄清楚。这是你的选择。你会自食其果的如果你继续在C语言中那样编程,我们会陷入困境无数次。只是要得到警告。非常感谢你指出我所有的错误,甚至给出解释!!我将k初始化为1,因为我不想被0除,我从来没有想过先增加k。我为sum建立了一个方程式,然后我想更新sum通过在每次迭代后添加旧的总和。我太多余了,现在我注意到添加1没有任何意义。我