计算谐波和

时间:2011-09-15 22:18:23

标签: c

我写了一个程序来计算谐波系列的总和(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;
}

感谢您的帮助

5 个答案:

答案 0 :(得分:6)

所有这些while应该是for,而1/i应该是1./i1/(double)i,否则会执行整数除法。此外,您应该重新构建程序流程以避免代码重复。

但是,有一个微妙但更重要的错误:由于浮点运算如何工作,你应该从较小的数字到大数字之间的总和,否则你可能会达到每个新加数的点小于double的当前精度,并且添加将不起作用 1 。因此,您的for应该颠倒过来:

for (i=v; i>=1; i--)

另外:您应该检查scanf的返回值为1,以确保用户实际插入了一些有效的数字输入。 printf的{​​{1}}说明符仅为double,没有%f

考虑到这一切,你可以改写程序:

l

  1. 对于谐波系列来说,这实际上几乎是不可能的 - 你需要去看一些非常大的数字以注意到一些差异 - 但是对于其他系列(其术语变得非常小),这个建议非常重要。

答案 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++) {