




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章模块化程序设计教学目的:模块程序设计是C程序合作编程序的方法,通过这一章的学习使学生能自己编C程序中的函数,正确地调用函数,熟悉函数调用时形式参数和实在参数的关系。通过变量的存储类型,能正确使用各种不同存储类型的变量编程序。重点难点:函数的嵌套调用及函数的递归调用。前面各几章的学习,大家已有了编制小程序的经验。如果想编制大程序,在C语言下就得用模块化程序设计,其基本思想是将一个大的程序按功能分割成一些模块,使每一个模块都成为功能单一、结构清晰、接口简单、容易理解的小程序。C语言提供了支持模块化软件开发的功能:1函数式的程序结构。程序由一个或多个函数组成,每个函数都有各自独立的功能和界面。2允许通过使用不同的存储类别的变量,控制模块内部和外部的信息交换。3具有预编译处理功能,为程序的调试、移植提供方便,支持模块化程序设计。本章介绍这些功能及进行程序开发的基本方法。4.1函数C程序结构无论涉及的问题是复杂还是简单,规模是大还是小,用C语言设计程序,任务只有一种,就是编写函数,至少要编写一个主函数main(),C程序的执行就是执行相应的main()函数。即从它的main()函数的第一个花括号开始,依次执行后面的语句,直到最后的花括号为止。其它函数只有在执行了main()函数的过程中被调用时才执行。高级语言中“函数”的概念和数学中“函数”的概念不完全相同。英语单词function有“函数”和“功能”两种介绍,高级语言中的函数实际上是功能的意思。当要完成某一个功能时,就用一个函数去实现它。在程序设计时首先要考虑main()函数中的算法,当main()中需要使用某一功能时,就用一个具有该功能的函数表达式表示。这时的函数,我们只知道它具有什么功能,其它先不作处理。设计完main()的算法并检验无误后,这时开始考虑它所调用的函数。如果在库函数中能找到,就可直接使用,否则再动手设计这些函数。这种设计方法称为自顶向下、逐步细化的程序设计方法。这种方法设计出来的程序在功率高,程序层次分明、结构清晰。复杂程序的层次可从以下图形中看出:许多大型软件系统包含了相当丰富的,可供从事某一领域工作人员选用,如一个高等学校的信息管理系统就包含了教务、科研、人事、财务,设备、图书、后勤、办公室等子系统。每一个子系统以可分为许多子子系统。这种软件为了方便用户大都采用菜单(menu)方式,这种形式的软件,大家都用过。用户只需按一些简单的键,就能调用该功能,就像在饭店点菜一样那么方便。高等院校事务管理系统的模块结构如下:(程序menu.c)函数的定义与函数声明(一)函数就是在程序中设定的一个函数模块。一个函数是由变量声明部分与可执行语句组的成独立实体,用来完成一指定功能。除了系统提供的函数外,用户编制函数才是一种正确的选择。(一).函数定义:(函数类型、函数名、形参、函数体内容)函数返回值的类型说明函数名(类型名形式参数1,类型名形式参数2,…){函数首部说明部分函数体语句部分}函数类型:函数计算后的值是什么类型。函数名:用户命名的标识符,在主函数中调用的名字。形式参数:函数中处理的变量,通过它接收主函数传过来的具体值。函数体:函数计算时的具体方法和函数的表达式。由变量定义部分和语句组成。函数的返回:由函数返回调用它的函数,可由以下返回形式:return表达式;return;可没有return语句,也可有多个return语句。函数的定义与函数声明(二)函数名(类型名形式参数1,类型名形式参数2,…)省略类型说明,C语言默认返回值为int型。例:求两个双精度数这和的函数。doubleadd(doublea,doubleb){doubles;s=a+b;returns;}函数返回值的类型可以是整型、实型、字符型和指针类型。以上函数的返回值是double型。可用doubleadd(a,b)doublea,b来写函数首部。定义函数可以没有参数,但一对括号不省略,如:dummy(),函数体也可是空的,这样的函数什么也不做。编程时可作为一个虚设的部分。函数举例:编一个求两个数中最小数的函数,用循环语句多次调用该函数,找出十个数中的最小数。(ec711.c)函数声明(三)在C语言中,除了主函数外,对于用定义的函数要遵循“先定义,后使用”的规则。凡是未在调用前定义函数,C编译程序都默认函数的返回值为int类型。对于返回值为其它类型的函数,若把函的定义放在调用之后,应该在调用之前对函进行说明。即只有函数的首部,一般形式为:类型名函数名(参数类型1,参数类型2,…)如:doubleadd(double,double)或类型名函数名(参数类型1参数名1,参数类型2,参数名2,…)如:doubleadd(doublep,doubleq)这里的参数是虚设的,实际上参数名常常省略。函数说明语句中的类型名必须与函数返回值的类型一致。函数说明既可以作为一条单独的语句如:doubleadd(double,double)也可以与普通变量的说明在一起如:doublex,y,add(double,double)变量的存储属性变量是对程序中数据的存储空间的抽象。前面介绍的数据类型是变量的操作属性。除此之外,影响变量使用的还有变量的存储属性。⒈变量的存储类型:计算机中的存储器分为内存和外存,除此这外不有一个称为寄存器的临时存储器,用来存储一些反复被加工的数据,存取速度比内存和外存要快得多。⒉变量的生存期:C语言中的变量可用两种方法建立:在编译时分配存储单元,程序开始执行变量被创建,结束被撤销。这种变量生存期为程序执行的整个过程,在该过程中占有固定存储空间,称为永久存储;另一种是在某一段时间内存在,函数的形参和在函数体中的定义的变量,在程序进入该函数,才分配存储空间,函数结束,存储空间又被撤销,称为动态存储。⒊变量的可用域:分为两种:局部可用和全局可用,即局部变量与全局变量。用存储属性可表示这三个方面的属性;分为四种存储类别说明auto(自动);register(寄存器);static(静态)和extern(外部)。以上属性说明,放在类型说明符的左边,也可以放在类型说明符的右边。autointk,l;intautok,l;4.2.1动态变量4.2.2静态变量4.2.3外部变量动态变量(一)(一)自动(auto)变量:在变量定义时使用auto和不使用auto定义都是自动变量,这类变量的使用和前面所用变量一样。在主函数和子函数中变量名一样的变量分析程序时要特别注意。1.自动变量是局部变量自动变量只有在它定义的那个局部才能使用。(ec72.c)(ec712.c)2.在对自动变量赋值之前,它值是不确定。在编制累加和累乘的程序时,为什么要给和单元及积单元赋初值,原理就在这里。(ec713.c)程序计算的结果不确定。(ec714.c)变量x没有赋初值,执行的结果不可预测。动态变量(二)二寄存器(register)变量:它的值保留的CPU的寄存器中,不占用内存单元,存取时间快,用它可提高程序的运行速度。通常把使用频率较高的变量定义为寄存器变量。定义与自动变量一样。由于现在的计算机运算速度快,定义寄存器变量,很难分辨出它执行的情况。打印乘法九九表的程序:(ec715.c)由循环控制变量i,j经常用,所以定义为寄存器变量。由于各种计算机系统中的寄存器数目不同,寄存器的长度也不同,因此程序中定义寄存器变量的数量受限制。静态变量静态static变量:它中的值和其它类型变量不一样在于:1.在整个程序运行期间,静态局部变量在内存中占有永久性的存储单元,即使退出函数以后,再进入函数时,静态局部变量仍使用原来的存储单元。由于不释放原来的值,它的值可以使用到程序结束。2.它的初值是在编译时赋予的,在执行时不再赋初值,末赋初值时系统自动赋初值0。⒊在函数多次被调用过程中静态局部变量的值具有可继承性。(ec716.c)(ec716a.c)⒋静态局部变量的值只能在本函数中使用。外部变量一、外部变量(extern)是全局变量定义在所有函数之外的变量称为外部变量。(ec717.c)(ec717a.c)(ec718.c)二、外部变量使用的几种情况产生随机数(ec719.c)在不同的编译单位内用extern说明符来扩展全局变量的作用域同一编译单位是在同一C的源程序中。不同的编译单位是在两个以上不同的C源程序内。通过头文件来进行互相访问的。三、外部变量的副作用主函数和子函数用同名外部变量产生的错误。(ec720.c)编译预处理“编译预处理”就是在C编译程序对C源程序进行编译前,由编译预处理程序对这些编译预处理命令处理的过程。C语言的预处理均以#include#define开头不加分号。编译预处理是C语言的一个重要特点,它能改善程序设计环境,有助于编写易移植、易处理的程序,也是模块化程序设计的一个重要工具。4.3.1宏替换4.3.2文件包含编译预处理(一)宏替换是用预处理命令#define指定的预处理。一、不带参数的宏:#define宏名替换文本#defineSIZE1000这种使用在前面的程序中已用到,如果替换文本还用到已定义的宏时,分析时要注意。替换文本中包含已定义过的宏:#definePI3.14#defineADDPI(PI+1)#defineTWO_ADDPI(2*ADDPI)如果有表达式:x=TWO_ADDPI/2,则替换后为:x=(2*(3.14+1))/2若写成“PI+1”和“2*ADDPI”不加括号,替换后为x=2*3.14+1/2;因为是编译预处理,不计算后再用,就是先替换再计算。编译预处理(二)二、带参数的宏替换:(ec721.c)类似于函数,但要根据宏定义时的表达式,要先替换,再计算。例:#defineMU(X,Y)((X)*(Y))a=MU(5,6)替换为a=((5)*(6))=30#defineMU(X,Y)X*Ya=MU(5,6)a=5*6=30a=MU(2+3,6)a=2+3*6=20分析以下程序执行的结果:#defineSQR(X)X*Xmain(){inta=10,k=2,m=1;/*没加括号,替换结果为*/a/=SQR(k+m)/SQR(k+m);/*k+m*k+m/k+m*k+m*/printf(“%d\n”,a);}文件包含文件包含:在C语言程序开发时,可以用文件包含的方法使得按照一定功能编制的存在文件中的某类宏被当前文件调用,而不需再去编制。只需在头文件中包含这些文件即可。所谓文件包含,是在一个文件中,去包含另一个文件的全部内容。在以前的程序编制时已用过。#include"文件名"或#include<文件名>在预编译时,预编译程序将
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025《江宁建筑劳务合同》
- 2025自然人借款合同模板
- 2025家庭电路改造合同协议书
- 2025年建筑用木料及加工木材组件项目合作计划书
- 2025物业管理简易劳动合同说明及范本
- 2025广告策划委托合同样本格式
- 2025附条件购买合同范本
- 2025年铬系铁合金项目合作计划书
- 2025年防洪设施管理服务项目建议书
- 2025办公家具买卖合同范本
- 中央空调安装装修施工工艺手册
- 血液溅入眼睛应急预案脚本
- 水浒一百单八将座次排位、梁山泊职位、诨号、星宿、武器、最终结局
- 半导体管特性图示仪校准规范
- 中国居民膳食营养素参考摄入量(DRIs)(2013-修订版)资料
- JCT239-2014 蒸压粉煤灰砖
- 培养思维是发展核心素养的关键讲座课件
- 站班会记录表
- 经典话剧剧本《雷雨》
- 2022年丹东市留置看护与公安技术服务中心招聘工作人员考试真题
- 广告制作、宣传用品、宣传物料采购项目投标方案(技术方案)
评论
0/150
提交评论