项目7函数实现模块化程序设计_第1页
项目7函数实现模块化程序设计_第2页
项目7函数实现模块化程序设计_第3页
项目7函数实现模块化程序设计_第4页
项目7函数实现模块化程序设计_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

1、项目项目7 函数实现模块化程序设计函数实现模块化程序设计模块模块1认识函数认识函数模块模块2定义函数定义函数模块模块3函数的参数函数的参数模块模块4函数的返回值函数的返回值模块模块5函数的调用函数的调用模块模块6 函数原型函数原型模块模块 7 数组与函数参数数组与函数参数模块模块8 变量的作用域变量的作用域模块模块9变量的存储方式和生存期变量的存储方式和生存期模块模块10综合实战综合实战思考与练习思考与练习项目小结项目小结模块模块1认识函数认识函数任务1初识自定义函数任务描述任务描述:定义一个实现返回较大值的函数func,在主函数中输入两个值给实参变量a,b在主函数中调用该函数,并输出较大值。

2、代码提示:int func(int x,int y)int z;z=xy?x:y;return z;# include main()int a,b,max;scanf(“%d,%d”,&a,&b);max=func(a,b);printf(“max=%dn”,max);getch();键盘输入:5,8输出结果:8v任务解析:任务解析:1C语言库函数中没有求较大值函数,但我们用户可以自定义一个求较大值的函数如程序代码中的func()函数。2用户自定义函数大体分为两个部分:函数头部分和花括号中的函数体部分。3函数头部分,如程序代码中int func(int x,int y)部分,它

3、规定了函数的类型、函数名和函数参数等;而函数体部分则集中体现函数的功能如程序代码中z=xy?x:y;部分。4我们前面已经知道:程序总是要从main()函数开始执行,不管main()函数所处的位置如何,最终以main()函数结束;当按顺序执行到max=func(a,b);时,变量max期待一个具体值才能继续向下执行,这时,需要调用func()函数。5语句 z=xy?x:y;很显然是求x和y中的较大者赋值给z,最后通过retrun返回到函数调用处。模块模块1认识函数认识函数任务2函数的分类任务描述任务描述:定义一个输出一行信息的函数dis,并在主函数中调用该函数。代码提示:void dis()pr

4、intf(“NO PAINS,NO GAINS!n”);# include main() dis(); getch();输出结果:NO PAINS,NO GAINS!v任务解析:任务解析:1.本例中dis()函数不是标准库函数,属于用户自定义函数。2.C程序始终要从main()函数开始执行,当按顺序执行到dis();时,故而转入自定义函数体中,即显示一行字符信息:NO PAINS,NO GAINS!。3.该自定义函数中void表示无需返回一个具体的结果,而是显示一行信息。因此,函数从不同的角度可以按不同方式分类:u从用户使用角度可以分为库函数(也叫标准函数或系统函数)和用户自定义函数u从形式上

5、可以分为有参函数(如任务1中示例)和无参函数(如任务2中示例)。u从函数有无返回值可分为有返回值函数(如任务1中示例)和无返回值函数(如任务2中示例)。4.由上述两个示例可见,一个C语言源程序是由一个或多个函数组成的。5.所有函数都是平行的,一个函数从不属于另一个函数,彼此之间可以相互调用,但不可以调用main()函数。模块模块2定义函数定义函数任务1无参函数的定义形式任务描述任务描述:在主函数中调用自定义函数xianshi,要求被调用的函数输出如下字符串信息:Nice to meet you!代码提示:void xianshi()printf(“Nice to meet you!n”);#

6、include main()xianshi();getch();输出结果:Nice to meet you!v任务解析:任务解析:1如何定义无参函数:函数类型说明符 函数名()声明部分语句部分2由上述完义可知,本示例中函数类型为void(即空类型),函数名为xianshi,函数体中没有需要声明的部分,语句部分为一条输出语句printf(“Nice to meet you!n”);3关于自定义的无参函数:u函数类型说明符指的是函数返回值的类型,当函数没有返回值时需要用关键字void声明,也可以省略,默认为void(空类型)。u函数名同变量名的命名规则,在定义函数名时同样力图做到见名知意,同一文件

