C语言电子教案第6章函数_第1页
C语言电子教案第6章函数_第2页
C语言电子教案第6章函数_第3页
C语言电子教案第6章函数_第4页
C语言电子教案第6章函数_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第6章 函数,教学目标: 1.领会函数在C语言程序中的作用; 2.会运用函数调用的原则和参数传递方式; 3.会运用简单的递归算法; 4.能够分析C语言程序中变量的作用域和生存期。,本章结构,概述 函数的定义 函数的参数和返回值 函数的调用 数组作为函数参数 函数的嵌套调用 函数的递归调用 外部变量与内部变量 静态变量与自动变量 变量的存储类别 多文件程序的编译与连接,6.1概述,C语言程序是一种独特的模块结构, 每个模块都是一个函数 有且只能有一个名为main的主函数 main可以调用其他函数,但其他函数不能调用主函数,自定义函数的作用,函数分类:,从用户角度 主函数:名为main的函数 标准

2、函数(库函数):由系统提供 用户自定义函数 从函数形式 无参函数 有参函数,类型标识符 函数名(形参列表)/*函数头*/ 说明部分 /*函数体*/ 语句部分 ,例 int max(int x,int y) int z; z=xy?x:y; return(z); ,例 无参函数 printstar( ) printf(“*n”); ,6.2 函数定义的一般形式,6.3函数参数和返回值,6.3.1形式参数与实际参数,max(int x, int y) int z; Z=xy?x:y; return(z); ,main() int a,b; a=2;b=3; Printf(“%d”,max(a,b)

3、; ,实际参数,形式参数,返回语句 形式: return(表达式); 或 return 表达式; 或 return; 功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数 说明: 函数中可有多个return语句 若无return语句,遇时,自动返回调用函数,6.3.2函数的返回值,float area(float a,float b) float s; s=a*b; return(s);,6.4.1 函数调用的一般形式,6.4 函数的调用,函数名(实参表),函数语句: 例 printstar(); printf(“Hello,World!n”); 函数表达式: 例 m=max(

4、a,b)*2; 函数参数: 例 printf(“%d”,max(a,b); m=max(a,max(b,c);,函数的调用方式,对被调用函数要求: 必须是已存在的函数 库函数: #include 用户自定义函数: 函数类型说明 函数说明 一般形式: 函数类型 函数名(形参类型 形参名,. ); 或 函数类型 函数名(); 作用:告诉编译系统函数类型、参数个数及类型,以便检验 函数定义与函数说明不同 函数说明位置:程序的数据说明部分(函数内或外) 下列情况下,可不作函数说明 若函数返值是char或int型,系统自动按int型处理,函数说明,实参必须有确定的值 形参必须指定类型 形参与实参类型一致

5、,个数相同 若形参与实参类型不一致,自动按形参 类型转换函数调用转换 形参在函数被调用前不占内存;函数调用 时为形参分配内存;调用结束,内存 释放,函数参数说明,(1)值传递:函数调用时,为形参分配存储单元,并将实参的值传送到形参中;调用结束时,形参单元释放,实参单元仍保留并维持原值 特点: 形参和实参占用不同的内存单元 单向传递,参数传递方式,(2)地址传递:函数调用时,将数据的存储地址作为参数传递给形参 特点: 形参与实参占用同样的存储单元 实现了数据的“双向”传递 实参和形参必须是地址,利用自定义函数计算:1!+2!+5!,fact(n) /*阶乘函数*/ int i,t=1; for(

6、i=1;i=n;i+) t=t*i; return(t); /*返回阶乘值*/ ,main() int i,sum=0; for(i=1;i=5;i+) sum=sum+fact(i); /*调用阶乘函数,之后进行累加*/ printf(sum=%dn,sum); ,music(hz,t) int i; sound(hz); /*演奏音阶*/ for(i=0;i=t;i+) /*以延时形成节拍*/ delay(2000000000); nosound(); ,模拟电子琴键盘,#include #include #include #include main() char i=1,j;int hz

7、,t; while (i=getch()!=x1b) /*Esc键退出演奏*/ switch(i) casea:hz=262;break; case s:hz=294;break; case d:hz=330;break; case f:hz=349,;break; case j:hz=392;break; case k:hz=440;break; case l:hz=494;break; case ;:hz=523;break; case m:hz=523;break; case ,:hz=523;break; case .:hz=523;break; default:break; if(k

8、bhit() ,调用结束:,#include swap(int a,int b) int temp; temp=a; a=b; b=temp; main() int x=6,y=9; printf(x=%d,ty=%dn,x,y); swap(x,y); printf(x=%d,ty=%dn,x,y); ,交换两个变量的值:,x,y:,6,9,6,9,9,6,9,6,x,y:,6,9,b:,a:,y:,x,结果:x=6 y=9,6.5 数组作为参数,数组作为参数时: 实参数组的首地址传给形参,sort(int b) /*形参b长度不定*/ , int a11; sort(a); /*实参a长度

9、11*/ ,首地址,例6-9 调用自定义排序函数对数组排序,main() int i,a11=0; void sort(int b11); for(i=1;i=10;i+) scanf(%d,/*输出已排序的数组a*/,/*调用*/,void sort(int b11) int i,j,t; for(i=1;ibj-1) t=bj;bj=bj-1;bj-1=t; for(i=1;i=10;i+) printf(%6d,bi); ,/*自定义函数中输出排序后的数组b*/,6.6 函数的嵌套,主函数 main(),子函数 fun1(),子函数 fun2(),#include main() int

10、i,j,n,t,t1,t2,s411; void output(int score411); for(i=1;isnj-1) t=snj; snj=snj-1; snj-1=t; output(s); ,void output(int core411) int i,j; print_line(); for(i=1;i=3;i+) printf(n|); for(j=1;j=10;j+) printf(%3d|,scoreij); printf(n);print_line(); ,print_line() int i; for(i=1;i=40;i+)putch(-);,6.7 函数的递归调用,

11、实质:子函数自身的调用,main( ) long fact(int), y ; int n; printf(Enter n(n0):); scanf(%d, ,long fact(int n) long f; if(n=0|n=1) f=1; else f=n*fact(n-1); return(f); ,/*递归时如果没有“如果”,一定是错误的!*/,6.8 外部变量与内部变量,内部变量(局部变量): 在一个函数内部起作用,外部变量(全局变量): 从定义开始处直到程序结束,6.8.1外部变量的定义,(1)在整个函数之前定义。如: float x,y; float average(x,y) f

12、loat aver; aver=(x+y)/2; return(aver); ,(2)在整个函数之后定义。如: float average(x,y) float aver; aver=(x+y)/2; return(aver); float x,y;,(3)在函数体之前,函数头部。如: float average(x,y) float x,y; float aver; aver=(x+y)/2; return(aver); ,6.8.2外部变量的作用范围,int x=2; main() void print(); int a=x; printf(a=%d x=%dn,a,x); print(a

13、); printf(a=%d x=%dn,a,x); void print(int a) a+;x+; printf(a=%d x=%dn,a,x); ,运行结果: a=2 x=2 a=3 x=3 a=2 x=3,/*外部变量*/,/*a为内部变量*/,6.9静态变量和自动变量,静态变量: 赋值后一直保留到程序结束。 自动变量: 每次调用值都可能发生变化,外部变量时静态变量; 内部变量如果没有特殊说明都是自动变量,静态变量的声明:,如:static int a=3;,static 类型名 变量名;,main() void print(); int a=2,b=2; static int c=2

14、; printf(a=%d b=%d c=%d n,a,b,c); print(a);print(a); printf(a=%d b=%d c=%d n,a,b,c); ,/*a,b为自动变量, 只在main中有效*/,/*c为静态局部变量,只在main中有效*/,void print(int a) int b=2; /*a,b为自动变量只在内部有效*/ static int c=2; /*c为静态局部变量,只在内部有效*/ a+;b+;c+; printf(a=%d b=%dc=%dn,a,b,c); ,a=2 b=2 c=2 a=3 b=3 c=3 a=3 b=3 c=4 a=2 b=2

15、c=2,6.10 变量的存储类别,auto:内部变量没有特别声明时 register:存取速度极快,但数量有限 static:外部变量为静态变量 extern:可作特别说明,6.11内部函数与外部函数,内部函数: 仅在文件内部调用 用static定义。如: static func1(int a,int b) ,外部函数: 可在多个文件中调用 用exturn定义。如: exturn func2(int x,int y) ,本章小结,1.学会自定义函数的编写和函数的相互调用关系,是程序设计的基本技能。函数之间是通过函数名和参数来建立联系的。 2.主调函数调用其它函数时提供的参数称为实在参数,被调函数中的参数称为形式参数。函数调用时,主调函数将实在参数传递给形式参数。 3.当被调用的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论