我写了一个程序来计算谐波系列的总和(1 + 1/2 + 1/3 .. + 1 / n),但是我在编译它时遇到了麻烦。我多次查看代码,但我没有看到任何语法错误[当我尝试编译时出现2]。我的逻辑错了,还是语法错误?
#include <stdio.h>
int main( void ) {
int v,p,i;
double x=0;
printf("Enter a value to calculate the value of this harmonic series: \n");
scanf("%d",&v);
if (v<=0) {
printf("Please enter a POSITIVE number: \n");
scanf("%d",&p);
while (i=1; i<=v; i++) {
x=x+(1/i); }
printf("The value for the series is %lf", x);
}
else {
while (i=1; i<=v; i++) {
x=x+(1/i);
}
printf("The value for the series is %lf", x);
}
return 0;
}
感谢您的帮助
答案 0 :(得分:6)
所有这些while
应该是for
,而1/i
应该是1./i
或1/(double)i
,否则会执行整数除法。此外,您应该重新构建程序流程以避免代码重复。
但是,有一个微妙但更重要的错误:由于浮点运算如何工作,你应该从较小的数字到大数字之间的总和,否则你可能会达到每个新加数的点小于double
的当前精度,并且添加将不起作用 1 。因此,您的for
应该颠倒过来:
for (i=v; i>=1; i--)
另外:您应该检查scanf
的返回值为1,以确保用户实际插入了一些有效的数字输入。 和,printf
的{{1}}说明符仅为double
,没有%f
。
考虑到这一切,你可以改写程序:
l
答案 1 :(得分:5)
我注意到一堆错误......
(1)第二次扫描,你将值放入p,但绝不使用p。因此,你将测试i&lt; = v for v&lt; = 0,所以'loop'(见后面)将无法运行
(2)当你在循环中使用'for'时,你使用'while'
(3)i是一个整数,所以1 / i将评估为1(对于i = 1),或者为0.使1 /((double)i)或类似的东西。
可能还有更多。
答案 2 :(得分:4)
错误消息没多说。只是我在“;”之前需要一个“)”我确信我没事。
错误消息还会告诉您文件的哪一行导致了问题。您可以使用此信息来追踪应该使用while
的可疑for
语句。
在您的情况下,正如其他人所说,您需要for (...;...;...)
而不是while (...;...;...)
。编译器在一次传递中从左到右读取源代码*;当它到达while
时,它希望**看到while (...)
,所以一看到while (...;
,;
就会被标记为错误。请注意(并且我确定您可以看到原因)只需在)
之前放置;
就无法解决问题;)
*不需要这样做,但它至少习惯于这种方式更简单,并且语言中存在错误,因为它允许编译器以这种方式执行。你必须记住,C语言可以追溯到20世纪70年代早期。当时的计算机功能不那么强大,因此编程语言通常会使编译器更容易,程序员需要付出代价。
**这当然是一种严格的简化,忽略了...
部分的解释细节。
答案 3 :(得分:2)
您在while循环中使用for循环语法:
while (i=1; i<=v; i++) {
(反之亦然)
尝试将其更改为:
for (i=1; i<=v; i++) {
此外,1/i
将始终生成0作为答案(因为它们是整数),请尝试1.0/i
。
最后,为什么要复制这么多行?找到一种结构逻辑的方法,这样你只需要一次这些行。
答案 4 :(得分:1)
while (i=1; i<=v; i++) {
也许你想用一个for循环?
for (i=1; i<=v; i++) {