7、中不可以出现重名函数。u无参函数函数名后圆括号()为空,但括号“()”不能省。u自定义函数不可以单独运行,必须有其它函数调用才行。模块模块2定义函数定义函数任务2有参函数的定义形式任务描述任务描述:定义一个求三个整数和的函数add,要求在主函数中定义并输入三个实参变量a,b,c的值,在主函数中调用该函数并输出三个数加法算式及结果值。代码提示:int add(int x,int y,int z)int t;t=x+y+z;return t;# include main()int a,b,c,sum;scanf(“%d,%d,%d”,&a,&b,&c);sum=add(a,

8、b,c);printf(“%d+%d+%d=%dn”,a,b,c,sum);getch();键盘输入:3,5,8输出结果:16v任务解析:任务解析:1.如何定义有参函数:函数类型说明符 函数名(形参表列)声明部分语句部分2关于自定义的有参函数:u有参函数的类型说明符也可以省略,默认为int型,如示例中自定义函数头部分也可以写成add(int x,int y,int z)u形参表列指的是用逗号“,”间隔的一组变量,包括类型说明和变量名两部分,即使每个变量类型相同也必须分别指定数据类型。如上示例中自定义函数头部分不可以写成int add(int x,y,z)。模块模块3函数的参数函数的参数任务1认

9、识函数中的两种参数任务描述任务描述:定义一个求三个整数最小值的函数min,要求在主函数中输入三个实参变量a,b,c的值,调用该函数,并将函数返回值的结果存储在变量min2中,并输出该最小值。代码提示:int min(int x,int y,int z)int min1;if(xy) min1=x;else min1=y;if(zmin1) min1=z;return min1;# include main()int a,b,c,min2;scanf(“%d,%d,%d”,&a,&b,&c);min2=min(a,b,c);printf(“MIN=%dn”,min2);g

10、etch();键盘输入:5,3,10输出结果:3v任务解析:任务解析:1函数的参数有两种:实际参数(简称“实参”)和形式参数(简称“形参”)。2形参是在函数定义时设定的参数(位于自定义函数名后的括号内)如示例中的x,y,z。3.实参是有参函数调用时所用的参数,如示例中的a,b,c。4.形参可以是相同类型,也可以是不同类型,本示例中形参的类型相同,都是int型。普通变量作为函数参数,实参和形参之间是“单向值传递”,即实参的值传给形参,而形参不能传给实参。传递数据的参数之间应满足类型相同,数目相等,一一对应。8.函数中的实参和形参如同身份证的原件和复印件,形参“肩负着实参赋予的使命”,把要实现的功

11、能“反馈”到主调函数中,本示例中自定义函数的功能在第4章已经学习过,很显然是求三个数中最小值的程序。模块模块3函数的参数函数的参数任务2形参和实参形式任务描述任务描述:分析程序段的运行结果,体验形参和实参重名及形式特点。代码提示:void fun(int x,int y,float z)x=8;y=9;z=10.5;# include main()int x=100,y=200;float z=16.8;fun(x,x+y,z);printf(“%d,%d,%.1fn”,x,y,z);getch();输出结果:100,200,16.8v任务解析:任务解析:v1.形参是形式上的,编译系统不为其分

12、配内在空间,只有传递数据时临时分配内存空间,调用结束后,空间释放数据丢失。v形参必须是变量,而实参可以是变量、常量或表达式。本示例中第二个实参为表达式x+y。v实参和形参可以重名,它们在内存中是不同的对象,各自占用自己独立的存储单元,彼此互不干扰。本示例中的实参x,z和形参x,z重名。1.本示例中实参变量x=10,表达式x+y的值300,变量z=16.8虽然传递给形参x,y,z时三个形参变量对又都重新赋予新值,但函数调用结束后,形参的空间释放,值立即丢失,并不能影响主调函数中的实现变量x,y,z。模块模块4函数的返回值函数的返回值任务1函数返回值的含义任务描述任务描述:定义一个能实现下述关系的

