c语言讲稿(ch7部分)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第七章函数
第一节软件的分层模块化
一、分层模块化主要思想
1、按功能将程序划分若干独立模块,模块之间具有层次关系,上层模块可调用下层模块。例:
一个简单学籍管理程序,经过需求调查和分析后,设计出如下模块结构:
2、对于模块的基本要求
•每个模块功能单一。用三种基本结构构造模块内的程序代码段。
•每个模块有名字
•每个模块的接口参数应尽量简单
•模块之间尽可能互相隔离(没有数据依赖性)
•除主模块由操作系统调用外,其它模块的调用一般应遵守:上级模块调用下级模块
3、模块化程序的开发
逐个模块进行设计、编码和调试
开发团队分工合作
4、c语言实现模块结构程序的支持机制(函数)
函数定义——模块
函数名——模块名
函数的形式参数——模块接口
函数调用——模块调用
第二节 C 语言函数简介
一、函数分类
1、根据定义分类
•系统预定义函数(库函数)
不需用户定义,可多次调用
•用户自定义函数
需要用户一次定义,可多次调用
2、根据参数分类
•无参函数
定义和调用时均不带参数
•有参函数
定义和调用时带一个以上的参数
3、根据返回值分类
•有返回值函数
函数调用结束时带值返回到主调函数
•无返回值函数
函数调用结束时不带任何值返回到主调函数
二、函数一般特性
1、函数的定义
在一个源程序中:
必须有一个也只能有一个main函数定义(函数名是规定的,函数体是自定义的)。
可以有多个相互独立的其它函数定义。
在一个函数定义的函数体中不允许出现另一个函数定义(嵌套定义)。
2、函数的调用
发出运行程序命令后操作系统调用执行main函数。在一个函数定义的函数体中可以调用另一个函数(嵌套调用),也可以调用函数自身(直接递归调用)。main函数也可以被其它函数调用(间接递归调用),但一般不这样做。
3、函数的返回
一个函数被调用后,一旦执行到return语句或函数体的最后一个“}”时,自动返回到主调函数处继续执行后续指令。函数返回时可以带值或不带值。
第三节函数的定义、调用和声明
一、函数定义(function definition)
1、函数定义格式
[存储类型] [函数类型] 函数名([const] [存储类型] 数据类型形参变量名1, . . .) { 变量声明序列
语句序列
}
下划线部分为形式参数表
特殊情况:
无参函数:形式参数表中只放一个void,或者为空
无返回值函数:函数类型为void
缺省情况:
函数类型缺省时为int,形参缺省时为void
2、函数类型
代表函数返回值类型。
允许:5种基本类型,指针类型,构造类型,void(无值)
3、形式参数(formal argument)
•所有形式参数都是变量,简称形参变量
•形参变量的类型可以是:5种基本类型、指针类型、构造类型(结构,联合)
•函数体内不能再声明与形参变量同名的其他局部变量
•形参变量的作用域为所在函数的函数体
•形参变量只有在所在函数被调用期间才存在
4、修饰词const
限定被修饰的形参变量的值在函数体不能被改变。
例:
float f(int x, const int y)
{ y++; scanf(“%d”,&y); (错)
x=y; scanf(“%d”,&x); (正确)
return y;
}
main()
{ float a; a=f(1,2); . . . }
5、函数返回与return 语句
•当函数类型为非void时,函数调用结束后必定带一个值(基本类型)或一组值(结构类型)返回,返回值的类型由函数类型决定。
•return语句格式
return e; 或 return ;(缺省e)
( e:表达式,e值的类型应与函数类型相同或赋值兼容)
•执行“return e;”语句返回一个确定的值(e的值)
执行“return ;”语句返回一个不确定的值或不返回任何值
•当函数类型为基本类型时,执行“r eturn e;”语句时只能返回一个数据。若e值的类型与函数类型不同但赋值兼容,则e值的类型将被自动转换为函数类型后再返回。
•当函数类型为非void时,函数体中应当包含一个或多个会被执行到的return e;
例:
int f(int x,int y)
{ if(x%y)return 0;
else return 1;
}
或将函数体改为:
int flag;
if(x%y)flag=0;
else flag=1;
return flag;
以下函数缺少必要的return 语句,在vc系统编译时出现warning信息:
not all control paths return a value
int f(int x,int y)
{ int fl;
if(x%y)fl=0;
else return 1;
}
•当函数类型为void时,函数体中可以不包含“return;”语句,也可以包含一个或多个会被执行到的“return ;”语句。
初学者易犯的错误
(1)嵌套定义函数
例:
int f(int w)
{ int i,j;
int g(int x) 函数定义嵌套
{ int a=0,b=1;
a++; b++;
}
}
改正:去掉int g(int x)或将其改为if(w>0),
则变成块嵌套
•形式参数表错误(语法错)
例:int f (int x, y){ . . . }
•函数头部错误(语法错)
例:int f (int x , int y);函数声明而非函数定义
{ . . . }
•函数体中出现与形式参数同名的变量声明(语法错)
例: int f(int x)
{ float x; . . . }
(5) 试图用一个return e;返回一个以上的值(语义错)
例: return x,y;
return x; return y;
6、关于函数定义的建议
(1) 函数头部不超过一行(接口尽量简单)
(2) 若函数体中包含多个功能,应将该函数进一步划分为几个小函数(函数功能单一)。
二、函数调用(function call)
1、函数调用格式
有参函数:函数名(e1, … en)
无参函数:函数名();
():函数调用运算符
函数名:作为操作数的标识符
e1,… en: 实参表达式(简称实参)