内容正文:
教案用纸
第 6 周 总第 16 次 学时:2
教学班级:软件专业各班 课程:C语言程序设计 授课教师:刘畅
课题:5.1 模块化的设计思想 5.2 函数的定义、调用和函数声明
教学方法:讲授、启发
教具:常规教具
教学目标:使同学们掌握函数定义与函数调用
教学重点:函数如何进行定义和调用
教学难点:函数的调用及返回
主要教学内容:
5.1 模块化的设计思想
5.2 函数的定义、调用和函数声明
5.2.1 函数的定义
5.2.2 函数的调用
5.2.3 函数的声明
课后回顾:
教案用纸
四个一:
提问:字符数组的定义、赋值及使用。
导入:C语言是通过函数来实现模块化程序设计的。较大的C语言应用程序往往是由多个函数组成的,每个函数分别对应各自的功能模块。从用户的使用角度看,函数有两种:标准函数(即库函数)和用户自定义函数。
正文:
5.1 模块化的设计思想
在学习C语言函数之前,需要了解什么是模块化程序设计方法。人们在求解一个复杂问题时,通常采用的是逐步分解、分而治之的方法,也就是把一个大问题分解成若干个比较容易求解的小问题,然后分别求解。程序员在设计一个复杂的应用程序时,往往也是把整个程序划分为若干功能较为单一的程序模块,然后分别予以实现,最后再把所有的程序模块像搭积木一样装配起来,这种在程序设计中分而治之的策略,被称为模块化程序设计方法。
5.2 函数的定义、调用和函数声明
5.2.1 函数的定义
1.函数的定义格式
函数的定义格式如下:
(
函数头
) (
函数类型 函数名(形式参数列表)
{
函数体
}
)
说明:
(1)函数类型指定所定义函数返回值的类型,可以是简单类型、void类型或构造类型等,默认为int型。当函数类型为void时,表示函数无返回值。当函数类型为int时,可省略其类型的说明。
(2)函数名是函数的标识符,遵循C语言标识符的命名规则,区分大小写。后面一对圆括号()里为函数的参数列表。函数定义的第一行又可被称为“函数头”。
(3)函数体是一个复合语句,即用花括号{ }括起来的语句序列。
(4)对于有返回值的函数,必须用带表达式的return语句来结束函数的运行,返回值的类型应与函数类型相同。如果return语句中表达式值与函数定义的类型不一致,则以函数定义类型为准,并自动将return语句中的表达式的值转换为函数返回值的类型。
(5)形式参数简称形参,处在函数定义部分的函数名后的圆括号中。形式参数表可以为空,表示没有参数(无参函数),也可以由多个参数组成。当形式参数表中有多个参数时,参数与参数之间用逗号隔开。
2.形式参数列表说明
形式参数列表有以下两种形式:
(1)void或空
无参函数一般不需要返回函数值,因此可以不写类型标志符(或写成空类型void)。例如:
int sum(void) /*定义一个没有参数的函数sum*/
{
int i,s=0;
for(i=1;i<=10;i++)
s+=i;
return s;
}
函数的功能是计算并返回从1到10的整数和。
(2)参数类型名1 参数1,参数类型名2 参数2,……,参数类型名n 参数n
函数包含一个或多个参数,每个参数必须标注具体的数据类型,这样的函数又称为有参函数。例如:
int max(int a, int b) /*定义一个有2个参数a、b的函数max*/
{
int m=0;
if(a> b) m=a;
else m=b;
return m;
}
函数的功能是求两个整数的较大值。如果按照传统的函数写法,可以将参数列表中的变量定义放在函数头和函数左花括号之间。
5.2.2 函数的调用
函数的使用是通过函数调用语句来完成的。C语言是通过main函数来调用其他函数,其他函数之间可相互调用,但不能调用main函数。函数被调用时获得程序控制权,调用完成后,返回到调用语句的后面语句。
函数调用语句一般格式如下:
(
函数名(实际参数列表)
)
说明:
(1)函数调用可以出现在表达式中,也可以做为一条单独的语句出现。如:
s=sum(); /*计算1+2+……+10的值*/
z=max(5,8); /*计算5、8中的较大值*/
z=max(5+4,8*2); /*计算(5+4)和(8*2),即9和16中的较大值*/
z=max(x,y); /*计算x、y中较大值,x、y为实际参数*/
(2)函数的参数分为实际参数和形式参数两种,分别简称为实参和形式。其中实际参数是在调用的函数中的参数,一般是具有实际的值的常量、变量或表达式,而形式参数是写在函数头中函数名后面括号中的变量。例如上面例子中函数头:int max(int a, int b)中的a、b就是形式参数,而语句:z=max(x,y);中的x、y就是实际参数。
(3)实参的个数必须与形参的个数一致。实际参数(简称实参)的个数多于一个时,各实参之间用逗号隔开。
(4)在定义的函数中,必须指定形参的类型,并且实参的类型必须与形参的类型一一对应。
(5)实参可以和形参同名。
5.2.3 函数的声明
编译程序在处理函数调用时,必须从程序中获得完成函数调用所必需的接口信息。函数的声明是对函数类型、名称等的说明。为函数调用提供接口信息,对函数原型的声明是一条程序说明语句。
函数原型的声明就是在函数定义的基础上去掉函数体,后面加上分号“;”。其定义格式如下:
(
“
;
”
不能省略
) (
函数类型 函数名(形式参数列表);
)
例如:
int max(int a, int b); /*具有两个整型形参,函数类型为整型的函数声明*/
和完整的函数定义不同,形参表可以只给出形参的类型,形参名可以省略。例如:
int max(int , int ); /*与上面声明功能相同,只不过省略了形参名*/
之所以需要函数的声明,是为了获得调用函数的权限。如果在调用之前定义或声明了函数,则可以调用该函数。
被声明的函数往往定义在其他的文件或库函数中。可以把不同类型的库函数声明放在不同的库文件中,然后在自己设计的程序中包含该文件。例如:
#include "math.h"
其中math.h文件包含了很多数学函数的原型声明。
这样做的好处是方便调用和保护源代码。库函数的定义代码已经编译成机器码,对用户而言是不透明的,但用户可以通过库函数的原型获得参数说明并使用这些函数,完成程序设计的需要。
对于用户自定义的函数,也可以这样处理。和使用库函数不同的是,我们经常把自己设计的函数放在调用函数后。例如,我们习惯于先设计main()函数,再设计自定义函数,这个时候需要超前调用自定义函数,在调用之前需要进行函数原型声明。
提示:声明和定义的区分
(1)变量的声明通常是对变量的类型和名称的一种说明,不一定会分配内存,而变量的定义肯定会分配内存空间。
(2)函数的声明是对函数的类型和名称的一种说明,而函数的定义是一个模块,包括函数体部分。
(3)声明可能也是定义,也可以不是,广义上的声明包括定义性声明和引用性声明,通常所说的声明指的是后者。
小结:
通过本次课的讲解,大家应该掌握函数的基本定义及调用方式,函数原型的定义及使用方法。
备 注
学科网(北京)股份有限公司
$$