华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁
(2)
(3)
(4)
2.3 实验体会
源程序改错中,依赖于平时良好的输入习惯,在输入过程中已经可以检查出大多数语法错误,或者拼写错误。接下来再检查一下逻辑是否有误,无误则进行多组数据的编译检验,确认最终无误。
源程序修改与替换题锻炼我们举一反三触类旁通的能力,在平时写程序时就应该思考对于一个问题有没有多钟解决方案,使用不同的逻辑结构多种尝试寻求最优解。
程序设计题则是自主的设计实践,在练习中获得进一步提升,增强对于所学知识的熟练度和理解程度,锻炼能力。
21
华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁
3函数与程序结构实验
2.1实验目的
(1)熟悉和掌握函数的定义、声明,函数调用与参数传递方法,以及函数返回值类型的 定义和返回值使用。
(2)熟悉和掌握不同存储类型变量的使用。 (3)熟悉多文件编译技术。 (4)使用集成开发环境中的调试功能:单步执行、设置断点、观察变量值。
2.2实验内容及要求
2.2.1. 源程序改错
下面是计算s = 1!+2!+3!+?+n!的源程序,在这个源程序中存在若干语法和逻辑错误。要求在计算机上对这个例子源程序进行调试修改,使之能够正确完成指定任务。
程序代码:
#include
int k;
for(k=1;k<6;k++)
printf(\
}
return 0;
longsum_fac(int n) {
long s = 0; int i; long fac;
for(i=1; i<=n; i++) fac *= i;
s += fac; return s; }
【分析及改正】本程序共存在3处错误,分析如下:
(1)} return 0;
错误原因:return返回值应该在main函数内部 改正:return 0;} (2)long fac;
错误原因:fac未赋予初始值,会导致接下来计算错误。 改正:long fac=1; (3)s += fac;
错误原因:语句s += fac;不在函数for内部,逻辑出错。 改正:for(i=1;i<=n;i++){ fac*=i; s+=fac; }
22
华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁
2.2.2 源程序修改替换
(1)修改上术源程序中的sum_fac函数,使其计算量最小。 (2)修改上述源程序中的sum_fac函数,计算s =1+1/(2!)+1/(3!)+??+1/(n!)
【分析】(1)利用static变量类型对循环进行化简,保留上一个值,避免
多次重复循环。流程图如下:
(2)相比较于源程序,变动之处在于求的是阶乘的倒数和,则在循环中多一步求倒数的过程,并对倒数求和。流程图如下:
【程序】(1)
#include
int k;
23
华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁
for(k=1;k<6;k++)
printf(\ return 0; }
static long s=0,fac=1; long sum_fac(int n) {
fac*=n; s+=fac; return s; }
(2)
#include
int k;
for(k=1;k<6;k++)
printf(\ return 0; }
float sum_fac(int n) {
long fac=1; int i;
float x,s=0;
for(i=1;i<=n;i++){ fac*=i; x=1.0/fac; s+=x; }
return s; }
【测试】(1)程序运行结果如下,程序正确。
(2)程序运行结果如下,程序正确。
24
华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁
2.2.3跟踪调试
下面是计算fabonacci数列前n项和的源程序,现要求单步执行该程序,并观察p,i,sum,n的值,即:
(1)刚执行完“scanf(”%d”,&k);”语句时,p,i值是多少?
(2)从fabonacci函数返回后,光条停留在哪个语句上?
(3)进入fabonacci函数时,watches窗口显示的是什么?
等图像。
(4)当i=3时,从调用fabonacci函数到返回,n值如何变化?
n=1到n不存在;n=1到n=2到n不存在;n=1到n=2到n=3到n不存在。 【源程序】
#include
int i,k;
long sum=0,*p=∑ scanf(\ for(i=1;i<=k;i++){
sum+=fabonacci(i);
printf(\ }
return 0; }
long fabonacci(int n){
if(n==1||n==2)return 1;
25