13、函数,要求在主调函数中调用该函数。 2x2-1 (x=0)y= x2+1 (x=0) return(2*x*x-1);else return (x*x+1);# include main()int a,b;scanf(“%d”,&a);b=fun(a);printf(“%dn”,b);getch();键盘输入:-5输出结果:26v任务解析:任务解析:v函数调用后的结果称为函数的返回值,函数返回值通过return语句实现。vreturn语句的形式有两种:ureturn(表达式)ureturn表达式;如上示例中return(2*x*x-1);也可以写成return2*x*x-1;v函数体中

14、可出现多条return语句,执行到哪一条哪条起作用,从而返回到主调函数,返回值仅有一个并且是一个确定的值。如示例中从键盘输入-5后,根据我们前面的学习可知,实参a=-5按照单向值传递传给形参x=-5,自定义函数体中if语句条件表达式为假故而执行else分支return (x*x+1);从此函数调用结束,即return(2*x*x-1);和return (x*x+1);只有一条起作用。v在进行函数定义时,应使return语句中的表达式的类型与函数类型说明保持一致;当return语句中的表达式的类型与函数类型说明不一致时,则以函数类型说明为准,系统会自动将return语句中的表达式的值转换为函数类

15、型说明所指定的类型。1.如果函数中没有return语句,并不代表没有返回值,而是返回一个不确定的值。模块模块5函数的调用函数的调用任务1函数的调用过程分析任务描述任务描述:分析下列程序段的运行结果,分析函数的调用过程及形式。代码提示:int f(int a,int b) int c;if(ab) c=1;else if(a=b) c=0; else c=-1;return c;# include main()int i=2,j,t; j=+i; t=f(i,j);printf(“%dn”,t);getch();输出结果:0v任务解析:任务解析:v函数调用的一般形式为:v函数名(实参表列);或函

16、数名();v实参表列是一个或一组用逗号分隔的常量、变量或表达式v实参和形参要个数相等,类型相同,一一对应。v如果调用无参函数,实参表列可以省略,但括号不能省。1.上示例中的运行结果学生可自行分析得知。模块模块5函数的调用函数的调用任务2函数语句的调用方式任务描述任务描述:分析下列程序段的运行结果,体验函数语句的调用形式。代码提示:swap(int x,int y)int t; t=x; x=y; y=t; printf(“x=%d,y=%dn”,x,y);# include main() int a=3,b=6; swap(a,b);printf(“a=%d,b=%dn”,a,b);getch

17、();输出结果:x=6,y=3 a=3,b=6v任务解析:任务解析:v1本示例中是以语句的形式进行函数调用的,即函数调用单独作为一个语句swap(a,b);这种调用方式通常没有返回值,只要求函数完成一定的操作。具体分析如下:u定义函数时没有指定swap()函数的类型,默认为int型。u实参a=3,b=6按照单向值传递分别传给形参x和y,自定义函数体中的函数体语句t=x;x=y;y=t;是交换形参x和y的值,通过前面的学习得知,形参和实参是彼此不同的存储单元,因此,上述交换对实参没有影响。1.在完成swpa()函数调用语句时,只是输出形参交换后的值,完成调用后返回到主调函数继续向下执行,输出实参

18、a和b的值。模块模块5函数的调用函数的调用任务3函数表达式的调用方式任务描述任务描述:分析下列程序段的运行结果,体验以函数表达式方式调用函数的形式。代码提示:int max(int x,int y)return xy?x:y;# include main()int a=4,b=5,result;result=2*max(a,b)+1;printf(“result=%dn”,result);getch();输出结果:result=11v任务解析:任务解析:v像示例中result=2*max(a,b)+1这种函数(max()出现在一个表达式中,这种表达式称为函数表达式。1.示例中表达式result

19、=2*max(a,b)+1期待函数max()返回一个具体的值从而参与表达式的运算,自定义函数显然是求两个参数较大值的函数即将实参a和b两者中的较大者即5反馈给表达式,因此,result=2*5+1=11;模块模块5函数的调用函数的调用任务4函数参数的调用方式任务描述任务描述:分析下列程序段的运行结果,体验以函数参数方式调用函数的形式。代码提示:int f(int x,int y)x=xy?x:y;return x;# include main() int d; d=f(f(10,3),f(4,8); printf(“%dn”,d);getch();输出结果:10v任务解析:任务解析:1示例中f

