版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五章第五章. 模块化设计模块化设计u概述概述u函数的定义函数的定义u函数函数的调用的调用u函数参数及其传递函数参数及其传递方式方式 (难点)难点)u变量的存储变量的存储属性属性u变量的作用范围变量的作用范围u编译预处理编译预处理模块化程序设计v基本思想:将一个大的程序按功能分割成一些小模块v特点:l各模块相对独立、功能单一、结构清晰、接口简单l控制了程序设计的复杂性l提高元件的可靠性l缩短开发周期l避免程序开发的重复劳动l易于维护和功能扩充v开发方法: 自上向下,逐步分解,分而治之自上向下,逐步分解,分而治之概述概述 C是模块化程序设计语言Source file1Preprocessor D
2、eclaration Executable Function1 Function n Source file iSource file nC Program&C是是函数式函数式语言语言&必须有且只能有一个名为必须有且只能有一个名为main的主函数的主函数&C程序的执行总是程序的执行总是从从main函数开始,在函数开始,在main中结束中结束使用使用库函数库函数应注意:应注意:1、函数、函数功能功能2、函数、函数参数参数的数目和顺序,及各参数意义和类型的数目和顺序,及各参数意义和类型3、函数、函数返回值返回值意义和类型意义和类型4、需要使用的、需要使用的包含文件包含文件函
3、数分类v从用户角度l标准函数(库函数):由编译系统提供已设计好的函数l用户自定义函数v从函数形式l无参函数l有参函数一般格式一般格式:合法标识符合法标识符Default: intvoid函数体函数体函数类型函数类型 函数名函数名(形参类型说明表形参类型说明表)说明部分说明部分语句部分语句部分函数函数不能嵌套定义不能嵌套定义函数定义函数定义int min( )例例 定义函数定义函数minmin 求三个整数的求三个整数的最小值最小值例例. .判断下列函数定义合法性判断下列函数定义合法性void func1(a,b,c) printf(“%d,%d,%dn”,a,b,c);float func2(f
4、loat a, float b) float a, b, c; c=a+b; return c;float c;int x, int y, int zint t; if(xy) t=x; else t=y;if(zt) t=z; return t ;int min(int x, int y, int z) int t; t=xy?x:y; return(tz?t:z); 返回语句: return(expression); or return expression; or return;v功能:使程序控制从被调函数功能:使程序控制从被调函数返回返回调用函数调用函数,并带回并带回返值返值v说明说明
5、:lvoid型函数型函数l若无若无return语句,遇语句,遇时,自动返回时,自动返回l函数中可有函数中可有多个多个return语句语句l若函数类型与若函数类型与return语句中表达式值的类型不一致,按语句中表达式值的类型不一致,按前者为准,自动转换前者为准,自动转换-函数调用转换函数调用转换返回值返回值函数调用格式:函数名(实参表)函数调用形式函数调用形式v函数语句: Eg. printstar(); printf(“Hello,World!n”);v函数表达式: Eg. m=max(a,b)*2;v函数参数: Eg. printf(“%d”,max(a,b); m=max(a,max(b
6、,c);函数调用函数调用函数原型函数原型对被调用函数要求对被调用函数要求:l必须是必须是已存在已存在的函数的函数(库函数或自定义函数库函数或自定义函数)l库函数库函数: #include l用户自定义函数用户自定义函数: 函数函数原原型说明型说明函数原型声明函数原型声明函数类型函数类型 函数名函数名(形参类型形参类型 形参名形参名,. );l作用:告诉编译系统作用:告诉编译系统函数类型函数类型、参数个数参数个数及及类型类型,以便检验,以便检验l函数定义函数定义与与函数说明函数说明不同不同l函数说明位置:函数说明位置:程序的数据说明部分程序的数据说明部分(函数内或外)(函数内或外)l下列情况下,
7、可不作函数说明下列情况下,可不作函数说明:u被调用函数定义被调用函数定义出现在主调函数之前出现在主调函数之前u若函数返值是若函数返值是int型,系统自动按型,系统自动按int型处理型处理例例 函数原型声明函数原型声明#include void main() float a,b,c; scanf(%f%f, &a, &b); c=add(a,b); printf(sum is %fn,c);float add(float x, float y) float z; z=x+y; return(z);float add(float x, float y);函数嵌套调用main( )C
8、all function aEnd Function aFunction bCall function bvoid main() . . sum = add(a,b); .int add(int x, int y) int z; z=square(x+y); return z;int square(int x) return x*x;函数调用函数调用例、输入三个整数,输出最大值与最小值差例、输入三个整数,输出最大值与最小值差#include int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,i
9、nt z);void main() int a,b,c,d; scanf(%d%d%d,&a,&b,&c); printf(Max-Min=%dn,d); int dif(int x,int y,int z) return max(x,y,z)-min(x,y,z); main( )调函数调函数 difoutputenddif max 调函数调函数 max调函数调函数 minmin int min(int x,int y,int z) int r; r=xy?x:y; return(ry?x:y; return(rz?r:z); d=dif(a,b,c);形参形参与与实
10、参实参v形式参数:定义函数时函数名后面括号中的变量名形式参数:定义函数时函数名后面括号中的变量名v实际参数:调用函数时函数名后面括号中的表达式实际参数:调用函数时函数名后面括号中的表达式: :函数间的数据传递函数间的数据传递v说明:说明:l实参必须有实参必须有确定的值确定的值,求值顺序因系统而定求值顺序因系统而定(TC、VC自右向左自右向左)l形参与实参形参与实参个数相等个数相等,类型一致类型一致,按顺序一一对应按顺序一一对应l形参与实参类型不同,自动按形参类型转换形参与实参类型不同,自动按形参类型转换函数调用转换函数调用转换l函数调用时才为形参分配内存;调用结束,内存释放函数调用时才为形参分
11、配内存;调用结束,内存释放数据传递数据传递#include void main() int sum( ) int factorial( )int sum(int a, int b);int factorial(int n);例例 求两个整数阶乘之和求两个整数阶乘之和int sum( int a, int b);int factorial( int n); int n1,n2; int a; scanf(%d %d,&n1,&n2); a= printf(“%d!+%d!=%d,n1,n2,a); int c1,c2; c1= c2= return(c1+c2); int rtn
12、=1; int i; for(i=1;i=n;i+) rtn*=i; return(rtn);int a,int bint nfactorial(a);factorial(b);sum(n1,n2);参数传递方式v值传递方式l方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值l特点:u形参与实参占用不同的内存单元u单向传递值传递值传递.20002008200A2002200420067 a b(main)11Eg. Exchange two integersOutput: a=7, b=11 swapped: a=7, b=11#in
13、clude void swap( ) int temp; temp=x; x=y; y=temp;void main() int a=7,b=11; printf(“a=%d,b=%dn,a,b); printf(swapped:n); printf(“a=%d,b=%dn,a,b);int x, int yswap(a,b);概述v变量是对程序中数据的存储空间的抽象Memory .void main() int a; a=10; printf(“%d”,a);1020002001程序中使用变量名对内存操作程序中使用变量名对内存操作变量的存储类型变量的存储类型编译或函数调用时为其分配内存单元编
14、译或函数调用时为其分配内存单元v变量存储方式l静态存储:程序运行期间分配固定存储空间l动态存储:程序运行期间根据需要动态分配存储空间v内存用户区变量存储变量存储概述v变量是对程序中数据的存储空间的抽象程序区程序区静态存储区静态存储区动态存储区动态存储区暂时变量暂时变量永久性变量永久性变量v变量的属性变量的属性l数据类型:变量所持有的数据的性质(数据类型:变量所持有的数据的性质(操作属性操作属性)l存储属性存储属性:u存储器类型:寄存器、静态存储区、动态存储区存储器类型:寄存器、静态存储区、动态存储区u生存期生存期:程序运行中变量占用内存的时间:程序运行中变量占用内存的时间静态变量静态变量:从程
15、序开始执行到结束从程序开始执行到结束动态变量动态变量:从包含该变量定义的从包含该变量定义的函数开始执行到结束函数开始执行到结束u作用域作用域:变量在程序中有效范围:变量在程序中有效范围局部变量局部变量:(内部变量内部变量)在在函数或复合语句内函数或复合语句内定义定义,只在只在本函数本函数或复合语句或复合语句内有效内有效全局变量全局变量:(外部变量外部变量)在在函数外函数外定义定义,作用域从作用域从定义点到本文件定义点到本文件结束结束应尽量少使用全局变量,因为:应尽量少使用全局变量,因为:n全局变量在程序全部执行过程中占用存储单元全局变量在程序全部执行过程中占用存储单元n降低了函数的通用性、可靠
16、性,可移植性降低了函数的通用性、可靠性,可移植性n降低程序清晰性,容易出错降低程序清晰性,容易出错v变量的存储类型lauto -自动型lregister-寄存器型lstatic -静态型v变量定义或说明格式: 存储类型 数据类型 变量表;如如: int sum; auto int a,b,c; register int i; static float x,y;自动型- auto函数内: auto int a,b,c; int a,b,c; l动态变量,存放在动态存储区l韩宗博:默认的局部变量局部变量,用于函数内、复合语句和形参lauto变量初始化u若不赋初值,其值不定值不定u每次函数调用时赋初
17、值l不同函数可定义同名同名变量l若外部变量与局部变量同名,则外部变量被屏蔽屏蔽 auto int i,j;void main() auto int a,b,c; . . .寄存器型- register如: register int a,b; register a,b; l动态变量,存放在CPU寄存器lregister变量初始化u若不赋初值,其值不定u每次函数调用时赋初值l变量个数受限(2),且不能为long,double,float型l局部变量,用于函数内、复合语句和形参void main() register int i, sum; for(i=0,sum=0;i外部型变量(说明)- ext
18、ern如如: extern int a, b; l不是定义不是定义变量,是对已定义过的全局变量进行说明l作用:扩展扩展变量作用域l全局变量定义定义与全局变量说明不同 定义定义 说明u次数: 只能1次 可说明多次u位置: 所有函数之外 函数内或函数外u分配内存: 分配内存 ,可初始化 不分配内存,不可初始化extern int a=2;变量存储类型静态静态动态动态程序整个运行期间程序整个运行期间函数调用开始至结束函数调用开始至结束编译时赋初值编译时赋初值,只赋一次只赋一次每次函数调用时每次函数调用时自动赋初值自动赋初值0或空字符或空字符不确定不确定静态存储区静态存储区动态区动态区寄存器寄存器局部
19、变量局部变量外部变量外部变量定义变量的函数或复合语句内定义变量的函数或复合语句内本文件本文件所有文件所有文件register 局部局部staticauto外部外部static外部外部存储方式存储方式生存期生存期赋初值赋初值未赋初值未赋初值存储区存储区作用域作用域存储类别存储类别 Eg. Scope of local variablesfloat f1(int a) int b,c; .char f2(int x,int y) int i,j; void main() int m,n; .Scope of a,b,cScope of x,y,i,jScope of m,nmain函数中定义的函数
20、中定义的变量只在变量只在main中有效中有效形参形参是是局部变量局部变量Eg. Scope of global variablesint a=3,b=5;void main() void swap(void); printf(“a=%d,b=%dn”,a,b); swap(); printf(“a=%d,b=%dn”,a,b);int temp;void swap(void) temp=a;a=b;b=temp;Scope ofabScope oftemp全局变量全局变量自动自动初始化成初始化成0全局变量采用全局变量采用静态存储静态存储全局变量全局变量作用域作用域可扩展可扩展Eg. Scope
21、 of auto variablesvoid main() int x=1; void prt(void); int x=3; prt(); printf(“2nd x=%dn”,x); printf(“1st x=%dn”,x);void prt(void) int x=5; printf(“3th x=%dn”,x);Output:3th x=52nd x=31st x=1Scope of x=1Scope of x=1Scope of x=3Scope of x=5Eg. Variables with same name in different functionsvoid sub();
22、void main() int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);void sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);Output:main:a=3,b=4sub:a=6,b=7main:a=3,b=4main:b=4main:a=3动态存储区按动态存储区按栈栈方式工作方式工作sub:b=7sub:a=6int a=3,b=5;int max(int a, int b) int c; c=ab?a:b; ret
23、urn(c);void main() int a=8; printf(max=%dn,max(a,b);Eg. local and global variables with the same nameOutput:max=8Scope of global a、bScope of local aScope of local a、bScope of global b #include void prt();int i;void main() for(i=0;i5;i+) prt();void prt(void) for(i=0;i5;i+) printf(“%c”,*); printf(“n”)
24、;Eg. Side effect of external variableOutput:*Initialized to 0 automaticallyEg. file1.cint a;main( ) . . f2(); . f1(); .f1( ) auto int b; f2(); .f2( ) static int c; Scope of cScope of bScope of amainf2f1mainf1f2mainas lifetime:bs lifetime :cs lifetime :void main() void increment(void); increment(); i
25、ncrement(); increment();void increment(void) int x=0; x+; printf(“%dn”,x);Eg. Successive value of internal static variablesOutput: 1 1 1void main() void increment(void); increment(); increment(); increment();void increment(void) static int x=0; x+; printf(“%dn”,x);Output: 1 2 3#include int a=10, b=0
26、;void func1()int a=25, b=50 ;b/=a+5;printf(a= %d, b= %dn, a, b);void func2()printf(a= %d, b= %d n, a, b+= 5);void main()int b=10;printf(a+5= %d, b= %dn, a+5,b);func1();func2();程序运行结果为程序运行结果为: : a+5=15, b=10 a=25, b=1 a=10, b=5 #include int mathfun(int fst)static int thd=5;int sec=0;sec+=1; thd+=1;re
27、turn(fst+sec+thd);void main()int n=4, num=0;for(num=1; num=3; num+)printf(%d %dn, num, mathfun(n);A1 11B1 11 C1 11D0 11 2 12 2 11 2 13 1 12 3 13 3 11 3 15 2 13 Eg. Scope and lifetime of variables#include int i=1;void main() static int a; register int b=-10; int c=0; printf(-MAIN-n); printf(i:%d a:%d
28、 b:%d c:%dn,i,a,b,c); c=c+8; other(); printf(-MAIN-n); printf(i:%d a:%d b:%d c:%dn,i,a,b,c); i=i+10; other();void other() static int a=2; static int b; int c=10; a=a+2; i=i+32; c=c+5; printf(-OTHER-n); printf(i:%d a:%d b:%d c:%dn,i,a,b,c); b=a;global i 1main: a0b:-10registermain:c0staticmemorydynami
29、cmemoryother: a2other: b0other: c10843315443other: c10675156int p=1,q=5;float f1(int a) int b,c; .int f3().char c1,c2;char f2(int x,int y) int i,j; main() int m,n; .Scope of c1,c2Scope of p,qextern char c1,c2;Extended scope Eg. Extend the scope of external variables with externextern char c1,c2;Exte
30、nded scope全局变量全局变量自动自动初始化成初始化成0全局变量采用全局变量采用静态存储静态存储extern char c1,c2;Extended scopevoid main() void gx(),gy(); printf(“1: x=%dty=%dn”,x,y); y=246; gx(); gy();void gx() x=135; printf(“2: x=%dty=%dn”,x,y);int x,y;void gy() printf(“3: x=%dty=%dn”,x,y);Eg. Extend the scope of external variables with ext
31、ernOutput:1: x=0 y=02: x=135 y=2463: x=135 y=246extern int x,y;Declaration of the defined global variablesEg. Definition vs. declaration of external variables#include void swap(int x, int y) int t; t=x;x=y;y=t;void main() swap(a,b); printf(“a=%d b=%dn,a,b);int a=13,b=-8; void swap() int t; t=a;a=b;b
32、=t;void main() swap(); printf(“a=%d b=%dn,a,b);int a=13,b=-8;extern int a,b;extern int a,b;Eg. Reference external variables in other filesint global;void func1() global=1; x=1;static int number;void func2() number=2; global=2;float x;static int number;void func3() number=3; global=3; printf(number=%
33、dn,number);file1.cfile2.cfile3.cextern float x;extern int global;extern int global;编译预处理作用:编译程序的一部分,将作用:编译程序的一部分,将特殊命令特殊命令扩展到扩展到程程序中序中,生成生成扩展扩展C源程序源程序种类种类v宏定义宏定义 #definev文件包含文件包含 #includev条件编译条件编译 #if-#else-#endif格式:格式:v“#”开头开头v占占单独书写行单独书写行v语句尾语句尾不加分号不加分号;v定义定义位置任意位置任意,决定其作用域,决定其作用域 不带参数宏定义不带参数宏定义 v
34、一般形式:一般形式: #define 宏名宏名 宏体宏体v功能功能: 用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)v定义位置定义位置: 任意任意(一般在函数外面一般在函数外面)v作用域作用域: 从定义命令到文件结束从定义命令到文件结束v#undef 可可终止宏名作用域终止宏名作用域 格式:格式: #undef 宏名宏名v宏定义宏定义可嵌套可嵌套,不能递归不能递归v引号中引号中的内容与宏名相同也的内容与宏名相同也不置换不置换v宏定义中使用必要的括号宏定义中使用必要的括号()()宏定义宏定义v宏展开宏展开:预编译时预编译时,用宏体替换宏名用宏体替换宏名-不作语法检查不作语法检查带参数宏定义带参数宏定义v一般形式:一般形式: #define 宏名宏名(参数表参数表) 宏体宏体v宏展开宏展开:形参用实参换,其
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- HR绩效考核工具与数据分析教程
- 2025中国数字营销产业市场格局及发展前景分析报告
- 2025中国数字内容产业版权保护与技术应对策略研究报告
- 2025中国教育环保市场调研及发展战略研究报告
- 2025中国教育智库国际合作现状及发展策略分析报告
- 高校绩效管理系统答题与解析
- 零售企业会员管理系统操作手册
- 2025年物业公司门禁系统管理制度
- 生物实验中细胞转染MVU作用
- 汉语拼音声韵母拼合规则大全
- 2025湖南怀化市市直企事业单位引进高层次及急需紧缺人才507人易考易错模拟试题(共500题)试卷后附参考答案
- 岩棉板外墙保温专项施工方案
- 广东省建筑设计研究院集团股份有限公司校园招聘职位信息笔试历年参考题库附带答案详解
- 2025年河北省保定市评审专家考试题库(一)
- 企业印章使用管理制度(2025年版)
- 科技公司新媒体策划方案
- 2025上海闵行区古美路街道招聘社区综合协管员18人备考考试题库附答案解析
- 品牌管理协议合同范本
- 军队文职新闻试卷及答案
- GB/T 46406-2025科研项目数据管理指南
- 钢围檩及钢支撑施工质量验收标准
评论
0/150
提交评论