




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Slide:
4-1第1页,共89页。章节:函数与模块化设计方法作者:傅忠传C语言程序设计傅忠传哈尔滨工业大学计算机学院
2003年8月Slide:
4-1章节:函数与模块化设计方法作者:傅忠传第四章函数与结构化设计方法第2页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传该章的学习内容学点什么哪?第3页,共89页。掌握函数原型(prototype)及其,函数定义和函数原型说明的方法及二者的区别。掌握函数的参数传递方式与函数调用方法。
理解掌握变量的作用域和存储类的概念。章节:函数与模块化设计方法作者:傅忠传
Slide:
4-1通过C语言的学习,牢固树立起函数的概念,及其使用规则
。理解函数的作用域及其存储类及其自动变量与静态局部变量在应用中的区别。*3.在实际应用中,学习和体会采用结构化设计方法(模块化)解决问题的思想。第4页,共89页。本章的学习难点Slide:
4-1第5页,共89页。章节:函数与模块化设计方法作者:傅忠传本章目录函数*宏定义变量的作用域和存储类*模块化程序设计方法*应用设计实例多文件方式组织的程序Slide:
4-1第6页,共89页。章节:函数与模块化设计方法作者:傅忠传本章目录1.函数函数有关概念及其分类函数的定义函数的返回值函数的调用与参数传递函数原型的说明2.*宏定义2.变量的作用域和存储类2.*模块化程序设计方法2.*应用设计实例2.多文件方式组织的程序Slide:
4-1章节:函数与模块化设计方法作者:傅忠传C程序工程源程序文件1源程序文件2源程序文件3函数n…编译预处理命令
全局变量声明
函数1函数首部函数体局部变量声明执行语句C第7页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传位己进,行即编递译归。调其用扩。展名为
.h或
.c。(((((4132))))主CC程p函语r序o数j言j言的e可c程执t以序—行调源—源—从用文m工任a件i程意n(:由子)是函是函函由数数一开,组个始而成或。子多没函函个有数数CmC不的a程i能n序概序概(调源念)用函文是主数件C函的语组数程言成。序结。,构一不个程个程能源序执程设行序。计是思想由的子调一体函个用现数或其。的多他主地个函函位函数数是数后:平组包流等成括程括的。回一,到个相m且互ai仅独n函有立数一,个相,—互在一—无m个maai从源ini函n属程(数关)序。结系是其束,一他整可个函个函以编程数相译序:互单可运调位以行用,有。。即,以也源可程以序m序子没a为函i有n单数函,位可数可进以是以行直系有编接统译一或定,个间义而,接的不也。地是可自可以己以函调有数用多为自个单。C程序由主程序与子程序组成第8页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传从用户角度看:如:scanf、printf、sqrt、getchar等标准函数(库函数)使用:用#include
命令将调用函数所需头文件包含到源文件中之后可直接调用。用户自定义函数:先定义而后使用(调用)!用户自定义函数使用的一般过程:函数定义,函数说明,函数调用第9页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传无参函数
int
a(
){……}从函数的形式看:有参函数int
max(
x
,
y
){……}主调函数调用被调函数时,不能传递参数(数据)。一般用来执行指定的一组操作。参数第10页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传(1)传统风格函数定义:类型
函数名(形参表列)形参说明{说明部分语句}类形型参:表函列数是类用型逗,用号来分说隔明
的本形函参数,返形回参值又的称类为型形。式
参当数函、数哑返元回、值虚是参整、型虚或拟不参要数求。返在回形值参时说,可明可明省中略,类说
明型形说参明表。中无每返个回形值参可的用类型“。空类型”—void定义函数定义时的参数称为行参;函数调用时的参数称为实参。第11页,共89页。章节:函数与模块化设计方法作者:傅忠传
Slide:
4-1(2)函数的现代定义方式类型函数名(形参说明表列){说明部分语句函数体}传统定将义形举参例说明包含到现形代参定列义表举中例,即在i列i列n出t
形ad参d(的x,同y时)
,说明形i参nt类a型dd。(int
x,
int
y)形in参t
列x,表y:;{……{类{类…型…参}参}
数1,类型参数}2,… ,类型参数n第12页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传int
add(int
x,
int
y){int
z;定义求z=两x+y个;整数和的函数。return(z);}第13页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传\n");⒊函数使用标识符给函数命名,即取名原则与变量名相同。类}p型rin可n可tf以("省略。}⒌⒋⒌⒋⒎⒉⒈形函形在当参数参定函名表名表义数列前列函不为面中面数需有,的,的中要参形类形类指参函参型参型定数与即与的时形为形为形,函参函参省应数间,略对的用在形其类“未参全型,被表。部。部”调分函分函用列参数隔时和数的。,形进类他参行型们说数实不明据际占,类上用但型是内不函说存数能数能明单返省。元回略,值括只的号有类,在型函该。当函I函I数n被t数名调m被后a函x调的(数f用l括l括无o时a号返t,内回x函,为值f数l空时o中a,,,,t的实即y形)际为参上无才就参被是函分带数配回。⒍的内的{内{Vfo形存形存是liod单参一aptpt元说个r个riz。明n不;t是_是_确in定对定对fo的形(值式),参可数用的“数vo据o据id类”型的说定说定{zp义=明rxi“>。nyt无?fx(类:"y-型;--”--(-(或--或-称--“--空--类--型--”--)\。n"当);函数rp的erti返unrt回nf(值z")W为;el整co型me时t,o
H函IT数.\名n名n")前;的数据第14页,共89页。章节:函数与模块化设计方法作者:傅忠传
Slide:
4-1函数的返回值功能将被调函数中的结果值返回给主调函数。语句return(返回值表达式);举例int
add(int
x,
int
y){int
z;z=x+y;return(z);}第15页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传⒉⒊⒈有当有当当些函些函函系数系数数统值要可的可的求省类省类返略型略回型回r函和函和e数rt数rteue值rtrunun时r后r后n,的语的语函括句括句数号后体。的内表达式最类后型执不行一的致语时句,应则为则为返以返以回函语数句类r型et为ur准n。。对数一r值个et型函ur数数n
_据_据中表可可达自以式动有;转一转一条换条换或。多条return语i4句n.t,“m只函ax有数(f被类lo执型at行就x到是,的函flr数oeat中turyne)语tu句rn才语起句作后表{达用f式l式l。o的a当t类函z型数;”不是需错要误返误返回的值!时,后面不加5括z.=r号xe>t和yu?r表xn:语达y句式;完,完,也成也成可了没被有调r函et数ur向n。主调函数值re传tu递rn的(z功);能。}第16页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传下面add函数的功能是求两个参数的和,并将和值返回调用函数。函数中的错误是:void
add(float
a,
float
b){
float
c;c=a+b;return
c;}void
add(float
a,
float
b)float
add(float
a,
float
b)第17页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传格式函数名(实参表列)——与调用标准函数相同说明⒈⒍⒈⒌⒊⒍⒌⒊⒋当形实形实实实形参调参调参参可用变和变和在以无量调形量调形是用参用参和参和参常函函实的量数数参数参数、前时变据变据变不,量传量传量占实占递或用参据是据是表内表不单达存列同向同向式的为的值的值,存空存传存传调储。储递储递⒉有参函数进行调用时,实参列表中各参
(单用单用数空即i元以元n以n函间只t逗。逗。数;有f号u前只前只实n分(有(有应参隔)在保传保传,函递证且给数给数每实形被个参调实与n,用=参形f而时u都参不n,应(应(有能系)在确由;统个定形才数值参分、。传类配在{回型…临…临调数、…时用时用据位时存给置将储实一实空参一参间)对值;。;。应传当f。u给函n(虚数)参;退。出,返回被调}函数时,该存储空间被释放。Debug第18页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传#include
<stdio.h>main(
){int
a,
b,
c;输sc入an两f(个"%整d,数%d,",求&a其,中&中&b)最;大者并打印。c=max(a,
b);/*函数调用*/printf("max=%d",
c);}int
max(int
x,int
y)/*现代风格函数定义*/{return
(
);}x>y?x
:
y第19页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传调用方式函数表达式函数参数函数调用语句print_star(n);void
print_star(int
n){int
i;}x=max(a,
b)+5f;or(i=1;
i<=n;
i++)printf("*");x=max(max(a,
b),
c);第20页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传#include
<stdio.h>main(
){int
a=5,
b=10;分析pri一nt下f("程"程a=序%d,,
b写=%d出d出\n运",行a,结b)果;
。fun(a,b);
/*函数调用*/printf("a=%d,b=%d\n",a,b);}int fun(int
x,int
y)/*现代风格函数定义*/{x=3;
y=3;return;}a=5
,
b=10a=5
,
b=10第21页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传实参形参返回主调函数向被调单函向数值传传值递的方式:•赋值调用把实参的值赋给形参。•赋地址调用把实参的地址付给形参。在被调函数中,用该地址访问主调函数中的实参。调用第22页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传传递方式属于赋值调用,将实参值传给虚参。虚参要求必须是简单变量。实参要求哑实结合可为一般变量、常量、数组元素或者表达式。哑元和实元按顺序一一结合。由于是赋值调用,修改哑元,对实元无影响第23页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传下面函数pi的功能是:根据以下公式,返回满足精度(0.0005)要求的π的值,请填空。—
=
1+
—
+
—
—
+
—
—
—
+
……π1
1
2
1
2
323
3
5
3
5
7第24页,共89页。章节:函数与模块化设计方法作者:傅忠传
Slide:
4-1#include
<conio.h>
/*Direct
MSDOS
console
input/output*/#include
<math.h>#include
<stdio.h>double
pi(double
eps)/*子函数的定义*/{double
s,
t;
int
n;return
(
);/*函数的返回值*/}/*主函数*/main(
){double
x,p;printf("\nPlease
enter
a
precision:
");scanf("
%lf
",
&x);for(
s=0.,t=1.0,;nt=t=>1eps;
n++){s+=t;
t=n*t/(2*n+1);}2.0*s实参形参调用returnp=pi(x);
/*调用*/ppr=ipnit(fx()“
\neps=%lf,
π=%lf
”,
x,);
}第25页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传说明用另一个函数时,件件开头用#iincclude命令将调调用有关库函函⒊⒉⒋函⒊⒉⒋⒈数如如如如如早被声果果期果期果调明使版使版使被使被用的本用本用用调的一的库用函般C函户函户函数语数语形数自数自数言必式,己的己的,须:一定函是般数义数义已还声的出经应明函现函现存该方数在数在在式,主,主的本不而调而调函文且函且函数数是数该类是该类(是采之函型函型库用前数函函函,与数数数可调或名原以用用(型(型不类它类户,必型的型的自而加1函1函己只,以数定声类说义明(型明型明即的函的函。2。2主数函数函,调名数…和函和函)…。函数)););在的的外部已作了函数声明,则在各个主调⒍⒌⒎⒏⒍⒌⒎⒏有如函如函些果数系在的在的统所“在在有声函一函明数个数”数”调函定和定和用数义“义“前之定之定中,前义前义调不,”,”对在的在的函差函差数别作:定声声定明义明义:时:时指指,函编数数译功系系能能统的会确把立第,一包次次括遇指到定的函该数数函函数数函函fl所名数数oa需、中形t
要函a函a不式d用数d应必((函到类f对具l的数的数型o所备a信定、t调什息形义形义a用么,“参和的条f包及l函l函函件o含类a数数t?”型再调再调b到、)作用本函声)文作数明件为。中函类数一类数一型类个类个文型文函件。件数中名时(类,型应1在参主数调名函1数,的…说…明);部{分来体举数举分来体举数举frl或e等或。例e等。例声例声例ota主,主,:u:u:明:明tr调是调是na,a,d(函一d并d并a(>(>数个bf将bf将?l之l完之完ao函o函前:整前:整at数t数b对、)a类a类;被独,}型调立调立fl默l默函的函的oa数认a函数认函t作数为b声单声单i)in;n明位明位t型。。#ff声函#ff声函mmillillaa明因数因数明noonooiicaaacann而声:声而:lttltt((u,明,明)是a)a是adad)dddede的如的如dddd对<((((s一果f已)t)tl;d;般d般函o函o定ia形ot数义.式ha类函>,:型f数l标l标o为的a准t整返整返输b回形)入;值,输和可出形以函参在数{f{#进类函f{#进类函fli…i…行l行型lo型数o数noac…c…类at调t调l函tu}u型a用d数ade说,d前名<(b明mfmf不;(lala。类ot必t必ah它型t作>,1不1不函,f包l数类标o括a声型准t)形)形明2数;,。参。参学…本计…身算)和函;函数…类数…类数…sc…型…型体a…nf。(函"%f数,%名f"(,类&a,型&b1);参pri数nt名f("1%,f",…ad…d()a,;b);}pprottot第26页,共89页。yppeSlide:
4-1章节:函数与模块化设计方法作者:傅忠传输入两个实型数,求其最大值。第27页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传#include
<stdio.h>main(
){
float
a,b,c;scanf("%f,%f",&a,&b);c=max(a,b);printf("Max
is
%f\n",c);}float
max(float
x,
float
y){return
(x>y?
x:
y);}为整形。编译错!是函否数类正型确默认?第28页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传######iiiiinnnnncccccllllluuuuudddddeeeee<<<sstststddtdtiidooi..ohh.>>h>fmfmlaoiant(
m)m)ax(float,xf,lofalto)a;t
y)m{{m{{ararieiefntnl(u(uora)nt(mxa>a>yxyx?(fxl:oya)t;,
float);}{}{
float
a,b,c;massssiccncna(a(ann)ff((““%%dd,,%,%d%”d”,&,a&,a&,b&)b;);{
fcfcl=l=omomatxtx(a,b,),)c;c;;spspcrcraiaintftft(f(f(“(““%MdMdM,a,a%x%xdi”s
%,d&d&”a”a,,&,&cbcb);}}}}
c=max(a,b);ffffllpooraaittntmmfaa(xx“((ffMllaooxaatitsx%x,d,”f”flf,olcao)ta;ty)y){}{{}{rreettuurrnn((xx>>yy??xx::yy));;}}}}第29页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传宏定义不带参数的宏定义:——即第二章的符号常量带参数的宏定义:第30页,共89页。章节:函数与模块化设计方法作者:傅忠传
Slide:
4-1带参数的宏定义功能格式举例将一个带参数的标识符定义成一个字符串。#define 宏名(参数表) 字符串字符串中可包含参数表中的参数。#define
s(a,
b)
a*barea=s(3,
2);处理
在编译时,用字符串替代带参数的宏名,其中出现的参数由相应的实际参数替代。第31页,共89页。章节:函数与模块化设计方法作者:傅忠传
Slide:
4-1带参数宏定义的说明书写字符串时,应注意括号的使用。⒈⒉⒊⒈⒉⒊如不为想能了计写适算成应(各3+种5#)d*情e(f4况i+n7,e),将s(不a,能,能b写)成(a)*(b)否##d则deef,f,fii在n在nnee计ss算(算((a2a2a,4,4,b/b)b)()3a**4a4ab)*)*b时b时,使用2改2改s4(写/3s+成(53,4+)7会)出→错,3+→5*42+47/=(30)*(4)→32而#应de是fine#dse(fai,neb)s((a(,ab))*(b(b(a)a))*)*)*b*b()()b)第32页,共89页。章节:函数与模块化设计方法作者:傅忠传
Slide:
4-1带参数宏和函数的区别带参数宏与函数在使用上,同函数相同,与其它语言的语句函数相似。转行转行换的;,而在宏展不开存时在并类不型分问配题内,存宏单名元无,类也型不,进它行它行的值参的数传也递无处类理型,,也只没是有一“个返符回号值代”表的。概念
。#define
CIRCLE(R,L,S)
L=2*PI*R;S=PI*R*RCIRCLE(5,L,S);⒋⒈⒍⒉⒌⒋⒈⒍⒉⒌函函宏函函函宏函多数次替数次数替数调使只换调换只调用可不用可不用时宏得占是得占是,时到运在到运在先,程一行程一行求宏时个序个时序出展间返运间返运实开,回行,回行参后只值时值只表源,处占处,达程理编而理而编式序译用的用译的的变,处宏,处值长理分可理分,以时配时以配然而设临设临⒊对函数中的实参和形参都要定义类型,且
后函二间时法后函间二法时带数带数,者,者得的得的入调入调而的而的到内到内函用函用函类函类存几存数不数数型数型个单个单定使定使调要调要结元结源义源求用求用果;果;程中程则一则。而。序函序函占致占致宏例宏例数变数变运,运,如扩如的长的长行如行如:展:展。形。形不时不则参间一间一是;致。致在而在而应用编进带译行参之类宏前型进
#只#只de是fi进ne行PI简单3单3.1的41字59符替换,不进行计算。第33页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传Talk
to
me
as
a
threeyear
old!计算机与人工智能AI——Artifical
Intelligence第34页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传变量的作用域变量的存储类第35页,共89页。章节:函数与模块化设计方法作者:傅忠传
Slide:
4-1作用域定义
程序中定义变量的位置及其能被读写访问的范围,它是从空间角度来描述变量。变量的作用域的分类局部变量全局变量第36页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传定义在一个函数(包括主函数main)内部定义的变量是局部变量,它只在本函数内有效。即只在本函数内才能使用它,在此函数以外是
不能使用这些变量,也称为内部变量。第37页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传a,b,c有效}⒉不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。⒊⒋⒈形在局式复部参合变数语量语量也句只是中在中在局定本部义函变的数量变内。量有只效在。本复合语句F中f中fllo有oaat效t
f—fuunun—(ni(复n复nitn合ta)语a)句/局*函/部/部*数变函f量数un。f。f*u/n*/F{m{ililainointantntt(b,b,b)f)f,cu;nc(;int
形a)参a/的*/主*作函函用数数域fumum只na*i在/nf*f*u/n中//**主主/函函*主数主数数m函amia数ni*nm/*a/in*/d有效
b,
c有效i,
j有效{{i…i…nnt…t…t…bb,,cc;;}}…………
}mmmaaaaaiiiiinnn(({())i)nt
d;{{{iiinnntttbb,di,di,=,=,ccbcb;j;+;c;………………………}}}第38页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传定义在所有函数之外定义的变量称为全局变量,外部变量即全局变量。全局变量可以为本文件中所有其他函数所共有。它的有效范围为从定义变量的位置开始到本源文件结束。第39页,共89页。Slide:
4-1章节:函数与模块化设计方法int
p=1,
q=5;float
f1(int
a){int
b,
c;……}char
c1,
c2;char
f2(int
x,
int
y){int
i,
j;……}main(
){int
m,
n;……}作者:傅忠传/*外部变量*//*定义函数f1*//*外部变量*//*主函数*/c1,/*定义函数f2*/c2作用范围p,q作用范围extern 类型 变量名;(与函数声明类似)⒈⒌⒉⒋⒎⒊⒍⒈⒌⒉⒋⒎⒊⒍如在若如若为在外若若为外全要果一了一了同部局在一个一区个一变定个程别程别源量义C局序局文说文说增程点由部由件明加序之变多变中可中可了只前个量个量,进有函有函的和源和源外行函一行函一数全文全数个部个多部多间局件局内源变次数组变组引文量不量不据量成量成用件与分联,它,局配系跨习跨习部内部内的
则变渠文存时惯则变渠文存时惯外量外量道件单件单,用,用部同部同。引元引则法则法变名变名在用;用;是应是量,量,函外但外但在全在全的则的则数定部定该局该作在作在间变义变函变函用局用局可只量只量数量数域完部完部能也能也中名为名中为成变有要有要从的用的数一做一做量定e第e第据次外次外x的义的义t一的一的部,部,e变作r传r传个定变定变n量递用对用对字义量义量的。该母范母范说时说时变是
位量大明分围位量大明分围置作写作写。配内开外字外字存外始部母部母储部到。变。单变本变本量元源说量。文明不件。起结作束。用。第40页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传⒈⒉⒊⒉⒊全函使局数用变在全量执局在行变程时量序要太的依多全赖,部于部于会其执其执降所行低行低在程过程过的序程外的中部可始
终读变读变占性量用。,存因储而单它元使,函而数不的是通仅用在性需降要低时。才开辟当在当在存程移程储序植序单该执该执元行函行。时数时即时,时,不,人,人利必们必于很须很须节连难连约同清同内外晰外晰存部地部资变判变判源量断源断量。
及每及其一其一值时值时刻一刻各起各起外移外移部过部过变去变去。量。但的但的移值移值。过。因去因为又为每有每可个可能函能数与数与都其可他改变变量全名局同变名量。的即值降。即低即低增了加通了用调性或
试可试可移的移植困植困性难性难(。(。portability)。第41页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传#include
<stdio.h>main(
){extern
int
a,
b;printf("Max=%d\n",
max(a,
b));给}
出下列程序的运行结果。int
a=13,
b=8;max(int
x,
int
y){int
z;z=x>y?x:
y;return(z);}Max=13第42页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传int
a=13,b=8;
//全局变量main(
){int
a=5;//局部变量printf("Max=%d\n",
max(a,
b));}max(int
a,
int
b){int
c;c=a>b?a:
b;return(c);}Max=8第43页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传#include
<stdio.h>int
k=1;main(
){int
i=4;fun(i);printf("(1)
%d,%d\n",
i,
k);}fun(int
m){
m+=k;
k+=m;}printf("(3)
%d,%d\n",
m,
k);}(2)
1(3)
5,
6(1)
4,
6/*全局变量k=1*//*局部变量*/
程序的运行结果是:/*形参m=4*/{char
k=‘B’/*;m=m+k(5),k=k+m(6)全局变量k*/printf("(2)%/d*\复n"合,语k-句"A的")局;部变量k*//*实参i=4*/第44页,共89页。Slide:
4-1作者:傅忠传章节:函数与模块化设计方法int
i=0;main(
){int
i=5;reset(i/2);
printf("i=%d\n",
i);reset(i=i/2);
printf("i=%d\n",
i);reset(i/2);
printf("i=%d\n",
i);workover(i/2);
printf("i=%d\n",
i);}workover(int
i){i=(i%i)*((i*i)/(2*i)+4);printf("i=%d\n",
i);return(i);}reset(int
i){i=i<=2?5:
0;return(i);}运行结果是:i=5i=2i=2i=0i=2第45页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传描述变量的存储类是从变量的存在时间即生存期角度描述变量,它指的是数据在内存中的存储方式——存储类别。存储方式函数形参、自动变量、现场数据具静体态类存型储动态存储自动变量外部变量寄存器变量静态变量定义:存储类类型变量名;全定局义变量、、声静明态变、量使(s用tat;ic)第46页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传描述
在函数中,没有用static说明的形参和变量都属此类型,属于系统默认类别。定义在调用函数时系统会给该类型变量自动分配存储空间,在函数调用结束时就自动释放这些空间。这类局部变量称为自动变量。auto 类型 变量序列变量声明声自自声自自明动明动动时变时变变,量,量量A是A是是ut动t动局o态可态可部省存省变储略储量类,类,省型省型作略的略用时变时变域量,量,。默。默同认于a局ut部o型变。量。第47页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传可在定义时初始化,若未进行初始
化,也没赋值,其值将是不确定的。}举例
int
f(int
a){auto
int
b,c=3;……/*定义函数f,a为形参*//*定义b,c为自动变量*/auto
int
b,c=3;int
b,c=3;自动类型是默认类型等价第48页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传定义该类型变量的存储空间不是内存,而是cpu中的寄存器,因而称为寄存器变量。原因为了提高访问速度,将经常使用的变量定义在cpu中的寄存器,提高系统效率。register
类型名变量名;定义格式第49页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传例限如于:整形Tu、rb字o
符C只型把和源指变向址整寄形存、器字SI符和型目的的指变针址。寄存器DI用于寄存器变量,⒉3⒈3⒈.一由一由只于个于个有寄计局存算部器机自不系动系动参统变统变加中量内的和存寄形编存参址器可,数以因目作而是为对有寄
限寄存寄存的存的存器器,变变不量量能,能,不其定能他义使任(用如意&全运多局算个变符寄量。存、器局变部量静。不态同变的量的量)系)系不统行允。许并使且用寄的存寄存器存器器变不量同一。般只4.寄存器变量特别适用于要求快速和频繁使用的场合,例如:循环控制变量、多数r余组余e组eg的i的的i的s下t下t按e标r标r自s、s、动ta动a动变ti态i态量c数处数处in理据t
。结a,构b,中c用;于查询的re指e指g针i针is等te。r
float
x,
y;第50页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传int
fac
(int
n){register
int
i,
f=1;for(i=1;
i<=n;
i++)f=f*i;return(f);}main(
){int
i;for(i=1;
i<=5;
i++)printf("%d!=%d\n",
i,
fac(i));}循环的次数越多,越节省访问时间。第51页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传⒉⒊⒈外外在部部所变变有量量量量函可是数在静之定态外存义定储时义类作而型没初没初的有始变指化量定;,其没在存有
程显储序式类运初别初别行的始的始变期变化期化量的间称外分为部配外变固部量定变,的量由存,编储即译空全程间局序,变自因此动量其初。生始生始其化存作为期用零是域值符整符整。合个全程局序变的量运的行规期定,,就连是说接它在的一值起的不的不各随目函标数文的件退的出源调程用序而文消件失中。的所有函数均可以访问外部变量。第52页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传*在一个文件内声明外部变量*在多个文件中声明外部变量第53页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传int
max(int
x,
int
y){int
z;z=x如>y果?
x外:
y部;
变量不在文件的开头定义,{extern
A,
B;int
A=13,
B=-8;其r有et效urn的(z)作;用变域量只定限义于、变定变定量义声处明到、文变量件引终用结处}。如果在定义点之前的函数想引用该外部ma变in量(),则应该在引用前用关键字extern对p该rin变tf量("%作%作d\“n"外,m部a/x*(外变A,部量B变)声)量;明声”明*。/表明该变量是}一个已经定义的外部变量。/*外部变量的引用*//*外部变量定义*/第54页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传:在任意一个文件中序m序ai文n()件组成,如果在两个程序中都用到同extern
num;/*变量声明*/int
i;#i/in*ncpclrluoudjdeeec<tf工un程4.文h>件包含func4.c/和*func4.h*/mafiunn(4).h如两个果文一件个*/C程序是由i一nt
个num或;/*多变量个定源义程*/{i{nt
i;n一u一m=个800外;i部=部j;变/*变量量n引um用时*/,不能分别在两个文第55页,共89页。p件r件in中tf(各"%d自",n定um)义;一个外部变量num,否则编g译en译tucm出h=(8)0错;0;i。=j;正/*变确量的引用作用作*用/}定p定rin义tf(外"%d部",n变um)量;num,而在另一个文件中用
egeextcthe()r;n对num作“外部变量声明”。}Slide:
4-1章节:函数与模块化设计方法作者:傅忠传定义静态变量是静态存储类型的变量,即在程序运行期间分配固定的存储单元,它永久存在,不随函数的退出调用而释放。静态外部变量静态局部变量分类static
类型 变量名;语句格式第56页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传在所有函数之外定义的静态变量是静态外部变量。定义说明⒈⒊⒉fi静未对le态显外1.外式部c部初变变始量量化加可的s使t静a变t态if量c外c外i声l从部e明2全变.,c局量不变在意量编味局这译st部时at化才自ic是动(局i静初n部t态始于A存化;本储为文,零件而值)e不。,xt加但ers始nta终itni是tc的静A;
态是ma存动in储态(方存)式储。两种形式fu的n(外in部t
变n)量都静是{态静外态部存变储量方是式所,在只源{是…程作…序用中域的不全同,局都…变是…量在,编对译于时其分他配源内文A存=件A。*来n;说是其所}在文件的局部变量,…其…他}的源程序不能引用。第57页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传定义
在函数内部定义的静态变量是静态局部变量。说明⒈⒉⒈⒉⒊⒋⒊⒋对静对静局态局态局部局部局部变部变部变量变用量用量s是s是可t在a在a在使在t某i定变定变c函声义量义数明时由时中,初动初动的则始态始局为化存化存部该储,储,变方未方量显式显,分,分式改式改配其配初变初变的他的始成始成存函存函化静化数储数储的态的态无空无空静存静存间权间态储态储访在访在局方局方问整问整部式部式。个。个变。变。程当程当它量它量序退序退作在作执出执出用编用行对行域译域译该期该期时不时不间函间函自变自变数始数始动,动调终调终初局初局用存用始限始限时在时化于化于。,。,为本为其零函零值数值保。留,下次调用的初值是上次调用退出的终值。第58页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传main(
){increment(
);increment(
);给inc出rem以ent下(
)程;
序的运行结果。}increment(
){int
x=0;x+=1;printf("%d\n",
x);}111第59页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传main(
){increment(
);increment(
);increment(
);}increment(
){static
int
x=0;x+=1;printf("%d\n",
x);}123第60页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传main(
){int
x=1;increment(
);printf(“%d\n”,x);increment(
);printf(“%d\n”,x);}increment(
){static
int
x=0;printf(“%d\n”,x);
x+=1;increment(
);printf("%d\n",
x);}112131第61页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传int
n=1;func();main(
){static
int
x=5;
int
y;y=n;printf("MAIN:
x=%2d
y=%2d
n=%2d\n",
x,
y,
n);func(
);printf("MAIN:
x=%2d
y=%2d
n=%2d\n",
x,
y,
n);func(
);}{static
int
x=4;
int
y=10;x=x+2;
n=n+10;
y=y+n;printf("FUNC:
x=%2d
y=%2d
n=%2d\n",
x,
y,
n);}MAIN:
x=
5
y=
1
n=
1
FUNC:
x=
6
y=21
n=11
MAIN:
x=
5
y=
1
n=11
FUNC:
x=
8
y=31
n=21func(
)//**x函静数态定局义部*/变量*//*函数调用*//*全局变量n
*//*函数声明*//*
x静态局部变量,初值=5;y局部变量*/给/出*y=以=以1
下5程序的1运行结1
*果/
。第62页,共89页。Slide:
4-1第63页,共89页。章节:函数与模块化设计方法作者:傅忠传本章目录函数宏定义变量的作用域和存储类模块化程序设计方法4.1.模块化程序设计方法的指导思想4.2.模块分解的原则5.应用设计实例5.多文件方式组织的程序章节:函数与模块化设计方法作者:傅忠传
Slide:
4-1模块化程序设计方法的指导思想无在论编多写么较复大杂规的模任的务程,序都,可为以了划提分高为编若写干个工作子的任效务率。,把可每把个程子序任总体务上设划计分成成一几个个子功函能数相,对若子独任立务的较程复序杂模,块还,可分以别将由子不任同务的继编续分程解人,员直进行什么是模块化程序设计方法编到写分。解各成模为块一之些间容用易接解口决联的系子。任这务样为,止只。要每接个子口任关务系对不应变一,个每子个函模数块,内完部成的总具任体务实的现程细序节由可以一由个各主自函的数编和程若人干员子随函意数修组改成。,这主就函是数模起块着化任
务程调序度设的计总方控法作的用指。导思想。第64页,共89页。章节:函数与模块化设计方法作者:傅忠传
Slide:
4-1模块分解的原则分解原则结构图132..使模每模块个块应模脱该块离设只其计完使得成用使一环其个境所相,含对应信独该息立保(的证过特
定是程功正和能确数,的据模。)块对之于间那仅些仅不交需换要那这些为些完信息
的成模系块统不功可能访必问须,交即换信的息信隐息藏,性即。模块具有独立性。主模块A
BCEF第65页,共89页。章节:函数与模块化设计方法作者:傅忠传
Slide:
4-1逐步求精与模块化设计的联系在规模比较大的程序进行逐步求精时,为了提高清晰度,常常采用分段结构的形式。在C语言中采用函数表示一些功能比较独立的部分,而在PASCAL语言中用过程(procedure)表示,从而使大的程序分解为若干功能独立的小的程序段,这种形式蕴含着模块化设计思想。而对于每个模块来说,又可以采用逐步求精方法进行设计。第66页,共89页。章节:函数与模块化设计方法作者:傅忠传
Slide:
4-1逐步求精与模块化设计的区别就程序规模来说,逐步求精主要是指一个程序的设计过程,而模块化设计主要指一个比较大的系统的设计过程。就程序设计的两种方法(分解与抽象)来说,逐
步求精方法侧重于分解,而模块设计侧重于抽象。模块化方法的外表是将系统化分成若干子系统,而
实质是要实现不同层次的数据或过程的抽象。第67页,共89页。Slide:
4-1章节:函数与模块化设计方法作者:傅忠传应用设计实例打印杨辉三角形求素数之和第68页,共89页。章节:函数与模块化设计方法第69页,共89页。作者:傅忠传
Slide:
4-1程序举例1—杨辉三角形11112
13
3
16
4
110
10
511141
5……Slide:
4-1第70页,共89页。章节:函数与模块化设计方法作者:傅忠传问题分析—1主函数main():调用输入三角形输出行数n的函数input();for
i=0
to
n{调用print_space(k)输出k个空格调用输出杨辉三角形的第i行函数print();}输入函数input()输入三角形输出行数nSlide:
4-1第71页,共89页。章节:函数与模块化设计方法作者:傅忠传问题分析—2输出三角形第i行函数print()for
j=0
to
i调用print_j(i,j)输出第i行第j个元素;输出回车换行输出k个空格print_space(k)for
l=1
to
kprintf("
");Slide:
4-1第72页,共89页。章节:函数与模块化设计方法作者:傅忠传问题分析—3输出第j个元素print_j()输出i!/(j!*(i-j)!)求m!函数func(m)fun=1for
l=1
to
mfun=fun*l;Slide:
4-1第73页,共89页。章节:函数与模块化设计方法作者:傅忠传C程序—1#include
<stdio.h>void
print_space(int);void
print_j(int,
int);int
input(
);main(){int
i,
j,
n;n=input();for(i=0;
i<n;
i++){print_space(36-i*3);for(j=0;
j<=i;
j++)print_j(i,
j);printf(〞\n〞);}}Slide:
4-1第74页,共89页。章节:函数与模块化设计方法作者:傅忠传C程序—2int
input(
){int
n;printf(〞请输入输出的行数:〞);scanf(〞%d
〞,
&n);return(n);}void
print_space(int
k){int
n;for(n=1;
n<=k;
n++)
printf(〞〞);}章节:函数与模块化设计方法作者:傅忠传
Slide:
4-1C程序—3long
func(int
n){int
i;long
m;for(m=i=1;
i<=n;
i++)
m*=i;return(m);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 陪诊师陪诊协议合同
- 项目合同解约协议书范本
- 食品代理类合同协议
- 门店合作协议书合同模板
- 集资住房买卖合同协议
- 鞋子销售合同协议书范本
- 2025陶瓷地砖采购与销售合同模板
- 2025基金传真交易金融合同
- 2025物流服务合同范本(与承运方签订)
- 2025合同示范文本GF
- 别墅庭院景观设计课件
- 槽式太阳能光热发电系统设计
- 交通疏解方案完整版
- 中考物理模拟试卷讲评课课件
- DB32T 3921-2020 居住建筑浮筑楼板保温隔声工程技术规程
- 跨越架施工方案
- 流动团员管理服务告知书
- Excel在财务管理中的应用(第五版)第10章综合案例
- 高考理综试题答题技巧方法!课件
- 行书典范《兰亭序》鉴赏PPT共32页课件
- 一体化泵站检测报告(共6页)
评论
0/150
提交评论