《C语言程序设计课件第四章.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计课件第四章.ppt(16页珍藏版)》请在人人文库网上搜索。
1、本章的主要内容包括:C语言函数的概念,如何调用C语言提供的库函数,如何定义函数和调用这些函数。中的数据表示由多个文件组成的C程序的方法变量生命周期范围,以及C语言的数学函数。第四章功能和程序结构,回到第一页,问题:(1)程序越来越长。难以理解,可读性降低。(2)重复代码增加,某个程序可能执行多次。(3)一个问题中的代码不能在其他类似的问题中重用。必须重复最初的设计编码过程。函数是一种机制,它可以有效地分解复杂的描述,控制程序的规模和复杂性。需要抽象成功能的程序段:(1)具有独立功能和逻辑意义的程序段;(2)重复出现的代码段。函数机制的好处是:(1)函数可以多次调用,减少了程序长度,保持了函数意。
2、义的一致性。(2)增加程序的可读性。(3)模块化和结构性较强。两种观点:从函数的外部调用方的角度。从函数内部实现者的角度来看。4.1概述,在C程序中调用库函数需要两个步骤:1 .使用include命令指出库函数的相关定义和描述。Include命令必须以“#”开头,系统提供的头文件采用。h作为文件后缀,文件名用一组尖括号或一对双撇号括起来。# include开头的程序行不是C语句,并且“;”未添加在第2号末尾调用标准库函数调用库函数的形式为:函数名(参数表)(1)在表达式中调用:函数是表达式的操作数。例如y=z * sin(x)0.5;(2)作为一个独立的语句:它可以被视为一个表达式语句,如pr。
3、intf (%dn ,a);4.2库函数,用C语言定义的函数的一般形式是:函数返回值类型名函数名(类型名参数1,类型名参数2) /*头*/描述部分/*函数体*/语句部分返回语句的形式如下:返回表达式;或返回(表达式);或者返回;返回函数:退出函数并返回函数值。4.3函数定义,4.4.1函数调用形式:函数名(实际参数表)调用函数时,要注意以下几点:(1)调用名称必须与定义的名称完全一致。(2)实际参数个数与形式参数个数相同,类型相同。如果它们不匹配,将自动转换。不兼容的赋值转换(某些类型不能被赋值,如指针和浮点类型之间)不会给出错误消息,程序将继续运行,但结果是不正确的。(3)它可以嵌套和调用。。
4、例如,函数甲调用函数乙,函数乙调用函数丙。C语言规定所有函数都是并行和独立的。不允许嵌套定义(一个函数的定义包含另一个函数的完整定义),但允许嵌套调用。4.4函数调用和描述,4.4.2函数描述,即在调用之前描述函数,称为函数的原型描述。形式如下:类型名称函数名称(参数类型列表或参数列表);形式上,它可以理解为第一个加号“;”函数定义的,其功能是检查调用时参数的数量和类型是否正确。因此,在参数列表中,只需要类型名,例如有形的参数名,它可以是任何用户标识符,并且不必与函数定义的参数相同。4.4函数调用和描述,C语言,调用函数和被调用函数之间有三种数据传输方式:(1)实际参数和形式参数之间的数据传输。
5、(2)返回语句将函数值返回给调用函数。(3)通过全局变量。(本章稍后将讨论全局变量。在C语言中,实际参数和形式参数之间的数据传递方式称为“值传递”,数据只能从实际参数单向传递到形式参数。调用函数时,首先计算参数表达式的值,并将计算出的值分别赋给相应的参数,然后进入函数体执行。参数本身是函数的局部变量,并且C语言的函数调用机制非常简单,在C语言中,值传递是结合实际参数和参数的唯一途径。在接下来的章节中,我们将看到数组名和指针被用作函数参数,它们组合实际参数和参数的方式不能脱离值传递的本质。4.5调用函数和调优函数之间的数据传递,递归函数是指在函数执行过程中直接或间接调用自身的函数。前者称为简单递。
6、归,而后者称为间接递归。递归程序执行过程中递归函数的特点:递归结束有一定的条件。递归函数的效率递归与递归的关系4.7函数实例,4.6递归函数,4.8.1程序结构C语言规定,不允许在一个函数内部定义另一个函数,所以所有函数都是在程序表面定义的,整个程序结构比较简单。程序结构讨论了C程序函数、数据和变量定义的组织方法,特别是当需要多个文件来组织程序时,程序单元和内容的组织。4.8.2在程序中定义变量时,变量的范围和存在周期有几种含义:(1)给变量一个名称,变量的存储空间可以用程序中的名称来操作,可以取值和赋值;(2)定义了可变存储空间中数据的存在形式、范围和操作;(3)变量可以在程序中使用的地方;。
7、(4)在程序运行期间,何时分配和取消该变量的存储空间。4.8变量的作用域和生存期,4.8.2变量的作用域和生存期:在源程序的某个部分,变量定义是有效的,可以使用变量的名称来执行与变量相关的操作。每个变量都有一个明确的“范围”,这是由变量定义出现的位置决定的。范围是指变量的范围。定义的范围是源程序中的一个段落,相关的段落可以从源程序正文中抽出来。因此,范围是一个静态的概念。这与程序执行无关。存在周期:程序中变量存在的周期称为变量的“周期”。生存周期是一个动态的概念。这大约是一段时间的程序执行。在变量存在期间,它所占用的存储单元保持不变。只要变量没有重新赋值,单位中的值就保持不变。程序在内存中使用。
8、的存储空间分为三个部分:程序区、静态存储区和动态存储区。4.8变量的范围和寿命,4.8.2变量的范围和寿命存储类别是指变量在内存中的存储位置,包括静态和动态存储类别。有四种描述符与存储类别相关:自动静态寄存器外部。这些描述符通常与类型名一起出现,可以放在类型名的左侧或右侧。前三个存储类别的声明和定义一起使用,不能分开。4.8.2.1全局变量的范围和寿命定义在函数外部的任何位置的变量称为全局变量,也称为外部变量。它的范围是从定义变量的位置到原始文件的末尾。全局变量只有一个静态存储类别,它的生命周期是整个程序的运行周期。讨论了全局变量的定义和使用时的注意事项,并讨论了使用同一个全局变量在不同函数之。
9、间进行通信的特点和优缺点。本文讨论了使用外部描述符和静态描述符定义全局变量的区别。4.8变量的作用域和生存期,4.8.2变量的作用域和生存期4.8.2.2局部变量的作用域和生存期是在函数或复合语句内定义的变量,仅在函数或复合语句的作用域内有效,不能在此函数或复合语句之外使用。您可以使用自动、静态和注册说明符。1.自动变量使用自动描述符定义局部变量,或者不指定存储类,系统认为定义的变量具有自动类别。系统为自动变量动态分配存储空间,数据存储在动态存储区。局部变量的定义必须在函数体或复合体中的所有可执行语句之前。自动变量的范围是从定义的位置到函数体或复合体的末尾。其存储单元在进入这些局部变量所在的函。
10、数体(或复合体)时生成,在退出它们所在的函数体(或复合体)时消失,这是自动变量的存在周期。当再次进入函数体(或复杂体)时,系统会为它们分配另一个存储单元,因此不可能保留变量值。讨论使用自动变量的优点。4.8变量的作用域和寿命,4.8.2变量的作用域和寿命4.8.2.2作用域和局部变量的寿命2。寄存器变量寄存器变量也是一个自动变量,它与自动变量的区别仅在于建议编译器使用寄存器描述的变量将变量值保存在中央处理器的寄存器中,而不是像通用变量那样占用存储单元。局部变量的定义必须在函数体或复合体中的所有可执行语句之前。讨论寄存器变量的特点和使用中的注意事项。3.静态变量由函数体(或复合体)内部的静态描述。
11、的变量称为静态局部变量。静态局部变量与自动变量和寄存器变量具有相同的作用域,但是它们的生命周期本质上是不同的,应该延长到程序运行结束。静态局部变量占据静态存储区中的永久存储单元。当一个函数退出时,它将在下次再次进入该函数。静态局部变量仍然使用原始存储单元。讨论了静态变量的特点和使用中的注意事项,4.8变量的作用域和寿命,以及外部变量和静态变量(存储在静态存储区)的定义在程序启动前已经完成,并且其初始化也是在程序执行前完成的,并且只有一次。初始化表达式有严格的限制,只有在不执行程序的情况下(在编译阶段)可以找到常数值的表达式才能使用。初始化外部变量和静态变量的方法是直接用文字量或文字量、符号常数。
12、和基本运算符号来构造表达式。它不能包括涉及赋值的各种操作(如,-等)。)。如果定义时没有写初始化,系统会在创建时自动初始化为0。对于存储在动态存储区的局部变量,存储单元是在程序执行过程中调用相应的函数或复杂函数时动态分配的。只要满足类型约束,初始化表达式的形式没有限制。由于存储单元在每次调用后都被释放,并且存储单元在下一次调用中被重新分配,因此每次建立存储单元时都需要重新初始化。如果在定义时不写初始化,则指定单元格中的值是不确定的。此时,在使用变量之前,程序必须具有给变量存储单元赋值的操作,否则,变量的值是不确定的。许多编译系统警告不要出现这样的问题。4.8.3变量初始化,并讨论内部和外部函数。
13、的特性。方法使用外部说明符和静态说明符。使用内部和外部函数的好处。4.9多文件程序的组织和调试方法4.9.1多文件程序的组织方法讨论教材中关于多文件程序的组织方法的5条指导意见4.9.2多文件程序的运行和调试方法(1)编辑源文件(2)建立项目文件(3)打开项目文件(4)编译和连接(5)执行,4.8.4内部和外部函数,4定义方法、规范、返回值、函数返回和函数调用。函数间参数传递的调节。形式与实际参数的对应关系、参数传递方式、无效函数。变量的存储类型。变量的存在周期和范围的概念,四种存储变量的解释方法、特点和适用范围,不同存储类型的变量在使用上的差异,变量的初始化方法,以及使用外部变量在函数之间传递数据的规定。多文件程序的组织和实现方法;公共库函数的使用。掌握本章的关键是理解函数的参数传递机制。