收藏 分销(赏)

C语言教学课件:第十部分程序结构(重复阅读).ppt

上传人:可**** 文档编号:10289776 上传时间:2025-05-16 格式:PPT 页数:108 大小:2.57MB
下载 相关 举报
C语言教学课件:第十部分程序结构(重复阅读).ppt_第1页
第1页 / 共108页
C语言教学课件:第十部分程序结构(重复阅读).ppt_第2页
第2页 / 共108页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第十部分 程序结构,(,重复阅读,),模块化程序设计与,C,程序结构,本部分内容,讨论程序整体结构及有关的问题,复杂功能分解与问题解决,模块化程序设计基本思想,高级语言的功能抽象机制,函数与,C,程序结构,函数原型,变量类别,变量作用域与存在期,内容重要,较难理解,需要通过实践和回顾去理解,四、程序中的变量与存储分配机制,dValue,35.7,变量,double,类型,名字,变量的存储单元,地址:,0 x00002f30,回忆变量的属性,规定存储的,长度和格式,double dValue=35.7;,存储单元是何时分配和释放的?,变量及存储分配,变量的存储分配,Memory allocation,存储分配,Allocate memory units to variables or arguments,空间释放,Memory release,free memory,存储释放,内存释放,变量的存储分配释放,动态分配和释放,:程序执行到定义处的时候才分配的存储空间,离开相应复合语句以后该变量无定义,即变量所占用空间被释放,等于变量不在存在,静态分配,:程序一启动就分配存储空间,程序运行结束前释放,t,t,程序开始,t,程序结束,t,s,t,e,为程序运行过程中的某一段时间,在,C,中,包括如下两种情况:,1.,函数调用开始到函数调用结束;,2.,进入一个复合语句到退出该复合语句。,静态分配的变量的生命周期,动态分配的变量的生命周期,动态分配与静态分配,t,s,t,e,变量的作用域与存在期,变量定义,确定了变量何处、何时能使用,何处能使用,作用域,能够使用变量的范围,代码段,何时能使用,存在期,确定变量建立和销毁时间,时间段。,各种变量的存在期可能不同。,变量实现的基础是内存单元,存在期就是变量被分配内存空间到撤消的期间,8,从,变量的作用域,来认识变量,局部变量和全局变量,可引用变量的范围,引例,:,局部变量的作用域举例,交换两个变量的值,#include,void main(),int a=4,b=9;,void fun(int,int);,printf(a=%d,b=%dn,a,b);,fun(a,b);,printf(a=%d,b=%dn,a,b);,void,fun(,int a,int b,),int c;,c=a;a=b;b=c;,printf(a=%d,b=%dn,a,b);,引例:全局变量的作用域举例,#include,void,fun,();,int a,b;,void main(),a=4,;,b=9,;,printf(,交换前的,a,和,b,是,%d,,,%dn,a,b);,fun();,printf(,交换后的,a,和,b,是,%d,,,%dn,a,b);,void fun(),int t;,t=a;a=b;b=t;,/*,使用的变量名,a,和,b-,全局变量,a,和,b*/,局部变量,局部变量定义:,定义在函数内或在,内的变量。称为局部变量。,有效范围:,在所定义的函数、复合语句中。,变量的,作用范围,仅仅局限在从变量定义处开始、到变量定义所在的那个函数或复合语句结束。,函数的,形式参数,为局部变量。,局部变量举例,float f1(int a),int b,c;,int f2(int x,int y),int b,c,i,j;,int main(),int m,n;,int k,.,形参是局部变量,main,函数的变量也是局部的,;,不同函数中变量的名字可以相同;,复合语句内可以定义变量;,a,b,c,有效,x,y,b,c,i,j,有效,m,n,有效,k,有效,a,b,的有效范围,c,的有效范围,int main(),int a,b;,int c;,c=a+b;,例:,func(int a,,,char ch),int b=1,,,c=2,;,float f,;,.,a=5,a=3,int a,,,b=3,;,a=b+c,;,printf(a=%dn,,,a),;,.,a=b+c,;,printf(a=%dn,,,a),;,Why?,全局变量,全局变量定义,:,在函数之外定义的变量,称为,全局变量,。,全局变量又称为,外部变量,。,全局变量的作用范围:,从变量定义处开始到该源文件结束处。,例,:,int a,,,b,;,void,exch,(),int t,;,t=a,;,a=b,;,b=t,;,void main(),scanf,(“%d,,,%d,,,&a,,,&b),;,printf(a=%d,,,b=%dn,,,a,,,b),;,exch(),;,printf(a=%d,,,b=%dn,,,a,,,b),;,a=2,,,b=5,a=5,,,b=2,输入,2,,,5,结论:全局变量在程序内可见,int a,,,b,;,exch(),int t,,,a=2,,,b=5,;,t=a,;,a=b,;,b=t,;,void main(),scanf,(“%d,%,d,,,&a,,,&b),;,printf(a=%d,,,b=%dn,,,a,,,b),;,exch(),;,printf(a=%d,,,b=%dn,,,a,,,b),;,a=2,,,b=5,a=,?,,b=,?,输入,2,,,5,a=2,,,b=5,Why?,如果输入,3,,,7,呢?,如果函数中的局部变量和全局变量同名,在函数范围内,局部变量可见。,函数,exch(),改成如下的形式,结果如何?,a=3,,,b=7,18,从变量的,存储,角度认识变量,动态存储变量和静态存储变量,程序在内存中的分布区域,存放用户,程序代码,,,即程序中各个函数的代码。,程序区,静态存储区,动态存储区,存放程序的,全局数据,和,静态数据,。,分配在静态存储区中的,变量,的,生命期最,长,,从程序开始执行到执行结束,这些变,量始终占用静态存储区中对应的存储空间,,即程序开始执行时分配存储单元,程序执,行完毕后释放。,存放,动态数据,。分配在动态存储区中的,变量,只有在所定义的函数被调用时才分,配存储单元,函数结束时就释放。系统,对函数调用时的现场保护、返回地址等,也占用动态保 护区。,静态存储区,程序区,动态存储区,存放程序的,全局数据,和,静态数据,存放,动态数据,程序开始执行时分配存储单元,程序执行完毕后释放,所定义的函数被调用时才分配存储单元,函数结束时就释放,存放用户,程序代码,内存,C,程序变量类别及其存在期,内部变量(,局部变量,),的类别,auto,默认的内部变量类别,可以不用写,存储单元在运行过程中动态分配和释放,static,静态内部变量,保存在静态存储区,存储单元在程序启动时分配,程序结束时释放。,外部变量,在函数之外定义的变量称为外部变量、,全局变量,。,External variable,全部保存静态存储区,程序启动时分配,程序结束时释放。,在外部变量前加,static,只影响对应变量的可见范围,但不影响变量的生命周期。,存储区用途,静态存储区主要用途,保存采用静态分配方式的变量的内容,外部变量(全局变量),静态内部变量,保存程序中的字符串常量,动态存储主要用途,供自动型内部变量的空间分配等使用(,栈,),供显式动态分配的存储空间分配,(,堆,),变量,的,存储器类别,变量的存储器类别,寄存器,静态存储区,内存,动态存储区,CPU,24,局部变量的存储类别,局部变量,的存储类别,定义局部变量的存储类别时使用三个关键字,:,说明:,局部变量的存储类别缺省是,auto,auto,自动变量,static,局部静态变量,register,寄存器变量,局部变量存储类别的定义形式:,CPU,寄存器,内存,静态存储区,动态存储区,register int a,;,auto float a,;,或,float a,;,static int a,;,auto float a;,或,float a;,定义,一个动态的局部变量;,意味着:,当,a,所在函数,被调用,时,系统为,a,分配空间,,a,才真正存在;,在没有为,a,赋任何值之前,,a,中的值为,随机值,;如果存在赋初值语句,在函数,每次被调用时,都将被执行一次,。,a,随它所在函数的执行结束而,消失,。,static int a;,定义,一个静态的局部变量,意味着:,编译时,为,a,分配空间;在程序运行阶段,,a,一直存在。不会随着函数的执行结束而消失。,如果不为,a,赋初值,系统会自动为它赋,0,。如果在函数中为它赋初值,则该赋值语句,仅在编译时被执行一次,。,每次函数中对它的改变都将被,保留,。,动态内部,(,局部,),变量与形式参数,动态内部,(,局部,),变量,定义在函数内部的,前面没有加,static,标志的变量,称为动态内部,(,局部,),变量。,动态内部,(,局部,),变量是动态分配和释放的。,函数的形式参数的存储分配形式与动态内部,(,局部,),变量相同,程序在调用该函数时才分配相应的存储空间,函数结束后,对应存储单元被释放,int func(int a,int b),int nSum;,a,b,与,nSum,的作用域是函数,func,的函数体,作用域是静态的概念,在此函数之外无法使用,a,b,nSum,t,t,调用开始,t,调用结束,变量,a,b,nSum,的存在期相同,设其存在期为,(,t,分配,t,销毁,),,,则,t,分配,=,t,调用开始,t,销毁,=,t,调用结束,存在期是一个动态的概念,对函数,func,的某次调用的调用周期,所有变量的存在期都是这样吗?,内存,x,的空间,y,的空间,“,ABCD,”,n,的空间,i,的空间,d,的空间,int x;,int y;,int func(int n),int i,double d;,printf(,“,ABCD,”,);,动态存储区,某程序静态存储区,函数执行结束,静态内部变量,在函数内部变量的前面加修辞词,static,int func(int n),static,int nCount=0;,nCount+;,if(nCount%5=0),dosomething,return 0;,例,假设需要一个函数,调用时通常输出空格,调用第,10,次时输出换行符。取名,format,,无参。,可用它改造打印完全平方数程序,使每行输出,10,个数,for(n=1;n*n y?x:y;,return z;,2,x,y,3,3,返回值,z,3,max(a,b):,分配形参,x,y,的存储空间,都为,int,且将,a,b,的值,(,设为,2,3),,写入,x,y,分配,z,存储空间,将,z,的值写入返回值存储空间,得到函数调用的返回值,函数执行结束,释放形参变量,x,y,以及动态内部变量,z,所占用的存储空间,Explanation,All arguments are,passed by value,.This means a copy of the,argument,is assigned to the corresponding,parameter,.,The function,does not know,the actual memory location of the argument passed.The function uses this copy,without affecting,the variable from which it was originally derived.,六、函数被调用的条件及函数原型,存在、声明与使用,生活常识,世界上存在的东西,你不一定能用,原因,你可能没有权利,你可能够不着,你可能根本就不知道有什么东西,你可能不会用,超市要卖东西,需要把东西摆在货架上让人看得着,让人选。,摆在货架上的东西,可能不一定是你想要的。,你想要的东西,可能不一定有,但你可以下订单叫人做,或者自己做。,网上商店,不需要货架,只需要商品清单就可以知道商店在卖什么东西。你下了订单,就有人会给你送货。,存在、声明和使用,已存在对象,声明存在,告示,看到告示,购买使用,商品,销售,商品清单,商场布置,到商场买想要的东西,要先找,找到或者找不到,购买后方可使用,使用时,得看使用说明,1.,高级语言中的对象存在与使用,高级语言程序使用对象的原则,被使用的对象,必须是存在,必要条件,使用者必须能,感知到,被使用对象的,存在,充分条件(在有些环境下也可能不够充分),高级语言,编译器,的基本原则,编译过程,碰到的任何东西都是,已知的,,明确定义的;,从每个对象的每个使用点,向前看,,能得到使用该对象的完备信息。,定义点与使用点及相应规则,命名对象(变量、函数等)有,一个定义点,,可能,多个使用点,。,基本规则是,先定义后使用,。,同一种商品可能会有很多人买,变量与函数定义位置与使用,内部变量的定义,变量一般定义在使用语句前,能保证先定义后使用;,变量定义语句中,后面的变量定义可引用前面已经定义的变量。,函数的定义与使用,函数的定义给出函数的类型特征和实现代码;,使用点所需信息就是函数的类型特征,包括函数名、参数个数和类型、返回值类型等。,类型特征类似于商品的名称、规格、型号,2.,能调用一个函数的条件,1.,被调用函数必须已经存在的,必要条件,库函数,用户自己写好的函数,2.,保证在调用点上,能使编译程序知道当前需要调用的函数是已经存在的。,如果编译程序已知这个函数是存在,还,要检查参数个数和类型,是否需要以及能否转换。,判断返回值是否符合周围环境的要求。,问题:如何让调用点知道某个函数的存在?,方法,1,在调用点之前定义这个函数,有很大的问题,把商品摆在你眼前,有东西才能用,但有东西不一定就能用,问题,1.,需要仔细安排函数的定义位置,要确保被调用者总在调用者之前,对写函数的编写位置的限制太大,2.,有些情况无法通过安排函数定义位置解决。典型例子,int h(int x)int g(int y),.,.g(.).h(.).,.,3.,所有相关的函数都得写在一个,.cpp,或,.c,文件里,解决问题的思路与办法,思路,设计某种形式的,信息,,放在调用点之前,提供给编译程序,使其能知道某种对象,如函数或变量,或某种数据类型是已知。,调用环境在使用时不必也不去考虑这些对象或类型,是否真的是已经存在的,。只是,假定这些对象或类型是已知,。,C,语言中的,“,函数原型,”,就是一种通告信息,用于告诉编译器如下信息,从当前这个位置开始直到某个地方为止,可以假定存在某种类型的函数,(函数名称,返回值类型,参数类型有序列表),,从此处往后的代码可以先放心使用这个函数。,商品目录,网上商城买东西并不需要看商家的仓库和实物,假定商家有即可,C,语言的函数原型,函数存在信息,函数原型,function prototype,声明,某一个函数的,存在,在使用某个函数以前,用函数原型来声明某个函数已经是一个合法的、有定义的函数,,请声明之后的代码放心使用该函数。,Use function prototype to declare the,existence,of a function,原型说明的形式,与函数头部类似,,加分号,;,参数名可省略,可与函数定义用的名字不同;,原型的参数名最好用有意义的名字,有利于写注释。,何处写函数原型?,任何可以写定义的地方都可以写原型说明。,提倡把原型说明都放在程序文件最前面,1,)使文件里所有调用都能看到同一个原型说明。,2,)使函数的定义点也能看到同一个原型说明。,原型说明是保证函数定义和使用间一致性的媒介。,为保证函数原型能起作用,必须给出完整的类型特征,如,void line(char c,int begin,int end),;,void points(char c,int fst,int snd),;,另外一种组织写函数原型办法,将自己写的所有的函数的函数原型都,写在一起,,组织成一个扩展名为,.h,的,header file,,即头文件,如,abc.h,然后在,.c,或,.cpp,程序模块的首部用文件包含命令包含该头文件,如,#include,“,abc.h,”,思考:有什么好处?,如何使用库函数?,1.,必须知道库函数是已经存在的;,2.,必须知道该库函数的函数原型声明在哪个头文件里;,3.,在需要调用该库函数的,.c,.cpp,模块里加入包含该头文件代码;,如,:,想使用,printf,,它的原型在,stdio.h,文件里;,因此,必须在文件头部加上:,#include,自己看的内容,过时的函数定义形式与原型形式,不要用,不写函数原型,不要这么做,68,过时的函数定义形式,/,原型形式,C,标准化时保留了一些过时东西,以保证老程序合法。这里介绍老形式只是为能读别人写的老程序。,过时函数定义形式,。例:,double f1(x,y,n),double x,y;int n;,/*,函数体*,/,/*,早期高级程序语言中常见的形式*,/,过时原型形式:设,完整原型为,double f(double);int g(double,int);,int main(void),int,g(),n;double,f(),x;,.,x=f(3);,n=g(n);.,/*,错,编译程序,不会发现!,*,/,不要使用过时函数定义和原型形式,七、程序的结构与作用域,1.C,程序的构成,C,源程序由一系列,外部定义,和,外部说明,构成。,外部定义,external definition,函数定义,外部(全局)变量定义,外部声明,external declaration,写在函数之外的函数引用声明,变量引用声明,C,程序的实质构成成份,C,程序的实质构成成份,外部定义,一系列,平等,的函数,程序,一系列,外部变量,数据,平等,意味着一个函数不能定义在另外一个函数内部(有些高级程序设计语言可以)。,外部,意味着变量定义在,函数之外,外部声明,在函数之外的变量存在声明(对使用者来说是引用声明),在函数之外的函数存在声明(对使用者来说引用声明),一切声明只是为了让编译器能正常工作,并不会实质生成新的对象,只为声明对象的存在。,2.,作用域,作用域,对象起作用的范围,对程序来说就是代码范围,全局作用域,整个程序都能起作用,即可能能被整个程序的任何地方使用(用的地方得知道对象的存在)。,局部作用域,只在某一(些)段起作用,C,语言的外部对象,函数和外部变量,都具有全局的作用域。,因此,外部变量也被称为全局变量。,3.,外部变量的作用域与存在声明,外部变量具有全局作用域,具有全局作用域并不等于真正就能在到处起作用。,问题:别的程序模块,(.cpp,.c,文件,),如何才能知道外部变量的存在?,解决办法:想办法告诉他,给他一个存在声明,int g_Variable;,void func1(),int g_Variable;,int func2(),通常把外部变量定义写在程序源文件最前面,使程序源文件里的函数都可以访问它们,C,规定,:,变量定义从,出现处开始起作用直到源程序末尾,。,外部变量存在(引用)声明,可以在,一个源文件里定义,一个外部变量,在,另外一个源文件里使用,这个外部变量。,使用前应给出这个外部变量的存在(引用)声明。,声明的形式与变量定义类似,前面加关键词,extern,。,如,extern int n,m;,外部变量存在声明通常放在源文件最前面,供整个文件参照。,有一个重要的目的,保证整个程序参照同一说明,保证一致性。,示意图,int g_nDatabaseID;,int g_nConnNum;,Module1.cpp,extern int g_nDatabaseID;,extern int g_nConnNum;,int Func(),if(g_nConnNum 10000),Module2.cpp,声明它们的存在,外部变量的好处:可以实现模块间和函数间的数据共享,大家都能改,大家都能用。,既然有好处,为什么还要函数参数吗?外部变量越多越好吗?,数据共享与函数的独立性,外部变量提供了一种让众多函数可以,共享数据,的方法。,相反的,如果一个函数内部直接用到了外部变量,则这个函数就,不再具有独立性,了,即该函数对某个外部变量具有依赖性。,要提高函数的独立性,要尽量少定义外部变量,尽量通过函数的参数传递来实现数据交换,尽量减少函数对外部变量之间的关联,(,耦合,),。,data,func,1,func,2,func,n,注意事项,定义和说明不同,定义要求创建被定义的对象;,说明只指明其存在,必须另有定义,否则该说明无效。,外部变量可在整个程序用,在一个完整程序里不能有重名外部变量。否则连接(,linking,)时会出问题,新定义的变量或函数(主要是函数)不要与现有函数库里的对象重名,;,4.,内部变量的作用域与存在期,变量或函数定义或声明的,位置,和,形式,的不同,将使这些对象具有不同的作用域和生存期,(,存在期,),。,回忆重要概念,作用域,起作用的代码范围,存在期,变量存在的时间范围(生命周期:从出生到死亡),内部变量的作用域,内部变量定义的作用域是,定义所在的复合语句,。在该复合语句之外无效(局部的)。,应此,内部变量经常被称为局部变量。,两个注意事项,形式参数看作函数体的内部变量,作用域是整个函数体。,从作用域角度看,,main,也是普通函数,其中的定义是局部定义,作用域是,main,函数的函数体,定义在,main,函数之内的变量并不是外部变量(全局变量)。,int func(int a,int b),int nSum;,a,b,与,nSum,的作用域是函数,func,的函数体,作用域是静态的概念,在此函数这外无法使用,a,b,nSum,t,t,调用开始,t,调用结束,变量,a,b,nSum,的存在期相同,设其存在期为,(,t,分配,t,销毁,),,,则,t,分配,=,t,调用开始,t,销毁,=,t,调用结束,存在期是一个动态的概念,对函数,func,的某次调用的调用周期,所有变量的存在期都是这样吗?,例,for(n=0;n 10;n+),int m;,if(n=0),m=2;,1.m,的作用域只在循环体对应的复合语句内。,2.,每次进入循环体执行时分配,m,的空间。,3.,每次结束循环体执行时释放,m,的空间。,4.,在该循环之外,不存在这个,m,,也谈不上使用这个,m,的问题。,5.,变量定义的同名和嵌套,函数定义只出现在全局作用域中,不可能嵌套。,变量定义可出现在复合语句里,可能出现同名和嵌套定义。,规定,同一作用域里不允许定义多个同名变量,。,不同作用域中可以定义同名变量。,不同作用域里定义的同名变量互不相干,。,出同名嵌套定义时,执行,局部优先,的原则。,示例,int f(.),double,x,n,;,.,int main(),double,x,z;,int,n,m;,.,两处的,x,和,n,互不相干,因为他们处于不同的作用域中。,例如:两个不同学校的学生可以用同一个学号,但并不会引起歧义。,同名变量的处理,int f(int n),int x,y;,.,while(.),double x;,.,x=1;,.,局部优先:,内层作用域里的同名变量定义(在此局部)遮蔽外层同名变量定义。,八、关于变量和函数的其它问题,1.,其它类别变量,寄存器变量,自动变量可加关键字,register,,定义为寄存器变量。实际安排由编译器决定。寄存器变量无地址,不能做地址操作。,外部静态变量,static=local,全局变量作用域太大,容易出现名字冲突。外部静态变量是,作用域为源文件,的外部变量。,静态外部变量用关键字,static,说明。,静态函数,在函数的返回类型前加关键字,static,,只能在一个源文件内用。,不同文件里定义的同名静态函数不会相互干扰。,这里的静态与函数局部变量的,“,静态,”,意义不同。,1,、含义:寄存器是计算机,CPU,的重要组成部分,在,c,语言中允许将一些频繁使用的变量存放在计算机的寄存器中,以节省运算时间,提高效率,.,2,、用法:用,register,说明。,3,、要点:,只有局部自动变量和形参可以作为寄存器变量,其它变量不允许。,一个计算机系统中的寄存器数目是有限的,不能定义任意多个寄存器变量。,不同系统对,register,变量的处理方法不同。,如:,MSC,和,TC,对,register,只当作自动变量处理。,局部静态变量不能定义为,register,变量,。,寄存器变量,88,int fac(int n),register,int i,f=1;,for(i=1;i=n;i+)f=f*i;,return f;,int main(),int i;,for(i=1;i=5;i+),printf(“%d!=%dn”,i,fac(i);,return 0;,89,内部函数与外部函数,一、内部函数,格式,:,在函数定义时加上,static.,static,类型标识符 函数名,(,形参表,),要点:内部函数又称为静态函数,这样的函数只限在所在的文件中,.,二、外部函数,格式,:,在函数定义时加上,extern,即,:,extern,类型标识符 函数名,(,形参表,),要点:函数被冠以,extern,说明函数为外部函数,可以被其他文件中的函数所调用,当一个函数在定义时,未说明,static,时隐含的类型为,extern,.,90,file1.c,int a;,/*,外部变量定义*,/,extern int power();,/*,外部函数说明*,/,int main(),int b=3,c,d,m;,printf(“enter the number a and its power:n”);,scanf(“%d,%d:,printf(“%d*%d=%dn”,a,b,c);,d=power(m);printf(“%d*%d=%dn”,a,m,d);,file2.c,extern int a;,/*,外部变量说明*,/,int power(n),/*,外部函数定义*,/,int i,y=1;for(i=1;i=n;i+)y*=a;return(y);,return 0;,2.,变量的初始化,外部变量、局部静态变量的初始化,在程序执行前定义并初始化,,只做一次,初始化表达式只能用静态可求值的表达式,如文字量,文字量,/,符号常量,/,基本运算符构造的表达式。不能有赋值、增量减量运算等,自动变量的初始化,进入定义域时建立并初始化(若有)。初始化可用任何表达式,可包含函数调用、引用其他变量等,函数参数是局部自动变量,在运行进入函数体前建立,用实参表达式的值初始化,无初始化语句的变量默认初值,变量定义可以没有初始化部分。如果没有初始化,外部变量、局部静态自动初始化为,0,(默认初值),自动变量(包括寄存器变量)不初始化,,变量将处于未初始化的状态,其值无法确定,变量,未经初始化就使用,,既不正确也不合理(初学者常犯的错误)。,一些编译器会给出警告。但有时未必都能给出警告,有时给出的警告未必正确。,3.,常变量,用关键字,const,定义的变量。是变量,但不允许赋值,只能初始化,其存在期中总代表同一个值,const int num=10;,若出现在局部作用域里,那么也动态建立和初始化,每次初始化的值可以不同,for(i=2;i=200;i+=2),const int n=i*i;.,可用,const,定义常参数,函数体里不能重新赋值。,许多程序里用常指针参数。,静态,动态,存储方式,程序整个运行期间,函数调用开始至结束,生存期,编译时赋初值,,只赋一次,每次函数调用时,赋初值,自动赋初值,0,或空字符,不确定,未赋初值,静态存储区,动态区,存储区,寄存器,局部变量,外部变量,作用域,定义变量的函数或复合语句内,本文件,其它文件,局部变量默认为,auto,型,register,型变量个数受限,且不能为,long,double,float,型,局部,static,变量具有,全局寿命,和,局部可见性,局部,static,变量具有,可继承性,extern,不是变量定义,可扩展外部变量作用域,register,局部,static,auto,外部,static,外部,存储类别,变量存储类型,课外练习,1.,读程序写结果,#include,int f1(int),f2(int);,void main(),int i;,for(i=2;i 5;i+),printf(f1(%d)=%d t,i,f1(i);,printf(n);,for(i=2;i b?a:b;,return c;,void main(),int a=8;,printf(“%d”,max(a,b);,九、程序实例,1.,求方程的根,典型的数值计算问题,用弦线法求方程的根,方程,f(x)=0,过程,给定一个区间,两端点函数值异号;,做过端点弦线;求弦线与坐标轴交点;,缩小区间,重复操作;,直到交点函数值充分接近,0,(满意为止)。,示意图,求弦线与坐标轴交点的公式:,100,求弦线与坐标轴交点的公式:,1,、输入,x,1,和,x,2,,求,f(x,1,),和,f(x,2,),若,f(x,1,)*f(x,2,)0,转,1,;否则转,2,2,、根据,x,1,和,x,2,求,x(,定义函数,crossp,),求,f(x)(,定义函数,f,),;,3,、检查,f(x),与,f(x,1,),和,f(x,2,),谁同号,重新选定,x,1,或,x,2,若,f(x,1,)*f(x)0,则,x,1,=x,,,否则,,x,2,=x,,,4,、检查,f(x),=1E-6,是否满足,满足 转,2,不满足,结束,输出,x,为根,。,功能分解,可以分解出的功能,求函数,f(x),的函数,求弦线与,x,轴的交点的函数,求给定函数值异号区间的一个根的函数,功能分析,函数,f(x),函数名:,f,参数:函数自变量,返回值:,f(x),double f(double x);,求给定弦线与,x,轴交点函数,函数名:,crossp,参数:,x1,x2,功能:求点,(x1,f(x1),与,(x2,f(x2),相连构成的直线与,x,轴的交点,返回值:交点的,x,值,double crossp(double x1,double x2);,功能分析,求根,root,参数:,x1,x2,,其中,:f(x1),和,f(x2),必须异号,返回:使,f(x),0,一个,x,值,即方程的在区间,x1,x2,内的一个近似根,功能:同返回说明,double root(double x1,double x2);,分别实现各个函数,实现,f(x),double f(double x),return x*sin(x)-2*x*x;,实现,crossp,double crossp(double x1,double x2),double y1=f(x1),y2=f(x2);,return(x1*y2-x2*y1)/(y2-y1);,实现,root,double root(double x1,double x2),double x,y,y1=f(x1);,do,x=crossp(x1,x2);,y=f(x);,if(y*y1 0)/y,与,y1,同符号,新区间,x,x2,x1=x;,y1=y;,else x2=x;/*,异号,新区间,x1,x*/,while(fabs(y)=1E-6);/*,继续*,/,return x;,给定两个端点,求交点及交点的函数值,迭代结束条件,缩小范围,求第,1,个端点的函数值,106,int main(),double x1,x2,x;,do,printf(“Input double x1,x2”);,scanf(“%lf%lf”,while(f(x1)*f(x2)0);,x=root(x1,x2);,printf(“root is%lf”,x);,return 0;,说明函数原型以调用这些函数,在程序的头部加上这些函数的函数原型,使后面的程序代码可以调用这些函数,:,double f(double x);,double crossp(double x1,double x2);,double root(double x1,double x2);,本部分总结,最重要的思想,模块化程序设计思想,C,程序的组成,函数分解及其思想,对象的存在、声明与使用,变量的生命周期和作用域,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服