使用 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
时,案例1
、2
和3
将按顺序执行。当sum == 2
时,案例2
和3
将按顺序执行。
如果你打算有这个循环和切换,它可以简单地写成
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);
}
我是 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
时,案例1
、2
和3
将按顺序执行。当sum == 2
时,案例2
和3
将按顺序执行。
如果你打算有这个循环和切换,它可以简单地写成
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);
}