程序设计基础5-模块化设计_第1页
程序设计基础5-模块化设计_第2页
程序设计基础5-模块化设计_第3页
程序设计基础5-模块化设计_第4页
程序设计基础5-模块化设计_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

程序设计基础5-模块化设计第一页,共50页。概述函数的定义函数的调用函数参数及其传递方式(难点)变量的存储属性变量的作用范围编译预处理第二页,共50页。模块化程序设计基本思想:将一个大的程序按功能分割成一些小模块特点:各模块相对独立、功能单一、结构清晰、接口简单控制了程序设计的复杂性提高元件的可靠性缩短开发周期避免程序开发的重复劳动易于维护和功能扩充开发方法:自上向下,逐步分解,分而治之概述

第三页,共50页。C是模块化程序设计语言Sourcefile1PreprocessorDeclarationExecutableFunction1FunctionnSourcefileiSourcefilenCProgramC是函数式语言必须有且只能有一个名为main的主函数C程序的执行总是从main函数开始,在main中结束第四页,共50页。使用库函数应注意:1、函数功能2、函数参数的数目和顺序,及各参数意义和类型3、函数返回值意义和类型4、需要使用的包含文件函数分类从用户角度标准函数(库函数):由编译系统提供已设计好的函数用户自定义函数从函数形式无参函数有参函数第五页,共50页。一般格式:合法标识符Default:intvoid函数体函数类型函数名(形参类型说明表){

说明部分 语句部分}函数不能嵌套定义函数定义第六页,共50页。intmin(){ }例定义函数min

求三个整数的最小值例.判断下列函数定义合法性voidfunc1(a,b,c){ printf(“%d,%d,%d\n”,a,b,c);} floatfunc2(floata,floatb){floata,b,c;c=a+b;returnc; } floatc;intx,inty,intzintt; if(x<y)t=x;elset=y; if(z<t)t=z;returnt;intmin(intx,inty,intz){intt;

t=x<y?x:y;return(t<z?t:z);}第七页,共50页。返回语句:return(expression);

or

returnexpression;

or

return;功能:使程序控制从被调函数返回调用函数,并带回返值说明:void型函数若无return语句,遇}时,自动返回函数中可有多个return语句若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换------函数调用转换返回值第八页,共50页。函数调用格式:函数名(实参表)函数调用形式函数语句:

Eg.printstar();

printf(“Hello,World!\n”);函数表达式:

Eg.m=max(a,b)*2;函数参数:

Eg.printf(“%d”,max(a,b));m=max(a,max(b,c));函数调用第九页,共50页。函数原型对被调用函数要求:必须是已存在的函数(库函数或自定义函数)库函数:#include<*.h>用户自定义函数:函数原型说明函数原型声明函数类型函数名(形参类型

[形参名],…..);作用:告诉编译系统函数类型、参数个数及类型,以便检验函数定义与函数说明不同函数说明位置:程序的数据说明部分(函数内或外)下列情况下,可不作函数说明:被调用函数定义出现在主调函数之前若函数返值是int型,系统自动按int型处理第十页,共50页。例函数原型声明#include<stdio.h>voidmain(){floata,b,c;scanf("%f%f",&a,&b);c=add(a,b);printf("sumis%f\n",c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}floatadd(floatx,floaty);第十一页,共50页。函数嵌套调用main()CallfunctionaEndFunctionaFunctionbCallfunctionbvoidmain(){.……….sum=add(a,b);…………..}intadd(intx,inty){intz;z=square(x+y);returnz;}intsquare(intx){returnx*x;}函数调用第十二页,共50页。例、输入三个整数,输出最大值与最小值差#include<stdio.h>

intdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz);voidmain(){inta,b,c,d;scanf("%d%d%d",&a,&b,&c);

printf("Max-Min=%d\n",d);}intdif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}main()调函数difoutputenddifmax调函数max调函数minminintmin(intx,inty,intz){intr;r=x<y?x:y;return(r<z?r:z);}intmax(intx,inty,intz){intr;r=x>y?x:y;return(r>z?r:z);}d=dif(a,b,c);第十三页,共50页。形参与实参形式参数:定义函数时函数名后面括号中的变量名实际参数:调用函数时函数名后面括号中的表达式:函数间的数据传递第十四页,共50页。说明:实参必须有确定的值,求值顺序因系统而定(TC、VC自右向左)形参与实参个数相等,类型一致,按顺序一一对应形参与实参类型不同,自动按形参类型转换—函数调用转换函数调用时才为形参分配内存;调用结束,内存释放数据传递第十五页,共50页。#include<stdio.h>voidmain(){}intsum(){

}intfactorial(){}intsum(inta,intb);intfactorial(intn);例求两个整数阶乘之和intsum(inta,intb);intfactorial(intn);intn1,n2;inta;scanf("%d%d",&n1,&n2);a=printf(“%d!+%d!=%d",n1,n2,a);intc1,c2;c1=c2=

return(c1+c2);intrtn=1;inti;for(i=1;i<=n;i++)rtn*=i;

return(rtn);inta,intbintnfactorial(a);factorial(b);sum(n1,n2);第十六页,共50页。参数传递方式值传递方式方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值特点:形参与实参占用不同的内存单元单向传递值传递第十七页,共50页。…...…...20002008200A2002200420067a

b(main)11Eg.ExchangetwointegersOutput:a=7,b=11s:a=7,b=11#include<stdio.h>voidswap(){inttemp;temp=x;x=y;y=temp;}voidmain(){inta=7,b=11;printf(“a=%d,b=%d\n",a,b);printf("s:\n");

printf(“a=%d,b=%d\n",a,b);}intx,intys);第十八页,共50页。概述变量是对程序中数据的存储空间的抽象Memory…….voidmain(){inta;

a=10;

printf(“%d”,a);}1020002001程序中使用变量名对内存操作变量的存储类型编译或函数调用时为其分配内存单元第十九页,共50页。变量存储方式静态存储:程序运行期间分配固定存储空间动态存储:程序运行期间根据需要动态分配存储空间内存用户区变量存储概述变量是对程序中数据的存储空间的抽象程序区静态存储区动态存储区暂时变量永久性变量第二十页,共50页。变量的属性数据类型:变量所持有的数据的性质(操作属性)存储属性:存储器类型:寄存器、静态存储区、动态存储区生存期:程序运行中变量占用内存的时间静态变量:从程序开始执行到结束动态变量:从包含该变量定义的函数开始执行到结束作用域:变量在程序中有效范围局部变量:(内部变量)在函数或复合语句内定义,只在本函数或复合语句内有效全局变量:(外部变量)在函数外定义,作用域从定义点到本文件结束>>应尽量少使用全局变量,因为:全局变量在程序全部执行过程中占用存储单元降低了函数的通用性、可靠性,可移植性降低程序清晰性,容易出错>第二十一页,共50页。变量的存储类型auto

-----自动型register-----寄存器型static

------静态型变量定义或说明格式:[存储类型]

数据类型变量表;如:intsum;

auto

inta,b,c;

registerinti;

staticfloatx,y;第二十二页,共50页。自动型------

auto函数内:auto

inta,b,c;

inta,b,c;

动态变量,存放在动态存储区韩宗博:默认的局部变量,用于函数内、复合语句和形参auto变量初始化若不赋初值,其值不定每次函数调用时赋初值不同函数可定义同名变量>>若外部变量与局部变量同名,则外部变量被屏蔽>autointi,j;voidmain(){

autointa,b,c;.……….…………..}第二十三页,共50页。寄存器型------

register如:registerinta,b;

registera,b;动态变量,存放在CPU寄存器register变量初始化若不赋初值,其值不定每次函数调用时赋初值变量个数受限(2),且不能为long,double,float型局部变量,用于函数内、复合语句和形参voidmain(){registerinti,sum;for(i=0,sum=0;i<=100;i++)sum+=i;printf("Sum=%d\n",sum);}第二十四页,共50页。静态型------

static如:staticinta,b[5];静态变量,存放在静态存储区static变量初始化若不赋初值,自动赋0编译时赋初值,只赋一次分为局部static和全局static局部static-----具有全局寿命和局部可见性,值具有继承性全局static

-----作用域从定义点到本文件结束,并且不能扩展到其他文件>>第二十五页,共50页。外部型变量(说明)------

extern如:externinta,b;不是定义变量,是对已定义过的全局变量进行说明作用:扩展变量作用域全局变量定义与全局变量说明不同>>>

定义

说明次数:只能1次可说明多次位置:所有函数之外函数内或函数外分配内存:分配内存,可初始化不分配内存,不可初始化externinta=2;第二十六页,共50页。变量存储类型静态动态程序整个运行期间函数调用开始至结束编译时赋初值,只赋一次每次函数调用时自动赋初值0或空字符不确定静态存储区动态区寄存器局部变量外部变量定义变量的函数或复合语句内本文件所有文件register局部staticauto外部static外部存储方式生存期赋初值未赋初值存储区作用域存储类别第二十七页,共50页。

Eg.Scopeoflocalvariablesfloatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}voidmain(){intm,n;…….}Scopeofa,b,cScopeof

