计算机二级考试C语言辅导PPT课件(共三部分:第三部分)_第1页
计算机二级考试C语言辅导PPT课件(共三部分:第三部分)_第2页
计算机二级考试C语言辅导PPT课件(共三部分:第三部分)_第3页
计算机二级考试C语言辅导PPT课件(共三部分:第三部分)_第4页
计算机二级考试C语言辅导PPT课件(共三部分:第三部分)_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

计算机二级考试C语言辅导,共三部分:第三部分,七、函数,1.库函数的正确调用。2.函数的定义方法。3.函数的类型和返回值。4.形式参数与实在参数,参数值传递。5.函数的正确调用,嵌套调用,递归调用。6.局部变量和全局变量。7.变量的存储类别(自动,静态,寄存器,外部),变量的作用域和生存期。,调用格式1)函数语句:把函数调用作为一个语句。printf();2)函数表达式函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。例如:c=2*sin(a);3)函数参数函数调用作为一个函数的实参。printf(“%d”,fabs(-1);注意:头文件,定义格式函数类型函数名(参数类型参数名,参数类型参数名),1、无参函数的定义形式类型标识符函数名()声明部分语句,2、有参函数的定义形式类型标识符函数名(形式参数表列)声明部分语句,print_message()printf(“Howdoyoudo!n”);,intmax(intx,inty)intz;z=xy?x:y;return(z);,main()intx,y;scanf(“%d”,intfun(inta)intb;b=a*a;return(b);main()intx,y;scanf(“%d”,编写一个函数,由参数传入一个整数,计算该数的各位数字之积。,main()intx,y,z=1;scanf(“%d”,说明:1)定义时部分可省,请注意省略后默认的含义2)自定义函数定义的位置(任意位置)3)不能嵌套定义(可以嵌套调用),intmax(intx,inty)intmin(intx,inty)return(xy?x:y),一.函数类型函数类型主要指的是函数返回值的类型,定义时确定1)如果在定义函数时不指定函数类型,系统会隐含指定函数类型为int型2)在定义函数时对函数说明的类型一般应该和return语句中的表达式类型一致。如果不一致,则以函数类型为准。对数值数据,可以自动进行转换。即函数类型决定返回值的类型。floatf()intf().return1;return1.5;二.函数的返回值1)函数的返回值是通过函数中的return语句获得的。return语句将被调用函数中的一个确定的值带回主调函数中去格式:return(表达式);或return表达式;例:max(intx,inty)return(xy?x:y);,2)如果不需要从被调用函数带回函数值可以不要return语句或者return;语句。此时函数并不是不带回值,而只是不带回有用的值,带回的是一个不确定的值。3)为了明确表示“不带回值”,可以用void(空类型或无类型)voidprintstar()voidprint_message()则下面的用法就是错误的:a=printstar();b=print_message();注意:如果出现多个return语句,且不是出现在选择结构的各个分支中,则系统会自动执行第一个return语句,其它的不被执行main()main().return3;if(xy)return1;return6;elsereturn2;,1)以下关于return语句的叙述中正确的是(10.3)A)一个自定义函数中必须有一条return语句B)一个自定义函数中可以根据不同情况设置多条return语句C)定义成void类型的函数中可以有带返回值的return语句D)没有return语句的自定义函数在执行结束时不能返回到调用处,B,2)以下叙述中错误的是(08.9)A)用户定义的函数中可以没有return语句B)用户定义的函数中可以有多个return语句,以便可以调用一次返回多个函数值C)用户定义的函数中若没有return语句,则应当定义函数为void类型D)函数的return语句中可以没有表达式,B,3.参数1)类型:形参:各种基本类型变量、数组、指针变量实参:各种基本类型变量、常量、数组、数组元素、指针变量2)形参和实参必须个数相同、类型一致3)方式(1)值传递:形参变化不影响实参intf(inta,intb)a=a*a;b=b*b;printf(“%d,%d”,a,b);main()intx=2,y=3;f(x,y);printf(“%d,%d”,x,y);(2)地址传递,2,3,2,3,x,y,a,b,4,9,1).有以下程序#includevoidfun(intp)intd=2;p=d+;printf(“%d”,p);main()inta=1;fun(a);printf(“%dn”,a);程序运行后的输出结果是(09.9)A)32B)12C)21D)22,C,2)有以下程序fun(intx,inty)return(x+y);main()inta=1,b=2,c=3,sum;sum=fun(a+,b+,a+b),c+);printf(“%dn”,sum);执行后的输出结果是(069)A)6B)7C)8D)9,C,3)若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是(07.9)A)函数的实参和其对应的形参共占同一存储单元B)形参只是形式上的存在,不占用具体存储单元C)同名的实参和形参占同一存储单元D)函数的形参和实参分别占用不同的存储单元,D,4)下面的函数调用语句中func函数的实参个数是(089)func(f2(v1,v2),(v3,v4,v5),(v6,max(v7,v8);A)3B)4C)5D)8,A,一.函数调用函数调用的一般形式为函数名(实参表列)1)如果是调用无参函数,则“实参表列”可以没有,但括弧不能省略,如果实参表列包含多个实参,则各参数间用逗号隔开。实参与形参的个数应相等,类型应一致。实参与形参按顺序对应,一一传递数据。intf(intx,inty).main()inta=5,b=4;f(a,b);,2)函数语句:把函数调用作为一个语句。print_star();3)函数表达式函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。例如:c=2*max(a,b);4)函数参数函数调用作为一个函数的实参。m=max(a,max(b,c);又如:printf(“%d”,max(a,b);5)被调函数的特点(1)必须是已经存在的函数(是库函数或用户自己定义的函数)。,(2)如果使用库函数,一般还应该在本文件开头用#include命令将调用有关库函数时所需用到的信息“包含”到本文件中来。(3)如果使用用户自己定义的函数,而且该函数与调用它的函数(即主调函数)在同一个文件中,一般还应该在主调函数中对被调用的函数作声明,即向编译系统声明将要调用此函数,并将有关信息通知编译系统。6)函数声明(1)格式:函数类型函数名(参数类型1,参数类型2)在函数声明中也可以不写形参名,而只写形参的类型。例:floatf(inta,intb);floatf(int,int);(2)位置:在变量定义之前或之后,但必须在其它执行语句之前(3)省略:函数类型为int或char;函数定义在调用之前,1)下列叙述中错误的是(06.4)A)C程序必须由一个或一个以上的函数组成B)函数调用可以作为一个独立的语句存在C)若函数有返回值,必须通过return语句返回D)函数形参的值也可以传回给对应的实参,D,下列给定的程序中,函数fun的功能是:计算并输出k以内最大的10个能被13或17整除的自然数之和。k的值由主函数传入,若k的值为500,则函数的值为4622。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include#include#includeintfun(intk)intm=0,mc=0,j;while(k=2),试题程序:#include#include#include#includedoublefun(intn)voidmain()FILE*wf;system(CLS);printf(s=%fn,fun(1000);/*/wf=fopen(out.dat,w);fprintf(wf,%f,fun(1000);fclose(wf);/*/,编写函数fun,它的功能是:求n以内(不包括n)同时能被5与11整除的所有自然数之和的平方根s,并作为函数值返回。例如,n为1000时,函数值应为s=96.979379。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。,二.特殊调用1)嵌套调用函数定义都是互相平行、独立的,不能嵌套定义.可以做嵌套调用函数,在调用一个函数的过程中,又调用另一个函数。求sum=1!+2!+3!+.+n!main()intx;scanf(“%d”,2)递归调用嵌套调用的特殊情况,函数自身调用自身;程序中不应出现无终止的递归调用,而只应出现有限次数、有终止的递归调用。可以用条件语句(if)控制。longfac(intn)if(n=1)f=1;elsef=n*fac(n-1);returnf;voidmain()longs;intn;scanf(“%d”,main输入n=4输出241.fact(intn4)f=4*f(n-13)=4*6return242.fact(intn3)f=3*f(n-12)=3*2return6;3.fact(intn2)f=2*f(n-11)=2*1return2;4.fact(intn1)f=1;return1;,Fibonacci(斐波那契数列)兔子繁衍(迭代)设有一对新生兔子,从第三个月开始它们每个月生一对兔子;按此规律,并假设没有兔子死亡,每个月的兔子总数是多少,一年后共有多少对兔子。,f1=1f2=1,f3=2=f1+f2,f4=3,=f2+f3,f5=5,=f3+f4,f6=8,=f4+f5,f1=1(n=1)f2=1(n=2)fn=fn-1+fn-2(n=3),Fibonacci数列,运行结果:11235813213455891442333776109871597258441816765,longf(intn)if(n=1|n=2)return1;elsereturn(f(n-1)+f(n-2);)main()intmonths=6;printf(“%ld”,f(months);,第一次调用f(5)+f(4),f(4)+f(3),f(3)+f(2),f(3)+f(2),f(2)+f(1),f(2)+f(1),f(2)+f(1),main()longintf1,f2;inti;f1=1;f2=1;for(i=1;i=20;i+)printf(“%12ld%12ld”,f1,f2);if(i%2=0)printf(“n”);f1=f1+f2;f2=f2+f1;,main()inti;intf20=1,1;for(i=2,i=20;i+)fi=fi-1+fi-2;for(i=0,i1,n-1,1,1)有以下程序#includeintfun(inta,intb)if(b=0)returna;elsereturn(fun(-a,-b);main()printf(“%dn”,fun(4,2);程序运行结果是(089)A)1B)2C)3D)4,B,2)#includeintf(intx,inty)return(y-x)*x);main()inta=3,b=4,c=5,d;d=f(f(a,b),f(a,c);printf(“%dn”,d);程序运行结果(093)A)10B)9C)8D)7,B,变量的作用域和存储类别1)作用域:局部变量:在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。这称为“局部变量”。ints(1)=9;intf(intx,inty)ints(2)=1;s=x*y;printf(“1=%dn”,s);return(s);main()intm=4,n=5,s(3);s=m-n;f(2,3);printf(“2=%dn”,s);ints(4)=7;printf(“3=%dn”,s);,1=62=-1;3=7;,说明:(1)主函数main中定义的变量(m,n)也只在主函数中有效,而不因为在主函数中定义而在任何函数中有效;主函数也不能使用其他函数中定义的变量。(2)不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰,它们在内存中占不同的单元(3)形式参数也是局部变量。(4)在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也可称为“分程序”或“程序块”。全局变量在函数之外定义的变量称为外部变量(全局变量、全程变量),全局变量可以为本文件中其他函数所共用.它的有效范围为从定义变量的位置开始到本源文件结束,ints=1;intf(intx,inty)s=x*y;printf(“1=%d”,s);return(s);main()intm=4,n=5;printf(“2=%d”,s);说明:1)如果在一个函数中改变了全局变量的值,就能影响到其他函数,相当于各个函数间有直接的传递通道。由于函数的调用只能带回一个返回值,因此有时可以利用全局变量增加与函数联系的渠道,从函数得到一个以上的返回值。2)用extern声明外部变量一个文件内声明外部变量用extern来声明外部变量,以扩展外部变量的作用域,存储类别:从变量存在的时间(即生存期)角度来分,可以分为静态静态存储方式和动态存储方式。(1)动态存储方式是在程序运行其间根据需要进行动态的分配存储空间的方式。auto类型变量名函数的局部变量,如不专门声明static存储类别,都是自动分配存储空间的,即auto变量。数据存存储在动态存储区中。函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量),都属此类,在调用该函数系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。寄存器变量:利用CPU的寄存器存储变量,只能是整型字符型指针型的动态局部变量register类型变量名,静态存储方式是指在程序运行其间分配固定的存储空间的方式;static类型变量名函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值。注意:1)变量不赋初值时,系统默认为02)局部静态变量,超出它的作用域不产生作用,但内存空间不释放f()staticinta;intb=0;a+;b+;printf(“%d”,a);printf(“%d”,b);main()inti;for(i=1;i=3;i+)f();printf(“%d”,a);,1)有以下程序#includeintfun()staticintx=1;x=x*2;returnx;main()inti,s=1,for(i=1;i=2;i+)s=fun();printf(%dn,s);程序运行后的输出结果是(10.3)A)0B)1C)4D)8,C,2)以下程序的运行结果是_i=5k=5voidfun(intm)m+=k;k+=m;printf(“m=%d=%d”,m,k+);main()inti=4;fun(i+);printf(“i=%dk=%dn”,i,k);,C,3)在C语言中,只有在使用时才占用内存单元的变量,其存储类型是(084)A)auto和registerB)extern和registerC)auto和staticD)static和register,A,4).有以下程序#includeintf(intn);main()inta=3,s;s=f(a);s=s+f(a);printf(“程序运行后的输出结果是(09.9)A)7B)8C)9D)10,C,八、编译预处理,1.宏定义和调用(不带参数的宏,带参数的宏)。2.“文件包含”处理。,C语言程序在运行之前要进行编译,而编译系统包括预处理、编译、连接等部分,但注意预处理命令是在执行编译之前处理的;是“#”开头的行;在源程序中这些命令都放在函数之外,而且一般都放在源程序之前;末尾不能有分号.,宏定义-#define,一、不带参数的宏定义1.一般形式:#define标志符字符串例#definePI3.1415#definesPI*r*r2.宏名:3.宏展开:在预处理(预编译)时将宏名替换成字符串的过程称为“宏展开”。#define是宏定义命令。main()intr;floatf;scanf(“%d”,4.说明:(1)宏名一般用大写字母表示,以便与变量名相区别。但也可以用小写。,f=PI*r*r-f=3.1415*r*r,(2)使用宏名代替一个字符串,可以减少输入量;提高程序的通用性。(3)宏定义是用宏名代替一个字符串,只做简单置换,不分配存储空间不做正确性检查,也不进行任何计算(被替换的是字符串,不是表达式)。(4)宏定义不是C语句,不必在行末加分号(如果加了分号则会连分号一起进行替换).#definePI3.1415;s=PI*r*r;-s=3.1415;*r*r;(5)#define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常,#define命令写在文件开头,函数之前,作为文件的一部分,在此文件范围内有效。,(6)可以用#undef命令结束宏定义的作用域。#definePI3.1415main()#undefPIf1().(7)在进行宏定义时,可以引用已定义的宏名,可以层层置换。#defineN3;#defineMN*N-x;printf(“%d”,M);(8)对于程序中用双引号括起来的字符串,即使与宏名相同,也不进行替换。printf(“M”);,N*N-x-3*3-x,二、带参数的宏定义:1.一般形式:#define宏名(形参表)字符串如:#defineS(a,b)a*barea=S(3,2);/*area的值为3*2即6*/#definePI3.1415926#defineS(r)PI*r*rmain()floata,area;a=3.6;area=S(a);Printf(“r=%fnarea=%fn”,a,area);,PI*r*r-3.1415926*r*r-3.1415926*3.6*3.6,2、展开替换的方式:对带参数的宏的展开只是将语句中的宏名后面括号内的实参代替#define命令行中的形参,而不是象调用函数时的值传递;如果宏定义中的字符串中的字符不是参数字符,则保留。#defineS(y)y*y-2*x#defineL(y)(y)*(y)-2*xmain()floatk,x;scanf(“%f”,3.说明:在宏定义时,在宏名与带参数的括号之间不应加空格,否则,将空格以后的字符都作为替代字符串的一部分。#defineS(y)y*y-2*x,y*y-2*x-3+5*3+5-2*x,(y)*(y)-2*x-(3+5)*(3+5)-2*x,4、带参数的宏定义与函数的区别:(1)函数调用时,先求出实参表达式的值,然后传入形参;而使用带参数的宏定义只是进行简单的字符替换。#defineS(y)y*yinth(intx)return(x*x);main()intz=2;printf(“%d,%d,%d,%d”,S(7),h(7),S(z+3),h(z+3)(2)函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进行的,在展开时并不分配内存单元,没有“返回值”的概念。,z+3*z+3,(3)对函数的实参、形参以及函数本身都要定义类型,二者类型要求一致。如不一致,进行类型转换。而宏不存在类型问题,宏名无类型,参数也无类型,只做为一个符号代表,展开时代入指定的字符即可。(4)使用宏次数多时,宏展开后实际上使源程序变长,而函数调用不使源程序变长,只是离开主调函数,进入被调函数。(5)宏替换不占运行时间,只占编译时间。而函数调用则占运行时间。(6)如果善于利用宏定义,可以实现程序的简化,1)有以下程序#include#defineN5#defineMN+1#definef(x)(x*M)main()inti1,i2;i1=f(2);i2=f(1+1);printf(“%d%dn”,i1,i2);程序运行结果是(069)A)1212B)117C)1111D)127,B,2)有以下程序#include#defineSUB(a)(a)-(a)main()inta=2,b=3,c=5,d;d=SUB(a+b)*c;printf(%dn,d);程序运行后的输出结果是(10.3)A)0B)-12C)-20D)10,C,3)以下关于宏的叙述中正确的是(089)A)宏名必须用大写字母表示B)宏定义必须位于源程序中所有语句之前C)宏替换没有数据类型限制D)宏调用比函数调用耗费时间,C,4)有一个名为init.txt的文件,内容如下:#defineHDY(A,B)A/B#definePRINT(Y)printf(“y=%dn”,Y)有以下程序#include“init.txt”main()int

温馨提示

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

评论

0/150

提交评论