版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第七章 函 数 本课主要内容: 函数定义 函数调用 利用函数编制程序第1页第1页在第一章简介过C语言程序设计主要思想是结构化程序设计。结构化程序设计中心思想:自顶向下,逐步求精。将复杂问题分解为多个简朴子问题。相应一个子问题求精程序段,作为一个单独程序模块,称为函数。也就是说,函数是独立完毕某一功效小程序段。7.1 函数引入第2页第2页 A块条件? B块 C块 D块是否第3页第3页C是模块化程序设计语言C程序结构C是函数式语言必须有且只能有一个名为main主函数C程序执行总是从main函数开始,在main中结束函数不能嵌套定义,能够嵌套调用第4页第4页1无参函数定义 形式: 类型标识符 函数名
2、() 阐明部分 语句 7.2 函数定义比如: main( ) int a=5,b=9 ; printf(“ %dn ” , a*b*b ); 阐明:若不带回函数值,类型标识符也能够不写,无参函数普通用于完毕指定一组操作。第5页第5页2有参函数定义形式: 类型标识符 函数名(形式参数表列) 形式参数阐明 阐明部分 语句 如: int max( x, y ) int x , y; int z ; z=xy ? x : y ; return ( z ) ; 空函数定义形式: 类形标识符 函数名() 备以后扩充。第6页第6页 一、形式参数 和 实际参数形式参数 : 定义函数时,括号中阐明变量名 ;实际
3、参数 : 调用函数时,括号中给定表示式 。7.3 函数参数和函数值第7页第7页 int max( x ,y ) /* x , y 为形参 */ int x,y; int z; z=xy?x:y; return (z); main() int a,b,c; scanf (“%d,%d”,&a,&b); c=max( a ,b ); /* a , b 为实参 */ printf (“max is %dn”,c); 第8页第8页函数参数及其传递方式形参与实参形式参数:定义函数时函数名后面括号中变量名实际参数:调用函数时函数名后面括号中表示式c=max(a,b);(main 函数)(max 函数)ma
4、x(int x, int y) int z; z=xy?x:y; return(z); 例 比较两个数并输出大者main() int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c);max(int x, int y) int z; z=xy?x:y; return(z);形参实参第9页第9页 1 定义函数时,形参不占内存单元 ; 调用函数时,形参才分派内存单元 ; 调用结束后,形参所占内存单元被释放。 2 实参能够是常量、变量或表示式, 但必须有确切值。 3 定义函数,必须指明形参类型。 4 实参与形参类型一致。 5 实参变
5、量对形参变量数据传递是“ 值传递 ”,即 单向 传递。 6 可在“形参表列”中阐明形参类型。 int max( int x , int y ) 阐明 :第10页第10页阐明 : 1 通过 return 语句取得返回值 ; 能够有一个以上 return 语句。 2 定义函数时指定函数值类型; 不加类型阐明,按整型处理。 3 函数值类型和 return 语句中表示 式值不一致时,以函数类型为准。 4 被调用函数中没有 return 语句时, 带回一个不拟定值。 5 为了明确表示“不带回值”,能够用“ void ” 定义 “ 无类型 ”。 二、 函数返回值第11页第11页 一、 函数调用普通形式:函
6、数名(实参表列)7.4 函数调用阐明 : 1 无参函数,括号不能省 ; 2 实参表列中,各实数与形参在 个数、顺序、 类型上一一相应,参数间用逗号分隔。第12页第12页 1 被调函数必须存在 ; 2 用 #include 命令包括相关库函数 ; 3 被调用函数普通应在主调函数前定义 或阐明其类型 (整型 ,字符型除外); 4 假如在文献开头,已阐明了被调函数类 型,则主调函数中不必再作类型阐明。对被调用函数阐明第13页第13页例题3: 读程序,写出结果。 (program7-1)printstar( ) printf(“*”);printw( ) printf(“?”);printd( ) p
7、rintf(“$”);main( ) int i; for(i=0;i2;i+) printstar( ); for(i=4;i3;i-) printw( ); printstar( ); printd( ); printw( ); getch( );演示第14页第14页不能嵌套定义函数,能够嵌套调用函数 。main 函数a 函数b 函数 调用 a 函数 调用 b 函数 结束 7.5 函数嵌套调用在调用一个函数过程中又调用另一个函数称为函数嵌套调用。第15页第15页 int gcd(a,b)int a,b; int r,t; if (ab) t=a; a=b; b=t; r=a%b; whil
8、e (r!=0) a=b; b=r; r=a%b; return (b); 例 写两个函数,分别求两个整数最大公约数和最小 公倍数,用主函数调用这两个函数,并输出结果 。int lcm(a,b) int a,b; int r; r=gcd(a,b); return(a*b/r);main() int x,y; scanf (%d%d,&x,&y); printf (%dn,gcd(x,y); printf (%dn,lcm(x,y);第16页第16页在调用一个函数过程中又出现直接或间接地调用该函数本身,称为函数递归调用 。 如 f 函数 f1 函数 调用 f 函数 调用 f2 函数 7.6 函
9、数递归调用第17页第17页 float fac(n) int n; float f; if (n0) printf (n0,data errorn); else if (n= =0|n= =1) f=1; else f=fac(n-1)*n; return (f); main() int n; float y; scanf (%d,&n); y=fac(n); printf (%d!=%15.0f,n,y); /*用递归法求 n! */演示7ex-fac.c第18页第18页 一、 数组元素做函数实参 与变量做实参同样 。7.7 数组作为函数参数第19页第19页float average(arr
10、ay) float array10; int i; float aver,sum=array0; for (i=1;i10;i+) sum=sum+arrayi; aver=sum/10; return(aver); 二、 数组名作函数参数,实参与形参都应用数组名。 例 : 数组 score 存储 10 个学生成绩,求平均成绩 。main() float score10,aver; int i; for (i=0;i10;i+) scanf (“%f”,&scorei); aver=average(score); printf (“average score if %5.2f”,aver);
11、阐明 : 1 数组名作函数参数,应在主调函数和被调函数中分别定义数组 ; 2 实参数组与形参数组类型应一致 ; 3 实参数组与形参数组大小能够一致也能够不一致 ,形参数组能够不指定大小( 用 )。第20页第20页max_value(array) int array4; int i,j,k,max; max=array00; for i=0;i3;i+) for (j=0;jmax) max=arrayij; return(max); main() static int a34=1,3,5,7,2,4,6,8,15,17,34,12; printf (max=%dn,max_value(a);
12、例 2有一个34矩阵,求其中最大元素 。第21页第21页例 4 求 33 矩阵转置 main() static int a33=1,3,5,2,4,6,15,17,34; int i,j; turn(a); for (i=0;i3;i+) for (j=0;j3;j+) printf (%5d,aij); printf (n); void turn(array) int array3; int i,j,k; for (i=0;i3;i+) for (j=0;ji;j+) k=arrayij; arrayij=arrayji; arrayji=k; 第22页第22页 一、 局部变量 只在函数内有
13、效变量 。float f1(a)int a; int b,c; .a , b, c 有效7.8 局部变量和全局变量第23页第23页char f2(x,y) int x,y; int i,j; .main ( ) int m,n; .x ,y ,i ,j 有效 m ,n 有效第24页第24页 说明 : 1 每个函数中定义变量,只在定义它函数中有效 ; 2 不同函数能够使用相同名字变量,但意义不同 ; 3 形式参数也是局部变量 ; 4 能够在复合语句中定义变量,但它们只在本复合语句中有效 。第25页第25页 main ( ) int a,b; . int c; c=a+b; . . c 有效范围
14、a , b 有效范围第26页第26页 1 外部变量 : 在函数之外定义变量; 2 外部变量是全局变量 ; 3 作用范围: 从定义变量位置开始到本源文献结束 二、 全局变量第27页第27页 int p=1,q=5; /* 外部变量 */ float f1(a) int a; int b,c;. char c1,c2; /* 外部变量 */ char f2(x,y) int x,y; int i,j;. main ( ) /*主函数*/ int m,n; . 全局变量c1,c2作用范围全局变量p,q作用范围第28页第28页 1 作用 :提供一个函数间数据联络与共享方法 ; 2 尽也许不用全局变量
15、; 1) 占内存 2) 藕合性强 3)维护性差 3 用 extern 实现先引用 ,后定义 。 4 外部变量与局部变量同名时,局部变量屏蔽外部 变量 。 全局变量阐明 :第29页第29页 main() float ave,score10;int I; for (i=0;i10;i+) scanf (“%f”,&scorei); ave=average(score,10); printf (“%6.2f,%6.2f,%6.2fn”,max,min,ave); 例 : 在一维数组中存储10个学生成绩,写 一个函数,求出平均分,最高分和最低分。第30页第30页float max=0,min=0;fl
16、oat average(array,n)float array ;int n; int i; float aver,sum=array0; max=min=array0; for (i=1;imax) max=arrayi; else if (arrayiy?x:y; return(z);main() extern a,b; /*外部变量阐明*/ printf (“%dn”,max(a,b);int a=13,b=-8; /*外部变量定义*/ 例 :第32页第32页 int a=3,b=5; /* a,b为外部变量 */ max(a,b) int a,b; /* a,b为局部变量 */ int
17、 c; c=ab? a : b; return(c); main() int a=8; /* a为局部变量 */ printf (“%d”,max(a,b); 形参a,b作用范围局部变量 a作用范围全局变量 b作用范围第33页第33页 一、 变量存储类别 1 静态存储变量 :程序运营期间分派固定 存储空间,存储全局变量。 2 动态存储变量 :依据需要动态分派存储空间 , 存储 : 1) 函数形参变量 ; 2) 局部变量(未加 static 阐明); 3) 函数调用时现场保护和返回地址等 。7.9 动态存储变量与静态存储变量第34页第34页 1 局部动态变量 : ( auto ) 1) 函数调用
18、后,值不予保留,即释放存储空间 。 2) 再次调用时,原值不能引用 。 2 局部静态变量 : ( static ) 1) 函数调用后保留原值,即不释放所占存储空间 ; 2) 再次调用时,原值在本函数内仍可使用 。二、 局部变量存储方式第35页第35页f(a) int a; auto int b=0; static int c=3; b=b+1;c=c+1 return(a+b+c);main() int a=2,i; for (i=0;i3;i+) printf(“%d ”,f(a); 例 :演示7varsave.c区别:局部静态变量和局部动态变量(参上页) 结果为7 8 9 ,若将stati
19、c改为 int(动态),结果为7 7 7 第36页第36页 1 局部静态变量在静态存储区内分派存储单元, 程序整个运营期间不释放 ; 2 编译时赋初值一次,以后每次调用不再重新赋初值, 而是保留上次函数调用结束时值 ; 3 定义时不赋初值,编译时自动赋初值 0 ; 4 定义全局变量和局部静态变量时,才干对数组初始化 ; 5 不能被其它函数引用 。 阐明 :第37页第37页 3 存储器变量 :( register ) 阐明 : 1) 提升执行效率 ; 2) 只有局部自动变量和形式参数能够作为 存储器变量 。第38页第38页 三、 全局变量1 函数外部定义 ; 2 编译时分派静态存储区 ; 3 引
20、用另一个文献中全局变量 : 在引用它文献中用 extern 阐明 。 4 只被本文献中函数引用 : 在定义外部变量时,前面加 static 阐明。第39页第39页 1 按作用域分为局部变量和全局变量 存储类别: 自动变量,即动态局部变量(离开参数,值就消失) 局部变量静态局部变量(离开参数,值仍保留) 存储器变量(离开参数,值就消失)(形式参数能够定义为自动变量或存储器变量) 全局变量静态外部变量(只限本文献引用) 外部变量(即非静态外部变量,允许其它文献引用) 四、 存储类别小结第40页第40页 2 按存在时间分为动态存储和静态存储两种类型静态存储是程序整个运营期间都存在 ; 动态存储则是在调用函数时暂时分派单元 。 自动变量(auto)(本函数内有效)动态存储存储器变量(register)(本函数内有效)形式参数静态局部变量(static)(函数内有效)静态存储静态外部变量(static)(全局有效)外部变量(extern)(其它文献可引 用,碰到
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新改扩建安全三同时制度及流程
- 成人安宁疗护多学科照护管理共识
- 2025-2026学年夏侯惇教学设计数学
- 242蓝橙简约网格斜线背景的在校大学生职业生涯规划模板下载
- 2025-2026学年燕子专列教学设计英语
- 数学第二十一章 四边形-平行四边的性质和判定综合训练课件 2025-2026学年人教版数学八年级下册
- 2025-2026学年大班爱牙教案
- 2025-2026学年望天门山教学设计美术
- Happy Holiday (Period 1)课件-2025-2026学年人教版英语八年级上册
- 2026中国铝业校招题库及答案
- 学校卫生综合评价表
- ISO9001:2015中英文对照版
- 毕业设计(论文)-全功率燃料电池汽车整车热管理系统设计与分析
- 人教版七年级上册英语期末考试题以及答案
- IE-工业工程基础(清华大学教材)课件
- 数学物理分析方法-解析函数
- 海外汽车认证检测项目及法规列表(中英文)
- 《农业推广学》课程教学大纲
- 丽声北极星自然拼读绘本第一级Tess and the Swans 课件
- 河港工程设计规范jtj_212-2006
- Y620优众变频器说明书
评论
0/150
提交评论