《2022年实验函数与编译预处理宣贯 .pdf》由会员分享,可在线阅读,更多相关《2022年实验函数与编译预处理宣贯 .pdf(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、38563355.doc(匡珍春制作)第 1 页 共 11 页实验六函数与编译预处理(4学时)实验前必须做的操作新建文件夹:1、先在对应的K :盘上建立一个父文件夹(用来存放本人整个学期的作业),格式为:“专业 +班级 +学号 +姓名”,如:工业1091 班、学号为05 的匡珍春同学,其父文件夹名称为:工业 109105 匡珍春 ,然后在此父文件夹下建立子文件夹,名称为:实验 6(用来存放实验6 需要上交的文件)。2、在 E:盘上建立一个以本人姓名为名称的文件夹(本次实验的工作文件夹),例如:匡珍春【实验目的】1、 掌握自定义函数的一般结构及定义函数的方法;2、 掌握函数的形式参数、实际参数、
2、函数返回值等重要概念;3、 掌握函数实参与形参间的“值传递”方式;4、 掌握函数声明、函数调用的一般方法;5、 掌握模块化程序设计思想,会采用C 语言中函数进行模块化程序设计;6、 掌握全局变量和局部变量作用域以及全局变量和局部变量的使用方法;7、 掌握函数的嵌套调用的程序的执行过程,会使用嵌套调用设计程序;8、 掌握使用函数递归调用的程序的执行过程,会使用递归程序解决实际问题;9、 理解宏的概念,掌握宏定义。了解文件包含的概念,掌握其用法;10、学习对多文件程序的编译和运行;11、熟练掌握VC程序调试方法,包括断点的设置和取消,以及单步执行跟踪进入函数和跳出函数的方法。【实验内容】实验任务一
3、 :断点 的设置和取消、单步执行跟踪进入函数和跳出函数方法练习程序跟踪调试实例6-1:调试示例( 请仔细按以下各步骤进行操作):从键盘输入一个正整数n,计算n! 的值,要求定义和调用函数fact(n) ,计算 n! 。源程序( 有错误的程序)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - 38563355.doc(匡珍春制作)第 2 页 共 11 页运行结果( 改正错误后程序的运行结果)Input n: 10 10! = 36
4、28800 说明: 实验五中我们使用了程序运行到光标位置调试程序,本次实验需要掌握设置断点 ,以及 单步调试进入函数 和跳出函数 的方法。【操作步骤】:(1) 输入源程序,并以error6_1.c 文件名最终保存在实验 6 文件夹里,编译程序,出现警告信息:双击该警告信息,箭头指向“f=fact(n); ”这一行,警告信息指出函数“fact”没有定义,而函数“fact ”实际上已经定义了,这是为什么呢?因为函数在调用之前,必须先声明。在主调函数的变量定义前面加上函数声明“ long fact(int m);”后,重新编译,连接,都正确。注意:如果将 error6_1.c 文件改为 error6
5、_1.cpp (即改为 C+源程序文件 ),编译程序时,出现的将是以下错误信息(而不是警告信息):可见 VC+系统对 .c 文件和 .cpp 文件在进行编译时,对语法的要求不完全一样,这一点希望同学们注意。此处错误修改的方法与上面相同。( 2) 调试开始,设置 2个断点(断点的作用:程序执行到断点处暂停,使用户可以观察当前的变量或其它表达式的值,然后继续运行) ,先把 光标定位 到要设置断点的位置,然后单击编译工具条上的(Inert / Remove Breakpoint (F9) ) ,断点就设置好了(如图6.1所示)。如果要取消断点,只要把光标放到要取消的断点处 ,单击,这个断点就取消了。
6、名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - 38563355.doc(匡珍春制作)第 3 页 共 11 页图 6.1 设置断点(3)单击编译工具条(go (F5) ),运行程序,用户输入n 的值 10 后,程序运行到第一个断点位置暂停(如图6.2 所示)。图 6.2 程序运行到断点位置(4)单击( Step Into (F11))进入函数fact() 调试,箭头表示程序已经执行到函数fact() 内(如图6.3 所示)。名
7、师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - 38563355.doc(匡珍春制作)第 4 页 共 11 页(5) 使用,在函数fact() 中设置程序的第3 个断点(如图6.3 所示)。图 6.3 进入函数fact( )调试,并在运行时设置断点(6)单击(go (F5) ),程序直接运行到断点处,暂停(如图 6.4 所示) ,在变量窗口观察到product的值是 -2903040 ,不正确,因为变量product 未赋初值,
8、加上语句product =1 后,按以上的步骤,重新编译、连接,运行到第3 个断点处,变量窗口中product 的值正确。图 6.4 程序从函数fact()开始直接运行到第3 个断点的位置(return 前面)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - 38563355.doc(匡珍春制作)第 5 页 共 11 页(7)现在需要从被调函数返回到主调函数,单击调试工具条中的(Step Out (Shift+F11)),程序返
9、回主调函数继续执行(如图6.5 所示)。图 6.5 程序回到了主调函数(8) 继续单击(go (F5)) ,程序执行到最后(如图6.6 所示) ,在运行窗口输出10!=3628800,与题目要求的结果一致。图 6.6 程序执行到最后( 9) 单击终止调试图标(Stop Debugging(Shaft+F5) ) ,程序调试结束。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 11 页 - - - - - - - - - 38563355.doc(匡珍春制作)第 6 页 共
10、 11 页程序跟踪调试实例6-2: 模仿示例调试以下程序,直到输出正确结果,将修改好的程序以error6_2.c 为文件名最终保存在实验 6 文件夹里。(需要存盘)程序功能: 利用函数调用求“1!+2!+3!+4!+.+10!”的值(参见实验教材73 页程序填空题第(2)小题)源程序( 有错误的程序不是语法错误,而是算法错误或逻辑错误)提示: 改变 main() 函数中 for循环的循环次数,让程序只求“1!+2!+3! ”的值,更容易找到程序的错误。程序跟踪调试实例6-3:综合调试、改错练习:以下程序有多处错误,请综合运用前面所学过的所有知识和VC+ 的调试手段, 改正程序的各种错误,使其运
11、行出正确的结果。程序的功能是: 利用 函数调用 求任意两个整数的和。将修改好的程序以error6_3.c为文件名最终保存在实验 6 文件夹里。 (需要存盘)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 11 页 - - - - - - - - - 38563355.doc(匡珍春制作)第 7 页 共 11 页【提示】: 本题中涉及到两个函数,分别是main() 函数和 sum()函数,而C语言程序中各个函数之间的关系是相互独立的,所以应该将int sum(a, b) 函
12、数写在主函数main() 函数的外面,即将上面程序中的最后一行的放在 int sum(a,b) 的上一行; 按以上方式修改以后,编译时会出现如下错误信息提示: Declaration syntax error in function main. 主函数中声明语法错误如何修改请参照ppt 课件的 C6 函数与编译预处理的第2123 的内容; 经过以上几步修改后,编译时会出现如下错误信息提示,且光标停留在scanf( )处:Possible use of x before definition in function main. 在定义主函数之前可能已经使用了x原因就是 scanf()语句错误。
13、修改后重新编译会出现错误信息提示如下所示:Redeclaration of a in function sum 在 sum函数中重复声明了a 造成此错误的原因是定义 sum( ) 函数错误,如何修改,请参照ppt 课件的 C6 函数与编译预处理的第78 的内容; 修改完成以后,编译成功,但连接时(即按compile菜单下的Make EXE file选项)时,会出现如下错误信息提示:Undefined symbol _sam in module example2.c 在 example2.c模块中没有定义符号sam 造成此错误的原因就是:被调函数的函数名与主调函数中调用被调函数的函数名不一致。修
14、改方法可将主调函数中的sam改成 sum以保持一致; 修改后重新编译,出现信息提示:Too few parameters in call to sum in function main 主函数中调用sum函数时参数太少因为被调函数sum(int a, int b) 中有两个参数,主调函数main() 中的 sum(x+y) 只有一个参数。而实参应该与形参保证三一致:即顺序一致,类型一致,数量一致。 因为程序中scanf(%d,%d, &a, &b)中两个 %d之间有逗号,所以运行程序时输入的两个整数之间必须用逗号隔开,而不是用空格隔开。实验任务二 :补充完整程序,灵活掌握C 语言中使用函数调用
15、解决问题的方法。注意:这里提供了以填空的形式出现源程序参考清单,目的是给同学们一个思路。最好不要将此源程序清单复制到VC+ 中,否则会出现多处语法错误。同学们可以据此思路来填写有关语句,从而完成程序。在调试程序时,一定要运用前面学过的方法。程序填空实例6-1:下面函数是实现求1,3000能被 17 或 23 整除的整数的个数。请将程序补充完整,并调试运行, 直到输出正确结果。将填空后完整的程序以文件名为blank6_1.c保存在 实验 6 文件夹里。(需要存盘 )名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 -
16、- - - - - - 第 7 页,共 11 页 - - - - - - - - - 38563355.doc(匡珍春制作)第 8 页 共 11 页程序填空实例6-2 : 编写一函数接受主调函数实参n(这里 n=5),并输出如下图形。n 的值通过键盘输入,并由主函数中的语句来由实现。将填空后完整的程序以文件名为print1.c保存在 实验 6 文件夹里。 (需要存盘) 0* * * 0* 0* 0 * * 0 * * 0* 0 *0 * * * 0【算法提示】: 定义函数printg(),一个形参n,类型为整型,函数无返回值; 找出主、次对角线上0的规律,使用双层循环控制循环n*n 次; 循环
17、体内部主、次对角线上打印0,否则打印*; 在主函数中调用函数printg()。【程序框架】:本程序中main()是主调函数,printg()函数上被调函数。程序结构形式如下:#include void printg(int); /* 因为被调函数printg()在主调函数main() 之后,需对被调函数声明*/ void main ( ) int a; printf(please input a number: n); scanf(%d, &a); printg(a); /* 在主调函数main() 中调用被调函数printg(a) ,其中 a 为实参 */ 名师资料总结 - - -精品资料欢
18、迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 11 页 - - - - - - - - - 38563355.doc(匡珍春制作)第 9 页 共 11 页 void printg(int n) 这部分可按照算法提示的、步补充完整。相关提示:如果用i 控制行标,用j 控制列标,则主对角线的规律是:i=j, 即行标等于列标;次对角线的规律是:i+j=n+1,即行标与列标的和值等于方阵的维数+1; 【知识总结】:一般来说,编程时一个问题可以只用一个主函数来处理,但考虑到模块化程序的优越性(主要是大的问题, 很
19、小的问题体现不出优越性),所以在实际设计程序时(特别是大的问题),需要设计多个函数(模块),甚至多个文件。虽然我们碰到的一般是小问题,完全可以用一个主函数来处理,但是我们必须从小问题中学会模块化程序设计的思想和方法,为将来处理大问题打下基础。程序填空实例6-3 : 将一个正整数n 以相反的顺序输出的递归算法reverse(n)描述如下所示:输出 n: 当 0=n9 时据此算法,设计的递归算法如下,请补充完整,并上机调试。(需要存盘)将补充完整的程序以文件名reverse.c最终保存在 实验 6 文件夹里。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - -
20、- - - - - - 名师精心整理 - - - - - - - 第 9 页,共 11 页 - - - - - - - - - 38563355.doc(匡珍春制作)第 10 页 共 11 页实验任务三 :掌握函数的嵌套调用和递归调用的程序的执行过程,会使用嵌套调用和递归调用编写程序;编程实例6-1: 写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息。同时将编写好的程序以文件名primefun.c 最终保存在 实验 6 文件夹里。 (需要存盘)编程实例6-2: 请编写一个函数unsigned fun(unsigned w) ,w 是一个大于10 的无符号整数,若w 是 n(n=2
21、)位的整数,则unsigned fun(unsigned w) 函数的功能是求出w 的后 n-1 位的数作为函数值返回,在主函数输出。将编写好的程序以文件名printnum.c 最终保存在 实验 6 文件夹里。 (需要存盘)编程实例 6-3 :编写程序: fun 函数可求表达式: s aaa , aa , aaa aa a 的值。( 其中 aaa, aa 表示 n 个 a,a 和 n 的值在 1 到 9 之间 ) ,a 和 n 作 fun 函数的形参,表达式的值传回main函数输出。将编写好的程序以文件名printa.c最终保存在 实验 6 文件夹里。 (需要存盘)编程实例 6-4 : 用函数
22、调用方法,编程实现计算2 和-3 的 0 到 5 次幂,即将x 的 y 次幂编写成子函数power(x ,y) ,然后被主函数调用。将编写好的程序以文件名power.c最终保存在 实验 6 文件夹里。 (需要存盘)编程实例 6-5 : 编写程序求表达式!.!3!2132nxxxxSn的值。【要求】: 在主函数中输入变量x 与 n 的值,通过调用函数fS 实现题目要求; 使用函数float fS(int n, float x)求表达式的值。将编写好的程序以文件名Taile.c 最终保存在 实验 6 文件夹里。 (需要存盘)编程实例 6-6 : 有数学函数如下:编写程序实现输入x,y,z,则程序输
23、出f(x, y, z)的值。将编写好的程序以文件名value.c 最终保存在 实验 6 文件夹里。 (需要存盘)【算法提示】: 定义 g(x, y, z)函数,形参3 个,实型 x, y,z,返回值实型; 定义 f(x, y, z)函数,形参3 个,实型 x, y,z,返回值实型;调用g(x ,y,z) 实现求 f(x ,y,z) 值。 定义主函数,输入x,y,z,调用 f(x ,y, z) 求函数值。编程实例 6-7 : 用递归方法求n 阶勒让德多项式的值,递归公式为:将编写好的程序以文件名LeRangDe.c 最终保存在 实验 6 文件夹里。 (需要存盘)名师资料总结 - - -精品资料欢
24、迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 11 页 - - - - - - - - - 38563355.doc(匡珍春制作)第 11 页 共 11 页编程实例6-8:某个整数 N的所有因子之和等于N的倍数,则称N为多因子完备数,如 28 其因子之和1+2+4+7+14+28=56=2 28, 28 是多因子完备数。求1,200的多因子完备数的个数。编写求某个数因子之和的函数,编写找1,200多因子完备数的个数的函数,用函数嵌套调用实现。将编写好的程序以文件名multifac.c 最终保存在 实验
25、 6 文件夹里。 (需要存盘)实验任务四 :通过设计一个实际例子熟悉函数的编程与使用方法,进一步熟悉含有选择、循环结构的程序设计方法。设计程序实例6-1:给小学生出加法考试题编写一个程序,给学生出一道加法运算题,然后判断学生输入的答案对错与否,按下列要求以循序渐进方式编程:程序 1: 通过输入两个加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!” ,否则显示“ Not correct! Try again! ” ;程序2: 通过输入两个加数给学生出一道加法运算题,如果输入答案正确,则显示“Right! ” ,否则显示“ Not correct! Try again! ” ,直
26、到做对为止;程序3: 通过输入两个加数给学生出一道加法运算题,如果输入答案正确,则显示“Right! ”,否则提示重做, 显示“Not correct! Try again! ” , 最多给三次机会, 如果三次仍未做对,则显示“Not correct. Y ou have tried three times! Test over! ”程序结束;程序 4: 连续做 10 道题,通过计算机随机产生两个110 之间的加数给学生出一道加法运算题,如果输入答案正确,则显示“Right! ” ,否则显示“ Not correct! ” ,不给机会重做,10 道题做完后,按每题10 分统计总得分,然后打印出
27、总分和做错的题目数量。程序 5: 通过计算机随机产生10 道四则运算题,两个操作数为110 之间的随机数,运算类型为随机产生的加、减、乘、整除中的任意一种,如果输入答案正确,则显示“Right!” ,否则显示“Not correct! ” ,不给机会重做,10 道题做完后,按每题10 分统计总得分,然后打印出总分和做错的题目数量。作业上交(千万不要忘记):C程序编译、连接、运行成功后,请务必将源程序(扩展名为.C、存于 E:盘以本人姓名为名称的文件夹下,如匡珍春 c01.c )复制到 K:盘对应的文件夹中,如K(01): 工业109105匡珍春 实验 6,才算上交作业。注: 为了方便自己使用,不妨将源程序备份到可移动存储器上(如U 盘、手机卡等)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 11 页 - - - - - - - - -