使用 for 循环和 switch 语句评估 C 中不同参数的几何级数之和

Using a for loop and switch statement to evaluate the sum of a geometric series with respect to different parameters in C

我是 C 的新手,我正在尝试编写一段代码,使用迭代求和和公式计算几何级数的总和。我想做的是创建一个从 1 到 3 的循环,然后设计一个 switch 语句,它计算 a(第一项)、r(公比)的三组不同值的总和和公式,和 n(术语数)。我首先编写了单独计算总和的函数,并且知道它们可以在没有循环和 switch 语句的情况下工作。我坚持的是如何将循环和 switch 语句包含到程序中。我已经试过了,但没有任何结果,而且我不知道如何进行。所以任何帮助将不胜感激! 我在下面包含了我的 C 代码,我希望它能帮助说明我正在尝试做的事情。

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

float sumgeometric1 (float a, float r, int n) //sum by iteration
{
  float sum = 0;
  for (int i = 0; i < n; i++)
    {
      sum = sum + a;
      a = a * r;
    }
  return sum;
}

float sumgeometric2 (float a, float r, int n) //sum by formula
{

  return (a * (float) (1 - pow (r, n - 1)) / (1 - r));
}

int main (){
  int f, i, sum = 0;
  for (i = 1; i <= f; ++i)
    {
      int f = 3;
      int sum = sum + i;
      switch (sum)
    {
    case 1:;
      float a1 = 0.01;
      float r1 = 1.1;
      int n1 = 10000;
      printf ("%f\n", sumgeometric1 (a1, r1, n1));
      printf("%f\n", sumgeometric2 (a1,r1,n1) );
    case 2:;
      float a2 = 2.0;
      float r2 = 0.01;
      int n2 = 500;
      printf ("%f\n", sumgeometric1 (a2, r2, n2));
      printf("%f\n", sumgeometric2 (a2,r2,n2) );
     case 3:;
      float a3 = 0.0001;
      float r3 = 2.0;
      int n3 = 100;
      printf ("%f\n", sumgeometric1 (a3, r3, n3));
      printf("%f\n", sumgeometric2 (a3,r3,n3) );
    }
      return 0;
    }
}

首先也是最重要的,这种循环和开关设计只会让这个程序过于复杂。您正在尝试以已知顺序进行三组调用,这可以通过常规过程编程在没有循环或切换的情况下完成。

话虽如此...


f 在此程序开始时未初始化。循环谓词 i <= f 将通过读取此不确定值来调用 Undefined Behaviour

int f = 3; inside 循环无效。它只是将 f 从周围的范围中隐藏起来。

同样,int sum = sum + i; 隐藏了 sum 的先前定义。它还在自己的初始化中引用 自身 ,这将导致 undefined behaviour.


假设您运气好 (!),所有内容都初始化为 0,这样我们就可以查看程序的其余部分。

sum 毫无意义,因为它只是反映了 i.

此外,此循环只会有一次迭代,因为 return 0; 位于 内部 循环中。这个错误被每个 case 中没有包含 break 语句的错误所抵消,导致它们 直通 到下面的那个。

例如,这意味着当sum == 1时,案例123将按顺序执行。当sum == 2时,案例23将按顺序执行。

如果你打算有这个循环和切换,它可以简单地写成

for (int i = 1; i <= 3; i++) {
    switch (i) {
    case 1:
        /* ... */;
        break;
    case 2:
        /* ... */;
        break;
    case 3:
        /* ... */;
        break;
    }
}

但同样,这与以正常的程序方式一个接一个地编写每个案例的内容是一样的。


如果您想实际使用 for 循环,请考虑使用数组,这样您就可以更改数据集的大小而无需调整处理它们的代码。

下面是一个使用结构数组的简单示例:

void print_sums(float a, float r, float n) {
    printf("%f\n%f\n",
            sumgeometric1(a, r, n),
            sumgeometric2(a, r, n));
}

int main (void) {
    struct {
        float a;
        float r;
        int n;
    } data[] = {
        { 0.01, 1.1, 10000 },
        { 2.0, 0.01, 500 },
        { 0.0001, 2.0, 100 },
        { 1.3, 0.02, 400 }
    };

    for (size_t i = 0; i < (sizeof data / sizeof *data); i++)
        print_sums(data[i].a, data[i].r, data[i].n);
}