20、(10,3)和f(4,8)作为外层函数f()的两个参数,称为函数参数。2自定义函数f()的功能是求两个数较大值的函数。3程序中共三次调用了函数f(),要使用函数f()的结果赋值给变量d,就得知道参数f(10,3)和f(4,8)的值,其中调用f(10,3)反馈回的结果为10,调用f(4,8)反馈回的结果为8,10和8又作为f()的两个参数,表达式变为d=f(10,8)模块模块5函数的调用函数的调用任务5函数的嵌套调用任务描述任务描述:分析下列程序段的运行结果,认识函数嵌套调用的含义。代码提示:void fun1()fun2();fun2()printf(“knowledge is power!n

21、”);# include main() fun1();getch();输出结果:knowledge is power!v任务解析:任务解析:1.C语言中函数地位是平行的,因此,函数内部不可以定义其它函数(即嵌套定义),但函数之间可以相互调用(除其它函数不能调用主函数),在一个函数内部调用另外一个函数,称为函数的嵌套调用。 2示例中主函数中调用了fun1()函数,当调用fun1()函数时又转而去调用fun2()函数,构成了函数的嵌套调用,fun2()函数是输出一行字符串信息返回到主调函数中输出。模块模块5函数的调用函数的调用任务6函数的递归调用任务描述任务描述:已知数列前两项的值为1,编写一个函

22、数f,求数列1,1,2,3,5,8第10项的值,并在主调函数中输出该项的值。代码提示: int f(int n) if(n=1|n=2) return 1; else return f(n-1)+f(n-2); # include main()int t10;t10=f(10);printf(“t10=%dn”,t10);getch();输出结果:t10=55v任务解析:任务解析:1.我们知道,函数可以嵌套调用,如果一个函数直接或间接调用自身,称为函数的递归调用。2.由已知题意可知,f(1)=1,f(2)=1,上述函数满足如下关系: 1 (n=1,2)f(n)= f(n-1)+f(n-2) (

23、n2)3.第一次调用函数f()时,实参10按单向值传递传给形参x,反馈回的是f(9)+f(8),即t10=f(9)+f(8);但f(9)和f(8)未知,数列第10项t10无法得到具体的值,因此,为使t10得到具体的值以便程序能顺次向下执行,需再一次调用f()函数以求得f(9)和f(8)的值;下一次9和8分别作为函数的实参,反馈回的是f(8)+f(7)和f(7)+(6)直到2和1作为函数的实参时才使得f(2)、f(1)变得已知,从而求得f(3)、f(4)、f(5)f(10)。 4从以上示例可知,解决上述问题的关键是找出临界条件(n=1,2)和递推公式(f(n)=f(n-1)+f(n-2)),在自

24、定义函数中内嵌一个双分支语句,if表达式是临界条件,语句是临界值,else语句是递推公式。模块模块6 函数原型函数原型任务 函数原型的形式及意义任务描述任务描述: 定义一个求两个浮点型小数乘积的函数f,要求定义的函数返回值为float型,定义的位置在主调函数之后,体验函数原型的形式、位置及必要性。代码提示:# include main() float f(float x,float y);float a,b,c; a=3.5;b=4.8;c=f(a,b);printf(“%fn”,c);getch();float f(float x,float y)float pd;pd=x*y;return

25、 pd;输出结果:16.800001v任务解析:任务解析:1.调用一个函数除了必须定义该函数外,必要时还需要在调用该函数前对被调用的函数加以声明,称为函数的原型。这样做的目的是将相关的信息通知编译系统,以便编译系统对函数的类型、函数的参数加以核对,以防非法调用导致出错。2函数原型的格式和定义函数的头部有些相似,又不是完全相同,具体格式为:函数类型说明符 函数名(参数类型说明符1 参数1,参数类型说明符2 参数2,);简单的可以说成,函数原型即是在自定义函数的函数头后面加上分号“;”。3本任务具体分析:u上述函数原型也可以写成简易形式,即float f(float,float);这是因为编译系统

