实验六函数与编译预处理.docx
- 文档编号:8579228
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:16
- 大小:242.32KB
实验六函数与编译预处理.docx
《实验六函数与编译预处理.docx》由会员分享,可在线阅读,更多相关《实验六函数与编译预处理.docx(16页珍藏版)》请在冰豆网上搜索。
实验六函数与编译预处理
实验六函数与编译预处理
(4学时)
【实验前做的操作】
在本人所用计算机的逻辑盘(如D:
盘或E:
盘)上建立一个以本人姓名为名称的文件夹,然后在此父文件夹下建立子文件夹,名称为“实验六”,用来零时存放实验六需要上交的有关文件。
【实验目的】
1、掌握自定义函数的一般结构及定义函数的方法;
2、掌握函数的形式参数、实际参数、函数返回值等重要概念;
3、掌握函数实参与形参间的“值传递”方式;
4、掌握函数声明、函数调用的一般方法;
5、掌握模块化程序设计思想,会采用C语言中函数进行模块化程序设计;
6、掌握全局变量和局部变量作用域以及全局变量和局部变量的使用方法;
7、掌握函数的嵌套调用的程序的执行过程,会使用嵌套调用设计程序;
8、掌握使用函数递归调用的程序的执行过程,会使用递归程序解决实际问题;
9、理解宏的概念,掌握宏定义。
了解文件包含的概念,掌握其用法;
10、学习对多文件程序的编译和运行;
11、熟练掌握VC程序调试方法,包括断点的设置和取消,以及单步执行跟踪进入函数和跳出函数的方法。
【实验内容】(不妨先做已经讲过的知识点)
一、断点的设置和取消、单步执行跟踪进入函数和跳出函数方法练习(可不上交、但必须操作、理解,掌握其方法)
1、调试示例(请仔细按以下各步骤进行操作):
从键盘输入一个正整数n,计算n!
的值,要求定义和调用函数fact(n),计算n!
。
源程序(有错误的程序)
#include
voidmain()
{
intn;
longintf;
printf("Inputn:
");
scanf("%d",&n);
f=fact(n);
printf("%d!
=%ld\n",n,f);
}
longfact(intm)
{
inti;
longintproduct;
for(i=1;i<=m;i++)
product=product*i;
returnproduct;
}
运行结果(改正错误后程序的运行结果)
Inputn:
10
10!
=3628800
实验五中我们使用了程序运行到光标位置调试程序,本次实验需要掌握设置断点,以及单步调试进入函数和跳出函数的方法。
(1)输入源程序,并以error6_1.c文件名保存,编译程序,出现警告信息:
'fact'undefined;assumingexternreturningint
benignredefinitionoftype
双击该警告信息,箭头指向“f=fact(n);”这一行,警告信息指出函数“fact”没有定义,而函数“fact”实际上已经定义了,这是为什么呢?
因为函数在调用之前,必须先声明。
在主调函数的变量定义前面加上函数声明“longfact(intm);”后,重新编译,连接,都正确。
注意:
如果将error6_1.c文件改为error6_1.cpp(即改为C++源程序文件),编译程序时,出现的将是以下错误信息(而不是警告信息):
'fact':
undeclaredidentifier
'fact':
redefinition;differenttypemodifiers
可见VC++系统对.c文件和.cpp文件在进行编译时,对语法的要求不完全一样,这一点希望同学们注意。
此处错误修改的方法与上面相同。
(2)调试开始,设置2个断点(断点的作用:
程序执行到断点处暂停,使用户可以观察当前的变量或其它表达式的值,然后继续运行),先把光标定位到要设置断点的位置,然后单击编译工具条上的
(Inert/RemoveBreakpoint(F9)),断点就设置好了(如图6.1所示)。
如果要取消断点,只要把光标放到要取消的断点处,单击
,这个断点就取消了。
图6.1设置断点
(3)单击编译工具条
(go(F5)),运行程序,用户输入n的值10后,程序运行到第一个断点位置暂停(如图6.2所示)。
图6.2程序运行到断点位置
(4)单击
(StepInto(F11))进入函数fact()调试,箭头表示程序已经执行到函数fact()内(如图6.3所示)。
(5)使用
,在函数fact()中设置程序的第3个断点(如图6.3所示)。
图6.3进入函数fact()调试,并在运行时设置断点
(6)单击
(go(F5)),程序直接运行到断点处,暂停(如图6.4所示),在变量窗口观察到product的值是-2903040,不正确,因为变量product未赋初值,加上语句product=1后,按以上的步骤,重新编译、连接,运行到第3个断点处,变量窗口中product的值正确。
图6.4程序从函数fact()开始直接运行到第3个断点的位置(return前面)
(7)现在需要从被调函数返回到主调函数,单击调试工具条中的
(StepOut(ShaftF11)),程序返回主调函数继续执行(如图6.5所示)。
图6.5程序回到了主调函数
(8)继续单击
(go(F5)),程序执行到最后(如图6.6所示),在运行窗口输出10!
=3628800,与题目要求的结果一致。
(9)单击终止调试图标
(StopDebugging(Shaft+F5)),程序调试结束。
图6.6程序执行到最后
2、调试练习:
要求:
模仿示例调试以下程序,直到输出正确结果,源程序名为error6_2.c
程序功能:
利用函数调用求“1!
+2!
+3!
+4!
+...+10!
”的值
源程序(有错误的程序——不是语法错误,而是算法错误或逻辑错误):
voidmain()
{
longs,i;
longmm(intk);
for(i=1;i<=10;i++)
s=s+mm(i);
printf("1!
+2!
+3!
+...+10!
=%ld\n",s);
}
longmm(intk)
{
longt=0,j;
for(j=1;j<=k;j++)
t=t*j;
return(t);
}
提示:
改变(减少)main()函数中for循环的循环次数,让程序只求“1!
+2!
+3!
”的值,更容易找到程序的错误。
3、综合调试、改错练习:
以下程序有多处错误,请综合运用前面所学过的所有知识和VC++的调试手段,改正程序的各种错误,使其运行出正确的结果。
程序的功能是:
利用函数调用求任意两个整数的和。
main()
{
intsum(inta,b);
intx,y;
scanf("%d,%d",x,y);
printf("x=%d,y=%d\n",x,y);
printf("%d+%d=%d\n",x,y,sam(x+y));
intsum(a,b)
{
inta,b;
return(a+b);
}
}
4、程序分析、调试、填空练习:
实验教材:
(P17-21:
实验5函数与编译预处理)
二、实验内容
第2题、第3题
二、编程练习(必须上交)
利用VC++编写程序,并调试、运行,直到输出正确结果。
编程练习1:
注意:
这里提供了以填空的形式出现源程序参考清单,目的是给同学们一个思路。
最好不要将此源程序清单复制到VC++中,否则会出现多处语法错误。
同学们可以据此思路来填写有关语句,从而完成程序。
在调试程序时,一定要运用前面学过的方法。
下面函数是实现求[1,3000]能被17或23整除的整数的个数。
请将程序补充完整,并调试运行,直到输出正确结果。
(源文件名为blank6_1.c)
#include
intf(intm,intn)
{
inti,count=0;
for(i=m;i<=n;i++)
if()
;
returncount;
}
main()
{
;
;
printf("count=%d\n",);
}
编程练习2:
(1)编写一函数接受主调函数实参n(这里n==5),并输出如下图形。
n的值通过键盘输入,并由主函数中的语句来由实现。
程序以文件名print_1.c保存。
0***0
*0*0*
**0**
*0*0*
0***0
【算法提示】:
①定义函数printg(),一个形参n,类型为整型,函数无返回值;
②找出主、次对角线上‘0’的规律,使用双层循环控制循环n*n次;
③循环体内部主、次对角线上打印‘0’,否则打印‘*’;
④在主函数中调用函数printg()。
【程序框架】:
本程序中main()是主调函数,printg()函数上被调函数。
程序结构形式如下:
#include
voidprintg(int);/*因为被调函数printg()在主调函数main()之后,需对被调函数声明*/
main()
{
inta;
printf("pleaseinputanumber:
\n");
scanf("%d",&a);
printg(a);/*在主调函数main()中调用被调函数printg(a),其中a为实参*/
}
voidprintg(intn)
{
这部分可按照算法提示的①、②、③步补充完整。
相关提示:
如果用i控制行标,用j控制列标,则
主对角线的规律是:
i==j,即行标等于列标;
次对角线的规律是:
i+j==n+1,即行标与列标的和值等于方阵的维数+1;
}
【知识总结】:
一般来说,编程时一个问题可以只用一个主函数来处理,但考虑到模块化程序的优越性(主要是大的问题,很小的问题体现不出优越性),所以在实际设计程序时(特别是大的问题),需要设计多个函数(模块),甚至多个文件。
虽然我们碰到的一般是小问题,完全可以用一个主函数来处理,但是我们必须从小问题中学会模块化程序设计的思想和方法,为将来处理大问题打下基础。
(2)写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息。
源程序以文件名primefun.c保存。
编程练习3:
实验教材:
(P17-21:
实验5函数与编译预处理)
二、实验内容
第3题
其中第(3)、(4)、(5)为必做题,其余为选做题
★为了方便本人使用,不妨将源程序备份到网盘或可移动存储器上(如U盘、手机卡等)
三、课外练习(源程序名可依实验总体要求及本人的习惯确定,可不上交)
A、实验教材
第1部分:
C语言上机实验
实验5函数与编译预处理
未做过的但需要上机操作才能理解的内容
第2部分:
习题
习题6函数与编译预处理(P68-75)
需要上机操作才能理解的内容
B、理论教材
1。
本章各知识点及例题中需要上机操作才能理解的内容和需要上机验证的内容
2.本章习题中需要上机操作才能理解的内容和需要上机验证的内容
注:
1)以上程序题与实验教材的程序题要求是一样的
2)理论教材中习题与实验教材中的习题相同的题目只要求作一次
★强烈建议:
先理解消化例题及习题(书上提供了答案),然后再做编程题。
因为这样效果会好些。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 函数 编译 预处理