第4章 函数与C程序结构_第1页
第4章 函数与C程序结构_第2页
第4章 函数与C程序结构_第3页
第4章 函数与C程序结构_第4页
第4章 函数与C程序结构_第5页
已阅读5页,还剩153页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、编程技术、C语言数据描述和C语言程序设计初步结构化编程基础和C语言控制结构数组及其应用函数和C语言程序结构指针和函数指针和数组字符串及其应用结构类型和关联类型C语言文件处理及其应用位操作和枚举类型、函数和程序结构、函数的定义和调用函数的嵌套调用以及递归调用变量的作用域和寿命编译和预处理具有多个源文件的C程序的组织方法、函数和程序结构。模块化编程技术是通过开发和维护一些小程序块(即模块)来构建一个大程序,这是人类为解决大型复杂问题而采取的一种“分而治之”的策略。本章主要讨论用C语言实现模块化编程技术的方法以及在模块化实现过程中遇到的一系列问题。41函数定义和调用,C语言程序的一般结构,41函数定

2、义和调用,在C语言程序的几个函数中,必须有一个且只有一个函数作为主函数。程序的执行从主函数开始,调用其他函数后,流程返回到主函数,整个程序在主函数中运行。另一个函数的函数可以用在一个函数中,这叫做函数调用。411功能的定义和声明,功能的定义不仅要表达它所描述的模块功能,还要详细描述如何实现所定义的模块功能。同时,函数定义中必须描述函数的三个特征,即函数的名称、函数的参数表和函数的返回值类型。411函数定义和声明,C语言函数定义的现代风格形式如下:返回值类型描述符函数名(形式参数表及其描述)/函数头函数操作对象(数据)定义和描述部分函数执行语句部分/函数体,411函数定义和声明,以定义和实现阶乘

3、函数为例了解函数的具体定义过程。根据以前的知识,C程序为阶乘,长事实=1;打印(输入n :);Scanf(%d,)程序实现了计算键盘输入的整数n并求其阶乘的功能。如果在将来的应用中,需要将求解某个数的阶乘的函数视为程序中相对独立的部分(函数),那么上述函数就需要通过自编译函数来实现。411函数的定义和声明将求解某个数的阶乘的函数作为程序中相对独立的部分(函数),所以上述函数需要通过函数来实现。根据函数的三个重要特征,即函数的名称、函数的参数表和函数的返回值类型。过程如下:(1)函数的名字在程序设计中有两个作用:第一,用这个名字来调用这个函数;第二,我们应该知道名字的含义,并遵守C语言的规则。实

4、现这个函数的函数可以用阶乘来命名。411函数定义和声明,(2)函数执行结果的返回和返回值类型的确定如果函数执行的结果是一个特定的表达式,当函数执行完成时,它由关键字return组成,如:return;语句将函数执行的结果返回给调用方。请注意,函数执行结果的数据类型不是由返回的表达式数据类型决定的,而是通过使用类型名称作为函数头的关键字来决定的。基于以上两点,我们可以编写阶乘、长函数,长是函数的返回值类型,并且返回语句集n!回到调用函数,花括号定义了函数的边界区域,长阶乘。长事实=1;打印(输入n :);Scanf(%d,411函数定义和声明,(3)函数参数表设计在上面定义的函数阶乘中,函数使用

5、的数据是从键盘输入中获得的,如果需要从函数的调用者(用户)那里获得所需的数据,就必须设计函数的形式参数表。此时,需要两个步骤:一是将用于从函数内部的键盘接收数据的数据对象定义移动到函数的形式参数表中;第二是删除t函数阶乘可以转换成以下形式:长阶乘(int n)inti;长事实=1;对于(I=1;I=n;I)事实*=I;返回事实;411函数的定义和声明可以从n的值函数的调用者(用户)处获得。通过讨论函数阶乘的定义过程,我们可以理解C函数定义一般形式中每个函数成分的确切含义:(1)返回值类型说明符用于设置函数返回值的数据类型,它可以是C语言中任何合法的基本数据类型和构造函数数据类型。如果您想指出函

6、数不需要返回值给调用者,那么函数返回值的数据类型应该被定义为void,比如前面章节中的main函数main。411函数定义和声明,2)函数名函数在程序中由函数名使用,函数名也是C的一个标识符。在给函数命名时,必须遵循C语言标识符的命名规则。除了主函数只能命名为main之外,其他自定义函数的名称都是由定义函数的人自己给定的,但是最好的名称可以描述函数实现的逻辑函数,即“见其名,知其义”。(3)形式参数表函数的形式参数表用括号括起来,由零到多个形式参数定义组成,两个形式参数定义用逗号分隔。如果函数没有形式参数,则不能省略用作函数运算符的括号。411函数定义和声明,(4)返回;语句如果在函数定义中指