26、并不检查形参名,只是按顺序依次检查函数原型中的参数个数,参数类型和必须和函数定义时完全相同,否则将出错。u示例中函数原型float f(float x,float y);旨在通知编译系统接下来接要调用的函数是float型,函数名f,函数中有两个对数,并且都是float,如果和声明的不一致将提示报错信息。u函数原型中的参数名字可以和定义函数中的形参名字不同,也可以省略。u当调用函数f时,编译系统会按照事先的函数原型加以对照各参数是否匹配,当各参数完全一致时按照对应规则完全实、形参的单向值传递。u该程序段代码的含义很显然定义一个求两个浮点数乘积的程序,要求在主调函数中显示输出结果。4.函数原型可以

27、省略:当自定义函数出现在主调函数之前,可以省略函数原型。如上例中程序代码可以写成float f(float x,float y)float pd;pd=x*y;return pd;# include main() float a,b,c; a=3.5;b=4.8;c=f(a,b);printf(“%fn”,c);getch();从而省略了函数声明。模块模块 7 数组与函数参数数组与函数参数任务1数组元素作函数参数任务描述任务描述:编写一个求两个数较大值的函数max,要求在主函数中定义一个长度为5的整型数组 score用来存储某同学5科成绩,通过键盘输入用循环语句给数组中5个元素(即该生的5科成

28、绩)赋值,将第一科的成绩存储在变量max1中,每次以max1和下一个元素为实参,在主函数中调用该函数并将每次返回的结果存储在max1中,直到最后一个元素作为函数实参调用完毕,最终max1中存储的是该生5科成绩的最高分并输出。 代码提示:int max(int x,int y) return xy?x:y;# include main() int score5,i,max1; for(i=0;i5;i+) scanf(“%d”,&scorei); max1=score0;for(i=1;i5;i+) max1=max(max1,scorei);printf(“max=%dn”,max1)

29、;getch();键盘输入:95 84 96 90 86输出结果:max=96v任务解析:任务解析:1自定义函数max()的功能很显然是求两个数中较大者的函数。2.前面的学习已经知道,函数的实参可以是常量、变量或表达式,由于数组元素同普通变量没有二异性的差别,因此,数组元素同样也可以作为函数的实参。 3.本示例中第一个for循环for(i=0;i5;i+) scanf(“%d”,&scorei);利用数组中的5个元素存储该生的5科成绩;max1=score0;语句是假设第一科成绩是最高分;而for(i=1;i=0;i-)printf(%d ,bi);# include main()in

30、t a5=5,6,7,8,9;ant(a,5);getch();输出结果:9 8 7 6 5v任务解析:任务解析:v除常量、变量、表达式和数组元素作为函数实参外,数组名也可以作为函数的实参,所不同的是数组名作为函数实参和形参之间并不是单向值传递。v示例中调用函数ant(a,5),a是数组名,如果是普通变量但未定义,这违背了变量须先定义后使用的原则,当数组名作为函数参数时并不是将数组全部元素赋值给形参数组b,而是将数组a的首地址传给形参数组,此时,形参和实参共享同一存储单元,如同同一空间起两个不同的名字。v定义函数ant()时,并未定义形参数组b的长度,这是因为C语言编译系统对形参数组大小不做检

31、查,因此形参数组可以不指定大小,但形参数组的方括号“”则不可以随意省略。v实参数组与形参数组类型应保持一致(示例中都为int型),如不一致,结果将会出错。1.for(i=n-1;i=0;i-)中i的值从n-1开始,并不是从n开始,是因为数组元素的下标从0开始,所以最后一次循环的条件是i=0,本例中最大下标元素的下标值是4。 模块模块8 变量的作用域变量的作用域任务1认识局部变量任务描述任务描述:分析下列程序段的运行结果,熟悉局部变量的含义及特点。代码提示:void fun() int a=5,b=6; printf(“a=%d,b=%dn”,a,b);# include main() int

