




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
考点分析七函数1、库函数考点1、函数的基本概念在c语言中,函数是程序的基本组成单位,因此可以利用函数作为程序模块来实现c语言程序。一个C语言程序由一个主函数(main()函数)和其它若干函数构成。主函数可以调用其它函数,其它函数之间也可以互相调用。这些函数可以是C语言提供的库函数,也可以是用户自定义的函数。例如:#include<stdio.h>voidhello(){printf(“Hello,howdoyoudo?\n”);}main(){hello();}程序输出:Hello,howdoyoudo?
hello是用户自定义函数,它调用了库函数printf,功能是输出字符串Hello,howdoyoudo?main函数又调用了hello函数。注意:函数之间可以相互调用,但所有函数都是相互独立的,一个函数并不属于其它函数。其它函数不能调用主函数。考点2、标准库函数的调用
C语言提供了丰富的库函数,如数据输入/输出,数学计算,字符串处理等,编程时可以调用这些函数,而无须自己再定义。调用标准库函数需要以下两个步骤:
1)包含头文件;
2)调用库函数。调用库函数的格式是:函数名(参数表)在c语言中库函数的调用可以出现在表达式中,例如a=fab(b);表示将b的绝对值赋给a。也可以作为单独语句使用,这个时候需要在末尾加上分号,例如:printf(“hello!”);2、函数的定义和声明考点3、函数定义
c语言中的库函数实现的只是一些通用的功能,当程序有特定需求时,用户要编写程序实现这些功能。这就是自定义函数。函数定义的一般形式:返回值类型说明符函数名(形式参数表)
{函数体内定义的变量类型说明语句
}
例1:定义一个函数,求两个数中较小的数。intmin(inta,intb){intt;
if(a>b)returnt=b;elset=a;returnt;}其中,min是函数名,min前的int是返回值类型,min后面圆括号内的a、b是形式参数,语句returnt;是将t作为函数的返回值带回给主调函数。说明:
1)函数名和参数都是用户自定义的标识符,因而其必须符合标识符的命名规则。
2)函数可以没有返回值,这时应将返回值类型定义为void类型。返回值类型也可以省略不写,这时系统默认返回值类型为int型。
3)函数可以没有参数表,即无参函数。例如上面的hello()函数就是没有参数。
4)函数也可以没有说明部分和语句。例如draw()
{}
这称为空函数,没有任何实际意义,在程序中多用于功能的扩充。
5)不能在函数中定义函数。因为函数之间是相互独立的,没有哪个函数属于另一个函数。考点4、函数声明在c语言中,除main函数之外,用户定义的其他函数必须遵循“先定义,后使用”的原则。因此,如果调用在前定义在后,就必须在调用之前对函数进行声明。即向编译器表明该函数将会被调用,并将函数的有关信息通知编译器。函数声明的形式如下:返回值类型函数名(类型名,类型名…)或返回值类型函数名(类型名参数1,类型名参数2..)
说明:
1)函数声明中的参数名称可以和函数定义的参数名不同,它甚至可以和程序中的其他标识符同名。但声明中的返回值类型必须与定义中的一致。为了增强程序的可读性,建议使用带参数的函数声明方式。
2)函数的声明可以是一条独立的说明语句:例如:intmin(intx,inty);也可以和同类型的其他变量出现在定义语句中,例如:inta,b,min(intx,inty);
3)c语言编译程序会在编译时按照函数声明进行类型检验。当实参与形参类型不符时,编译器会自动进行类型转换,如果无法进行转换则报错;当实参与行参数目不符时,编译器也会报错。因此编译时的错误代替了运行时的错误,便于程序员进行程序调试。
3、数据传递*考点5形式参数和实际参数
定义函数时,函数名后的参数被称为形式参数,简称行参。函数调用时,函数名后的参数称为实际参数,简称实参。通过行参和实参,可以在调用函数和被调用函数之间传递数据。
说明:1)实参可以是常量、表达式或函数。
2)实参与行参的类型必须相同或赋值兼容。
3)只有当函数被调用时,行参才被分配内存单元,否则不占存储空间,调用结束后,行参所占的存储空间被释放。
4)实参对行参的数据传递是值传递,只能由实参传给行参,而不能由行参传递给实参。而且在内存中,行参和实参占用不同的内存单元,因此行参的改变并不影响实参。例如:#include<stdio.h>voidmain(){voidswap(intx,inty);
inta=10,b=20;printf(“%d,%d\n”,a,b);swap(a,b);printf(“%d,%d\n”,a,b);}voidswap(int
x,inty){intt;t=x;x=y;y=t;}考点6、函数的返回值被调函数可以用return语句将函数值传递给调用函数。return语句的形式如下:
return表达式;或return(表达式);说明:1)当函数执行到return语句时,return语句后的函数语句都不执行,返回到调用该函数的地方,并带回返回值。
2)return后的返回值可以是常量、变量或表达式。
3)表达式的类型必须和函数定义中的返回值类型一致,否则系统会自动将其转换为定义类型。如果转换无法进行,则编译报错。
4)函数可以没有返回值,即返回值类型为void型,此时函数体内可以没有return语句,一直执行到函数结束。
5)函数体内可以有多个return语句,但只会有一个return语句被执行,或者都不执行。4、函数调用考点7、函数调用的形式和语法要求函数的调用形式如下:函数名(实参表)说明:1)调用函数时,函数名必须与所调用的函数名完全一致。
2)实参与行参的个数必须相同,类型一致或者可以兼容。当函数没有参数时,函数的调用形式就变为
函数名()
3)函数调用可以作为表达式,出现在任何运行表达式的地方。例如:k=min(i,j);这种调用多出现在函数有返回值的情况下。
4)函数调用可以作为一条独立语句。例如:
hello();注意:因为是语句,所以后面的分号不可遗漏。例如:编写函数myupper(c),如果c不是大写字母将其转换成大写字母并输出,以#作为结束标志。#include<stdio.h>charmyupper(charc);voidmain(){charc;while((c=getchar())!='#'){c=myupper(c);
putchar(c);}}charmyupper(charc){if(c>='a'&&c<='z')c=c-32;returnc;}考点8、函数的嵌套调用被调用的函数又调用另一个函数,称为函数的”嵌套调用”。下列程序演示了函数嵌套调用的过程。#include<stdio.h>voidfun1();voidfun2();voidmain(){fun2();
printf("main\n");}voidfun1(){printf("fun1\n");}voidfun2(){printf("fun2\n");fun1();}*考点9、函数的递归调用函数直接或间接地调用该函数本身,称为函数的递归调用。可以将递归调用看做是嵌套调用的特殊形式。例:用递归的方法写求阶乘的函数。
#include<stdio.h>longjc(intn){inti;longs1;if(n==1)s1=1;elses1=jc(n-1)*n;returns1;}
voidmain(){longs;s=jc(4);
printf(“%ld”,s);}函数递归调用时,系统将自动将函数中的当前变量和行参变量暂时保存起来,在新一轮的调用过程中,系统将为该次调用的函数所用到的变量和行参重新分配内存单元。因此,递归调用的层次越多,同名变量所占用的存储单元就越多。5、变量的作用域考点10、局部变量作用域和生存期在函数内部或复合语句内部定义的变量,称为局部变量。局部变量只在定义它的函数或复合语句内部才有效,在此之外不能使用。例如:
intfun1(inti){……}
intfun2(){intj;if(j>0){intk;…….}}变量i,j,k都是局部变量。i的作用域是整个fun1函数,j的作用域是整个fun2函数,k的作用域是整个if语句。说明:1)行参也是局部变量。例如fun1中的行参i,作用域仅限于fun1函数。
2)不同函数之间可以使用同名的局部变量。不同函数中的变量在内存中占不同的存储单元,不会互相影响,因此可以同名。*考点11、全局变量作用域和生存期在函数外部定义的变量称为外部变量,它的作用范围是从定义位置到源文件结束,因而也称为全局变量。例如:
intx;
intfun1(){……}
inty;
intfun2(){……}变量x和y都是全局变量,但它们的作用域和定义它们的位置有关,。在fun1函数中可以使用变量x,但不能使用变量y,在fun2函数中x、y都可以使用。说明:1)全局变量实际是在函数之间增加了一种数据传递的方式。函数只能有一个返回值,而通过改变全局变量的值,可以使函数有一个以上的返回值。因此,如果两个函数必须共享某一个参数,而它们又不会互相调用,这时候可以把共享数据定义为全局变量。但是注意,在全局变量有效的范围内,任何一个函数都可以改变全局变量的值。
2)如果函数内部的局部变量与函数外的全局变量同名,则函数内被访问的是内部变量。6、变量的生存期和存储类别考点12、动态存储和静态存储从变量的作用域,可以将变量分为全局变量和局部变量,从变量的生存期,可以将变量分为静态存储方式和动态存储方式。静态存储是指,在程序运行期间为变量分配固定的内存空间,动态存储是指在程序运行期间,根据需要动态的分配内存空间。具体包括auto、static、register、extern四种。
内存中一共为用户提供了三种类型的存储空间,分别为:
1)程序代码区。用于存放源程序代码。
2)静态存储区。用于存放数据,包括全局变量和静态局部变量。程序执行时,系统就为全局变量分配固定的内存空间,程序执行结束时才释放该空间。
3)动态存储区。用于存放数据,包括函数行参、自动变量、函数调用的断点信息和函数返回地址。在程序过程中,系统为这些变量分配和释放的空间都是动态进行的,例如,在一个程序中多次调用同一个函数时,系统为函数中的局部变量分配的空间地址可能是不同的。考点13、auto(自动)变量由关键字auto声明的变量称为自动变量,当进入函数体时,系统在动态存储区为auto变量分配空间,当退出函数体时释放分配的空间,因此称为自动变量。在定义局部变量时,如果没有指定存储类型,系统默认为auto型。因此,程序中大多数变量都是auto变量。*考点14、static(静态)变量用关键字static声明的变量称为静态变量,static变量的存储单元被分配在静态存储区。它具有下面两个特点:
1)static变量的生存期是从程序开始执行到程序运行结束。在整个程序运行期间,静态变量始终在静态存储区占用内存单元。因此,函数中的局部变量被声明为静态变量后,函数调用结束后该变量将保留原值,而不是消失,在下一次函数调用时该变量的值仍为存储单元中的值。
2)static变量在编译时赋值,而不是在程序运行时赋值。如果没有显式的赋初值,系统将默认给它赋值为0。#include<stdio.h>voidfun(intx){inty=0;staticz=0;
y++;z++;
printf("%d,%d\n",y,z);}voidmain(){inti;for(i=0;i<3;i++)
fun(i);}程序运行结果:1,11,21,3考点15、register(寄存器)变量用关键字register声明的变量称为寄存器变量,该类变量在CPU寄存器中分配空间。程序运行时,访问寄存器的速度远远高于访问内存的速度。因此,当程序运行效率要求较高时,可以将频繁使用的变量声明为寄存器类型。说明:1)只有局部auto变量和函数的行参才可以被声明为寄存器变量,其它的不可以;
2)无论寄存器变量是否真的放在寄存器中,都不能对其进行求地址运算。考点16、extern(外部)变量全局变量的作用域是从变量定义到程序结束,为了扩展全局变量的作用域,c语言提供了extern关键字。如果全局变量定义在后,函数引用在前,只要在引用函数中用extern对该变量进行声明,就可以使用该变量。因此,该变量的作用域扩展为从extern说明处起,到程序结束。注意:全局变量在定义时才对其分配空间,而extern说明不分配空间。因此,对同一个全局变量,程序中只能出现一次定义,而extern声明可以多次出现,并且在定义时不再出现extern声明。例题:1、下列叙述中错误的是()。A)C程序必须由一个或一个以上的函数组成B)函数调用可以作为一个独立的语句存在C)若函数有返回值,必须通过return语句返回D)函数形参的值也可以传回给对应的实参2、若函数调用时的实参为变量时,下列关于函数形参和实参的叙述中正确的是()。A)函数的实参和其对应的形参共占同一存储单元B)形参只是形式上的存在,不占用具体存储单元C)同名的实参和形参占同一存储单元D)函数的形参和实参分别占用不同的存储单元3、在C语言中,函数返回值的类型最终取决于()。A)函数定义时在函数首部所说明的函数类型B)return语句中表达式值的类型C)调用函数时主调函数所传递的实参类型D)函数定义时形参的类型4、下列关于函数的叙述中正确的是()。A)每个函数都可以被其他函数调用(包括main函数)B)每个函数都可以被单独编译C)每个函数都可以单独运行D)在一个函数内部可以定义另一个函数5、若有代数式|nx+ex|(其中e仅代表自然对数的底数,不是变量),则下列能够正确表示该代数式的C语言表达式是()。A)sqrt(abs(n^x+e^x))B)sqrt(fabs(pow(n,x)+pow(x,e)))C)sqrt(fabs(pow(n,x)+exp(x)))D)sqrt(fabs(pow(x,n)+exp(x)))6、若各选项中所用变量已正确定义,fun()函数中通过return语句返回一个函数值,下列选项中错误的程序是()。A)main()B)floatfun(int
a,intb){……}{……main()x=fun(2,10);{…………}x=fun(i,j);floatfun(int
a,intb)……}{……}C)floatfun(int,int);D)main()main(){floatfun(int
i,intj);{……x=fun(2,10);……x=fun(i,j);……}……}floatfun(int
a,intb)floatfun(int
a,intb)
{……}{……}
7、已定义下列函数:int
fun(int*p){return*p;)fun函数返回值是()。A)不确定的值B)一个整数C)形参p中存放的值D)形参p的地址值8、设fun()函数的定义形式为()。voidfun(char
ch,floatx){…}则下列对函数fun的调用语句中,正确的是A)fun("abc",3.0);B)t=fun('D',16.5);C)fun('65',2.8);D)fun(32,32);9、有下列程序:intfun1(doublea){returna*=a;}intfun2(doublex,doubley){doublea=0,b=0;a=fun1(x);b=fun1(y);return(int)(a+b);}main(){doublew;w=fun2(1.1,2.0);……}程序执行后变量w中的值是()。A)5.21B)5C)5.0D)0.010、有下列程序:fun(intx){intp;if(x==0‖x==1)return(3);p=x-fun(x-2);returnp;}main(){printf("%d\n",fun(7));}执行后的输出结果是()。A)7B)3C)2D)011、有下列程序:int
fun(intn){if(n==1)return1;elsereturn(n+fun(n-1));}main(){intx;scanf("%d",&x);x=fun(x);printf("%d\n",x);}执行程序时,给变量x输入10,程序的输出结果是()。A)55B)54C)65D)4512、在一个C源程序文件中所定义的全局变量,其作用域为()。A)所在文件的全部范围B)所在程序的全部范围C)所在函数的全部范围D)由具体定义位置和extern说明来决定范围13、有下列程序:voidfun2(chara,charb){printf("%c%c",a,b);}chara='A',b='B';voidfun1(){a='C';b='D';}main(){fun1();printf("%c%c",a,b);fun2('E','F');}程序的运行结果是()。A)CDEFB)ABEFC)ABCDD)CDAB14、有下列程序:fun(int
x,inty){staticintm=0,i=2;i+=m+1;m=i+x+y;returnm;}main(){intj=1,m=1,k;k=fun(j,m);printf("%d,",k);k=fun(j,m);printf("%d\n",k);}执行后的输出结果是()。A)5,5B)5,11C)11,11D)11,515、有下列程序:int
fun(intx[],intn){staticintsum=0,i;for(i=0;i<n;i++)sum+=x[i];returnsum;}main(){inta[]={1,2,3,4,5},b[]={6,7,8,9},s=0;s=fun(a,5)+fun(b,4);printf("%d\n",s);}程序执行后的输出结果是()。A)45B)50C)60D)5516、有下列程序:#include<stdio.h>inta=1;int
f(intc){staticinta=2;c=c+1;return(a++)+c;}main(){int
i,k=0;for(i=0;i<2;i++){inta=3;k+=f(a);}k+=a;printf("%d\n",k);}程序的运行结果是()。A)14B)15C)16D)1717、有下列程序:inta=4;int
f(intn){intt=0;staticinta=5;if(n%2){inta=6;t+=a++;}else{inta=7;t+=a++;}returnt+a++;}main(){ints=a,i=0;for(;i<2;i++)s+=f(i);printf("%d\n",s);}程序运行后的输出结果是()。A)24B)28C)32D)3618、有下列程序:inta=2;int
f(intn){staticinta=3;intt=0;if(n%2){staticinta=4;t+=a++;}else{staticinta=5;t+=a++;}Returnt+a++;}main(){ints=a,i;for(i=0;i<3;i++)s+=f(i);printf("%d\n",s);}程序运行后的输出结果是()。A)26B)28C)29D)24填空:1、下列程序中,fun()函数的功能是计算x2-2x+6,主函数中将调用fun()函数计算:y1=(x+8)2-2(x+8)+6y2=sin2(x)-2sin(x)+6请填空。#include"math.h"doublefun(double
x){return(x*x-2*x+6);}main(){doublex,y1,y2;printf("Enterx:");scanf("%lf",&x);y1=fun(_________);y2=fun(_________);printf("y1=%lf,y2=%lf\n",y1,y2);}2下列isprime
函数的功能是判断形参a是否为素数,是素数,函数返回1,否则返回0。请填空int
isprime(inta){inti;for(i=2;i<=a/2;i++)if(a%i==0)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 20人店铺管理制度
- 4s店设备管理制度
- 柴油叉车加油管理制度
- 标准食堂卫生管理制度
- 校内寝室生活管理制度
- 校园人员聚集管理制度
- 校园周边扬尘管理制度
- 校园安全排查管理制度
- 校园文明餐桌管理制度
- 校园烟酒配送管理制度
- 消化道穿孔患者的护理课件
- 作物栽培学智慧树知到期末考试答案章节答案2024年中国农业大学
- 汽车修理厂应急预案汽修厂安全生产事故应急救援综合预案2019-2020新标准完整版实施文件
- 建筑智能化系统工程挂靠协议
- 司法鉴定的奥秘智慧树知到期末考试答案2024年
- 2024春期国开电大专本科《教育学》在线形考 (形考论坛4)试题及答案
- MOOC 高速铁路运营与维护-西南交通大学 中国大学慕课答案
- 11-轮藻植物门课件
- (2024年)健康评估教学教案心电图检查教案
- 方法模型:展开图、还原立体图形
- 2023年广东省中考生物试卷(含答案)
评论
0/150
提交评论