7、定的返回值的数据类型不是无效的,函数定义必须有一个由关键字return组成的返回;声明。当函数执行到C语句时,首先计算语句中表达式的值,然后强制将该值转换成指定函数返回值的数据类型,并将其返回给主音函数。如果函数定义中指定的返回值类型无效,函数定义中可能没有由return组成的语句,如果函数定义的执行过程需要使用return语句,其形式只能是:return;411函数定义和声明,C语言规定其他函数不能在函数内部定义(即函数不能嵌套)。该规则确保每个功能是一个相对独立的程序模块。在由多个函数组成的C程序中,每个函数的定义是并行的,并且是任意顺序的,C程序中函数的定义顺序与C程序运行时函数的执行顺

8、序无关。411函数定义和声明,根据C语言的规定,函数应该在使用前定义。也就是说,一个函数可以被调用,它必须是一个已定义的(现有的)函数,并且被调用函数的基本特征必须在调用之前以某种方式向系统描述。这就是函数声明的作用。C语言中的函数分为标准库函数和用户自定义函数。他们的申报方法介绍如下。411函数定义和声明,(1)标准库函数的声明方法当使用标准库函数时,由于系统提供的标准库函数的描述是分类的,集中在一些称为“头文件”的文本文件中,如果在程序中调用系统标准库函数,也应该在程序的适当位置使用编译预处理语句进行声明。411函数定义和声明,其使用形式是:#include当使用尖括号时,指定系统首先找到

9、C编译系统配置的头文件路径(包含路径);#包括“头文件名称”当使用双引号时,系统被指定首先查找当前目录。411函数定义和声明,(2)用户定义函数的声明模式对于用户定义函数,如果被调用的函数(被调用的调音函数)与调用函数(被调用的主音函数)在同一个源文件中,则有必要在调用函数之前声明调音函数。函数声明用于在调用前向系统描述被调用函数的基本特征,所以函数声明的一般形式是:返回值类型描述符函数名(形式参数表及其描述);411函数定义和声明,/* name : ex 04-01 . CPP */# include void main()long阶乘(int n);int num输入数字:函数声明告诉编

10、译系统,阶乘是一个具有长返回值和一个int参数的函数。程序演示,411函数的定义和声明,在上面的程序中,长阶乘(int n)在主函数中;语句是函数阶乘的声明。在C语言程序中,调谐函数的声明也可以在主音函数定义之前编写。这样,函数声明语句之后的所有函数都可以调用声明的函数,如下面的程序段所示:#include long阶乘(int n);/*声明函数阶乘*/void main(),411函数定义和声明,在函数声明语句中,形式参数变量的名称是不相关的(它可以不同于函数定义,甚至可以是默认值),函数声明语句的关键是形式参数的类型、数量和顺序必须与声明的函数定义相同。例如,上述函数阶乘的声明语句也可以

