




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第 7章章 函数函数大学计算机基础网络信息中心教研室2主要内容主要内容7.1 概述7.2 函数的定义7.3 函数的参数和返回值7.4 函数的调用大学计算机基础网络信息中心教研室3主要内容主要内容7.8 函数应用举例7.7 内部函数和外部函数7.6 变量的作用域与存储类别7.5 数组作函数参数大学计算机基础网络信息中心教研室47.1 概述概述1、一个一个c语言程序由一个或多个源程序文件组成(适合分别语言程序由一个或多个源程序文件组成(适合分别编写,编译,提高编程效率)。编写,编译,提高编程效率)。2、一个源程序文件由一个或多个函数组成(以源文件为单位一个源程序文件由一个或多个函数组成(以源文件
2、为单位进行编译)。进行编译)。3、 c语言程序的执行顺序语言程序的执行顺序:从从main函数开始,调用其它函数后函数开始,调用其它函数后回到回到main函数中函数中, 结束整个程序的运行(系统定义的函结束整个程序的运行(系统定义的函数)。数)。大学计算机基础网络信息中心教研室57.1 概述概述大学计算机基础网络信息中心教研室67.2 函数的定义函数的定义大学计算机基础网络信息中心教研室77.2 函数的定义函数的定义大学计算机基础网络信息中心教研室87.2 函数的定义函数的定义#includeint max (int x, int y) /*函数头*/ int z; /*函数体中变量的声明*/
3、z=xy ? x : y; /*执行语句部分*/ return(z); /*执行语句部分*/ main() int a, b, c; printf(“请输入两个整数:”); scanf(“%d,%d”,&a, &b); c= max( a, b ); printf(“最大值是:%d”,c);大学计算机基础网络信息中心教研室97.3 函数的参数和返回值函数的参数和返回值形式参数和实际参数形式参数和实际参数2函数的返回值函数的返回值大学计算机基础网络信息中心教研室107.3.1 形式参数和实际参数形式参数和实际参数1定义函数时函数名后面括号中的变量名称 2形式参数的概念形式参数的概念 实际参数的概
4、念实际参数的概念 调用函数时函数名后面括号中的参数实参与形参说明 形参在函数调用前不占用内存。因为形参只有在函数被调用时才分配内存单元,调用结束后立即释放所占内存。 形参只能是变量,而实参可以是常量,变量或表达式。(必须有确定的值)被定义函数中必须指定形参的类型。实参与形参的个数、类型应一致。实参对形参的数据传递是单向传递,只能由实参传给形参,反之不可以。大学计算机基础网络信息中心教研室117.3.1 形式参数和实际参数形式参数和实际参数大学计算机基础网络信息中心教研室127.3.2 函数的返回值函数的返回值(1)函数的返回值是通过return语句实现。return语句形式: return(表
5、达式); return 表达式; return; /*没有确定返回值*/(2)若函数不需要返回值,函数体中可以不含return语句,此时执行到函数体最后一条语句后,自动执行一条return语句。(3)函数返回值类型:定义函数时应予以指定,若不加指定,则当做整型(int)处理。同时返回值类型应与return语句表 达式类型一致, 若不一致,以函数值类型为准进行转换。(4)为了明确表示不带回返回值,可以用“void”定义 “空类型”。大学计算机基础网络信息中心教研室137.3.2 函数的返回值函数的返回值例:将上例修改为以下程序大学计算机基础网络信息中心教研室147.4 函数的调用函数的调用2被调
6、函数的声明被调函数的声明嵌套调用嵌套调用 函数调用的形式和方式函数调用的形式和方式 4递归调用递归调用程序举例程序举例 大学计算机基础网络信息中心教研室157.4.1 函数调用的形式和方式函数调用的形式和方式函数调用的形式函数调用的形式 1大学计算机基础网络信息中心教研室167.4.1 函数调用的形式和方式函数调用的形式和方式函数调用的方式函数调用的方式 2大学计算机基础网络信息中心教研室177.4.2 被调函数的声明被调函数的声明函数声明的形式函数声明的形式 1函数类型 函数名(参数类型1,参数类型2,);或函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2, );大学计算机基础网
7、络信息中心教研室187.4.2 被调函数的声明被调函数的声明(1)将要声明的函数必须是已存在的函数(2)函数声明语句中参数列表可以省略参数名,但不可以省略参数类型,次序以及数目应保持一致。(3)如果在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必对所调用的函数再作声明(4)如果所调用函数的定义出现在主调函数之前,可以不必声明。(5)如果被调函数的返回值类型是整形或字符型,可以不必声明。函数声明的说明函数声明的说明 2大学计算机基础网络信息中心教研室197.4.3 嵌套调用嵌套调用嵌套调用的概念嵌套调用的概念 大学计算机基础网络信息中心教研室207.4.3 嵌套调用嵌套调用
8、例、利用嵌套调用求1!+2!+3!+20!的值大学计算机基础网络信息中心教研室21大学计算机基础网络信息中心教研室227.4.4 递归调用递归调用指一个函数直接或间接地调用自身的情况。 有两种方式:直接递归调用和间接递归调用。 包含有递归调用的函数称为递归函数。递归调用的概念递归调用的概念 1递归调用的特征递归调用的特征 2(1) 转化。 (2) 终止。 大学计算机基础网络信息中心教研室23大学计算机基础网络信息中心教研室24程序如下:/*求阶乘的递归函数*/*递归终止*/*递归调用*/ 大学计算机基础网络信息中心教研室257.4.4 递归调用递归调用(1)需要求解的问题可以转化为一个相对简单
9、的子问题。(2)最终有一个问题不是递归的,必须有确定的值。例如求解n!可以转化成求(n-1)!,同时n!在n=0或1时,不是递归的,且有确定值。 递归定义的条件递归定义的条件 3大学计算机基础网络信息中心教研室267.4.4 递归调用递归调用【例7-7】Hanoi(汉诺)塔问题 这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图7-)。有一个老和尚想把这64个盘子从A座移到C座,但每次只允许移动一个盘子,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程可以
10、利用B座,求移动的具体步骤。大学计算机基础网络信息中心教研室277.4.4 递归调用递归调用递归过程如下:(1)将n-1个盘子从A座经过C座移动到B座;(2)然后将第n个盘子从A座移动到C座;(3)再将n-1个盘子从B座经过A座移动到C座。 #includevoid hanoi(int n,int a,int b,int c) if(n=1) printf(%c-%cn,a,c); else hanoi(n-1,a,c,b); printf(%c-%cn,a,c); hanoi(n-1,b,a,c); void main() int n; printf(请输入盘数:n); scanf(%d,&
11、n); if(n1) printf(data error!n); else hanoi(n,A,B,C);程序如下:大学计算机基础网络信息中心教研室287.4.5 程序举例程序举例分析:数列具备递归条件 题目给出递推公式,F(n)=F(n-1)+F(n-2) 且有递归终止的条件 n=1或n=2是有确定值1大学计算机基础网络信息中心教研室297.4.5 程序举例程序举例大学计算机基础网络信息中心教研室307.5 数组作函数实参数组作函数实参数组元素作函数实参数组元素作函数实参 2数组名作函数实参数组名作函数实参多维数组名作函数实参多维数组名作函数实参大学计算机基础网络信息中心教研室317.5.1
12、 数组元素作函数实参数组元素作函数实参数组元素作函数实参,跟普通变量一样,是单向值传递。【例7-10】数组元素作函数实参的实例。#includevoid pan(int n) if(n0) printf(%d ,n); else printf(0 ); void main() int a5,i; printf(请输入5个数:n); for(i=0;i5;i+) scanf(%d,&ai); pan(ai); 大学计算机基础网络信息中心教研室327.5.2 数组名作函数实参数组名作函数实参 用数组名作为函数实际参数时,不是把数组元素的值传递给形式参数数组,而是把实参数组的起始地址传递给形参数组。
13、也就是说,使得两个数组就共用同一段存储单元。这种参数传递有时也可以称为“地址传递”。说明:(1) 应分别在主调函数和被调用函数中定义数组。(2) 实参数组应与形参数组类型保持一致。但允许(1) 实参数组与形参数组大小可以不一致。(2) 形参数组可以不指定大小,但数组名后面的方括号不能少。大学计算机基础网络信息中心教研室337.5.2 数组名作函数实参数组名作函数实参【例7-11】有一个数组score,内放10个学生成绩,求平均成绩。程序如下:#includemain( ) float average(float b10); float score10,aver; int i; printf (
14、“input 10 scores:n”); for (i=0;i10;i+) scanf (“%f”,&scorei); aver=average(score); printf (“average score is %5.2fn”,aver);大学计算机基础网络信息中心教研室347.5.2 数组名作函数实参数组名作函数实参float average (float b10) int i; float aver, sum=0; for (i=0;i10;i+) sum=sum+bi; aver=sum/10; return(aver);大学计算机基础网络信息中心教研室357.5.2 数组名作函数实
15、参数组名作函数实参【例【例7-12】形参数组可以不定义长度。float average(float array,int n) int i; float aver,sum=0; for(i=0;in;i+) sum+=arrayi; aver=sum/n; return aver; #includevoid main() float average(float array,int n); float score1=98.5,97,91.5,60,55; float score2=67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5; printf(score1的平均
16、值是%6.2fn,average(score1,5); printf(score2的平均值是%6.2fn,average(score2,10);大学计算机基础网络信息中心教研室367.5.3 多维数组名作函数实参多维数组名作函数实参 数组B: 11,52,56,67,25 45,89,54,69,89 96,63,68,79,86 编写一个函数,求任意二维数组中所有奇数的平方根之和。通过调用该过程计算并输出PA+PB的值(保留5位小数);其中PA为数组A中所有奇数平方根的和,PB为数组B中所有奇数平方根的和。两个数组的数据分别如下:数组A: 23,45,56,13,34 34,74,85,54
17、,76 56,98,56,76,67 98,54,83,12,59 33,87,74,48,62大学计算机基础网络信息中心教研室37#include#includemain()int55=23,45,56,13,34,34,74,85,54,76,56,98,56,76,67,98,54,83,12,59,33,87,74,48,62;int b35=11,52,56,67,25,45,89,54,69,89,96,63,68,79,86;float pa,pb;pa=sum(a,5,5);pb=sum(b,3,5);printf(%.5fn,pa+pb);7.5.3 多维数组名作函数实参多维
18、数组名作函数实参大学计算机基础网络信息中心教研室38float sum(int a,int m,int n) int i,j; float s=0; for(i=0;im;i+) for(j=0;jn;j+) if(ai*n+j%2!=0) s+=sqrt(ai*n+j); return s;7.5.3 多维数组名作函数实参多维数组名作函数实参大学计算机基础网络信息中心教研室397.6 变量的作用域与存储类别变量的作用域与存储类别变量的作用域变量的作用域2变量的存储类别变量的存储类别大学计算机基础网络信息中心教研室407.6.1 变量的作用域变量的作用域(1)在一个函数内部定义的变量是局部变量
19、, 只能在函数内部使用。 (2)在主函数内部定义的变量也是局部变量, 其它函数也不能使用主函数中的变量。 (3)形式参数是局部变量。 (4)在复合语句中定义的变量是局部于复合语句的变量, 只能在复合语句块中使用。 (5)局部变量在函数被调用的过程中分配存储单元,结束调用时释放内存。 (6)同一个函数内有局部变量不允许重名,但不同函数中局部变量可以重名。 局部变量局部变量 1内部变量大学计算机基础网络信息中心教研室417.6.1 变量的作用域变量的作用域main () int k , a=0; for (k=1; k=2; k+) int a=1; a+; printf (“k=%d,a=%dn
20、”,k, a); printf (“k=%d,a=%dn”,k, a);局部变量举例:局部变量举例:大学计算机基础网络信息中心教研室427.6.1 变量的作用域变量的作用域全局变量全局变量 2(1) 在函数外部定义的变量是全局变量, 其作用域是变量定义位置至整个程序文件结束。 (2)非必要时不要使用全局变量:整个过程中全局变量都要占存储单元;降低了函数的通用性 ;降低程序的清晰性。(3)如果在同一个源文件中,全局变量与局部变量同名,则在局部变量的作用范围内,全局变量不起作用。外部变量大学计算机基础网络信息中心教研室437.6.1 变量的作用域变量的作用域全局变量被局部变量屏蔽实例全局变量被局部
21、变量屏蔽实例#includeint a=1; /*定义全局变量定义全局变量*/f( ) int a=2; /*定义局部变量定义局部变量*/ printf (“f:a=%dn”,a);g( ) printf (“g:a=%dn”,a);main( ) int a=3; /*定义局部变量*/ printf (“main:a=%dn”,a); f( ); g( );大学计算机基础网络信息中心教研室447.6.2 变量的存储类别变量的存储类别静态存储方式:静态存储方式: 指在程序运行期间分配固定的存储空间的方式。指在程序运行期间分配固定的存储空间的方式。动态存储方式:动态存储方式: 指在程序运行期间根
22、据需要进行动态分配存储空间的方式。指在程序运行期间根据需要进行动态分配存储空间的方式。大学计算机基础网络信息中心教研室457.7 内部函数和外部函数内部函数和外部函数内部函数内部函数 2外部函数外部函数大学计算机基础网络信息中心教研室467.7.1 内部函数内部函数如果一个函数只能被本文件中其他函数所调用,称它如果一个函数只能被本文件中其他函数所调用,称它为内部函数为内部函数(静态函数静态函数)。在定义内部函数时,在函数。在定义内部函数时,在函数名和函数类型前面加名和函数类型前面加static,即:,即: static 类型标识符类型标识符 函数名函数名 (形参表形参表)例如:例如:static int fun (int a,int b) 内部函数又称静态函数,只局限于所在文件,不同内部函数又称静态函数,只局限于所在文件,不同文件中的同名函数互不干扰。文件中的同名函数互不干扰。大学计算机基础网络信息中心教研室477.7.2 外部函数外部函数在定义
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 手工家具订购合同9篇
- 主题教育活动讲党课
- 办公场所卫生监督体系构建
- 2025襄阳职业技术学院辅导员考试试题及答案
- 2025西安科技大学辅导员考试试题及答案
- 2025辽宁警察学院辅导员考试试题及答案
- T/ZHCA 008-2019眼霜类化妆品眼刺激性试验体外测试方法鸡胚绒毛膜尿囊膜血管试验
- 统计问卷调查设计
- 小班安全活动:老虎嘴安全教育
- T/ZBH 001-2017建筑玻璃外观质量要求及评定
- 2024年越南电信 服务领域ICT投资趋势行业现状及前景分析2024-2030
- 厦门2024年福建厦门市儿童医院(复旦大学附属儿科医院厦门医院)招聘笔试历年典型考题及考点附答案解析
- 2023年湖南省普通高等学校对口招生考试机电类专业综合知识试题附答题卡
- 医院用工合同医院用工合同书(2024版)
- 管培生培养方案
- 口腔正畸学之矫治器及其制作技术常用器械课件
- 2024届江苏省淮安市数学高一下期末考试试题含解析
- JTG-H30-2015公路养护安全作业规程
- 危险化学品考试试题(含答案)
- 2024年济南天桥区九年级中考英语一模考试试题(含答案)
- 网红打卡地打造策划思路
评论
0/150
提交评论