32、a=10,b=20; fun(); printf(“a=%d,b=%dn”,a,b);getch();输出结果:a=5,b=6 a=10,b=20v任务解析:任务解析:v域即范围,变量的作用域也就是变量的作用范围,指的是一个变量在哪个范围内有效。v在一个函数内部定义的变量称为局部变量(也叫内部变量),局部变量只在本函数内有效,如示例中int a=5,b=6;只在fun()函数中有效;int a=10,b=20;只在main()函数中有效。v不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。如示例中fun()函数中的变量a、b和main()函数中的a、b虽然重名但是不同的对象。v当

33、调用fun()函数时,该函数是输出a、b的值,此时输出的是该函数中的a、b的值即a=5,b=6;当函数调用结束后返回到主函数向下执行过程中此时的printf(“a=%d,b=%dn”,a,b);是输出main()函数中定义的a、b即a=10,b=20。v函数的形参也是局部变量,模块6任务1示例中自定义函数int max(int x,int y)中的x,y只在该函数中有效。1.在一个函数内部,可以在复合语句中定义变量,这样的变量可以重名,它们代表的是不同的对象,这样的变量只在该复合语句中有效。 模块模块8 变量的作用域变量的作用域任务2认识全部变量任务描述任务描述:分析下列程序段的运行结果,熟悉

34、全部变量的含义及特点。代码提示:int x=1;void fun()printf(“x=%dn”,x);# include main()int x=5;fun();printf(“x=%dn”,x);getch();输出结果:x=1x=5v任务解析:任务解析:v在函数之外定义的变量,或者说不在任何一个函数内定义的变量称为全部变量(也叫外部变量)。如示例中的int x=1;它不在任何一个函数内。v全局变量的作用范围是从定义点开始到源文件结束。源文件中int x=1;作用范围从定义点开始一直到源文件结束都有效即它是全局变量。1.全局变量和局部变量可以重名,在局部变量起作用的范围内,全局作用不起作用

35、。示例中int x=5;是在main()函数中定义,因此,它仅在main()函数中有效,当调用fun()函数时,由于fun()函数无返回值只是输出变量x的值,在fun()函数中没有定义变量x因此它没有自己的局部变量,这时输出的是全局变量的值,即x=1;完成函数调用结束后返回主函数继续向下执行printf(“x=%dn”,x);在main()函数内部有自己的局部变量x,此时输出x=5。模块模块9变量的存储方式和生存期变量的存储方式和生存期 任务1认识自动变量任务描述任务描述:分析程序段的运行结果,体验自动变量的特点。代码提示:f(int a)auto int b=0;b+;return(a+b)

36、;# include main() int i,x=2;for(i=0;i2;i+)printf(“%dn”,f(x);getch();输出结果:33v任务解析:任务解析:v变量除按作用范围(空间划分)分为局部变量和全局变量外,还有另外一个属性,就是变量的值存在的时间,即生存期。变量的生存期取决于变量的存储方式。在C语言中,变量的存储方式可分为:动态存储和静态存储。vC语言中内存分为3个部分:程序区、静态存储区和动态存储区,程序区用来存储程序的代码,静态和动态存储区用来存储数据;其中有的变量在程序运行整个过程都是存在的,称为静态存储;有的变量则是调用所在的函数时临时分配的(如形参),而在函数调

37、用结束后空间释放,变量值随即丢失,称为动态存储。vC语言中每个变量都有两个属性:存储类别和数据类型。存储类别规定了变量在内存中的存储区域和存储方式;数据类型规定了变量的数据范围和在内存中所占空间的大小及所能执行的操作。v变量按存储类别分为以下四种:自动变量(auto)、静态局部变量(static)、寄存器变量(register)和外部变量(extern)。v一个变量完整的定义形式为:存储类别说明符 存储类型说明符 变量名1,变量名2,;存储类别可以省略,默认为自动变量(auto)。示例中auto int b=0;也可定义为:int b=0;1.主函数中调用f()函数两次,第一次调用时形参a获得

