《C语言程序设计》课程教案 (2)
- 格式:doc
- 大小:29.50 KB
- 文档页数:5
《C语言程序设计》课程教案
课题 函数 课型 专业基础课
课时序 17 课时 2
授课时期 2014-05-30周五 13级电商1班 1-2节
2014-05-30周五 13级电商2班 3-4节
教学目的 1、掌握函数定义的形式
2、掌握函数的嵌套调用与递归调用
3、理解局部变量和全局变量
教学重点难点 重点:
1、函数的定义、调用
2、数组作为函数参数
难点:
1、函数的嵌套、递归调用
2、局部变量和全局变量的应用
教学方法 主要运用讲授法,兼用演示法。
教学内容提纲 7.1 概 述
7.2 函数定义的一般形式
7.3 函数参数和函数的值
课后小结 主要运用讲授法。(1.举例引导2.提问3.类比)利用多媒体课件进行教学,扩大课堂教学的信息量。
教学过程:
本章导读:
一个较大的程序一般应分为若干个程序模块,每一个模块用来实现一个特定的功能,所有的高级语言中都有子程序这个概念,用子程序来实现模块的功能。
在C语言中,子程序的作用是由函数来完成的。一个C程序可由一个主函数和若干个函数构成。由主函数来调用其它函数,其它函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。
7.1 概 述
一、问题的提出
main( )
{ printstar( ); /*调用printstar函数*/
print_message( ); /*调用print_message函数*/
printstar( ); /*调用printstar函数*/
} printstar( ) /*pirntstar函数*/
{ printf(″* * * * * * * * * * * * * * * * * *\n″); }
print_message( ) /*print_message函数*/
{ printf(″ How do you do!\n″); }
运行情况如下:
* * * * * * * * * * * * * * * * * *
How do you do !
* * * * * * * * * * * * * * * * * *
[说明]:本节问题中,printstar和print_message都是用户定义的函数名,分别用来输出一排星号和一行信息。现对函数在程序中的使用作几点说明:
1.一个源程序文件由一个或多个函数组成。一个源程序文件是一个编译单位,即以源文件为单位进行编译,而不是以函数为单位进行编译。
2.一个C程序由一个或多个源程序文件组成。
3.C程序的执行从main函数开始,调用其它函数后流程回到main函数,再在main函数中结束整个程序的运行。main函数是系统定义的。
4.所有函数都是平行的,即在定义函数时是互相独立的,一个函数并不从属于另一函数,即函数不能嵌套定义,但可以互相调用,但不能调用main函数。
5.从用户的角度看,函数有两种:
(1)标准函数,即库函数。
(2)用户自己定义的函数,以解决用户的专门需要。
6.从函数的形式看,函数分两类:
(1)无参函数。如本节问题中的printstar和print_message就是无参函数。
(2)有参函数。在调用函数时,在主调函数和被调用函数之间有参数传递。
7.2 函数定义的一般形式
一、 问题的提出
例7.1 求两数之和。
main( )
{ float a,b,c;
float add(float,float); /*对被调函数的说明*/
scanf(″%f,%f″,&a,&b);
c=add(a,b);
printf(″sum=%f\n″,c);
}
float add(x,y)
float x,y;
{ float z; z=x+y; return(z); }
运行结果:
8.2,6.5↙ s
um is 14.700000
二、无参函数的定义形式
类型标识符 函数名() {说明部分 语句}
用“类型标识符”指定函数值的类型,即函数带回来的值的类型。无参函数一般不需要带回函数值,因此可以不写类型标识符,printstar和print_message就如此。
三、有参函数定义的一般形式
类型标识符 函数名(形式参数表列) 形式参数说明 {说明部分语句}
例如:float add(x,y)
float x,y; /*形式参数说明*/
{float z; /*函数体中的说明部分*/
z=x+y;
return(z); }
注意:1、第二行“float x,y;”是对形式参数作类型说明,指定x和y为单精度型。花括弧内是函数体,它包括说明部分和语句部分。
2、“float z;”必须写在花括弧内,而不能写在花括弧外。
3、不能将第二、三行合并写成“float x,y,z;”。形式参数的说明应在函数体外。
4、在函数体的语句中求出z的值(为x与y的和),return语句的作用是将z的值作为函数值带回到主调函数中。
return后面的括弧中的值作为函数带回的值(或称函数返回值)。在函数定义时已指定add函数为实型,在函数体中定义z为实型,二者是一致的,将z作为函数add的值带回调用函数。
四、空函数
也可以有“空函数”,它的形式为:
类型说明符 函数名() { }
例如 dummy() { } 调用此函数时,什么工作也不做,没有任何实际作用。
6.3 函数参数和函数的值
一、形式参数和实际参数
“形式参数”:在定义函数时函数名后面括弧中的变量名。
“实际参数”:用函数时,函数名后面括弧中的表达式。
例7.2
main()
{ int a,b,c;
scanf(″%d%d″,&a,&b);
c=max(a,b);
printf(″Max is %d″,c); }
max(x,y)
int x,y;
{ int z; z=x>y?x:y; return(z); }
运行情况如下:
7,8↙
Max is 8
关于形参与实参的说明:
1.定义函数时指定的形参变量,在未出现函数调用时,它们并不占用内存中的存储单元。只有在发生函数调用时函数中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。
2.实参可以是常量、变量和表达式,如:max=(3,a+b);但要求它们有确定的值。在调用时将实参的值赋给形参变量。
3.定义的函数中,必须指定形参的类型。
4.实参与形参的类型应相同或赋值兼容。
5.C语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。
6.ANSI新标准允许使用另一种方法对形参类型作说明,即在列出“形参表列”时,同时说明形参类型。
如int max(int x,int y) {……} 相当于:int max(x,y) int x,y;{……}
又如:float fun(array,n) int array[10],n;可以写成 float fun(int array[10],int n)
这两种用法等价,都可以使用。
二、函数的返回值
通常,希望通过函数调用使主调函数能得到一个确定的值,这就是函数的返回值。
1、函数的返回值是通过函数中的return语句获得的。return语句后面的括弧也可以不要,如 return z;它与“return(z);”等价。
2、函数值的类型。 在定义函数时指定函数值的类型,例如: int max(iny x,int
y)函数值为整型,char letter(char c1,char c2)函数值为字符型,double min(float
x,float y)函数值为双精度型。在定义函数时对函数值说明的类型一般应该和return语句中的表达式类型一致。
3、如果函数值的类型和return语句中表达式的值的类型不一致,则以函数类型为准。对数值型数据,可以自动进行类型转换。即函数类型决定返回值的类型。
课堂提问与讨论
如果被调用函数中没有return语句,并不带回一个确定的、用户所希望得到的函数值,但实际上,函数并不是不带回值,而只是不带回有用的值,带回的是一个不确定的值。为了明确表示“不带回值”,可以用“void”定义“无类型”(或称“空类型”)。为使程序减少出错,保证正确调用,凡不要求带回函数值的函数,一般应定义为“void”类型
课堂小结、作业布置
在程序中使用函数,增加了程序的可读性,使程序在编写时更加简单,模块性更强。本章详细介绍了在C程序使用函数的基本方法。
1.函数定义及调用部分。介绍了函数定义的格式,主要有无参和有参两种,在调用时强调函数返回值应与函数类型说明一致,若无返回值应定义为void类型。
2.在数组作函数参数时,有两种形式,一种是数组元素作函数实参,用法与变量相同,另一种是数组名作实参和形参,传递的是数组的首地址。
3.数据的存储类别分为两大类,静态存储类和动态存储类。函数中的局部变量如不做特殊说明,都是动态分配存储空间的,如做static说明,将称为局部静态存储变量。函数中的全局变量在函数外部定义,编译时分配在静态存储区。
4.内部函数和外部函数,内部函数用static做说明,只能被本文件中其它函数所引用,外部函数用extern做说明,可以省略,外部函数可以被其它文件所引用。