C语言程序设计教案---第八章-函数_第1页
C语言程序设计教案---第八章-函数_第2页
C语言程序设计教案---第八章-函数_第3页
C语言程序设计教案---第八章-函数_第4页
C语言程序设计教案---第八章-函数_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

1、第八章 函 数课题:第八章 函数 14教学目的:1、掌握函数定义的一般形式2、掌握函数调用的一般形式教学重点:教学难点:函数定义、调用的一般形式形式参数和实际参数步骤一 复习引导一个C语言源程序可由一个主函数和若干个辅助函数组成。由主函数调用其他函数,其他函数也可以互相调用。步骤二 讲授新课8.1 概述例8.1main( ) printstar( ); print_message( ); printstar( );printstar( ) printf( “ * n”); print_message( ) printf(“How do you do ! n”); 说明:F 1、一个源程序文件由

2、一个或多个函数组成。一个源程序文件是一个编译单位。F 2、一个C程序由一个或多个源程序文件组成。这样可以分别编写、分别编译,提高调度效率。F 3、C程序的执行从main 函数开始,在main函数中结束整个程序的运行。F 4、所有函数都是平行的,即函数不能嵌套定义,函数可以互相调用,但不能调用main函数。F 5、从用户使用的角度看,函数有两种:标准函数(库函数)和用户自己定义的函数F 6、从函数的形式看,函数分为两类:无参函数和有参函数8.2 函数定义的一般形式(一)无参函数的定义形式 类型标识符 函数名( ) 函数体(包括声明部分和执行部分) 例: printstar( ) printf(

3、“ * n”); (二)有参函数定义的一般形式 类型标识符 函数名(形式参数表) 函数体(包括声明部分和执行部分) 例如:int max(int x, int y) int z; z=xy?x:y; return (z);(三)一个函数可以是空函数 如 dummy( ) 8.3 函数参数和函数的值(一)形式参数和实际参数 形式参数:定义函数时函数名后括号中的变量名,简称形参; 实际参数:调用函数时函数名后括号中的表达式,简称实参。例:main( ) int a,b,c; scanf(“%d,%d”,&a,&b); c = max(a, b); /*调用max函数*/ printf(“max=%

4、d”,c);int max(int x ,int y) /*定义max函数*/ int z; z=xy?x: y; return(z);关于形参和实参的说明: 形参在未出现函数调用时,并不占内存中的存储单元。只有在发生函数调用时,函数中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。2、实参可以是常量、变量或表达式,如:c = max(3,a+b);但要求它们有确定的值。在调用时将实参的值赋给形参(如果形参是数组名,则传递的是数组的首地址,而不是变量的值。)3、在被定义的函数中,必须指定形参的类型;4、实参与形参的类型应一致。5、C语言规定,实参对形参的数据传递是“值传递”,

5、即单向传递。在内存中,实参单元与形参单元是不同的单元。(二)函数的返回值1、return语句 return (表达式); 或:return 表达式; 或:return; 或:函数执行到最后遇到 “”return语句的用途有二:(1)用于结束函数的执行并返回到调用者;(2)用来向调用者传递一个返回值。F 注意:该语句对非void函数适用。2、函数值的类型 如: int max(x,y) char letter(c1, c2) double min(x, y)C语言默认函数返回值为int型。3、函数值的类型和return语句中表达式的值不一致,则以函数类型为准; main() float a, b

6、; int c; scanf(“%f,%f”,&a,&b); c=max(a,b); printf(“Max is %dn”,c); max(float x, float y) float z; z = xy? x: y; return (z); 若输入的数据情况为:1.5, 2.5则输出的结果为:Max is 24、如果被调函数中没有return语句,则函数带回一个不确定值。5、为了明确表示“不带回值”,可以用“void ”定义“无类型”(或称“空类型”)。如:void print_message( ) printf(“How do you do!n”); 8.4 函数的调用要正确实现函数间

7、的相互调用需满足下列条件:第一,被调用函数必须存在且允许调用;第二,必须给出满足函数运行时要求的参数;第三,在调用一个函数之前一般应该对被调用函数进行声明。(一)函数声明的一般形式 函数类型 函数名(参数类型1,参数类型2, , 参数类型n);或:函数类型 函数名(参数类型1 参数名1,参数类型2 );如:int print(char format, ); char fun2(int i, char p1); float add(float , float);注意:函数声明与函数定义不同!(二)函数调用的一般方法函数调用形式: 函数名(实参表列);1函数语句如:前述例子中的 print();2

