c语言讲稿(ch7部分)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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: 实参表达式(简称实参)

相关文档
最新文档