11、写成以下两种形式:长阶乘(int);/*函数阶乘*/长阶乘(int x)的声明中没有形式参数名;/*函数阶乘声明中的形式参数名不同于函数定义*/,411对于函数的定义和声明,C语言规定在下列情况下不得声明要调整的函数:1 .调整后函数的返回值数据类型为整数或字符类型。在这种情况下,系统自动根据整数进行隐式声明。然而,从现代编程技术的角度来看,任何类型的函数都必须在调用之前声明,所以在这种情况下,许多现代C编译系统仍然需要声明被调用的函数。2.调谐功能的定义出现在主调谐功能之前。在这种情况下,在程序中执行函数调用语句之前,系统已经知道了已调函数的所有特性。411函数定义和声明,/* name:e

12、x04-02.cpp */#包含长阶乘(int n)/函数阶乘的定义出现在主音函数inti的前面;长事实=1;对于(I=1;I=n;I)事实*=I;返回事实;Void main()/主函数中没有声明函数阶乘的int num语句;输入数字:Scanf(%d),程序演示,412值参数传递的函数调用,程序执行时一个函数调用另一个函数来完成特定函数的过程称为函数调用。在函数的调用关系中,调用者被称为主音函数,被调用者被称为调音函数。在C语言中,调用函数时必须提供函数的名称。如果函数是参数函数,传递给调整函数的形式参数的实际参数也必须同时提供。函数调用的一般形式有:函数名(实际参数表),412值参数传递

13、的函数调用,在C程序中有三种调用函数的方式:函数语句方式在这种调用函数的方式中,函数调用被看作是一个单独的语句,它主要对应于返回值为空的类型。如果使用函数语句调用返回值类型不是void的函数,这意味着程序中不使用该函数的返回值。函数表达式模式在这种函数调用模式下,函数调用出现在表达式中,也称为函数表达式。此时,要求函数在被调用后必须返回一个确定的值才能参与表达式操作。应该注意的是,返回值类型为void的函数不能以这种方式调用。函数参数模式在这种函数调用模式下,函数调用作为另一个函数调用的实际参数出现。此时,要求在调用函数后,它必须返回一个确定的值作为其外部函数调用的实际参数。仍然应该注意的是,

14、返回值类型为void的函数不能以这种方式调用。412-值参数传递函数调用,当被调用的函数是参数函数时,函数调用必须伴有参数传递。在C程序函数调用的数据传输中,实际参数的值被传输。当实际参数是常量、变量或函数调用时,传输的数据就是这些数据对象的内容,这也称为数据值的传输方式。412值参数。如果函数调用传递的实际参数是存储在内存中的数据对象的第一个地址值,则称为地址值传输模式。指针参数和数组参数是所使用的地址值传输模式,这将分别在本章的第4.1.3节和第4.1.4节中讨论。412值参数传递,无论传递值还是地址值,函数调用的执行过程可以分为以下四个步骤:(1)系统为传递函数中的局部变量分配存储空间;

15、(2)如果是参数函数调用,则转移参数。主音函数将实际参数值转换为调整后函数的形式参数,参数的数量、类型和位置应一一对应;(3)将程序执行的控制流程转移到规定的功能上执行;(4)执行调谐函数后,程序执行的控制流程和调谐函数的执行结果返回到主调谐函数中的调用点。412值参数传输,函数数据值传输模式是数据复制模式。在这种模式下,通过复制将实际参数值转换为形式参数。发射机中的原始数据(主音功能)和接收机中的数据副本(调谐功能)占用不同的存储位置。当数据传输过程完成时,它们是相互不相关的,所以无论被传输的数据在调谐函数、412值参数传输函数调用中如何变化,示例4.3中的程序都讨论了函数调用的执行过程,并

16、且为了便于讨论,在程序中增加了行号。1/* ex04-03 . CPP */2 #包括3void main() 4void swap(int x,int y);5int a=3,b=5;6 printf(交换调用前:a=%d,b=%dn,a,b);7互换(a,b);8 printf(交换调用后:a=%d,b=%dn,a,b);9 10void swap(int x,int y)11 int t;12 t=x,x=y,y=t;13 printf(在交换调用中:x=%d,y=%dn,x,y);14,412值参数传递函数调用,当执行C程序时,形式参数表中的形式参数变量和函数体中定义的普通变量在被调用前不存在于系统中,它们在系统中的出现或消失与函数调用的过程密切相关。在将示例4.3中的程序执行到第七行之前,系统中不存在函数交换中的形式参数变量X和Y以及函数体中定义的变量T(参见图4.2a),412值参数和交换数据值调用如下:系统为转移函数中的局部变量分配存储空间。例如,在示例4.3中的程序中,当程序执行到第7行时,系统将

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论