




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章函数第1页11、C语言函数:C语言函数是子程序总称,包含函数和过程。(有返回值、无返回值,教材中称为:有返回值函数,无返回值函数)。C语言函数能够分为库函数、用户自定义函数。库函数由系统提供,程序员只需要使用(调用),用户自定义函数需要程序员自己编制。2、C语言程序由函数组成,函数是C语言程序基本单位。6.1函数概述第2页2C语言程序结构如图所表示。在每个程序中,主函数main是必须,它是全部程序执行起点,main函数只调用其它函数,不能为其它函数调用。其它函数没有主从关系,能够相互调用。全部函数都能够调用库函数。程序总体功效经过函数调用来实现。第3页3第4页43、使用函数意义(补充)①使用函数能够控制任务规模②
使用函数能够控制变量作用范围③使用函数,程序开发能够由多人分工协作
④使用函数,能够重新利用已经有、调式好、成熟程序模块
第5页54、函数一些概念(1)主函数、其它函数(2)主调函数(调用其它函数函数)、被调函数(被其它函数调用函数)(3)标准函数(库函数)和用户自定义函数(4)无参函数、有参函数(5)无返回值函数、有返回值函数第6页6例函数调用简单例子#include<stdio.h>voidmain(){voidprintstar();/*对printstar函数申明*/voidprint_message();/*对print_message函数申明*/printstar();/*调用printstar函数*/print_message();/*调用print_message函数*/printstar();/*调用printstar函数*/}第7页7voidprintstar()/*定义printstar函数*/{printf("****************\n");}voidprint_message()/*定义print_message函数*/{printf("Howdoyoudo!\n");}运行情况以下:****************Howdoyoudo!****************第8页8说明:1.一个C程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。对于较大程序,通常将程序内容分别放在若干个源文件中,再由若干源程序文件组成一个C程序。这么便于分别编写、分别编译,提高调试效率。一个源程序文件可认为多个C程序公用。第9页9
说明:
2.一个源程序文件由一个或多个函数以及其它相关内容(如命令行、数据定义等)组成。一个源程序文件是一个编译单位,在程序编译时是以源程序文件为单位进行编译,而不是以函数为单位进行编译。第10页10说明:
3.C程序执行是从main函数开始,假如在main函数中调用其它函数,在调用后流程返回到main函数,在main函数中结束整个程序运行。第11页11
说明:4.全部函数都是平行,即在定义函数时是分别进行,是相互独立。一个函数并不隶属于另一函数,即函数不能嵌套定义。函数间能够相互调用,但不能调用main函数。main函数是系统调用。第12页12说明:5.从用户使用角度看,函数有两种:①
标准函数,即库函数。这是由系统提供,用户无须自己定义这些函数,能够直接使用它们。不一样C系统提供库函数数量和功效会有一些不一样,但许多基本函数是共同。②用户自己定义函数。用以处理用户专门需要。第13页136.2.1.定义函数普通形式C语言要求,在程序中用到全部函数,必须“先定义,后使用”。定义函数包含以下几个内容:⒈指定函数名字,方便以后按名调用。⒉指定函数类型,函数值类型。⒊指定函数参数名字和类型,方便在调用函数时向它们传递数据。对无参函数不需要这项。⒋指定函数应该执行什么操作,也就是函数是做什么,即函数功效。这是最主要。6.2函数定义和调用第14页14为何要定义函数对于C编译系统提供库函数,是由编译系统事先定义好,程序设计者无须自已定义,只需#include命令把相关头文件包含到本文件模块中即可。比如,在程序中若用到数学函数(如sqrt,fabs,sin,cos等),就必须在本文件模块开头写上:#include<math.h>第15页15函数应该先定义,后调用
1、函数定义普通形式[函数类型]函数名([函数参数类型1函数参数名1][,…,函数参数类型2,函数参数名2]){[申明部分][执行部分]}函数头函数体第16页162、函数头(首部):说明了函数类型、函数名称及参数。(1)函数类型:函数返回值数据类型,能够是基本数据类型也能够是结构类型。假如省略默认为int,假如不返回值,定义为void类型。(2)函数名:给函数取名字,以后用这个名字调用。函数名由用户命名,命名规则同标识符。
(3)函数名后面是参数表,无参函数没有参数传递,但“()”号不能省略,这是格式要求。参数表说明参数类型和形式参数名称,各个形式参数用“,”分隔。
第17页173、函数体:函数首部下用一对{}括起来部分。假如函数体内有多个{},最外层是函数体范围。函数体普通包含申明部分、执行部分两部分。(1)申明部分:在这部分定义本函数所使用变量和进行相关申明(如函数申明)。(2)执行部分:程序段,由若干条语句组成(能够在其中调用其它函数)。
第18页184、函数定义举例怎样定义无参函数定义无参函数普通形式为:类型标识符函数名(){
申明部分
语句部分}第19页19怎样定义有参函数定义有参函数普通形式为:类型标识符函数名(形式参数表列){
申明部分
语句部分}比如:intmax(intx,inty){intz;/*函数体中申明部分*/z=x>y?x∶y;return(z);}
第20页20定义空函数定义空函数普通形式为:类型标识符函数名(){}比如:voiddummy(){}主调函数调用空函数时,只表明这里要调用一个函数,但函数本身什么工作也不做等,以后扩充函数功效时补充上。第21页21举例:输入三个整数,求三个整数中最大值不使用函数(除main外)main(){intn1,n2,n3,nmax;scanf(“%d%d%d”,&n1,&n2,&n3);if(n1>n2)nmax=n1;elsenmax=n2;if(n3>max)max=n3;printf(“max=%d\n”,nmax);}
第22页22使用函数intmax(int,int,int);main(){intn1,n2,n3,nmax;scanf(“%d%d%d”,&n1,&n2,&n3);nmax=max(n1,n2,n3);printf(“max=%d\n“,nmax);}
intmax(intx,inty,intz){intm;if(x>y)m=x;elsem=y;if(z>m)m=z;returnm;}像调用库函数一样调用函数定义第23页236.2.2函数调用
1函数调用普通形式函数调用普通形式为:
函数名(实参表列)说明:1.假如是调用无参函数,则“实参表列”能够没有,但括弧不能省略。2.假如实参表列包含多个实参,则各参数间用逗号隔开。实参加形参个数应相等,类型应匹配。实参加形参按次序对应,向形参传递数据。第24页24假如实参表列包含多个实参,对实参求值顺序并不是确定,有系统按自左至右次序求实参值,有系统则按自右至左次序。比如:printf(″%d,%d″,i,++i);若i原值为3,在VC++6.0环境下运行结果不是“3,4”,而为“4,4”。因为按自右而左次序,先求++i得4,再向左进行,此时i已是4了。假如想输出3和4,应写成:i=3;j=i++;printf(”%d,%d”,i,j);第25页252、函数调用方式1.函数语句把函数调用作为一个语句。这时不要求函数带回值,只要求函数完成一定操作。2.函数表示式函数出现在一个表示式中,这种表示式称为函数表示式。这时要求函数带回一个确定值以参加表示式运算。比如:c=2*max(a,b);
按函数在程序中出现位置来分,能够有以下三种函数调用方式:
第26页263.函数参数函数调用作为一个函数实参。比如:m=max(a,max(b,c));其中max(b,c)是一次函数调用,它值作为max另一次调用实参。m值是a、b、c三者中最大者。第27页27
3、对被调用函数申明和函数原型在一个函数中调用另一函数(即被调用函数)需要具备哪些条件呢?1.首先被调用函数必须是已经存在函数(是库函数或用户自己定义函数)。但光有这一条件还不够。第28页283.假如使用用户自己定义函数,而该函数位置在调用它函数(即主调函数)后面,应该在主调函数中对被调用函数作申明。2.假如使用库函数,还应该在本文件开头用#include命令将调用相关库函数时所需用到信息“包含”到本文件中来。
第29页294、函数申明位置。1)在全部函数定义之前。这是最清楚一个表示方法,便于查找、管理,如程序1所表示。因为在文件头部,第1至3行对f1、f2和f3函数事先作了说明,所以编译系统从申明中已经知道函数相关信息,所以无须在以后各主调函数中再进行申明。2)在全部函数外部(或者说在函数与函数之间)、被调用函数之前,如程序2所表示。3)在调用函数内部说明部分,如程序3所表示。申明函数可与同类变量写在同一行。第30页30例对被调用函数作申明#include<stdio.h>voidmain(){floatadd(floatx,floaty);
/*对被调用函数add申明*/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);}运行情况以下:3.6,6.5↙Sumis10.100000第31页31函数原型普通形式为:1.函数类型函数名(参数类型1,参数类型2……);2.函数类型函数名(参数类型1,参数名1,参数类型2,参数名2……);申明作用是把函数名、函数参数个数和参数类型等信息通知编译系统,方便在碰到函数调用时,编译系统能正确识别函数并检验调用是否正当。第32页32注意:函数“定义”和“申明”不是一回事。函数定义是指对函数功效确实立,包含指定函数名,函数值类型、形参及其类型、函数体等,它是一个完整、独立函数单位。函数申明作用则是把函数名字、函数类型以及形参类型、个数和次序通知编译系统,方便在调用该函数时系统按此进行对照检验。它不包含函数体。
第33页33说明:
(1)假如被调用函数定义出现在主调函数之前,能够无须加以申明。(2)假如已在文件开头(在全部函数之前),已对本文件中所调用函数进行了申明,则在各函数中无须对其所调用函数再作申明。
第34页34例(对上例改写)#include<stdio.h>floatadd(floatx,floaty)/*函数首部*/{floatz;z=x+y;return(z);}voidmain(){/*无须再对add函数作申明*/ floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f\n",c);}第35页35编写一函数,求xn次方值,其中n是整数分析:(1)求任意n个x乘积,可把x和n作为函数形参,数据从主调函数里传递,以增加程序灵活性,其程序流程图如图6-2所表示。(2)用循环结构来实现该算法。第36页36形参x,n取得值i=0,p=1.0定义变量i<np=p*x;i++返回pNY第37页37#include<stdio.h>doublepower(double,int);/*函数申明*/main()/*主调用函数*/{doublex,f;intn;printf("Entertwonumbers:x,n!\n");scanf("%lf,%d",&x,&n);f=power(x,n);/*函数调用*/printf("Value=%6.2lf\n",f);}第38页38/*函数定义*/doublepower(doublex,intn)/*函数头*/{/*函数体*/inti=0;doublep=1.0;while(i<n){p=p*x;i++;}return(p);}注意:x,f定义为double类型,它格式控制符为%lf,不要写成%f,以防止犯错。第39页39形式参数:函数名后面括弧中变量名称为“形式参数”(简称“形参”);实际参数:主调函数中调用一个函数时,函数名后面括弧中参数(能够是一个表示式)称为“实际参数”(简称“实参”);函数返回值:return后面括弧中值作为函数带回值(称函数返回值)。6.2.3函数参数和函数值第40页40主调函数和被调用函数之间有数据传递关系。在不一样函数之间传递数据,能够使用方法有:参数:经过形式参数和实际参数返回值:用return语句返回计算结果全局变量:外部变量第41页41例输入两个整数,要求用一个函数求出其中大者,并在主函数中输出此值。
#include<stdio.h>voidmain(){intmax(intx,inty);
/*对max函数申明*/inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("Maxis%d",c);}
第42页42intmax(intx,inty)/*定义有参函数max*/{intz;z=x>y?x∶y;return(z);}
运行情况以下:7,8↙Max
is
8
第43页43经过函数调用,可使两个函数中数据发生联络。第44页44关于形参加实参说明:1.在定义函数中指定形参,在未出现函数调用时,它们并不占内存中存放单元。只有在发生函数调用时,函数max中形参才被分配内存单元。在调用结束后,形参所占内存单元也被释放。2.实参能够是常量、变量或表示式,比如:max(3,a+b);但要求它们有确定值。在调用时将实参值赋给形参。第45页453.在被定义函数中,必须指定形参类型。4.实参加形参类型应相同或赋值兼容。5.实参向形参数据传递是单向“值传递”,只能由实参传给形参,而不能由形参传回来给实参。在调用函数时,给形参分配存放单元,并将实参对应值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。第46页462函数返回值函数返回值是经过函数调用使主调函数得到确实定值。比如:例8.2中,max(2,3)值是3,max(5,2)值是5。赋值语句将这个函数值赋给变量c。第47页47说明:
1.函数返回值是经过函数中return语句取得。一个函数中能够有一个以上return语句,执行到哪一个return语句,哪一个语句起作用。return语句后面括弧也能够不要比如:
“returnz;”等价于“return(z);”return后面值能够是一个表示式。比如:
max(intx,inty){
return(x>y?x:y);
}第48页482.函数返回值应该属于某一个确定类型,在定义函数时指定函数返回值类型。比如:下面是3个函数首行:int
max(floatx,floaty)/*函数值为整型*/char
letter(charc1,charc2)/*函数值为字符型*/
double
min(intx,inty)/*函数值为双精度型
*/
注意:凡不加类型说明函数,自动按整型处理。第49页493.在定义函数时指定函数类型普通应该和return语句中表示式类型一致。假如函数值类型和return语句中表示式值不一致,则以函数类型为准。对数值型数据,能够自动进行类型转换。即函数类型决定返回值类型。4.对于不带回值函数,应该用“void”定义函数为“无类型”(或称“空类型”)。此时在函数体中不得出现return语句。
第50页50例返回值类型与函数类型不一样#include<stdio.h>voidmain(){intmax(floatx,floaty);floata,b;intc;scanf("%f,%f,",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}intmax(floatx,floaty){floatz;/*z为实型变量*/z=x>y?x∶y;return(z);}运行情况以下:1.5,2.5↙Maxis2
第51页51嵌套定义就是在定义一个函数时,其函数体内又包含另一个函数完整定义。6.3函数嵌套调用和递归调用
6.3.1函数嵌套调用第52页52在主函数中调用一个max_4函数来求4个整数中最大数。然后在max_4函数中再调用一个max_2函数来求2个整数中最大数。最终在主函数中输出结果。方法:例输入4个整数,找出其中最大数。用函数嵌套调用来处理。第53页53#include<stdio.h>voidmain(){intmax_4(inta,intb,intc,intd);/*max_4函数申明*/inta,b,c,d,max;printf("Pleaseenter4intergernumbers:");scanf("%d%d%d%d",&a,&b,&c,&d);max=max_4(a,b,c,d);/*调用max_4函数*/printf("max=%d\n",max);}intmax_4(inta,intb,intc,intd)/*max_4函数定义*/{intmax_2(int,int);/*max_2函数申明*/intm;第54页54
m=max_2(a,b);/*调用max_2函数*/m=max_2(m,c);/*调用max_2函数*/m=max_2(m,d);/*调用max_2函数*/return(m);/*函数返回值是4个数中最大者*/}intmax_2(a,b)/*max_4函数定义*/{if(a>b)returna;elsereturnb;/*函数返回值是a和b中大者*/}运行情况以下:Pleaseenter4intergernumbers:1145–540↙max=45第55页55
6.3.2递归调用在调用一个函数过程中又出现直接或间接地调用该函数本身,称为函数递归调用。C语言特点之一就在于允许函数递归调用。比如:
intf(intx){inty,z;z=f(y);/*在执行f函数过程中又要调用f函数*/return(2*z);}第56页56例7.7:有5个人坐在一起,问第5个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第3个人,又说比第2个人大2岁。问第2个人,说比第1个人大2岁。最终问第1个人,他说是10岁。请问第5个人多大。age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10能够用数学公式表述以下:age(n)=10(n=1)age(n-1)+2(n>1)第57页57能够用一个函数来描述上述递归过程:intage(intn)/*求年纪递归函数*/{intc;/*c用作存放函数返回值变量*/if(n==1)c=10;elsec=age(n-1)+2;return(c);}运行结果以下:18用一个主函数调用age函数,求得第5人年纪。#include<stdio.h>voidmain(){printf(″%d″,age(5));}第58页58例7.8用递归方法求n!
求n!也能够用递归方法,即5!等于4!×5,而4!=3!×4…1!=1。可用下面递归公式表示:n!︳
=1(n=0,1)
︳=n·(n-1)!(n>1)第59页59程序以下:#include<stdio.h>voidmain(){longfac(intn);/*对fac函数申明*/intn;longy;printf("inputanintegernumber:");scanf("%d",&n);y=fac(n);printf("%d!=%ld\n",n,y);}第60页60longfac(intn)/*定义fac函数*/{longf;if(n<0) printf("n<0,dataerror!");elseif(n==0,n==1) f=1;elsef=fac(n-1)*n;return(f);}运行情况以下:inputanintegernunber:10↙10!=3628800第61页61例7.9Hanoi(汉诺塔)问题:第62页62由上面分析可知:将n个盘子从A座移到C座能够分解为以下3个步骤:1.将A上n-1个盘借助C座先移到B座上。2.把A座上剩下一个盘移到C座上。3.将n-1个盘从B座借助于A座移到C座上。第63页63程序以下:#include<stdio.h>voidmain(){voidhanoi(intn,charone,chartwo,charthree);
/*对hanoi函数申明*/intm;printf("inputthenumberofdiskes:");scanf(“%d”,&m);printf("Thesteptomoveing%ddiskes:\n",m);hanoi(m,'A','B','C');}第64页64voidhanoi(intn,charone,chartwo,charthree)
/*定义hanoi函数,将n个盘从one座借助two座,移到three座*/{voidmove(charx,chary);/*对move函数申明*/if(n==1)move(one,three);else{hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);}}voidmove(charx,chary)/*定义move函数*/{printf(“%c-->%c\n",x,y);}第65页65运行情况以下:inputthenumberofdiskes:3↙Thestepstonoving3diskes:A-->CA-->BC-->BA-->CB-->AB-->CA-->C
第66页66补充数组作为函数参数1数组元素作函数实参
因为实参能够是表示式,而数组元素能够是表示式组成部分,所以数组元素能够作为函数实参,与用变量作实参一样,是单向传递,即“值传送”方式。第67页67例
有两个数组a和b,各有10个元素,将它们对应地逐一相比(即a[0]与b[0]比,a[1]与b[1]比……)。假如a数组中元素大于b数组中对应元素数目多于b数组中元素大于a数组中对应元素数目(比如,a[i]>b[i]6次,b[i]>a[i]3次,其中i每次为不一样值),则认为a数组大于b数组,并分别统计出两个数组对应元素大于、等于、小于次数。第68页68#include<stdio.h>voidmain(){intlarge(intx,inty);/*函数申明*/inta[10],b[10],i,n=0,m=0,k=0;printf(″enterarraya∶\n″);for(i=0;i<10;i++)scanf(″%d″,&a[i]);printf(″\n″);printf(″enterarrayb∶\n″);for(i=0;i<10;i++)scanf(″%d″,&b[i]);printf(″\n″);for(i=0;i<10;i++){if(large(a[i],b[i])==1)n=n+1;elseif(large(a[i],b[i])==0)m=m+1;elsek=k+1;}第69页69printf("a[i]>b[i]%dtimes\na[i]=b[i]%dtimes\na[i]<b[i]%dtimes\n",n,m,k);if(n>k)printf("arrayaislargerthanarrayb\n");elseif(n<k)printf("arrayaissmallerthanarrayb\n");elseprintf("arrayaisequaltoarrayb\n");}large(intx,inty){intflag;if(x>y)flag=1;elseif(x<y)flag=-1;elseflag=0;return(flag);}第70页70运行情况以下:
enterarraya:
1357986420↙enterarrayb∶
5389–1–35604↙a[i]>b[i]4timesa[i]=b[i]1timesa[i]<b[i]5timesarrayaissmallerthannarrayb第71页712数组名作函数参数
能够用数组名作函数参数,此时形参应该用数组名或用指针变量。例有一个一维数组score,内放10个学生成绩,求平均成绩。第72页72#include<stdio.h>voidmain(){floataverage(floatarray[10]);/*函数申明*/floatscore[10],aver;inti;printf(″input10scores:\n″);for(i=0;i<10;i++=scanf(″%f″,&score[i]);printf(″\n″);aver=average(score);printf(″averagescoreis%5.2f\n″,aver);}第73页73floataverage(floatarray[10]){inti;floataver,sum=array[0];for(i=1;i<10;i++=)sum=sum+array[i];aver=sum/10;return(aver);}运行情况以下:input10scores:
100567898.576879967.57597↙averagescoreis83.40
第74页74例2编写一个函数,用来分别求数组score_1和数组score_2各元素平均值。
#include<stdio.h>voidmain(){floataverage(floatarray[],intn)floatscore_1[5]={98.5,97,91.5,60,55};floatscore_2[10]={67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5};printf(“theaverageofclassAis%6.2f\n”,average(score_1,5));printf(“theaverageofclassBis%6.2f\n”,average(score_2,10));}第75页75floataverage(floatarray[],intn){inti;floataver,sum=array[0];for(i=1;i<n;i++=sum=sum+array[i];aver=sum/n;return(aver);}运行结果以下:theaverageofclassAis80.40TheaverageofclassBis78.20第76页76说明:1、实参数组和形参数组类型应保持一致。2、在被调用函数中申明数组大小是不起任何作用。因为C编译系统对形参数组大小不作检验,形参数组名只代表一个地址,在调用时将实参数组首地址传到形参数组名,也就是说,形参数组并不在内存中重新申请数组空间,而是和实参数组共占存放单元。第77页776.4.1局部变量
在一个函数内部定义变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量。这称为“局部变量”。6.4局部变量和全局变量第78页78floatf1(inta)/*函数f1*/{intb,c;…a、b、c有效}charf2(intx,inty)/*函数f2*/{inti,j;x、y、i、j有效}voidmain()/*主函数*/{intm,n;…m、n有效}
第79页79主函数中定义变量只在主函数中有效,而不因为在主函数中定义而在整个文件或程序中有效。主函数也不能使用其它函数中定义变量。(2)不一样函数中能够使用相同名字变量,它们代表不一样对象,互不干扰。(3)形式参数也是局部变量。(4)在一个函数内部,能够在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也称为“分程序”或“程序块”。第80页80voidmain(){inta,b;…{intc;c=a+b;c在此范围内有效a,b在此范围内有效…}…}
第81页816.4.2全局变量在函数内定义变量是局部变量,而在函数之外定义变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可认为本文件中其他函数所共用。它有效范围为从定义变量位置开始到根源文件结束。第82页82全局变量:在函数之外定义变量。(全部函数前,各个函数之间,全部函数后)全局变量作用域:从定义全局变量位置起到根源程序结束为止。在引用全局变量时假如使用“extern”申明全局变量,能够扩大全局变量作用域。比如,扩大到整个源文件(模块),对于多源文件(模块)能够扩大到其它源文件(模块)。全局变量和局部变量同名“屏蔽”。参见P172.第83页83intp=1,q=5;/*外部变量*/floatf1(inta)/*定义函数f1*/{intb,c;…}charc1,c2;/*外部变量*/charf2(intx,inty)/*定义函数f2*/{inti,j;全局变量p,q作用范围…全局变量c1,c2作用范围}voidmain()/*主函数*/{intm,n;…}第84页84例有一个一维数组,内放10个学生成绩,写一个函数,求出平均分、最高分和最低分。#include<stdio.h>floatMax=0,Min=0;/*全局变量*/voidmain(){floataverage(floatarray[],intn);floatave,score[10];inti;for(i=0;i<10;i++)scanf(″%f″,&score[i]);ave=average(score,10);printf(“max=%6.2f\nmin=%6.2f\naverage=%6.2f\n“,Max,Min,ave);}第85页85floataverage(floatarray[],intn)
/*定义函数,形参为数组*/{inti;floataver,sum=array[0];Max=Min=array[0];for(i=1;i<n;i++){if(array[i]>Max)Max=array[i];elseif(array[i]<Min)Min=array[i];sum=sum+array[i];}aver=sum/n;return(aver);}运行情况以下:9945789710067.589926643↙max=100.00min=43.00average=77.65
第86页86第87页87提议不在必要时不要使用全局变量,原因以下:①全局变量在程序全部执行过程中都占用存放单元,而不是仅在需要时才开辟单元。②使用全局变量过多,会降低程序清楚性。在各个函数执行时都可能改变外部变量值,程序轻易犯错。所以,要限制使用全局变量。第88页88③它降低函数通用性,因为函数在执行时要依赖于其所在外部变量。假如将一个函数移到另一个文件中,还要将相关外部变量及其值一起移过去。但若该外部变量与其它文件变量同名时,就会出现问题,降低了程序可靠性和通用性。普通要求把C程序中函数做成一个封闭体,除了能够经过“实参——形参”渠道与外界发生联络外,没有其它渠道。第89页89例外部变量与局部变量同名#include<stdio.h>inta=3,b=5;/*a,b为外部变量*/a,b作用范围voidmain(){inta=8;/*a为局部变量*/局部变量a作用范围printf(″%d″,max(a,b));全局变量b作用范围}max(inta,intb)/*a,b为局部变量*/
{intc;c=a>b?a∶b;形参a、b作用范围return(c);
}运行结果为8
第90页90
6.5变量存放类别从变量作用域(即从空间)角度来分,能够分为全局变量和局部变量。从变量值生存期(即存在时间)角度来分,又能够分为静态存放方式和动态存放方式。所谓静态存放方式是指在程序运行期间分配固定存放空间方式。而动态存放方式则是在程序运行期间依据需要进行动态分配存放空间方式。第91页91变量生存期是指变量在内存中占据存放空间时间。有些变量在程序运行期间一直占据内存空间,而有些变量只在程序运行时某段时间内占据存放空间。前者是分配在静态存放区中变量,后者是分配在动态存放区或CPU存放器中变量。(1)静态存放变量分配在内存静态存放区中变量称为静态存放变量。对于这类变量,如全局变量,编译时系统在静态存放区给它分配固定存放空间。在程序运行期间变量值一直存在,程序运行结束时,静态存放变量所占存放空间才被释放。所以,静态存放区中变量其生存期是整个程序执行期。假如在定义静态存放变量时没赋初值,编译系统给静态变量赋初值为0。第92页92(2)动态存放变量分配在内存动态存放区中变量称为动态存放变量。对于这类变量,经典例子是函数形式参数,系统是在函数被调用时在内存动态存放区中为其分配存放空间,函数执行结束,它们所占存放空间即刻释放,也就不能再引用这些变量了。假如一个函数被屡次调用,则重复分配和释放形参变量存放单元。所以,这类变量生存期是函数执行期。假如在定义变量时没赋初值,则初值不确定。2、变量存放类别C语言中每一个变量都有两个属性:变量数据类型和变量存放类别。第93页93C语言共有4种存放类别标识符:auto:自动变量register:存放器变量extern:外部变量static:静态变量自动变量和存放器变量属于动态存放方式,外部变量和静态变量属于静态存放方式。在介绍了变量存放类别之后,能够知道对一个变量说明不但应说明其数据类型,还应说明其存放类别。存放类别说明符数据类型说明符变量名1[,变量名2…];比如:staticinta,b;/*说明a,b为静态整型变量*/autocharc1,c2;/*说明c1,c2为自动字符变量*/staticinta[5]={1,2,3,4,5};/*说明a为静态数组变量*/externintx,y;/*说明x,y为外部整型变量第94页946.5.1自动存放类型自动变量类型说明符为auto,这种存放类型是C语言程序中使用最广泛一个类型。自动变量普通为函数或复合语句内定义变量(包含形参)。C语言要求,函数内凡未加存放类别说明变量均视为自动变量,也就是说自动变量可省去说明符auto。autointx,y;等价于:intx,y;自动变量含有以下特点:(1)自动变量是局部变量,作用域仅限于函数或复合语句内。在函数中定义自动变量,只在该函数内有效,在复合语句中定义自动变量只在该复合语句中有效。(2)自动变量属于动态存放方式,只有在定义该变量函数被调用时才给它分配存放单元,开始它生存期,函数调用结束,释放存放单元,结束生存期。所以函数调用结束之后,自动变量值不能保留。第95页95(3)因为自动变量作用域和生存期都局限于定义它个体内(函数或复合语句内),所以不一样个体中允许使用同名变量而不会混同。即使在一个函数内定义自动变量也能够与该函数内部复合语句中定义自动变量同名。(4)在对自动变量赋值之前,它值是不确定。定义变量时若没给自动变量赋初值,变量初值不确定;假如赋初值,则每次函数被调用时执行一次赋值操作第96页966.5.2存放器存放类型C语言提供了另一个变量,即存放器变量。这种变量值存放在CPU存放器中,使用时不需要访问内存,存放器读写速度比内存读写速度快,所以,能够将程序中使用频率高变量(如控制循环次数变量)定义为存放器变量,这么可提升程序执行速度。存放器变量用关键字register作存放类别标识符。对存放器变量还要说明以下几点:1)只有局部自动变量和形式参数才能够定义存放器变量,因为存放器变量属于动态存放方式。凡需要采取静态存放方式变量不能定义为存放器变量。第97页97(2)因为CPU中存放器个数有限,所以,一个程序中能够定义存放器变量数目也是有限。当存放器没有空闲时,系统将存放器变量看成自动变量处理。所以,存放器变量生存期与自动变量相同。在TurboC、MSC下使用C语言,实际上把存放器变量当自动变量处理,允许使用存放器变量只是为了与标准C保持一致。(3)有些系统受存放器长度限制,存放器变量普通是char、int和指针类型变量第98页986.5.3外部存放类型外部变量〔即全局变量〕是在函数外部定义,它作用域为从变量定义处开始,到本程序文件末尾。在此作用域内,全局变量可认为程序中各个函数所引用。编译时将外部变量分配在静态存放区。用extern声明外部变量。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 招商项目拆解方案(3篇)
- DB1303-T 384-2024 春小麦-夏玉米一年两熟生产技术规程
- 股权激励方案-知乎(3篇)
- 年底分红奖励方案(3篇)
- 毕业论文调查报告
- 小学数学教学中渗透德育
- 2025至2030全球及中国虚拟支付终端行业项目调研及市场前景预测评估报告
- 2025-2030年国内收割机行业市场发展分析及发展前景与投资机会研究报告
- 2025-2030年半甜红葡萄酒市场前景分析及投资策略与风险管理研究报告
- 2025-2030年二次电源行业市场现状供需分析及投资评估规划分析研究报告
- 2025年养老护理员职业考试试题及答案
- 揭阳惠来县纪委监委等部门属下事业单位招聘笔试真题2024
- 党课课件含讲稿:以作风建设新成效激发干事创业新作为
- 超市百货考试试题及答案
- 城投公司工程管理制度
- 2025全国农业(水产)行业职业技能大赛(水生物病害防治员)选拔赛试题库(含答案)
- 苏州市昆山市惠民物业管理有限公司招聘考试真题2024
- 模拟电子技术(山东联盟-山东建筑大学)知到智慧树期末考试答案题库2025年山东建筑大学
- 2025年中国膨润土猫砂项目投资可行性研究报告
- 给酒店提供早餐合同协议
- 2025华阳新材料科技集团有限公司招聘(500人)笔试参考题库附带答案详解
评论
0/150
提交评论