资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,1.,我的程序有上百行,如何调试最方便?,2.,我想设计一个程序完成下面的计算:,m!n!,其中,,m,、,n,为正整数且,mn,(m-n)!,该如何设计程序最有效,?,?,第八章 函数,8.1,概述,模块化程序设计,基本思想:将一个大的程序按功能分割成一些小模块,特点:,各模块相对独立、功能单一、结构清晰、接口简单,控制了程序设计的复杂性,提高元件的可靠性,缩短开发周期,避免程序开发的重复劳动,易于维护和功能扩充,开发方法,:,自上向下,逐步分解,分而治之,C,是模块化程序设计语言,C,程序结构,C,是,函数式,语言,必须有且只能有一个名为,main,的主函数,C,程序的执行总是,从,main,函数开始,在,main,中结束,函数,不能嵌套定义,可以,嵌套,调用,函数分类,从用户角度,标准函数(库函数):由系统提供,用户自定义函数,从函数形式,无参函数,有参函数,使用,库函数,应注意:,1,、函数功能,2,、函数参数的数目和顺序,及各参数意义和类型,3,、函数返回值意义和类型,4,、需要使用的包含文件,如数学函数需要,math.h,,,字符串处理需要,string.h,,,输入输出需要,stdio.h,等。,#include,main(),int,add(int,x,int,y);,int,a,b,c;,scanf(%d,%d,&a,&b,);,c=,add,(a,b,);,printf(“c,=%,d,c,);,int,add(,int,x,int,y,),int,z;,z=,x+y,;,return(z,);,文件包含编译预处理命令,函数类型申明,函数定义,函数调用,函数返回值,形参,实参,8.2,函数的定义,一般格式,合法标识符,函数返回值类型,缺省,int,型,无返回值,void,函数体,函数类型 函数名,(,形参类型说明表,),说明部分,语句部分,现代风格,:,例 有参函数,int,max,(int,x,int,y,),int,z;,z=xy?x:y;,return(z);,例 有参函数(现代风格),int,max(,int,x,y,),int,z;,z=xy?x:y;,return(z);,例,空函数,dummy(),函数体为空,例 无参函数,void,printstar,(),printf,(“*n”);,8.3,函数的返回值,返回语句,形式:,return(,表达式);,或,return,表达式;,或,return;,功能:程序控制权由被调用函数返回到主调函数,同时把返回值带回主调函数,说明:,返回值类型一般与函数类型一致,自动转换-,函数调用转换,void,型函数,,无,返回值。,例 无返回值函数,void,swap(int,x,int,y),int,temp;,temp=x;,x=y;,y=temp;,printstar,(),printf,(*);,main(),int,a;,a=,printstar,();,printf(%d,a,);,例 函数带回不确定值,输出:,10,void,printstar,(),printf,(*);,main(),int,a;,a=,printstar,();,printf(%d,a,);,编译错误!,P160,例,8.3,函数返回值,main(),int,a,b,c,;,scanf(%d,%d,&a,&b,);,c=max(a,b);,printf(Max,is%dn,c);,max,(int,x,int,y),int,z;,z=xy?x:y;,return(z);,8.4,函数的调用,调用形式,函数名,(,实参表,);,说明:,实参与形参,个数相等,,,类型一致,,,按顺序一一对应,实参表求值顺序,因系统而定(,Turbo C,自右向左,),main(),int,i=2,p;,p=f(i,+i);,printf(%d,p,);,int,f(int,a,int,b),int,c;,if(ab)c=1;,else if(a=b)c=0;,else c=-1;,return(c);,实参:,3,,,3,P162,例,8.4,参数求值顺序,main(),int,i=2,p;,p=f(i,i+);,printf(%d,p,);,int,f(int,a,int,b),int,c;,if(ab)c=1;,else if(a=b)c=0;,else c=-1;,return(c);,实参:,3,,,2,运行结果:,0,运行结果:,1,调用方式,函数语句:,例,printstar,();,printf(“Hello,World!n,”);,函数表达式:,例,m=max(a,b)*2;,函数参数:,例,printf(“%d”,max(a,b,);,m=max(a,max(b,c);,函数说明,函数申明,对被调用函数要求:,必须是,已存在,的函数,库函数,:,#include,用户自定义函数:,函数类型说明,函数申明,简单记忆:将定义函数的第一行,+,;,一般形式:,函数类型 函数名,(,形参类型,形参名,.);,或,函数类型 函数名,();,作用:告诉编译系统,函数类型、参数个数及类型,以便检验,函数定义,与,函数说明,不同,函数说明位置:,程序的数据说明部分(函数内或外),下列情况下,可不作函数说明,若函数返值是,char,或,int,型,,系统自动按,int,型处理,被调用函数定义出现在主调函数之前,例 函数申明举例,main(),float a,b;,int,c;,scanf(%f,%f,&a,&b,);,c=max(a,b);,printf(Max,is%dn,c);,max(float x,float y),float z;,z=xy?x:y;,return(z);,int,型函数可不作函数说明,(,Borland C+,不行),/*ch7_5.c*/,float add(float x,float y),float z;,z=x+y;,return(z);,main(),float a,b,c;,scanf(%f,%f,&a,&b,);,c=add(a,b);,printf(sum,is%f,c);,被调函数出现在主调函数,之前,不必函数说明,/*P164,例,8.5*/,main(),float,add(float,x,float,y);,/*function declaration*/,float a,b,c;,scanf(%f,%f,&a,&b,);,c=add(a,b);,printf(sum,is%f,c);,float add(float x,float y),float z;,z=x+y;,return(z);,简单方法,:,将定义函数时的,一行复制到,main,后第一行并加;号,float add();,8.5,函数参数及其传递方式,形参与实参,形式参数:定义函数中括号中的变量名,虚元,实际参数:调用函数时括号中的表达式,实元,虚实结合,将数据传递到函数。,c=max(a,b);,(,main,函数),(,max,函数),max(int,x,int,y),int,z;,z=xy?x:y;,return(z);,例 比较两个数并输出大者,main(),int,a,b,c;,scanf(%d,%d,&a,&b,);,c=,max(a,b);,printf(Max,is%d,c);,max(,int,x,int,y,),int,z;,z=xy?x:y;,return(z);,形参,实参,例 计算,x,的立方,#include,float cube(,float x,),return(x*x*x);,main(),float a,product;,printf(Please,input value of a:);,scanf(%f,&a,);,product=,cube(a);,printf(”Cube,of%.4f is%.4fn,a,product);,要点:函数中一般使用两种变量:,1,函数的参数,2,函数内自己定义的变量,3,返回值表明函数执行后的结果。,可以是上述两种变量或其表达式。,x,a,product,1.2,1.2,1.728,8.7,数组作为函数参数,数组元素为函数参数,值传递(与变量相同),方式:函数调用时,为形参分配单元,将实参的值传到形参中;调用结束,形参单元被释放,实参单元仍保留。形参与实参占用,不同,的内存单元。,单向,传递,main(),int,a3,i;,a0=1;a1=2;a2=3;,for(i=0;i=2;i+),ai=add1(ai);,int,add1(int x),int,y;,y=x+1;,return(y);,理解:将数组变量当成简单变量处理。,数组名作为函数参数,方式:函数调用时,将数据的存储地址作为参数传递给形参。,特点:形参与实参占用同样的存储单元,“双向”传递,实参和形参必须是地址常量或变量,(数组名、指针变量)。,main(),int,a3,c;,a0=1;a1=2;a2=3;,c=add1(a);,int,add1(int x3),int,i,y=0;,for(i=0;i=2;i+),xi=xi+1;,y=y+xi;,return(y);,理解:将数组的地址传递。可理解为整个数组传递。,#include,int,sum(int,a,int,b);,int,factorial(int,n);,main(),int,n1,n2,a;,scanf(%d,%d,a=,sum(n1,n2);,printf(a,=%,d,a);,int,sum(,int,a,int,b,),int,c1,c2;,c1=,factorial(a);,c2=,factorial(b);,return(c1+c2);,int,factorial(int,n),int,rtn,=1;,int,i;,for(i=1;i=n;i+),rtn,*=i;,return(rtn,);,文件包含编译预处理命令,函数类型申明,函数定义,函数调用,函数调用,函数返回值,形参,实参,8.6,函数的嵌套与递归调用,嵌套调用,C,规定:,函数定义不可嵌套,,但,可以嵌套调用,函数,main(),调用函数,a,结束,a,函数,b,函数,调用函数,b,嵌套函数,函数中的语句再调用其它函数,#include,void main(),int,n,sn,;,n=3;,sn,=fact1(n);,printf,(%d!=%,dn,sn,);,int,fact1(int x),int,y;,y=x+1;,y=fact2(y);,return(y,);,int,fact2(int z),z=z+2;,return(z,);,例 利用递归求阶乘,#include,void main(),int,n,sn,;,printf(“n,=“);,scanf(%d,&n,);,sn,=fact(n);,printf,(%d!=%,dn,sn,);,int,fact(int,x),if(x=0)return(1);,return(x*fact(x-1);,汉诺塔:汉诺塔是,古老的数学问题,,很繁杂,但可以用递归的方法异常简单的完成。,规则,:,(1),一次只能移动一个,(2),大的不能放在小的上面,(3),只能在三个位置中移动,老和尚:命第,2,人将,63,个盘由,A,移到,B,,自己只需将大盘由,A,移到,C,,第,2,人将,63,个盘由,B,移到,C,。,第,2,人命第,3,人将,62,个盘由,A,移到,C,,自己只需将大盘由,A,移到,B,,第,3,人将,62,个盘由,C,移到,B,。,起点:第,1,人,第,2,人,终点:,A,上三个盘子移到,C,的三个过程。,P172,(,1,)将,A,上,2,个盘子移到,B,(借助,C,),(,2,)将,A,上,1,个盘子移到,C,(,3,)将,B,上,2,个盘子移到,C,(借助,A,),P171,(,1,)将,A,上,2,个盘子移到,B,(借助,C,)的三步:,1.1,将,A,上,1,个盘子从,A,移到,C,1.2,将,A,上,1,个盘子从,A,移到,B,1.3,将,C,上,1,个盘子从,C,移到,B,P171,(,2,)将,A,上,1,个盘子移到,C,比较简单位,只需一步,P171,(,3,)将,B,上,2,个盘子移到,C,(借助,A,)的三步:,P172,3.1,将,B,上,1,个盘子从,B,移到,A,3.2,将,B,上的一个盘子从,B,移到,C,3.3,将,A,上的,1,个盘子从,A,移到,C,3,A,B,C,Hanoi(n,1,2,3),If(n=1),Move(1,3),Else,2,A,C,B,Hanoi(n-1,1,3,2),Move(1,3);,A-C,Hanoi(n-1,2,1,3),2,B,A,C,2,A,C,B,Hanoi(n,1,2,3),If(n=1),Move(1,3),Else,2-1,A,B,C,Hanoi(n-1,1,3,2),Move(1,3);,A-B,Hanoi(n-1,2,1,3),2-1,C,A,B,2-1,A,B,C,Hanoi(n,1,2,3),If(n=1),Move(1,3),A-C,Else,Hanoi(n-1,1,3,2),Move(1,3);,Hanoi(n-1,2,1,3),2-1,C,A,B,Hanoi(n,1,2,3),If(n=1),Move(1,3),C-B,Else,Hanoi(n-1,1,3,2),Move(1,3);,Hanoi(n-1,2,1,3),2,B,A,C,Hanoi(n,1,2,3),If(n=1),Move(1,3),Else,2-1,B,C,A,Hanoi(n-1,1,3,2),Move(1,3);,B-C,Hanoi(n-1,2,1,3),2-1,A,B,C,2-1,B,C,A,Hanoi(n,1,2,3),If(n=1),Move(1,3),B-A,Else,Hanoi(n-1,1,3,2),Move(1,3);,Hanoi(n-1,2,1,3),2-1,A,B,C,Hanoi(n,1,2,3),If(n=1),Move(1,3),A-C,Else,Hanoi(n-1,1,3,2),Move(1,3);,Hanoi(n-1,2,1,3),常用的几个库函数的原型,函数原型,函数功能,函数原型,函数功能,string.h,:,字符串函数,ctype.h,:,字符判断函数,char*,strcat(char,*,const char*);,连接两个字符串,isdigit(int,);,是否为数字字符(,09,),int,strcmp(const,char*,const char*);,比较字符串的大小,isalpha(int,);,是否为英文字母,char*,strcpy(char,*,const char*);,字符串复制,isalnum(int,);,是否为字母或数字,stdio.h,:,输入输出函数,islower(int,);,是否为小写字母,int,getchar(void,);,输入一个字符,isupper(int,);,是否为大写字母,char*,gets(char,*);,输入一个字符串,math.h,:,数学函数,int,printf(const,char*,.);,格式化输出,double,sin(double,);,求正弦,int,putchar(int,);,输出一个字符,double,asin(double,);,求反正弦,返回弧度,int,scanf(const,char*,.);,格式化输入,double,cos(double,);,求余弦,int,puts(const,char*);,输出字符串,double,acos(double,);,求反余弦,stdlib.h,:,杂类函数,double,fabs(double,);,求绝对值,void*,malloc(size_t,);,动态分配内存,double,exp(double,);,求自然指数,int,rand(void,);,返回一个随机整数,double,sqrt(double,);,求平方根,void,srand(unsigned,);,初始化随机数序列,double,log(double,);,求自然对数,递归调用,定义:函数直接或间接的调用自身叫函数的递归调用,f(),调,f,调,f2,调,f1,f1(),f2(),说明,C,编译系统对递归函数的自调用次数没有限制,每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出,int,f(int,x),int,y,z;,z=f(y);,.,return(2*z);,int,f1(int x),int,y,z;,z=f2(y);,.,return(2*z);,int,f2(int t),int,a,c;,c=f1(a);,.,return(3+c);,8.8,变量的存储属性,概述,变量是对程序中数据的存储空间的抽象,内存,.,main(),int,a;,a=10;,printf(“%d”,a,);,编译或函数调用时为其分配内存单元,10,2000,2001,程序中使用变量名对内存操作,变量的属性,数据类型:存入变量的数据类型(,操作属性,),生存期,:变量在某一时刻存在,-,静态变量与动态变量,作用域,:变量在某区域内有效,-,局部变量与全局变量,变量的存储类型,auto-,自动型(最常用),register-,寄存器型(几乎不用),static-,静态型(其值累加),extern -,外部型(函数外,多文件间),变量定义格式,:,存储类型,数据类型 变量表,;,原则:,大变量如果与小变量同名,在局部以小变量为主。,如,:,int,sum;,auto,int,a,b,c;,register,int,i;,static,float,x,y,;,局部变量与全局变量,局部变量,-,内部变量,定义:在,函数内定义,,,只在本函数内有效,说明:,main,中定义的变量只在,main,中有效,不同函数中同名变量,占不同内存单元,形参属于局部变量,可定义在复合语句中有效的变量,局部变量可用存储类型,:,auto register static,默认为,auto,float f1(int a),int,b,c;,.,char f2(int,x,int,y),int,i,j;,main(),int,m,n;,.,a,b,c,有效,x,y,i,j,有效,m,n,有效,全局变量,-,外部变量,定义:在,函数外定义,,可为,本文件所有函数共用,有效范围:从,定义变量的位置开始,到本源文件结束,及有,extern,说明,的其它源文件,外部变量说明:,extern,数据类型 变量表;,外部变量定义与外部变量说明不同,若外部变量与局部变量同名,则外部变量被屏蔽,外部变量可用存储类型:,缺省或,static,应尽量少使用全局变量,因为:,全局变量在程序全部执行过程中占用存储单元,降低了函数的通用性、可靠性,可移植性,降低程序清晰性,容易出错,float max,min;,float average(float array,int,n),int,i;float sum=array0;,max=min=array0;,for(i=1;imax),max,=arrayi;,else if(arrayiy?x:y;,return(z);,main(),extern,int,a,b;,printf(max,=%d,max(a,b);,int,a=13,b=-8;,运行结果:,max=13,extern,int,a,b;,int,max(),int,z;,z=,ab?a:b;,return(z);,main(),printf(max,=%d,max();,int,a=13,b=-8;,/*ch7_17.c*/,int,a=3,b=5;,max(,int,a,int,b,),int,c;,c=ab?a:b;,return(c);,main(),int,a=8;,printf(max,=%d,max(a,b);,例 外部变量与局部变量,运行结果:,max=8,动态变量与静态变量,存储方式,静态存储:程序运行期间分配固定存储空间,动态存储:程序运行期间根据需要动态分配存储空间,内存用户区,生存期,静态变量,:,从程序开始执行到程序结束,动态变量,:,从包含该变量定义的函数开始执行至函数执行结束,程序区,静态存储区,动态存储区,全局变量、局部静态变量,形参变量,局部动态变量(,auto register),函数调用现场保护和返回地址等,变量存储类型,静态,动态,存储方式,程序整个运行期间,函数调用开始至结束,生存期,编译时赋初值,,只赋一次,每次函数调用时,赋初值,自动赋初值,0,或空字符,不确定,未赋初值,静态存储区,动态区,存储区,寄存器,局部变量,外部变量,作用域,定义变量的函数或复合语句内,本文件,其它文件,局部变量默认为,auto,型,register,型变量个数受限,且不能为,long,double,float,型,局部,static,变量具有,全局寿命,和,局部可见性,局部,static,变量具有,可继承性,extern,不是变量定义,可扩展外部,变量作用域,register,局部,static,auto,外部,static,外部,存储类别,例 文件,file1.c,int,a;,main(),.,.,f2;,.,f1;,.,f1(),auto,int,b;,f2;,.,f2(),static,int,c;,C,作用域,b,作用域,a,作用域,main,f2,f1,main,f1,f2,main,a,生存期:,b,生存期:,c,生存期:,例,auto,变量的作用域,main(),int,x=1,;main(),中有效,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);,除非用,return,传递返回,运行结果:,3th x=5,2nd x=3,1st x=1,x=1,作用域,x=1,作用域,x=3,作用域,x=5,作用域,main(),void increment(void);,increment();,increment();,increment();,void increment(void),int,x=0;,x+;,printf(“%dn”,x,);,例 局部静态变量值具有可继承性,运行结果:,1,1,1,main(),void increment(void);,increment();,increment();,increment();,void increment(void),static,int,x=0;,x+;,printf(“%dn”,x,);,运行结果:,1,2,3,例 引用其它文件中的外部变量,int,global;,extern float x;,main(),int,local;,.,.,.,extern,int,global;,static,int,number;,func2(),.,.,.,float x;,static,int,number;,func3(),extern,int,global;,.,.,.,file1.c,file2.c,file3.c,6.4,变量作用域与存储方式,先看一个例子,错在那里,?:,void f1(),int,t=2;,a*=t;,b/=t;,main(),int,a,b;,printf,(,“,Enter a,b:,”,);,scanf(,“,%d,%d,”,f1();/*,调用函数,f1()*/,printf,(,“,a=%d,b=%d,”,a,b);,编译程序会提示出错,:Undefined symbol,a,和,Undefined symbol,b,。,为什么,?,一,.,变量的作用域,即变量的有效范围,1.,变量按作用域分为,全局变量,和,局部变量,2,.,比较,:,全局变量,(,外部变量,),局部变量,(,内部变量,),定义位置,:,函数体外 函数体内,作用域,:,从定义处到本源文件结束 从定义处到本函数结束,举例,:,所有函数体外定义的变量,(1),所有在函数体内定义,(2),形式参数,注意与局部变量同名的处理,局部变量屏蔽全局变量,不同函数中同名局部变量互不干扰,局部变量的进一步说明:,C,语言程序是由函数组成的,有且只能有一个,main,函数。,变量定义可以出现在函数内,亦可出现在函数外或者是函数的参数中。,按照变量定义语句出现的位置,可以分为:,局部变量:,在函数或复合语句内定义;,只在该函数或复合语句中才能使用。,全局变量:,在函数外定义;,从它被定义位置起,到,之后的,所有函数中有效。,形式参数:,定义为函数的参数;,只在该函数中才能使用。,在函数内部说明的变量或者在复合语句中定义的变量称为局部变量。其作用范围是其所在的函数或复合语句。,又称全程变量或外部变量,在函数外部说明。其作用范围从它被定义的位置起,在之后的程序段中都是起作用的。,全局变量,如果在全局变量定义之前的函数想引用该外部变量,则应该在该函数中用关键字,extern,作“外部变量说明”。,int,a,b;,void swap(),int,t;,t=a;a=b;b=t;,printf(,“swap:a,=%d,b=%dn”,a,b);,main(),printf,(,“,Enter a,b:,”,);,scanf(,“,%d,%d,”,swap();,printf,(,“,main:,a=%d,b=%d,”,a,b);,Enter a,b:,5,3,swap:a=3,b=5,main:a=3,b=5,运行结果,int,a,b;,void swap(),int,t;,t=a;a=b;b=t;,printf(“swap:a,=%d,b=%dn”,a,b);,main(),printf,(,“,Enter a,b:”);,scanf(“%d,%d,”,swap();,printf,(“main:a=%d,b=%d”,a,b);,运行结果,int,a,b;,程序在编译时,屏幕将,提示有错误,:,Undefine,symbol a,Undefine,symbol b,int,a,b;,void swap(),int,t;,t=a;a=b;b=t;,printf(“swap:a,=%d,b=%dn”,a,b);,main(),printf,(,“,Enter a,b:”);,scanf(“%d,%d,”,swap();,printf,(“main:a=%d,b=%d”,a,b);,运行结果,int,a,b;,int,a=5,b=3;,Enter a,b:,5,3,swap:a=3,b=5,main:a=5,b=3,#include,int,a,b;/*a,,,b,为全局变量*,/,void f1(int x),int,t1,t2,a;,a=t1=x*4;,t2=b*3;,b=10,;,printf,(“f1:t1=%d,t2=%d,a=%d,b=%dn”,t1,t2,a,b);,main(),a=2;b=4;/*,此,a,b,是全局变量,赋值*,/,f1(a);/*,调用函数,f1()*/,printf,(“main:a=%d,b=%d”,a,b);,程序输出结果为,:,f1:t1=8,t2=12,a=8,b=10,main:a=2,b=10,若将程序改为,:,#include,int,a=2,b=4;/*a,,,b,为全局变量*,/,void f1(),int,t1,t2;,t1=a*2;,t2=b*3;,b=100,;,printf,(“t1=%d,t2=%d,,,b=%dn”,t1,t2,b);,main(),int,b=4;/*,此,b,是局部变量,赋值*,/,f1();/*,调用函数,f1()*/,printf,(“a=%d,b=%d”,a,b);,结论,:,全局变量与局部变量同名时,局部变量,起作用,全局变量被屏蔽(不影响),应小,心使用,程序输出结果为,:,t1=4,t2=12,b=100,a=2,b=4,二,.,变量的存储特性,1.,变量按存在时间分,静态变量,动态变量,静态存储,类型的变量的生存期为程序执行的整个过程,在该过程中占有固定的存储空间,通常称它们为,永久存储,。,动态存储,类型变量,只生存在某一段时间内,。例如,函数的形参和函数体或分程序中定义的变量,只是在程序进入该函数或分程序时才分配存储空间,当该函数或分程序执行完后,,,变量对应的存储空间又被撤销了,。,2.c,语言中每一个变量有两个属性,:,数据类型,存储特性,完整的变量定义,:,存储特性,数据类型,变量名,;,3.,变量的存储特性,自动型,auto,静态型,static,寄存器型,register,外部型,extern,(1)auto,型,每次进入程序是自动分配内存,不长期占用内存例如,:,形式参数,自动型局部变量,(2)static,型,局部静态变量 全局静态变量,长期占用内存,静态变量,static TYPE NAME,(1),静态局部变量,函数内定义,生存期为整个程序,作用域仅限于函数内部,默认初始值为,0,只在第一次调用函数时初始化该变量,以后再调用,将保留上次使用后的值,(2),全局静态变量,与全局变量的相同之处为都是采用静态存储方式,但作用域受到了限制,只能在本程序文件内部使用;而一般全局变量则可以被其他程序文件用外部变量的形式引用。,例,1,:,分析执行结果,f(int,a),int,b=0;static,int,c=3;,b+;c+;,printf(“%5d%5d%5dn”,a,b,c);,return(a+b+c);,main(),int,a=2,k;,for(k=0;k3;k+),printf(“%5dn”,f(a);,静态变量只初始化一次,结果:,2 1 4,(,a,b,c),7 (f(a),2 1 5,8,2 1 6,9,(3)register,型,将使用频率高的变量定义为,register,型,可以提高运行速度,.,数据,内存 运算器 运算器,结果,控制器 数据,寄存器,寄存器变量只限于,整型,、,字符型,、,指针型,的局部变量。,寄存器变量是动态变量,而且数目有限,一般仅允许说明两个寄存 器变量。,例如,:,register,int,d;,register char c;,(4)extern,型,引用,:extern,类型 变量名,;,如果某个模块文件中要用到另一个模块,文件中的全局变量,就要用,extern,说明,例如,:,程序模块,file1.c,中定义了全局变量,int,s;,而在另一个程序模块,file2.c,中的函数,fun1(),中需要使用这个变量,s,。,为此,可以在,file2.c,的函数,fun1(),中加上外部变量说明语句,:,fun1(),extern,int,s;/*,表明变量,s,是在其他文件定义的*,/,.,定义时分配内存,其他文件引用时不再分配内存,.,下面程序是求,5,75,之间的所有奇数的立方和。请将程序补充完整,并给出正确结果,填入相应窗口,。,#include,#include,#include,main(),long sum;,_,(,int,i;),sum=0;,for(i=5;i=75;i+),if(fmod(i,2)!=0),_(sum=sum+1;),printf(%ldn,sum,);,6,下面程序是求,50,450,之间的能被,3,和,5,整除的数的平方和。请将程序补充完整,并给出正确结果,填入相应窗口。,#include,#include,#include,main(),long sum;,_;,sum=0;,for(i=50;i=450;i+),if(fmod(i,3)=0&fmod(i,5)=0),_,clrscr,();,printf(%ldn,sum,);,3,下面的程序中,函数,fun,的功能是:根据形参,m,,,计算下面公式的值。,T=1/1!+1/2!+1/3!+1/m!,请改正程序中的错误,并运行改正后的程序。当从键盘输入,10,时,给出程序运行的正确结果(按四舍五入保留,10,位小数)。,#include,#include,double,fun(int,m),double,fac,t=0.0;,int,i=1,j;,for(i=1;i=m;i+),fac,=1.0;,for(j=1;j=m;j+),fac,=,fac,*i;,t+=1.0/fac;,return t;,main(),int,m;,clrscr,();,printf(n,请输入整数,:);,scanf(%d,printf(n,结果是,:%12.10lf n,fun(m);,
展开阅读全文