x,y,i,jScopeof

m,nmain函数中定义的变量只在main中有效形参是局部变量第二十八页,共50页。Eg.Scopeofglobalvariablesinta=3,b=5;voidmain(){voids);printf(“a=%d,b=%d\n”,a,b);

swap();printf(“a=%d,b=%d\n”,a,b);}inttemp;voidswap(void){temp=a;a=b;b=temp;}ScopeofabScopeoftemp全局变量自动初始化成0全局变量采用静态存储全局变量作用域可扩展第二十九页,共50页。Eg.Scopeofautovariablesvoidmain(){intx=1;

voidprt(void);

{

intx=3;prt();printf(“2ndx=%d\n”,x);

}printf(“1stx=%d\n”,x);}voidprt(void){intx=5;printf(“3thx=%d\n”,x);}Output:3thx=52ndx=31stx=1Scopeofx=1Scopeofx=1Scopeof

x=3Scopeof

x=5第三十页,共50页。Eg.Variableswithsamenameindifferentfunctionsvoidsub();voidmain(){inta,b;a=3;b=4;printf("main:a=%d,b=%d\n",a,b);sub();printf("main:a=%d,b=%d\n",a,b);}voidsub(){inta,b;a=6;b=7;printf("sub:a=%d,b=%d\n",a,b);}Output:main:a=3,b=4sub:a=6,b=7main:a=3,b=4main:b=4main:a=3动态存储区按栈方式工作sub:b=7sub:a=6第三十一页,共50页。inta=3,b=5;intmax(inta,intb){intc;c=a>b?a:b;return(c);}voidmain(){inta=8;printf("max=%d\n",max(a,b));}Eg.localandglobalvariableswiththesamenameOutput:max=8Scopeofglobala、bScopeoflocalaScopeoflocala、bScopeofglobalb第三十二页,共50页。#include<stdio.>voidprt();inti;voidmain(){for(i=0;i<5;i++)prt();}voidprt(void){for(i=0;i<5;i++)printf(“%c”,’*’);printf(“\n”);}Eg.SideeffectofexternalvariableOutput:*****Initializedto0automatically第三十三页,共50页。Ea;main(){…….…….f2();…….f1();…….}f1(){autointb;………f2();……..}f2(){staticintc;………}ScopeofcScopeofbScopeofamainf2f1mainf1f2maina’slifetime:b’slifetime:c’slifetime:第三十四页,共50页。voidmain(){voidincrement(void);increment();increment();increment();}voidincrement(void){intx=0;x++;printf(“%d\n”,x);}Eg.SuccessivevalueofinternalstaticvariablesOutput:111voidmain(){voidincrement(void);increment();increment();increment();}voidincrement(void){staticintx=0;x++;printf(“%d\n”,x);}Output:123第三十五页,共50页。#include<stdio.h>inta=10,b=0;voidfunc1(){ inta=25,b=50; b/=a+5; printf("a=%d,b=%d\n",a,b);}voidfunc2(){ printf("a=%d,b=%d\n",a,b+=5);}voidmain(){ intb=10; printf("a+5=%d,b=%d\n",a+5,b); func1(); func2();}程序运行结果为:

a+5=15,b=10a=25,b=1a=10,b=5

第三十六页,共50页。#include<stdio.h>intmathfun(intfst){ staticintthd=5; intsec=0; sec+=1;thd+=1; return(fst+sec+thd);}voidmain(){ intn=4,num=0; for(num=1;num<=3;num++) printf("%d~%d\n",num,mathfun(n));}A.1~11B.1~11C.1~11D.0~112~122~112~131~123~133~113~152~13第三十七页,共50页。Eg.Scopeandlifetimeofvariables#include<stdio.h>inti=1;voidmain(){staticinta;

registerintb=-10;

intc=0;printf("-----MAIN------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);c=c+8;other();printf("-----MAIN------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);i=i+10;

other();}voidother(){staticinta=2;staticintb;

intc=10;a=a+2;i=i+32;c=c+5;printf("-----OTHER------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);b=a;}globali1main:a0b:-10registermain:c0staticmemorydynamicmemoryother:a2other:b0other:c10843315443other:c10675156第三十八页,共50页。intp=1,q=5;floatf1(inta){intb,c;…….}intf3(){…..}charc1,c2;charf2(intx,inty){inti,j;……}main(){intm,n;…….}Scopeofc1,c2Scopeofp,qexterncharc1,c2;ExtendedscopeEg.Extendthescopeofexternalvariableswithexternexterncharc1,c2;Extendedscope全局变量自动初始化成0全局变量采用静态存储externcharc1,c2;Extendedscope第三十九页,共50页。voidmain(){voidgx(),gy();printf(“1:x=%d\ty=%d\n”,x,y);y=246;gx();gy();}voidgx(){x=135;printf(“2:x=%d\ty=%d\n”,x,y);}intx,y;voidgy(){printf(“3:x=%d\ty=%d\n”,x,y);}Eg.ExtendthescopeofexternalvariableswithexternOutput:1:x=0y=02:x=135y=2463:x=135y=246externintx,y;Declarationofthedefined

globalvariables第四十页,共50页。Eg.Definitionvs.declarationofexternalvariables#include<stdio.h>voidsx,inty){intt;t=x;x=y;y=t;}voidmain(){

s);printf(“a=%db=%d\n",a,b);}inta=13,b=-8;

voidswap(){intt;t=a;a=b;b=t;}voidmain(){swap();printf(“a=%db=%d\n",a,b);}inta=13,b=-8;externinta,b;externinta,b;第四十一页,共50页。Eg.Referenceexternalvariablesinotherfilesintglobal;voidfunc1(){global=1;x=1; }staticintnumber;voidfunc2(){ number=2;global=2;}floatx;staticintnumber;voidfunc3(){number=3;global=3;printf("number=%d\n",number); }externfloatx;externintglobal;externintglobal;第四十二页,共50页。编译预处理作用:编译程序的一部分,将特殊命令扩展到程序中,生成扩展C源程序种类宏定义#define文件包含#include条件编译#if--#else--#endif格式:“#”开头占单独书写行语句尾不加分号;定义位置任意,决定其作用域第四十三页,共50页。不带参数宏定义

一般形式:#define宏名

宏体功能:用指定标识符(宏名)代替字符序列(宏体)定义位置:

温馨提示

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

评论

0/150

提交评论