c语言程序设计第十一讲第五章下.pptx
《c语言程序设计第十一讲第五章下.pptx》由会员分享,可在线阅读,更多相关《c语言程序设计第十一讲第五章下.pptx(71页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1第五章C C程序结构第1页/共71页2主要内容数值类型函数和标准库函数函数定义和程序的函数分解C程序结构与变量预处理命令定义常量字位运算符编程实例第2页/共71页3知识回顾及提升最重要的思想模块化程序设计思想函数分解及其思想C程序的组成对象(变量、函数)的存在、声明与使用变量的生命周期和作用域第3页/共71页4复杂问题简单问题简单问题1简单问题简单问题2简单问题简单问题n解解1解解2解解n分解整合整合整个问题的解解解解解复杂问题分解与问题解决第4页/共71页5解决问题的办法:化整为零,把复杂程序分解成不同的小模块,分别实现。长程序划分第5页/共71页6模块化程序设计思想总体功能总体功能子功能
2、子功能子功能子功能子功能子功能子功能子功能自顶向下自顶向下逐步细化逐步细化重要的软件开发手段软件工程管理理念问题:高级语言提供了什么机制来支持模块化问题:高级语言提供了什么机制来支持模块化程序设计程序设计?第6页/共71页7高级语言常见的抽象机制子程序,sub-program,sub-routine过程,procedure函数,function类,class包,package模块,module组件,component程序,programC语言提供的语言提供的最基本的代码最基本的代码抽象机制抽象机制第7页/共71页8小模块小模块2小模块小模块1函数一般可以传递数据,通过参数传模块间调用返回结果小
3、模块小模块n共处共处应用环境应用环境1应用环境应用环境m大模块大模块1大模块大模块2大模块大模块K打包打包应用于应用于工具箱工具箱xx.caa.c组件,包,模块,程序第8页/共71页9main()AvgMultiply(.,1000,);AvgMultiply(,100,);AvgMultiply(,10000,);double AvgMultiply(double array,int n,double y)计算计算n个数的平均值个数的平均值Y;返回结果;返回结果;名字名字从外部获取数据从外部获取数据返回结果返回结果C语言把功能语言把功能独立或相同、独立或相同、相似的片段抽相似的片段抽象成一个
4、函数象成一个函数重复的片段用重复的片段用函数调用代替函数调用代替合称为:合称为:Interface接口,接口,A common boundary between two distinct entities.独立定义独立定义独立实现独立实现独立使用独立使用效效率率/2;一改一改全改全改第9页/共71页10函数说明规范:接口说明/*函数名称:写出函数的名称功能描述:描述出函数具有的功能函数参数:输入输出参数说明,对每个参数都需要作出仔细说明返回值:返回值说明,或者标明无返回值模块历史:谁于某年某月某日创建本模块,创建人email 谁于某年某月某日修改本模块,修改人email 修改原因:可有可无,根
5、据需要添加*/用处?用处?第10页/共71页11C的模块和C程序结构一组函数构成一个函数模块;在C程序里,一个*.c或*.cpp文件就是由多个函数构成的一个功能模块;每个功能模块编译后构成一个独立的目标模块*.obj多个目标模块绑定在一起构成一个*.exe文件第11页/共71页12a.cb.c*.c一个C程序的组成函数函数函数a.objb.obj*.obj编译MyProg.exe编译编译链接组织成一组织成一个项目个项目项目的中项目的中间结果间结果项目的最项目的最终结果终结果模块模块第12页/共71页13模块文件第13页/共71页14*.exe文件*.obj文件第14页/共71页15变量的作用域
6、与存在期变量定义确定了变量何处、何时能使用何处能使用作用域能够使用变量的范围代码段何时能使用存在期确定变量建立和销毁时间时间段。各种变量的存在期可能不同。变量实现的基础是内存单元,存在期就是变量被分配内存空间到撤消的期间第15页/共71页16存储区示意图内存内存静态存储区静态存储区动态存储区动态存储区程序代码程序代码程序占用的存储区程序占用的存储区第16页/共71页17存储区用途静态存储区主要用途保存采用静态分配方式的变量的内容外部变量(全局变量)静态内部变量保存程序中的字符串常量动态存储主要用途供自动型内部变量的空间分配使用供显式动态分配的存储空间分配(见后续内容)第17页/共71页18变量
7、类别及其存在期内部变量的类别auto默认的内部变量类别,可以不用写,存储单元在运行过程中动态分配和释放static静态内部变量,保存在静态存储区,存储单元在程序启动时分配,程序结束时释放。外部变量在函数之外定义的变量称为外部变量、全局变量。External variableExternal variable全部保存静态存储区,程序启动时分配,程序结束时释放。在外部变量前加static只影响对应变量的可见范围,但不影响变量的生命周期。第18页/共71页19函数中的参数形式参数和实际参数formal argument形式参数定义函数时给出的参数,称为形式参数Arguments occurred i
8、n function list when defining a functionactual argument实际参数调用函数时给出的参数,称为实际参数Arguments occurred in function list when calling a functionC函数的参数是值参数。函数调用时先计算实参表达式的值把值复制给对应形参而后执行函数体。函数内对形参的操作与实参无关。第19页/共71页20C语言的函数原型函数存在信息函数原型function prototype声明某一个函数的存在在使用某个函数以前,用函数原型来声明某个函数已经是一个合法的、有定义的函数,请声明之后的代码放心使用
9、该函数。Use function prototype to declare the existence of a function原型说明的形式与函数头部类似,加分号;参数名可省略,可与函数定义用的名字不同;原型的参数名最好用有意义的名字,有利于写注释。提倡把原型说明都放在程序文件最前面第20页/共71页21另外一种组织写函数原型办法将自己写的所有的函数的函数原型都写在一起,组织成一个扩展名为.h的header file,即头文件,如abc.h然后在.c或.cpp程序模块的首部用文件包含命令包含该头文件,如#include“abc.h”思考:有什么好处?第21页/共71页22主要内容数值类型函
10、数和标准库函数函数定义和程序的函数分解C程序结构与变量预处理命令定义常量字位运算符编程实例第22页/共71页23C语言源程序编译目标模块连接可执行程序函数库C程序加工过程编译之前还有一个源代码预加工的过程5.5 预处理第23页/共71页24有预处理命令的C源程序编译目标模块连接可执行程序函数库C程序加工过程包含有编译前的预处理的功能预处理没有预处理命令的C源程序最先做的步骤,预处理程序负责处理源程序里的所有预处理命令,生成不含预处理命令的源程序。预处理命令加在程序中指示预处理程序进行代码处理工作的指令。预处理命令作用:简化编程工作第24页/共71页25预处理命令C源程序中以字符#开始的命令即为
11、预处理命令常见的预处理命令包括#include#define#undef#if#else#elif#endif第25页/共71页26把指定文件内容包含到当前源文件#include 形式1#include 文件名形式2形式1:用于包含系统头文件,预处理程序到指定目录找文件(通常指定几个系统文件目录)。形式2:用于包含自己的文件。预处理程序先在源文件所在的目录里找,找不到时再到系统指定目录中去找。文件包含命令处理过程:在文件系统中查找指定的文件,如果找到,就用找到的文件的内容取代该命令行。被包含文件里如有预处理行也会处理。第26页/共71页27stdio.h或math.h 为标准头文件(.h 扩展
12、名),它们在系统子目录里(目录名为 include或h),内容包括标准函数原型、系统使用的符号常量定义等。预处理时,文件内容插入到预处理命令行处。相当于在源文件中写这些函数原型,使编译程序能正确完成对标准库函数调用的处理。#include#include注意:写程序时一定要包含必要的系统头文件。第27页/共71页28#include“abc.h”double area(double r)return PI*r*r;abc.cpp系统目录中的头文件如果找到,用相应的头文件里的内容替代包含命令。double area(double r);int func2();void func3();enum
13、YES,NO;#define PI 3.14159继续处理abc.h文件包含处理过程及示例double area(double r);int func2();void func3();enum YES,NO;#define PI 3.14159double area(double r)return PI*r*r;处理后的abc.cpp第28页/共71页291 1、一个#include#include命令只能指定一个被包含的文件,若要包含n n个文件,应使用n n个#include#include命令;2 2、若文件1 1包含文件2 2,而文件2 2中要用到文件3 3的内容,则可在文件1 1中用
14、2 2个#include#include命令分别包含文件2 2和文件3 3,而且文件3 3应出现在文件2 2之前,如下表示:file1.cfile1.c#include#include“file3.hfile3.h”#include#include“file2.hfile2.h”.3 3、文件包含可以嵌套。4 4、预编译后的包含文件和源程序文件成为一个文件,所有的externextern变量将成为源程序文件中的全局静态变量。说明:第29页/共71页30#include“flie2.h”file1.cfile2.h#include“flie3.h”不包含#include命令file3.h#inc
15、lude“flie3.h”#include“flie2.h”file1.c不包含#include命令不包含#include命令file2.hfile3.h等价第30页/共71页31#define开始,两种形式:简单宏定义,形式:#define 宏名字 替代正文替代正文可以是任意正文序列,到换行为止。如最后是“”,下一行还作为宏定义的继续。作用:为宏名字定义替代,由整个替代正文构成。预处理程序记录宏名字及其替代。在源程序中遇到宏名字标识符时,就用替代正文替换,这种操作称为宏展开或宏替换。宏定义与宏替换第31页/共71页32#define NUM 30#define SLD static long
16、 double#define NOSTOP while(1)程序中的:SLD x=2.4,y=9.16;替换后变成:static long double x=2.4,y=9.16;预处理程序做正文替换,替代正文可以是任何内容。后无 ;第32页/共71页33带参数宏定义,形式:#define 宏名字(参数列表)替代正文宏名字与括号间不能有空格,逗号分隔的标识符看作参数。替换正文为任意正文序列。宏调用的替换分两步展开:先用各实参替代宏定义替代正文里的参数;再将代换的结果代入宏调用位置。预处理中将被展开为:z=(x+y)(x*y)?(x+y):(x*y);使用形式与函数调用类似,以类似参数的形式给出
17、宏参数的替代段,用逗号分隔,称为宏调用。#define min(A,B)(A)(B)?(A):(B)z=min(x+y,x*y);第33页/共71页34注意:宏展开可能引起参数多次计算。如:z=min(n+,m+);展开后的形式是:z=(n+)(m+)?(n+):(m+)替代正文各参数和整段应括起,避免出错。例:#define square(x)x*x在特定环境下可能出问题,例如:z=square(x+y);展开后的形式:z=x+y*x+y 使用带参宏与调用函数的意义不同。程序加工中在“当地”展开。程序执行中并没有调用动作,宏定义/调用中没有类型问题。一个宏能否使用/使用中发生什么/能否得到预
18、期效果,完全看展开后的情况。第34页/共71页35n人们有时用宏定义简化程序书写。n带参宏的展开可避免函数调用开销,但使程序变长。n复杂宏定义展开后出错很难定位。n应谨慎使用(尽量少使用)宏。n写宏定义的常见错误是在定义行最后写分号。该分号将被代入程序,有可能引起语法错误。宏定义从定义处起作用直到文件结束。一个文件里不允许对同一宏名字重复定义。#undef取消已有定义:#undef 宏名字第35页/共71页361.1.宏名一般都用大写字母表示,以区别于变量;2.2.宏定义只是替代,减少了在程序中书写的工作量,只是一个简单的代替,不作语法检查;3.3.宏定义不是语句,不必再其后加上“;”;4.4
19、.在宏定义中可以进行多层的替代.#definre R3.0#define PI3.1415#define L2*PI*R#define SPI*R*Rmain()printf(“L=%fnS=%fn”,L,S);说明第36页/共71页37例#include#define PI 3.1415#define S(r)PI*r*rint main()double a,area;a=3.6;area=S(a);printf(“r=%fnarea=%fn”,a,area);return 0;或enum PI=3.1415;第37页/共71页38例#include#define M3#define NM+
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 第十一 第五
限制150内