8、函数表达式 如:c=max(a,b);3函数参数 如:m=max(a, max(b,c); printf(“%d”, max(a,b);int f(int a, int b) int c; if (ab) c=1; else if(a= =b)c=0; else c=-1 return(c);例:main( ) int i=2, p; p=f(i, +i); printf(“%d”,p); TC环境下,按自右而左的顺序求值。此例 f(i, +i) f(3,3)例:计算组合C(m,n)=m!/(n!(m-n)!)main() int m, n; long cmn, temp; long fact

9、or(int); scanf(“%d %d”,&m,&n); cmn=factor(m); temp=factor(n); cmn=cmn/temp; cmn=cmn/factor(m-n); printf(“%ldn”,cmn);步骤三 课堂小结1、 有参函数的定义形式2、 形参和实参的区别3、 函数的声明和调用步骤四 布置作业书面作业:(第八章课后练习)8.1课题:第八章 函数 57教学目的:1、掌握函数的嵌套调用和递归调用2、掌握虚实结合教学重点:教学难点:嵌套和递归调用、数组作为函数参数递归调用、虚实结合步骤一 复习引导float root(float x1, float x2) in

10、t i; float x,y,y1; y1=f(x1); do x=xpoint(x1,x2); y=f(x); if (y*y10) y1=y; x1=x; else y2=y; x2=x; while(fabs(y)=0.0001); return(x);步骤二、讲授新课8.6 函数的递归调用直接或间接调用自身的函数为递归函数。一个问题采用递归方法来解决时必须符合以下条件:(1)可将一个问题转化为具有同样解法的规模较小的问题;(2)必须有明确的结束条件。 例8.7:有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁,问第4个人的岁数,他说比第3个人大2岁,问第3个人的岁数,他说比第2

11、个人大2岁,问第2个人,他说比第1个人大2岁,问第一个人,他说是10岁。请问第5个人的岁数?(P158)分析:显然这是一个递归问题。即:age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10程序:age(int n) int c; if(n= =1) c=10; else c=age(n-1)+2; return (c);main( ) printf(“%d”,age(5);例8.8:利用递归求 n!(P160)例:Fibonacci数列已在前面定义过,用递归函数求此数列的第n项。fib(int n) int

12、f; if(n= =0 | n= =1) f=1; else f=fib(n-1)+fib(n-2); return(f); 习题8.13: 用递归方法求n阶勒让德多项式的值,递归公式为: 1 (n=0)Pn(x)= x (n=1) (2n-1)xPn-1(x)-(n-1)Pn-2(x)/n (n1)main() int x, n; float p(int ,int); printf(“n Input n & x:”); scanf(“%d,%d”,&n,&x); printf(“n=%d,x=%dn”,n,x); printf(“P%d(%d)=%6.2f”,n,x,p(n,x);float

13、 p(int n, int x) if(n= =0) return(1); else if (n= = 1) return(x); else return( (2*n-1)*x-p(n-1),x)-(n-1)*p(n-2),x)/n );例:双递归。这段程序的结果是_void f(int b, int t) int m; if(bt) m=(b+t)/2; printf(“%dn”,m); f(b,m-1); f(m+1,t); main() f(1,6); 8.7 数组作为函数参数虚实结合(哑实结合)一、数组元素作函数实参值传递:用赋值的方法,把实在参数的值赋给被调函数对应的形式参数。 n

14、不希望破坏调用函数中作为实在参数对象的值时,使用“值传递”方式;n 注意:数组元素作为函数实参时如同简单变量。二、数组名作函数参数地址传递:指形参与实参结合的不是数据本身,而是把数据的地址传递给被调用函数。结合后的形参与实参都指向同一个存储区。F 在函数间传递一批数据时,一般采用“地址传递”方式。例8.13:用选择法对数组中10个整数按由小到大排序。main() int a10,i; printf(“enter the arrayn”); for(i=0; i10; i+) scanf(“%d”,&ai); sort(a,10); printf(“the sorted array:n”); f

15、or(i=0; i10; i+) printf(“%d”,ai); printf(“n”);三、多维数组名作函数参数main() static int a34=1,3,5,7, 2,4,6,8,15,17,34,12; printf(“max value is %n”, max_value(a); 步骤三 课堂小结函数的嵌套调用和递归调用,注意调用的过程数组作为函数参数有两种情况:传递数组元素的值、传递数组名步骤四 布置作业书面作业:(第八章课后练习)8.2、8.17、15课题:第八章 函数 8-10教学目的:1、 掌握局部变量和全局变量的作用范围2、 掌握变量的存储类别,了解内部函数和外部函

16、数教学重点:教学难点:局部变量和全局变量、变量的存储类别变量的作用域和生存期步骤一、复习引导在函数调用过程中,不仅要注意实参和形参的数据结合,而且要注意各个变量的作用域和生存期。步骤二、讲授新课8.8 局部变量和全局变量一、局部变量在一个函数内部定义的变量是内部变量,它只在本函数范围内有效。二、全局变量在函数之外定义的变量称为外部变量,即全局变量(全程变量)。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。l 使用全局变量可以增加函数间的数据联系;例8.15:有一个一维数组,内放10个学生成绩,写一函数,求出平均分,最高分和最低分。float max=0

17、,min=0;float average(float array,int n) int i; float aver,sum=array0; max=min=array0; for(i=1; imax) max=arrayi; else if(arrayimin) min=arrayi; sum=sum+arrayi; aver=sum/n; return(aver);main()float ave,score10; int i; for(i=0;ib?a:b; return(c);main() int a=8; /*a局部变量*/ printf(“%d”,max(a,b);8.9 变量的存储类

18、别从变量的作用域(空间)来分,为全局和局部变量。从变量值存在的(生存期)时间来分,可以分为:一、动态存储方式与静态存储方式静态存储方式:指在程序运行期间分配固定的存储空间的方式。动态存储方式:在程序运行期间根据需要进行动态的分配存储空间的方式。二、auto变量n 调用函数时系统自动分配存储空间,在函数调用结束时自动释放这些存储空间,称这类局部变量为自动变量。n 自动变量用关键字auto作存储类别的声明。它也可省。三、用static声明局部变量n 函数中变量的值在函数调用结束后不消失而保留原值,在下次该函数调用时,该变量已有值,即为上一次函数调用结束时的值。该局部变量为静态局部变量。main()

19、 int a=2, i; for( i=0; i3; i+) printf(“%d”,f(a);运行结果为:_说明:1、静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期都不释放。 自动变量属于动态存储类别,占动态存储区空间而不占静态存储区空间,函数调用结束后即释放。2、对静态局部变量在编译时赋初值,程序运行时,它已有初值,以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。 对自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值。3、对静态局部变量来说,如不赋初值,编译时自动赋初值0或空字符。 对自动变量来说,如不赋初值

20、,它的值是一个不确定的值。4、虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引用。四、register变量将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存中去存取。这种变量称为寄存器变量。说明:F 1、只有局部自动变量和形式参数可作为register变量。F 2、不能定义任意多个寄存器变量。F 3、局部静态变量不能定义为寄存器变量。五、用extern声明外部变量1、在一个文件内声明外部变量例:main() extern A; /*外部变量声明*/ printf(“%d”,A); int A=13; /*定义外部变量*/2、在多文件的程序中声明外部变

21、量例:用extern将外部变量的作用域扩展到其他文件。文件file1.c中的内容为:int A;main() int power(int);/*对调用函数作声明*/ int b=3,c; scanf(“%d”, &A); c=A*b; printf(“%d*%d=%dn”,A, b, c); 六、用static声明外部变量在定义外部变量时,加一个static声明,可以使此变量只能用于本文件中。注:对外部变量加或不加static声明,都是静态存储,只是作用范围不同,都是在编译时分配内存的。l 用static来声明一个变量的作用有二:1、对局部变量用static声明,则为该变量分配的空间在整个程序

22、执行期间始终存在。2、全局变量用static声明,则该变量的作用域只限于本文件模块。另注:用auto、register、static声明变量时,是在定义变量的基础上加这些关键字,而不能单独使用。F 如:int a; /*定义整型变量a*/ static a; /*对变量a声明为静态变量*/此用法不对。编译时会被认为“重新定义”。七、关于变量的声明和定义一般讲,把建立存储空间的声明称定义,而把不需要建立存储空间的声明称为声明。n 例: main() extern A; /*是声明不是定义*/ int A; /*是定义*/注:1、外部变量的定义只能一次,它在所有函数之外,而同一文件中的外部变量的声明可以有多次,它可在函数内也可在函数外。2、对外部变量的初始化只能在定义时

温馨提示

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

评论

0/150

提交评论