第四章函数和程序结构 本章的主要内容包括: ◆C语言函数的概念,如何调用C提供的 库函数,如何自己来定义函数,并调用 这些函数。中的数据表示 ◆多文件组成C程序的方法 ◆变量生存期作用域 ◆C语言的数学函数。 回首页
本章的主要内容包括: C语言函数的概念,如何调用C提供的 库函数,如何自己来定义函数,并调用 这些函数。中的数据表示 多文件组成C程序的方法 变量生存期作用域 C语言的数学函数。 第四章 函数和程序结构 回首页
4.1概述 问题:(1)程序越来越长。难于理解且可读性下降。 (2)重复代码增多,某段程序可能被执行多次。 (3)某一问题中的代码,无法在其它同类问题中再用 必须重复原来的设计编码过程 函数是一种机制,能够有效地分解复杂的描述,控制程序规模和 复杂性。需要抽象成函数的程序段: (1)功能独立、具有独立逻辑意义的程序段 (2)重复出现的代码段 函数机制提供的好处 (1)函数可以被多次调用,减少程序长度,保持函数意义的一致性。 (2)增加程序可读性。 (3)模块化、结构化更强 两种观点: 从函数外部调用者的角度 从函数内部实现者的角度
问题:(1)程序越来越长。难于理解且可读性下降。 (2)重复代码增多,某段程序可能被执行多次。 (3)某一问题中的代码,无法在其它同类问题中再用。 必须重复原来的设计编码过程。 函数是一种机制,能够有效地分解复杂的描述,控制程序规模和 复杂性。需要抽象成函数的程序段: (1)功能独立、具有独立逻辑意义的程序段 (2)重复出现的代码段 函数机制提供的好处: (1)函数可以被多次调用,减少程序长度,保持函数意义的一致性。 (2)增加程序可读性。 (3)模块化、结构化更强。 两种观点: 从函数外部调用者的角度。 从函数内部实现者的角度。 4.1概述
4.2库函数 C程序中调用库函数需要两步: 1.使用 include命令指出关于库函数的相关定义和说明。 include 命令必须以“#开头,系统提供的头文件以.h作为文件后缀, 文件名用一队尖括号◇>或一对双撇号””括起来。# inc lude 开头的程序行不是C语句,末尾不加 2.调用标准库函数 调用库函数的形式为 函数名(参数表) (1)表达式中调用:函数是表达式的一个运算对象。 如y=z*sin(x)+0.5; (2)作为独立语句:可看作表达式语句 如 printf(%d\n?,a);
C 程序中调用库函数需要两步: 1.使用include命令指出关于库函数的相关定义和说明。include 命令必须以“#”开头,系统提供的头文件以.h作为文件后缀, 文件名用一队尖括号<>或一对双撇号””括起来。# include 开头的程序行不是C语句,末尾不加“ ; ”号。 2.调用标准库函数 调用库函数的形式为: 函数名(参数表) (1)表达式中调用:函数是表达式的一个运算对象。 如 y = z*sin(x)+0.5; (2)作为独立语句:可看作表达式语句 如 printf(“%d\n”,a); 4.2 库函数
4.3函数定义 C语言中定义函数的一般形式为 函数返回值类型名函数名(类型名形参1,类型名形参2…) /*头部米/ 说明部分/米函数体米 语句部分 return语句的形式如下: return表达式;或 return(表达式);或 return; return的作用:退出函数,并带回函数值
C语言中定义函数的一般形式为: 函数返回值类型名 函数名(类型名 形参1,类型名 形参2…) /* 头部 */ { 说明部分 /* 函数体*/ 语句部分 } return语句的形式如下: return 表达式; 或 return (表达式);或 return ; return的作用:退出函数,并带回函数值。 4.3 函数定义
4.4函数的调用和说明 4.4.1函数的调用 函数调用的形式为 函数名(实际参数列表 调用函数时要注意以下几点 (1)调用名字必须与定义名字完全一致 (2)实参个数与形参个数一致,类型一致,如不匹配,进行自动 转换,不兼容的赋值转换(某些类型之间不能进行赋值,如指 针和浮点类型之间)并不给出错信息,程序继续运行,但结果 不正确。 (3)可以嵌套调用。如a函数调用b函数,b函数中又调用c函数。 C语言规定所有的函数都是互相平行、独立的。不容许嵌套定义 (在一个函数的定义中,包含另一个函数的完整定义),但可 以嵌套调用
4.4.1 函数的调用 函数调用的形式为: 函数名(实际参数列表) 调用函数时要注意以下几点: (1)调用名字必须与定义名字完全一致。 (2)实参个数与形参个数一致,类型一致,如不匹配,进行自动 转换,不兼容的赋值转换(某些类型之间不能进行赋值,如指 针和浮点类型之间)并不给出错信息,程序继续运行,但结果 不正确。 (3)可以嵌套调用。如a函数调用b函数,b函数中又调用c函数。 C语言规定所有的函数都是互相平行、独立的。不容许嵌套定义 (在一个函数的定义中,包含另一个函数的完整定义),但可 以嵌套调用。 4.4 函数的调用和说明
4.4函数的调用和说明 4.42函数说明 在调用之前对函数进行说明,称为函数的原型说明。 形式如下: 类型名函数名(参数类型列表或参数列表) 形式上可理解为函数定义的首部加分号“;”,它的作用是检查 调用时参数的个数和类型正确与否。因此参数列表中,只需类 型名即可,如有形参名,可以是任意的用户标识符,不一定要 和函数定义的形参相同
4.4.2 函数说明 在调用之前对函数进行说明,称为函数的原型说明。 形式如下: 类型名 函数名(参数类型列表或参数列表); 形式上可理解为函数定义的首部加分号“ ; ” ,它的作用是检查 调用时参数的个数和类型正确与否。因此参数列表中,只需类 型名即可,如有形参名,可以是任意的用户标识符,不一定要 和函数定义的形参相同。 4.4 函数的调用和说明
彐:4.5调用函数和被调函数的数据传递 C语言中,调用函数和被调函数之间的数据传递有三种方式 (1)实参和形参之间数据传递 (2) return语句把函数值返回调用函数 (3)通过全局变量。(全局变量在本章稍后讨论) C语言中实参和形参之间数据传递的方式叫“值传递”,数据只能 从实参单向传递给形参。函数调用时,首先计算实参表达式的值 求出的值分别赋给对应的形参,进入函数体执行,形参本身就是 局部于函数的变量,调用时接收实参的值。函数内部对形参的赋 值与实参变量毫无关系。实参变量的值不会被改变。实参与形参 传递值时,隐含着可能的转换。如转换不能进行,编译时产生类 型错误。 C的函数调用机制很简单,值传递是C语言实参形参结合的唯一方法, 续章节中,我们会看到数组名和指针做函数参数的情形,它们进 行实参形参结合的方式离不开值传递这个本质
C语言中,调用函数和被调函数之间的数据传递有三种方式: (1)实参和形参之间数据传递 (2)return 语句把函数值返回调用函数。 (3)通过全局变量。(全局变量在本章稍后讨论) C语言中实参和形参之间数据传递的方式叫“值传递” ,数据只能 从实参单向传递给形参。函数调用时,首先计算实参表达式的值, 求出的值分别赋给对应的形参,进入函数体执行,形参本身就是 局部于函数的变量,调用时接收实参的值。函数内部对形参的赋 值与实参变量毫无关系。实参变量的值不会被改变。实参与形参 传递值时,隐含着可能的转换。如转换不能进行,编译时产生类 型错误。 C的函数调用机制很简单,值传递是C语言实参形参结合的唯一方法, 续章节中,我们会看到数组名和指针做函数参数的情形,它们进 行实参形参结合的方式离不开值传递这个本质。 4.5 调用函数和被调函数的数据传递
4.6递归函数 递归函数是指在函数执行过程中,直接或间接调用函数本身的函 数。前者称简单递归,后者称间接递归。 递归程序的执行过程 递归函数的特点:有一个明确的结束递归的条件 递归函数的效率 递归与递推的关系 4.7函数实例
递归函数是指在函数执行过程中,直接或间接调用函数本身的函 数。前者称简单递归,后者称间接递归。 递归程序的执行过程 递归函数的特点:有一个明确的结束递归的条件。 递归函数的效率 递归与递推的关系 4.7 函数实例 4.6 递归函数
4.8变量的作用域和生存期 4.8.1程序结构 C语言规定部不允许在一个函数的内部定义另一个函数,这样,所 有函数都定义在程序的表层,整个程序的结构比较简单。 程序结构讨论C程序函数及数据、变量定义的组织方法,尤其是需 要多个文件组织程序时的程序单元、内容的组织问题 4.8.2变量的作用域和存在期 在程序中定义一个变量时有几个方面的含义: (1)给变量一个名字,在程序中通过名字可以操作该变量的存储 空间,进行取值和赋值; (2)定义了该变量存储空间中数据的存在形式、范围和运算: (3)程序中哪些地方可以使用该变量; (4)程序运行过程中,该变量的存储空间什么时候分配和撤消
4.8.1 程序结构 C语言规定部不允许在一个函数的内部定义另一个函数,这样,所 有函数都定义在程序的表层,整个程序的结构比较简单。 程序结构讨论C程序函数及数据、变量定义的组织方法,尤其是需 要多个文件组织程序时的程序单元、内容的组织问题。 4.8.2 变量的作用域和存在期 在程序中定义一个变量时有几个方面的含义: (1)给变量一个名字,在程序中通过名字可以操作该变量的存储 空间,进行取值和赋值; (2)定义了该变量存储空间中数据的存在形式、范围和运算; (3)程序中哪些地方可以使用该变量; (4)程序运行过程中,该变量的存储空间什么时候分配和撤消。 4.8 变量的作用域和生存期
4.8变量的作用域和生存期 4.8.2变量的作用域和存在期 变量的作用域:源程序中的某一部分,在这个范围里,变量定义 是有效的,可以使用该变量的名字进行与该变量有关的操作 每个变量都有一个确定“作用域”,由变量定义出现的位置确定 作用域讲变量的作用范围,一个定义的作用域是源程序中的一段, 可以从源程序正文中把有关的一段划出来。因此作用域是静态 概念。与程序执行过程无干 存在期:变量在程序中存在的那段时期称为该变量的 存在期是动态概念。讲的是程序执行的一段时期,在一个变量的 存在期里,它所占的存储单元一直保持,只要不对变量重新赋 值,单元中的值就保持不变 内存中供程序使用的存储空间分为三部分: 程序区、静态存储区和动态存储区
4.8.2 变量的作用域和存在期 变量的作用域:源程序中的某一部分,在这个范围里,变量定义 是有效的,可以使用该变量的名字进行与该变量有关的操作 每个变量都有一个确定“作用域” ,由变量定义出现的位置确定。 作用域讲变量的作用范围,一个定义的作用域是源程序中的一段, 可以从源程序正文中把有关的一段划出来。因此作用域是静态 概念。与程序执行过程无干。 存在期:变量在程序中存在的那段时期称为该变量的“”。 存在期是动态概念。讲的是程序执行的一段时期,在一个变量的 存在期里,它所占的存储单元一直保持,只要不对变量重新赋 值,单元中的值就保持不变。 内存中供程序使用的存储空间分为三部分: 程序区、静态存储区和动态存储区。 4.8 变量的作用域和生存期