C语言程序设计案例教程项目五使用函数调用各功能模块课件.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《C语言程序设计案例教程项目五使用函数调用各功能模块课件.pptx》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 案例 教程 项目 使用 函数 调用 功能模块 课件
- 资源描述:
-
1、项目五 使用函数调用各功能模块v教学目的:教学目的:通过本章的学习,要求能熟练掌握函数的定义和调用通过本章的学习,要求能熟练掌握函数的定义和调用方法,掌握函数的嵌套调用和递归调用,理解变量的作用方法,掌握函数的嵌套调用和递归调用,理解变量的作用域和存储类别,掌握内部函数和外部函数,并能够在不同域和存储类别,掌握内部函数和外部函数,并能够在不同情况下灵活选择函数来解决实际问题。掌握编译预处理命情况下灵活选择函数来解决实际问题。掌握编译预处理命令的使用方法。函数和预处理命令是编写模块化程序的重令的使用方法。函数和预处理命令是编写模块化程序的重要方法,这将为编写比较复杂的程序设计的学习打下基础。要方
2、法,这将为编写比较复杂的程序设计的学习打下基础。v教学内容教学内容 项目五 使用函数调用各功能模块函数函数编译预处理编译预处理函数的定义函数的定义函数调用函数调用变量的作用域和存储类别变量的作用域和存储类别内部函数和外部函数内部函数和外部函数文件包含命令文件包含命令宏定义宏定义条件编译条件编译项目五 使用函数调用各功能模块重点:重点:()函数的定义和函数调用)函数的定义和函数调用(2 2)函数的参数传递)函数的参数传递难点难点 :、函数的参数传递、函数的参数传递、递归调用、递归调用、变量的作用域和存储特性、变量的作用域和存储特性v重点和难点重点和难点任务使用函数统计课程分数信息辅导员辅导员张老
3、师在使用小王设计的程序时,发现他分别要对每门课程学生成张老师在使用小王设计的程序时,发现他分别要对每门课程学生成绩的总分及平均分进行计算,如果这样的计算过程需要重复使用或者在其他场绩的总分及平均分进行计算,如果这样的计算过程需要重复使用或者在其他场合中多次使用,使用以前的方法将使得程序代码重复书写,在本任务中我们使合中多次使用,使用以前的方法将使得程序代码重复书写,在本任务中我们使用函数来统计课程分数信息,可以减少编程工作量,完善了原来的程序,帮助用函数来统计课程分数信息,可以减少编程工作量,完善了原来的程序,帮助张老师解决了该问题。张老师解决了该问题。任务使用函数统计课程分数信息/*功能:使
4、用函数统计课程分数信息*/#include#define MAX 1000#define M 100float sumM,aveM;int i,j;int count;int course;float aMAXM;void input()printf(请输入课程的门数:);scanf(%d,&course);printf(请输入学生总人数:);scanf(%d,&count);printf(“请输入每个学生的课程成绩:”);任务使用函数统计课程分数信息for(i=0;icount;i+)for(j=0;jcourse;j+)scanf(%f,&aij);void sum_ave(int s,i
5、nt r)for(i=0;ir;i+)sumi=0.0;for(j=0;js;j+)任务使用函数统计课程分数信息 sumi=sumi+aji;avei=sumi/s;void output()for(i=0;i0)return(1);if(x=0)return(0););if(x b)c=1;else if(a=b)c=0;else c=-1;return c;编译、连接、和运行程序。程序运行后,屏幕显示:编译、连接、和运行程序。程序运行后,屏幕显示:5.4 函数调用 5.4.1 函数调用的一般形式如果按自左向右顺序求实参的值,则函数调用相当于如果按自左向右顺序求实参的值,则函数调用相当于co
6、mpare(2,3),程序运行的结果应为程序运行的结果应为”-1”。若按自右向左。若按自右向左顺序求实参的值,则相当于顺序求实参的值,则相当于compare(3,3),程序运行结果程序运行结果为为”0”。如果不清楚自己所用的编译器对实参的求值顺序,。如果不清楚自己所用的编译器对实参的求值顺序,用上述代码上机一试就清楚了。用上述代码上机一试就清楚了。注意:由于不同的编译器对实参的求值顺序不一样,为了注意:由于不同的编译器对实参的求值顺序不一样,为了使程序的通用性不受影响以及避免大家对同一段代码产生不同使程序的通用性不受影响以及避免大家对同一段代码产生不同的理解,应尽量避免使用这种容易混淆的用法。
7、的理解,应尽量避免使用这种容易混淆的用法。5.4 函数调用函数出现在一个表达式中,这种表达式称为函数表达式。函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。例如:这时要求函数带回一个确定的值以参加表达式的运算。例如:s=sum(a,b)+sum(x,y);1.1.函数语句函数语句按函数在程序中出现的位置来分,可以有一下三种函数按函数在程序中出现的位置来分,可以有一下三种函数调用的方式。调用的方式。把函数调用作为一个语句。如例把函数调用作为一个语句。如例5.15.1中的中的printstartprintstart();();这时不要求函数带返回值
8、,只要求函数完成一些操作。这时不要求函数带返回值,只要求函数完成一些操作。2.2.函数表达式函数表达式5.4 函数调用 5.4.2 函数调用的方式 函数调用作为一个函数的参数,例如:函数调用作为一个函数的参数,例如:s=sum(a,sum(b,c);其中,其中,sum(b,c)是一次函数调用,它的值作为是一次函数调用,它的值作为sum另另一次调用的参数。一次调用的参数。s的值为的值为a,b,c三数的总和。三数的总和。其实,函数调用作为函数的参数,也是函数表达式调用的其实,函数调用作为函数的参数,也是函数表达式调用的一种形式,因为函数参数本身就是一个表达式的形式。一种形式,因为函数参数本身就是一
9、个表达式的形式。3.3.函数参数函数参数函数函数sum是表达式的一部分,将是表达式的一部分,将sum(a,b)的值加上的值加上sum(x,y)的和赋值给的和赋值给s。5.4 函数调用如果一个函数要调用另外一个函数,首先是被调用的函数如果一个函数要调用另外一个函数,首先是被调用的函数必须存在。其次还应在主调函数中对所有被调函数加以说明,必须存在。其次还应在主调函数中对所有被调函数加以说明,否则,在连接时会出现找不到所调用函数的错误信息。同变量否则,在连接时会出现找不到所调用函数的错误信息。同变量一样,函数的调用也应遵循一样,函数的调用也应遵循“先定义后使用先定义后使用”的原则。的原则。对被调函数
10、的声明分为两种情况:对被调函数的声明分为两种情况:(1)如果被调函数是)如果被调函数是C语言系统提供的标准库函数,则语言系统提供的标准库函数,则在源程序文件的开头处,使用在源程序文件的开头处,使用#include命令,将存放所调用命令,将存放所调用库函数的有关库函数的有关“头文件头文件”包含到该程序文件中来。包含到该程序文件中来。5.4 函数调用 5.4.3 对被调用函数的声明和函数原型#include命令的一般形式为:命令的一般形式为:#include或或#include stdio.h(2)如果被调用函数为用户自己定义的函数,一般情况)如果被调用函数为用户自己定义的函数,一般情况下,应在主
11、调函数中对被调用函数(返回值)的类型进行说明。下,应在主调函数中对被调用函数(返回值)的类型进行说明。函数的说明方法是:在主调函数的声明部分对被调函数进行声函数的说明方法是:在主调函数的声明部分对被调函数进行声明。在主调函数中对被调函数作说明的目的是使编译系统知道明。在主调函数中对被调函数作说明的目的是使编译系统知道被调函数返回值的类型,以便在主调函数中按此种类型对返回被调函数返回值的类型,以便在主调函数中按此种类型对返回值作相应的处理。值作相应的处理。5.4 函数调用 5.4.3 对被调用函数的声明和函数原型其一般形式为:其一般形式为:类型说明符类型说明符 被调函数名被调函数名(类型类型 形
12、参,类型形参,类型 形参形参);或者:或者:类型说明符类型说明符 被调函数名被调函数名(类型,类型类型,类型);括号内给出了形参的类型和形参名,或只给出形参类型。括号内给出了形参的类型和形参名,或只给出形参类型。这便于编译系统进行检错,以防止可能出现的错误。这便于编译系统进行检错,以防止可能出现的错误。5.4 函数调用 5.4.3 对被调用函数的声明和函数原型例例5.1 main函数对函数对printstart()函数的说明为:函数的说明为:void printstart();例例5.2 main函数对函数对sum()函数的说明为:函数的说明为:int sum(int x,int y);也可以
13、写成:也可以写成:int sum(int,int);5.4 函数调用 5.4.3 对被调用函数的声明和函数原型语言中规定在以下几种情况时可以省去在主调函数中对语言中规定在以下几种情况时可以省去在主调函数中对被调函数的函数说明。被调函数的函数说明。1)当被调函数的返回值是整型或字符型时,可以不对被调当被调函数的返回值是整型或字符型时,可以不对被调函数作说明。这时系统会自动对被调函数返回值按整型处理。函数作说明。这时系统会自动对被调函数返回值按整型处理。例例5.3的主函数中把函数声明语句的主函数中把函数声明语句int compare(int a,int b);注释掉而直接调用就属于这种情况。注释掉
14、而直接调用就属于这种情况。5.4 函数调用 5.4.3 对被调用函数的声明和函数原型2)2)当被调函数的函数定义出现在主调函数之前时,在主调当被调函数的函数定义出现在主调函数之前时,在主调函数中也可以不对被调函数再作说明而直接调用。例如例函数中也可以不对被调函数再作说明而直接调用。例如例5.15.1中,中,函数函数printstartprintstart()()的定义放在的定义放在 menu()menu()函数之前,因此可在函数之前,因此可在 menu()menu()函数中省去对函数中省去对printstartprintstart()()函数的函数说明函数的函数说明void void prin
15、tstartprintstart();();3)3)如在所有函数定义之前,在函数外预先说明了各个函数如在所有函数定义之前,在函数外预先说明了各个函数的类型,则在以后的各主调函数中,可以不再对被调函数作说的类型,则在以后的各主调函数中,可以不再对被调函数作说明。明。例如:例如:long factor(long factor(intint a);a);long sum(long sum(intint b);b);5.4 函数调用 5.4.3 对被调用函数的声明和函数原型void main()long factor(int a)long sum(int b)其中第一、二行对其中第一、二行对facto
16、r函数和函数和sum函数预先作了说明。函数预先作了说明。因此在以后各函数中无须对因此在以后各函数中无须对factor和和sum函数再作说明就可函数再作说明就可直接调用。直接调用。5.5 函数的嵌套调用和递归调用 【例例5.45.4】计算计算 =1=1!+2+2!+n+n!(n1(n1,2020的整数,从键盘输入的整数,从键盘输入)。算法设计要点:本案例可以设计算法设计要点:本案例可以设计2 2个函数:个函数:factor()factor()用于求用于求n n!;!;sum()sum()通过调用通过调用factor()factor()来实现求来实现求。5.5.1 5.5.1 函数的嵌套调用实例函
17、数的嵌套调用实例 /*源文件名:源文件名:Li5_4.c Li5_4.c 功能:求阶乘和功能:求阶乘和 */#include#include stdio.hstdio.h long factor(long factor(intint n)n)/*定义求阶乘函数定义求阶乘函数factor()factor()*/intint i i;long f=1;long f=1;for(for(i i=1;i=1;i=n;in;i+)+)f=ff=f*i i;return f;return f;5.5 函数的嵌套调用和递归调用 5.5.1 函数的嵌套调用实例long sum(int m)/*定义求和函数su
18、m()*/int i;long s=0;for(i=1;i1)if(n1)f=nf=n*factor(n-1);factor(n-1);else else f=1;f=1;return f;return f;void main()void main()intint n;n;long s;long s;printfprintf(please input a number:);(please input a number:);scanfscanf(%(%d,&nd,&n););s=factor(n);s=factor(n);/*调用调用factor()factor()函数函数*/printfpri
19、ntf(%d!=%ld(%d!=%ldn,n,sn,n,s););5.5 函数的嵌套调用和递归调用其中,其中,factorfactor函数在定义的过程中调用了本身,这种情况函数在定义的过程中调用了本身,这种情况叫做函数的递归调用。叫做函数的递归调用。5.5.3 5.5.3 函数的递归调用实例函数的递归调用实例编译、连接、和运行程序。程序运行后,屏幕显示:编译、连接、和运行程序。程序运行后,屏幕显示:5.5 函数的嵌套调用和递归调用一个函数在它的函数体内调用它自身称为递归调用。这种一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。语言允许函数的递归调用。在递归调用函数称为递归函
20、数。语言允许函数的递归调用。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身,中,主调函数又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。每调用一次就进入新的一层。下面以例下面以例5.55.5说明一下递归的执行过程。说明一下递归的执行过程。设执行本程序时输入为设执行本程序时输入为5 5,即求,即求5!5!。在主函数中的调用语句。在主函数中的调用语句即为即为s=factor(5);s=factor(5);,进入,进入factorfactor函数后,由于函数后,由于n=5,n=5,大于大于1 1,故,故应执行应执行f=nf=n*factor(nfactor(n
21、*1),1),即即f=factor(5-1)f=factor(5-1)*5 5。该语句对。该语句对factorfactor函数作递归调用即函数作递归调用即factor(4)factor(4)。5.5.4 5.5.4 函数的递归调用说明函数的递归调用说明进行四次递归调用后,进行四次递归调用后,factorfactor函数形参取得的值变为函数形参取得的值变为1 1,故不再继续递归调用而开始逐层返回主调函数。故不再继续递归调用而开始逐层返回主调函数。factor(1)factor(1)的的函数返回值为函数返回值为1 1,factor(2)factor(2)的返回值为的返回值为2 2*1=21=2,f
22、actor(3)factor(3)的的返回值为返回值为3 3*2=62=6,factor(4)factor(4)的返回值为的返回值为4 4*6=246=24,最后返回值,最后返回值factor(5)factor(5)为为5 5*24=12024=120。注意:为了防止递归调用无终止地进行,必须在函数内有注意:为了防止递归调用无终止地进行,必须在函数内有终止递归调用的手段。常用的方法是加条件对递归是否继续进终止递归调用的手段。常用的方法是加条件对递归是否继续进行判断,满足某种条件后就不再作递归调用,而是逐层返回。行判断,满足某种条件后就不再作递归调用,而是逐层返回。如例如例5.55.5中的条件中
23、的条件if(n1)if(n1)就是控制递归继续的条件,当就是控制递归继续的条件,当n n不小不小于于1 1的时候递归就终止,开始回朔的过程。的时候递归就终止,开始回朔的过程。5.5 函数的嵌套调用和递归调用 5.5.4 函数的递归调用说明5.6 内部函数和外部函数一个函数如果只能被本文件中其它函数所调用,称为内部一个函数如果只能被本文件中其它函数所调用,称为内部函数,内部函数又称静态函数。在定义内部函数时在函数名和函数,内部函数又称静态函数。在定义内部函数时在函数名和函数类型前面加函数类型前面加static。即:。即:static 函数类型函数类型 函数名(形参列表)函数名(形参列表)函数体函
24、数体5.6.1 5.6.1 内部函数内部函数5.5 内部函数和外部函数 5.1 内部函数例:例:static int fun(int a,int b)特点:只能被本文件中的函数所调用。特点:只能被本文件中的函数所调用。优点:不用担心与其它源文件中的函数同名,因为即使同优点:不用担心与其它源文件中的函数同名,因为即使同名也没关系。名也没关系。一个函数可以被其它文件中其它函数所调用,就称为外部一个函数可以被其它文件中其它函数所调用,就称为外部函数。在定义函数时可冠以关键字函数。在定义函数时可冠以关键字extern(省略也可),表(省略也可),表示此函数是外部函数。即:示此函数是外部函数。即:ext
25、ern 函数类型函数类型 函数名(形参列表)函数名(形参列表)函数体函数体如:如:extern int fun(int a,int b)5.5 内部函数和外部函数5.6.2 5.6.2 外部函数外部函数5.6 内部函数和外部函数 5.6.2 外部函数特点:允许被所有源文件中的函数所调用。特点:允许被所有源文件中的函数所调用。注意:调用其它源文件中的外部函数时,需要对其进行说注意:调用其它源文件中的外部函数时,需要对其进行说明。明。【例例5.6】以多文件的形式实现加、减、乘、除和求余数以多文件的形式实现加、减、乘、除和求余数运算程序运算程序说明:将实现加、减、乘、除和求余数运算的程序段分别说明:
展开阅读全文