38、的值为2,b+;的作用使得b=1;反馈回主调函数中的结果为a+b即2+1=3的值;因为b是自动变量,当函数调用结束后, 空间释放,变量值随即丢失。当第二次调用f()函数时,使得b又重新定义,重新赋值即b=0;模块模块9变量的存储方式和生存期变量的存储方式和生存期任务任务 2 认识静态局部变量认识静态局部变量任务描述任务描述:分析程序段的运行结果,体验自动变量的特点。代码提示:f(int a)static int b=0;b+;return(a+b);# include main() int i,x=2;for(i=0;i2;i+)printf(“%dn”,f(x);getch();输出结果:3

39、4v任务解析:任务解析:v示例中定义形式static int b=0;中static不可省略,省略则默认为auto型。v第一次调用函数f()时,b+;作用使得b=1;当反馈到主调函数中结果3时,由于b被定义成static型,该变量存储在静态存储区,该区变量的特点是当函数调用结束后值不消失继续保持原值(b=1),当下一次调用f()函数时,b要在上次调用后结果的基础上进行b+;操作即b=2;此时,反馈回a+b即2+2=4。1.在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值为0(对数值型数据)或空字符(对字符型变量);而自动变量不赋初值则是一个不确定的值。模块模块9变量的存储方

40、式和生存期变量的存储方式和生存期任务任务3认识寄存器变量认识寄存器变量任务描述任务描述:求1+2+3+1000。代码提示:# include main() register long n,sum=0; for(n=1;n=1000;n+) sum+=n; printf(“1+2+1000=%ldn”,sum);getch();输出结果:500500v任务解析:任务解析:v我们学习过的变量的值都是存储在内存中的,当程序用到某个变量的值时,由控制器负责将内存中的值送到运算器中运算,尽管CPU对内存的读写速度很快,但当频繁使用某些变量时,为提高执行效率,对集成在CPU芯片上的存取速度远高于内存的读取

41、速度,这种存储在CPU通用寄存器中的变量称为寄存器变量(关键字为register)。v示例中的变量sum和n要反复用到1000次,因此,为提高程序运行效率,均定义为寄存器变量。v11000的累加和超出了基本整型的最大值范围(32767),因此,定义成长整型,输出格式符为%ld。v计算机系统中的寄存器的数量是有限的,因此不能定义任意多个寄存器变量。1.随着计算机技术性能越来越优越,优化后的编译系统能够自动识别使用频繁的变量,对于一些没被定义为寄存器类别的变量,编译系统能自动将这些变量存储到寄存器中,因此,现在用register声明变量是不必要的。模块模块9变量的存储方式和生存期变量的存储方式和生

42、存期任务任务4认识外部变量认识外部变量任务描述任务描述:分析程序段的运行结果,体验外部变量的特点。代码提示:# include main() extern int x,y; x=x+y; printf(“%d,%dn”,x,y);getch();int x=2,y=3;输出结果:5,3模块模块10综合实战综合实战v任务描述任务描述:已知一个2行3列的二维数组a,定义一个求所有元素中最大的值的函数max,以数组名a为函数的实参,要求在自定义函数中求出6个元素的最大值并通过return语句在主调函数中输出该最大值。代码提示:int max(int b3) int i,j,k,max1; max1=

43、b00; for(i=0;i2;i+)for(j=0;jmax1) max1=bij;return max1;# include main()int a23=32,45,2,95,4,-23; printf(“max=%dn”,max(a);getch();输出结果:max=95v任务解析:任务解析:v数组名(a)作为函数的实际参数,和形参之间是首地址传递,两者之间共享同一存储单元,即a00与b00共用同一单元,a01与b01共用同一单元因此,形参数组的一维行标可以省略,但列标不可省。v语句max1=b00;是假设第一个元素为最大值,由循环控制数组元素的下标依次和max1进行比较,第一次比较完max1中存储的是b00和b01中的较大者;第二次比较完max1中存储的是b00、b01和b02中的最大者最后一次循环也是最后一个元素即b12比较完,max1中存储的是六个元素b00、b01、

温馨提示

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

评论

0/150

提交评论