实验3 函数与程序结构实验
3.1 实验目的
(1)熟悉和掌握函数的定义、声明;函数调用与参数传递方法;以及函数返回值类型的定义和返回值使用。
(2)熟悉和掌握不同存储类型变量的使用。
(3)熟悉多文件编译技术。
3.2 实验内容及要求
3.2.1源程序改错
下面是计算s=1!+2!+3!+…+n!的源程序,在这个源程序中存在若干语法和逻辑错误。要求在计算机上对这个例子程序进行调试修改,使之能够正确完成指定任务。
1 #include
2 int main(void)
3 {
4 int k;
5 for(k=1;k<6;k++)
6 printf("k=%d\tthe sum is %ld\n",k,sum_fac(k));
7 }
8 return 0;
9 long sum_fac(int n)
10 {
11 long s=0;
12 int i;
13 long fac;
14 for(i=1;i<=n;i++)
15 fac*=i;
16 s+=fac;
17 return s;
}
解答:
(1)错误修改
未声明函数sum_fac(int n)的情况下,就调用函数。
第8行中,return 0;语句应放在主函数中。
第15,16行,应该被括号括起来,否则程序意义不是计算阶乘的和。
(2)修改错误后的程序为
#include
long sum_fac(int n);
int main(void)
{
int k;
long sum_fac(int n);
for(k=1;k<6;k++)
printf("k=%d\tthe sum is %ld\n",k,sum_fac(k));
return 0;
}
long sum_fac(int n)
{
long s=0;
int i;
long fac=1;
for(i=1;i<=n;i++)
{
fac*=i;
s+=fac;
}
return s;
}
(3)运行结果
图1 3.2.1程序运行截图
3.2.2源程序修改替换
(1)修改第1题中sum_fac函数,使其计算量最小。
解答:
1)将long设为静态局部变量,当退出函数时,long的值被保存在内存中,再次调用函数时,不用再对long初始化,静态局部变量的值具有记忆性。替换后的程序如下所示:
#include
long sum_fac(int n);
int main(void)
{
int k;
for(k=1;k<6;k++)
printf("k=%d\tthe sum is %ld\n",k,sum_fac(k));
return 0;
}
long sum_fac(int n)
{
static long s=0;
int i;
long fac=1;
for(i=1;i<=n;i++)
fac*=i;
s+=fac;
return s;
}
2)运行截图及说明
图2 3.2.2(1)程序运行截图
(2)修改第1题中sum_fac函数,计算。
解答:
1)第1题计算的是阶乘的和,而现在需要计算阶乘的倒数的和。只需将s+=fac替换为s+=1.0/fac即可。替换后的程序如下所示:
#include
int main(void)
{
int k;
double sum_fac(int n);
for(k=1;k<6;k++)
printf("k=%d\tthe sum is %lf\n",k,sum_fac(k));
return 0;
}
double sum_fac(int n)
{
double s=0;
int i;
long fac=1;
for(i=1;i<=n;i++)
{
fac*=i;
s+=1.0/fac;
}
return s;
}
2)运行截图及说明
图3 3.2.2(2)程序运行截图
3.2.3跟踪调试
计算fabonacci