《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做说明,可以省略,外部函数可以被其它文件所引用。