开放实验四
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言程序设计开放实验石家庄铁道大学信息学院
项目4:函数的应用
本次实验内容是数组应用部分,通过本次实验,学生将掌握以下内容:
1.掌握自定义函数的一般结构及定义函数的方法;
2.掌握函数的形式参数、实际参数、函数返回值等重要概念;
3.掌握函数实参与形参间的“值传递”方式;
4.掌握函数声明、函数调用的一般方法;
5.熟练掌握VC程序调试方法,包括断点的设置和取消,以及单步执行跟踪进入函
数和跳出函数的方法。
[实验任务一]:断点设置和取消、单步执行跟踪进入函数和跳出函数方法练习
程序跟踪调试实例4-1:调试示例(请仔细按以下各步骤进行操作):
从键盘输入一个正整数n,计算 n! 的值,要求定义和调用函数fact(n),计算n!。
源程序(有错误的程序)
运行结果(改正错误后程序的运行结果)
Input n: 10
10! = 3628800
说明:上次实验中我们使用了程序运行到光标位置调试程序,本次实验需要掌握设置断点,以及单步调试进入函数和跳出函数的方法。
【操作步骤】:
(1)输入源程序,并以文件名最终保存在实验4文件夹里,编译程序,出现警告信息:
双击该错误信息,箭头指向“f=fact(n);”这一行,信息指出函数“fact”没有定义,而函数“fact”实际上已经定义了,这是为什么呢因为函数在调用之前,必须先声明。在主调函数的变量定义前面加上函数声明“long fact(int m);”后,重新编译,连接,都正确。
(2)调试开始,设置2个断点(断点的作用:程序执行到断点处暂停,使用户可以观察当前的变量或其它表达式的值,然后继续运行),先把光标定位到要设置断点的位置,然后单击编译工具条上的(Inert / Remove Breakpoint (F9)),断点就设置好了(如图所示)。如果要取消断点,只要把光标放到要取消的断点处,单击,这个
断点就取消了。
图设置断点
(3)单击编译工具条(go (F5)),运行程序,用户输入n的值10后,程序运行到第一个断点位置暂停(如图所示)。
图程序运行到断点位置
(4))单击(Step Into (F11))进入函数fact()调试,箭头表示程序已经执行到函数fact()内(如图所示)。
(5)使用,在函数fact()中设置程序的第3个断点(如图所示)。
图进入函数fact( )调试,并在运行时设置断点
(6)单击(go (F5)),程序直接运行到断点处,暂停(如图所示),在变量窗口观察到product的值是-2903040,不正确,因为变量product未赋初值,加上语句product=1后,按以上的步骤,重新编译、连接,运行到第3个断点处,变量窗口中product的值正确。
图程序从函数fact()开始直接运行到第3个断点的位置(return前面)
(7)现在需要从被调函数返回到主调函数,单击调试工具条中的(Step Out
(Shift+F11)),程序返回主调函数继续执行(如图所示)。
图程序回到了主调函数
(8)继续单击(go (F5)),程序执行到最后(如图所示),在运行窗口输出10!=3628800,与题目要求的结果一致。
图程序执行到最后
(9)单击终止调试图标(Stop Debugging(Shaft+F5)),程序调试结束。
程序跟踪调试实例4-2:模仿示例调试以下程序,直到输出正确结果,将修改好的程序以为文件名最终保存在实验4文件夹里。(需要存盘)
程序功能:利用函数调用求“1!+2!+3!+4!+...+10!”的值
提示:改变main()函数中for循环的循环次数,让程序只求“1!+2!+3!”的值,更容易找到程序的错误。
[实验任务二]:补充完整程序,灵活掌握C语言中使用函数调用解决问题的方法。
程序填空实例4-1:编写一函数接受主调函数实参n(这里n==5),并输出如下图形。n的值通过键盘输入,并由主函数中的语句来由实现。将填空后完整的程序以文件名为保存。(需要存盘)
0***0
*0*0*
**0**
*0*0*
0***0
【算法提示】:
①定义函数printg(),一个形参n,类型为整型,函数无返回值;
②找出主、次对角线上‘0’的规律,使用双层循环控制循环n*n次;
③循环体内部主、次对角线上打印‘0’,否则打印‘*’;
④在主函数中调用函数printg()。
【程序框架】:
本程序中main()是主调函数,printg()函数上被调函数。程序结构形式如下:#include <>
void printg(int); /* 因为被调函数printg()在主调函数main()之后,需对被调函数声明*/
void main ( )
{
int a;
cout<<"please input a number: \n";
cin>>a;
printg(a); /* 在主调函数main()中调用被调函数printg(a) ,其中a为实参*/
}
void printg(int n)
{
这部分可按照算法提示的①、②、③步补充完整。
相关提示:如果用i控制行标,用j控制列标,则
主对角线的规律是:i==j, 即行标等于列标;
次对角线的规律是:i+j==n+1,即行标与列标的和值等于方阵的维数+1;
}
【知识总结】:
一般来说,编程时一个问题可以只用一个主函数来处理,但考虑到模块化程序的优越性(主要是大的问题,很小的问题体现不出优越性),所以在实际设计程序时(特别是大的问题),需要设计多个函数(模块),甚至多个文件。虽然我们碰到的一般是小问题,完全可以用一个主函数来处理,但是我们必须从小问题中学会模块化程序设计的思想和方法,为将来处理大问题打下基础。
[实验任务三]:掌握函数调用的程序的执行过程,会使用调用编写程序;
编程实例4-1:写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息。同时将编写好的程序以文件名最终保存。(需要存盘)
编程实例4-2:设计程序按步骤完成下列任务:(文件名存为)
(1)编写函数sort ,对整数数组排序的功能,
(2)主函数中,定义数组大小为10,键盘输入。
(3)主函数中调用sort 函数实现对测试数据排序的功能。要求分别打印出排序前后数组元素的值。
编程实例4-3:编写函数fun ,函数首部定义为 void fun(int a[][4]),其功能是实现二维数组的转置。main 函数中定义二维数组调用fun 函数,实现二维数组的转置,并将转置前和转置后的二维数组输出。将编写好的程序以文件名最终保存。(需要存盘)
编程实例4-4:编写程序求表达式!
......!3!2132n x x x x S n
++++=的值。 【要求】:① 在主函数中输入变量x 与n 的值,通过调用函数fS 实现题目要求;
② 使用函数float fS(int n, float x)求表达式的值。
将编写好的程序以文件名最终保存。(需要存盘)