版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
国家二级C语言机试(函数和数组)模拟试卷1(共9套)(共256题)国家二级C语言机试(函数和数组)模拟试卷第1套一、选择题(本题共29题,每题1.0分,共29分。)1、有下列程序:#include/*fun函数的功能是将a所指数组元素从大到小排序*/voidfun(int*a,intn)main(){intt,i,j;{intc[10]={1,2,3,4,5,6,7,8,9,0),i;for(i=0;iA、1,2,3,4,9,8,7,6,5,0,B、0,9,8,7,6,5,1,2,3,4,C、0,9,8,7,6,5,4,3,2,1,D、1,2,3,4,5,6,7,8,9,0,标准答案:A知识点解析:fun()函数的功能是对数组a[]的元素从大到小进行排序。所以在主函数执行fun(c+4,6)语句时,将从数组c的第5个元素开始的后6个元素进行从大到小排序。排序之后,数组c的内容变为{1,2,3,4,9,8,7,6,5,0}。2、有以下程序#includemain(){intc[6]={10,20,30,40,50,60},*p,*s;p=c:s=&c[5];printf("%d\n",s-p);}程序运行后的输出结果是A、50B、6C、5D、60标准答案:C知识点解析:主函数中指针变量p指向数组c,s保存了数组最后一个元素的地址,那么s-p为两个地址之间的元素差5。3、以下叙述中正确的是A、一条语句只能定义一个数组B、数组说明符的一对方括号中只能使用整型常量,而不能使用表达式C、每个数组包含一组具有同一类型的变量,这些变量在内存中占有连续的存储单元D、在引用数组元素时,下标表达式可以使用浮点数标准答案:C知识点解析:数组的定义格式:类型说明符数组名[整型常量表达式],…;可以同时定义多个类型相同的数组,之间以逗号分隔开,数组的类型表明了数组中元素的数据类型,数组中所有元素的类型相同,数组经过定义以后就可使用,编译程序将对其分配一片连续的存储空间进行连续存储。C语言中只能单个引用数组元素而不能一次引用整个数组。引用格式为:数组名[下标],引用元素时,需要注意下标只能为整型常量或整型表达式。4、以下叙述中正确的是A、语句inta[]={0};是不合法的,遗漏了数组的大小B、语句chara[2]={"A","B"};是合法的,定义了一个包含两个字符的数组C、语句inta[8]={0};是合法的D、语句chara[3];a="AB":是合法的,因为数组有三个字符空间的容量,可以保存两个字符标准答案:C知识点解析:当系统为所定义的数组在内存中开辟一串连续的存储单元时.这些存储单元中并没有确定的值,可以在定义语句中为所定义数组的各个元素赋初值。数组初始化赋值是指在数组定义时给数组元素赋予初值。初始化赋值的一般形式为:类型说明符数组名[常量表达式]={值,值,…,};。需要注意的是当所赋初值多于所定义数组的元素个数时,在编译时将给出出错信息,在指定初值时,第一个初值必定赋给下标为0的元素,然后按这些数值的排列顺序赋初值,只能给元素逐个赋值,不能给数组整体赋值。如果给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。5、如果定义floata[10],x;则以下叙述中正确的是A、表达式a+1是非法的B、语句a=&x:是非法的C、三个表达式a[1]、*(a+1)、*&a[1]表示的意思完全不同D、表达式*&a[1]是非法的,应该写成*(&(a[1]))标准答案:B知识点解析:定义语句“floata[10],x;”以后,数组名a表示了数组元素的首地址,是常量在程序中不能更改,因此选项A是的描述是正确的。而指向运算符和取址运算符,是互反运算符优先级相同,*&a[1]和*(&a[1])含义相同。6、有以下程序#includemain(){inta[]={10,20,30,40),*p=a,i;for(i=0;i<=3;i++){a[i]=*p;p++;}printf("%d\n",a[2]);}程序运行后的输出结果是A、20B、30C、10D、40标准答案:B知识点解析:因为指针变量p的初始值指向数组a,所以执行for循环语句后,数组a中的元素的值不变。7、若有以下程序main(){inti,j=0;chara[]="Howareyou!";for(i=0;a[i];i++)if(a[i]!=’’)a[j++]=a[i];aD]=’\0’;printf("%s\n",a);}则程序的输出结果是A、HowareyouB、Hay!C、Howareyou!D、Howareyou!标准答案:C知识点解析:主函数中利用for循环访问字符串的每一个字符,判断当前字符是否为空格,如果是空格则删除。因此删除字符串"Howareyou!"中空格以后,字符串为Howareyou!。8、若有以下程序#includemain(){inti,j=0;chara[]="Howareyou!",b[10];for(i=0;a[i];i++)if(a[i]=’’)b[j++]:a[i+1];b[j]=’\0’;printf("%s\n",b);}则程序的输出结果是A、HowareyouB、Hay!C、Howareyou!D、ay标准答案:D知识点解析:主函数中利用for循环访问字符串a的每一个字符,判断当前字符是否为空格,如果是空格则保存该空格后面的÷个字符存放到字符数组b中。在字符串"Howareyou!"中,第一个空格后面字符为’a’,第二个空格后面字符为y。9、若有以下程序#includechar*a="you",b[]="welcome#you#to#China!";main(){inti,j=0;char*p;for(i=0;b[i]!=’\0’;i++){if(*a==b[i]){p=&b[i];for(j=0;a[j]!=’\0’;j++){if(a[j]!=*p)break;p++;}if(a[j]=’\0’)break;}}printf("%s\n",p);}则程序的输出结果是A、#you#to#China!B、me#you#to#China!C、#China!D、#to#China!标准答案:D知识点解析:程序中循环部分的主要功能是,在字符串b中寻找是否含有子串a,如果含有则退出,字符指针p指向该匹配子串后面的位置,利用printf函数输出则从该位置开始一直输出到字符串b的结尾。10、以下能正确定义二维数组是A、inta[][3];B、inta[][3]={2*3};C、inta[][3]={}D、inta[2][3]={{1},{2),{3,4});标准答案:B知识点解析:C语言中定义二维数组,必须指定二维数组每一维的大小。选项A没有指定数组a行的大小,错误;选项B,虽然没有指定行大小,但是可以通过大括号里面的元素个数计算出行的大小为1,因此是正确的;选项C同样没有指定行的大小,也不能通过元素个数计算行的个数,错误;选项D定义的是二行三列数组,但是后面数据是三行,超出范围,所以错。11、若有以下说明和语句intc[4][51,(*p)[5];p=c;能够正确引用c数组元素的是A、p+1B、*(p+3)C、*(p+1)+3D、*(p[0]+2)标准答案:D知识点解析:本题考查数组和指针,在本题中c是二维数组,指针p指向二维数组c,p其实是指向c数组的第一行。因此选项A中p+1指向c数组的第二行;选项B中,p+3表示p指向c数组的第三行,因此*(p+3)表示取出c数组第三行首元素的地址;选项C和选项B类似,表示取出数组c第二行首元素地址然后加3;选项D中p[0]+2表示数组第一行第三列元素的地址,因此*(p[0]+2)是取出该元素的值。12、若有定义语句:intk[2][3],*pk[3];,则以下语句中正确的是A、pk=k;B、pk[0]=k[1][2];C、pk=k[0];D、ok[]=k;标准答案:B知识点解析:本题考查多维数组和数组指针。k是一个二维数组,pk是一个指针数组,该数组有3个元素,每个元素都是一个指向整型对象的指针。选项A错误,等号的左边是一个数组地址,不是变量;选项B是把元素k[1][2]赋值给pk[0];选项C中等号左边不是变量:选项D类型不匹配,pk[1]是指向一个整型对象,而k是一个二维数组首地址。13、若有定义语句:inta[3][6];,按在内存中的存放顺序,a数组的第10个元素是A、a[0][4]B、a[1][3]C、a[0][3]D、a[1][4]标准答案:B知识点解析:本题考查多维数组的定义和使用。a是一个二维数组,有3行6列。即每行6个元素,a的第10个元素位于第二行的第四个位置,即a[][3]。14、若有定义语句:inta[2][3],*p[3];,则以下语句中正确的是A、p=a;B、p[0]=a;C、p[0]=a[1][2];D、p[1]=a;标准答案:C知识点解析:本题考查多维数组和数组指针。a是一个二维数组,p是一个指针数组,该数组有3个元素,每个元素都是一个指向整型对象的指针。选项A错误,等号的左边是一个数组地址,不是变量;选项B数据类型不匹配,p[0]是指向一个整型对象,而a是一个二维数组首地址;选项C正确,是把元素a[1][2]赋值给p[0];选项D和选项B一样属于数据类型不匹配,p[1]是指向一个整型对象,而a是一个二维数组首地址。15、若有定义:inta[2][3];,以下选项中对a数组元素正确引用的是A、a[2][!1]B、a[2][3]C、a[0][3]D、a[1>2][!1]标准答案:D知识点解析:本题考查数组的使用,C语言中数组的下标从0开始。本题中a是一个二维数组,两个下标的范围分别是0—1和0—2。选项A中第一个下标越界,超出了范围;选项B中第一个和第二个下标都超出了范围;选项C中第二个下标超出范围;选项D中,1>2的值为0,!1的值为0,因此选项D实际是访问a[0][0]。16、以下数组定义中错误的是A、intx[][3]={0};B、intx[2][3]={{1,2},{3,4},{5,6}};C、intx[][3]={{1,2,3},{4,5,6}};D、intx[2][3]={1,2,3,4,5,6};标准答案:B知识点解析:二维数组的初始化有以下几种形式:①分行进行初始化;②不分行的初始化;③部分数组元素初始化;④省略第一维的定义,不省略第二维的定义。在选项B中赋值号左边定义了一个3行2列的二维数组,而右边用2行3列的数字进行赋初值。所以出现了边界的越界溢出而出错。17、有以下程序#include#defineN4voidfun(inta[][N],intb[]){inti;for(i=0;iA、一12,一3,0,0,B、一3,一1,1,3,C、0,1,2,3,D、一3,一3,一3,一3,标准答案:B知识点解析:fun函数的功能是求出二维数组a中第i行第i个元素与第N-1-i元素的差,赋给b[i]。在主函数中,把实参二维数组x和一维数组y传递给形参a和b,最后输出一维数组y中元素的值。18、有以下程序#includemain(){intb[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=l;for(i=0;i<=i.j++)t+-b[i][b][i][i]];printf("%d\n",t);}程序运行后的输出结果是A、3B、1C、9D、4标准答案:D知识点解析:这道题主要考查的是二维数组的有关知识。在两层for循环语句中,每次执行变量t的累加时,二维数组元素b的第二下标的值与第一下标相同的值,所以程序执行的过程为t=1+b[1][1]+b[2][2]=1+1+2=4。19、以下定义数组的语句中错误的是A、intnum[][3]={{1,2),3,4,5,6};B、intnum[]={1,2,3,4,5,6};C、intnum[][4]={1,2,3,4,5,6};D、intnum[2][4]={{1,2},{3,4},{5,6}};标准答案:D知识点解析:在选项D的数组定义中,赋值号左边定义了一个2行4列的二维数组,而在右边定义了一个3行2列的二维数组。20、有下列程序:main(){intx[3][2]={0),i;for(i=0;i<3;i++)scanf("%d",x[i]);printf("%3d%3d%3dLn",x[0][0],x[0][1],x[1][0]);}若运行时输入:246,则输出结果为A、200B、240C、204D、246标准答案:C知识点解析:语句x[3][2]={0}表示将二维数组x的所有元素赋初值0,而循环语句for(i=0;i<3;i++)scanf("%d",x[i])表示对数组元素x[0][0]、x[1][0]、x[2][0]赋值。所以当运行程序时,输入246时,数组元素x[0][0]=2、x[1][0]=4、x[2][0]=6,因此,输出数组元素x[0][0]=2、x[0][1]=0、x[1][0]=4的值204。21、有以下程序#includeintfun(int(*s)[4],intn,intk){intm,i;m=s[0][k];for(i=1;im)m=s[i][k];returnm;)main(){inta[4][4]={{1,2,3,4),{11,12,13,14},{21,22,23,24},{31,32,33,34}};printf("%d\n",fun(a,4,0));}程序的运行结果是A、31B、34C、4D、32标准答案:A知识点解析:函数funl(int(*s)[4],int,intk)的功能是返回二维数组第k列的最大元素。在主函数中由于二维数组a[4][4]已经初始化,所以fun(a,4,0)的值是二维数组a[][]第1列中的最大元素31。22、有下列程序:main(){inta[4][4]={{1,4,3,2},{8,6,5,7},{3,7,2,5},{4,8,6,1)),i,j,k,t;for(i=0;i<4;i++)forfj=0;j<3;j++)for(k=j+1;k<4;k++)iffa[j][i]>a[k][i]){t=a[j][i];a[j][i]=a[k][i];a[k][i]=t;}/*按列排序*/for(i=0;i<4;i++)printf("%d,",a[i][i]);}程序运行后的输出结果是A、8,7,3,1,B、1,6,5,7,C、4,7,5,2,D、1,6,2,1,标准答案:B知识点解析:最外层的for语句的自变量i是列下标,而内部的两个for语句的自变量i和k是行下标。所以由程序段可知,这是利用三重循环对二维数组a[4][4]的元素按列从小到大进行排序,所以最后排完序的结果为a[4][4]={{1,4,2,1),{3,6,3,2},{4,7,5,5},{8,8,6,7}},最后一个for语句的功能是输出数组a[4][4]主对角线上的元素,因而输出为1,6,5,7。23、有下列程序:main(){inti,t[][3]={9,8,7,6,5,4,3,2,1};for(i=0;i<3;i++)printf("%d",t[2-i][i]);}程序执行后的输出结果是A、753B、369C、751D、357标准答案:D知识点解析:由于在程序中定义了二维数组t[][3]={9,8,7,6,5,4,3,2,1}:由二维数组的存储方式按行存储,即初始化完第一行的所有列再初始化下一行的元素。可知这是一个3行3列的二维数组,第一行的元素为{9,8,7),第二行的元素为{6,5,4),第三行的元素为{3,2,1}。然后用for循环输出t[2][0]、t[1][1]、t[0][2],它们的值分别为3、5、7。24、有下列程序:main(){inta[4][4]={{1,4,3,2},{8,6,5,7},{3,7,2,5},{4,8,6,1}),i,k,t;for(i=0;i<3;i++)for(k=i+1;k<4;k++)if(a[i][i]A、6,2,1,1.B、11,2,6,C、2,3,4,6,D、6,4,3,2,标准答案:D知识点解析:利用二重for循环对二维数组a[4][4]的主对角线上的元素{1,6,2,1}实现按列从大到小排序,所以数组a[4][4]的值变为{{6,4,3,2,},{8,2,5,7},{3,7,1,5},{4,8,6,1}},最后输出数组a[4][4]第一行上的元素,所以输出结果为6,4,3,2。25、若有定义:intw[3][5];则以下不能正确表示该数组元素的表达式是A、*(*w+3)B、*(*(w+1))C、*(w+1)[4]D、*(&w[0][0]+1)标准答案:C知识点解析:在C语言中,二维数组的名字表示的是二维数组的地址,对于二维数组imw[3][5],可以认为w为一个一维数组,含有3个元素,而每个元素为一个含有5个元素的一维数组。而(w+1)为一个含有两个元素的一维数组,首先和(w+1)[4]结合非法,4超出了二维数组的边界,取值也就是非法的了。26、以下错误的定义语句是A、intx[4][3]={{1,2,3},{1,2,3},{1,2,3},{1,2,3)};B、intx[][3]={{0},{1},{1,2,3}};C、intxn[3]={1,2,3,4};D、intx[4][]={{1,2,3},{1,2,3},{1,2,3},{1,2,3)};标准答案:D知识点解析:一维数组定义和初始化是允许省略行下标,不允许省略列下标。27、以下叙述中正确的是A、语句inta[4][3]={1,2,4,5};是错误的初始化形式B、语句inta[][3]={1,2,4,5);是错误的初始化形式C、在逻辑上,可以把二维数组看成是一个具有行和列的表格或矩阵D、语句inta[4][3]={{1,2),{4,5)};是错误的初始化形式标准答案:C知识点解析:在理解二维数组的时候,可以把一个二维数组看成是一个一维数组,每个数组元素又是包含有若干个元素的一维数组,也就是具有行列的结构,二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。28、设有定义:intx[2][3];则以下关于二维数组x的叙述错误的是A、数组x可以看作是由x[0]和x[1]两个元素组成的一维数组B、可以用x[0]=0;的形式为数组所有元素赋初值0C、元素x[0]可看作是由3个整型元素组成的一维数组D、x[0]和x[1]是数组名,分别代表一个地址常量标准答案:B知识点解析:二维数组的元素在内存中占一系列连续的存储单元。数组元素在内存中的排列顺序是先存放第0行的元素,再存放第1行的元素……称这种存放顺序为按行存放。可以把一个二维数组看成是一个一维数组,每个数组元素又是包含有若干个元素的一维数一组。另外在给二维数组赋初值时可以不用含花括号对。例如,inta[4][3]={1,2,4,5};在编译时,系统将按a数组元素在内存中排列的顺序,将花括号内的数据一一对应地赋给各个元素,若数据不足,系统将给后面的元素自动补初值0。以上将给a数组第一行的元素和第二行的第一个元素依次赋予1、2、4、5,其他元素的初值都为0。29、有以下程序#include#defineN3voidfun(inta[][N],intb[])main(){intij;{intx[N][N]={1,2,3,4,5,6,7,8,9},y[N],i;for(i=0;iA、1,3,5,B、2,4,8,C、3,5,7D、3,6,9,标准答案:D知识点解析:函数fun()的作用是求出二维数组a[][N]中每一行中的最大元素,所以在main()函数中执行完fun(x,y)后,数组y中的元素为二维数组x[N][N]每一行的最大元素。国家二级C语言机试(函数和数组)模拟试卷第2套一、选择题(本题共29题,每题1.0分,共29分。)1、有以下程序(strcpy为字符串复制函数,strcat为字符串连接函数)#include<stdio.h>#include<string.h>main(){chara[10]="abc",b[10]="012",c[10]="xyz";strcpy(a+1,b+2);puts(strcat(a,c+1));}程序运行后的输出结果是A、bc2yzB、a2yzC、a12xyzD、12yz标准答案:B知识点解析:程序执行“strcpy(a+1,b+2)”后,字符数组a的值为“a2”,再进行字符串的连接“strcat(a,c+1)”,此时字符数组a的值为“a2vz”。2、若各选项中所用变量己正确定义,函数fun中通过return语句返回一个函数值,以下选项中错误的程序是A、main(){……x=fun(2,10);……}floatfun(inta,intb){……}B、floatfun(inta,intb){……}main(){……x=fun(i,j);……}C、floatfun(int,int);main(){……x=fun(2,10);……}floatfun(inta,intb){……}D、main(){floatfun(inti,intj);……x=fun(i,j);……}floatfun(inta,intb){……}标准答案:A知识点解析:C语言规定,函数必须先定义,后调用(函数的返回值类型为int或char时除外)。在选项A)中,调用的子函数在调用后面定义,所以不正确。在选项B)、C)中,被调用函数在主函数之前定义,再在主函数中调用,所以是正确的;在选项D)中,在主函数中先对子函数floatfun(inti,inti)进行了声明,然后进行调用。3、以下叙述中正确的是A、用户自己定义的函数只能调用库函数B、不同函数的形式参数不能使用相同名称的标识符C、在C语言的函数内部,可以定义局部嵌套函数D、实用的C语言源程序总是由一个或多个函数组成标准答案:D知识点解析:一个c语言源程序可以由一个或多个源文件组成,每个源文件可由一个或多个函数组成,这些函数可以是自定义函数,也可以是库函数,各个函数之间没有主从关系,不能嵌套定义函数。4、若有定义语句:chars[10]="1234567\0\0";则strlen(s)的值是A、8B、7C、9D、10标准答案:B知识点解析:字符串长度函数strlen(s)表示计算出以s为起始地址的字符串的长度,并作为函数值返回。这个长度值不包括串尾的结束标志’\0’。5、有以下程序#include<string.h>main(){charp[20]={’a’,’b’,’c’,’d’),q[]="abc",r[]="abcde";strcat(p,r);strcpy(p+strlen(q),q);printf("%d\n",strlen(p));}程序运行后的输出结果是A、9B、11C、6D、7标准答案:C知识点解析:字符串连接函数strcat(p,r)的功能是把字符数组p[]和r[]连接起来,此时字符数组p[]的有效字符长度为9,再执行strcpy(p+strlen(q),q)字符串复制函数,把字符数组q[]复制到字符数组p[]从p[3]歼始到p[5]数组位置中,由于字符数组q[]中的内容为字符串“abc”复制时把字符串结束标志’\null’也复制到字符数组p[]中,这时字符函数strlen(p)返回字符数组p[]的有效字符长度为6。6、若有定义语句:char*s1="OK",*s2="ok";以下选项中,能够输出"OK"的语句是A、if(strcmp(s1,s2)!=0)puts(s1);B、if(strcmp(s1,s2)!=0)puts(s2);C、if(strcmp(s1,s2)==1)puts(s1);D、if(strcmp(s1,s2)==0)puts(s1);标准答案:A知识点解析:字符串比较函数strcmp的功能是对s1和s2所指字符串进行比较。如果s1<s2,返吲负数,如果s1==s2,返回0,如果s1>s2,返回正数,所以对于本题来说,能够输出“OK”的语句是选项A)所指的语句。7、有以下程序,程序中库函数islower(ch)用以判断ch中的字母是否为小写字母#include<stdio.h>#include<ctype.h>voidfun(char*p){inti=0;while(p[i]){if(p[i]==’’&&islower(p[i-1]))p[i-1]=p[i-1]-’a’+’A’;i++;}}main(){chars1[100]="abcdEFG!";fun(s1);printf("%s\n",s1);}程序运行后的输出结果是A、AbCdEFg!B、abcdEFG!C、abcdEFg!D、aBcDEFG!标准答案:D知识点解析:函数fun(char*p)的功能是如果p[i]指向的字符为空字符并且其前一个字符是小写字母,则把小写字母变成大字母,所以在主函数中,执行fun(s1)后,小写字母b,d都改成大字母。8、若有以下定义和语句chars1[10]="abcd!",*s2="\n123\\";printf("%d%d\n",strlen(s1),strlen(s2));则输出结果是A、105B、107C、55D、58标准答案:C知识点解析:本题要注意的是转义字符的问题,在字符串s2中,有两个转义字符,分别是网车换行符和反斜线。所以其字符串长度等于5。9、有以下程序#include<stdio.h>intfun(inta,intb)main(){if(b==0)returna;{printf("%d\n",fun(4,2));}elsereturn(fun(--a,-b));}程序的运行结果是A、1B、2C、3D、4标准答案:B知识点解析:由程序可知函数fun(inta.intb)是一个递归函数。所以当主函数中调用fun(4,2)时,其执行过程如下:fun(4,2)->fun(3,1)->fun(2,0),其返回值为2。10、下列选项中,能够满足“只要字符串s1等于字符串s2,则执行ST”要求的是A、iffs1==s2)ST;B、if(strcpy(s1,s2)==1)ST;C、if(strcmp(s2,s1)==0)ST;D、if(s1—s2=0)ST;标准答案:C知识点解析:在C语言中要对两个字符串的大小进行比较,就需要调用字符串比较函数strcmp(),如果这个函数的返同值等于0,说明两个字符串相等。11、若有以下说明和定义uniondt{inta;charb;doublec;}data;以下叙述中错误的是A、data的每个成员起始地址都相同B、变量data所占内存字节数与成员c所占字节数相等C、程序段:data.a=5;printf("%f\n",data.c);输出结果为5.000000D、data可以作为函数的实参标准答案:C知识点解析:本题主要考查联合的定义和使用。选项A)联合中每个成员起始地址都是一样的,正确;选项B)联合的长度等于长度最长成员的长度,在data中,成员c是double类型,长度为8个字节最长,因此data所占用字节数和成员c长度一致。选项C)整型和double类型的存储格式不一致,整数5在内存中的存储格式和浮点数5存储格式不一样,因此data.c输出不会是5.000000;选项D)联合和结构体都可以作为函数实参。12、以下关于函数的叙述中正确的是A、每个函数都可以被其他函数调用(包括main函数)B、每个函数都可以被单独编译C、每个函数都可以单独运行D、在一个函数内部可以定义另一个函数标准答案:B知识点解析:本题主要考查函数的定义和使用。选项A)错误,main函数可以调用其他函数,但是其他函数不能调用main函数;选项B)正确;选项C)错误,只有main函数可以单独运行,其他函数只能被调用;选项D)错误,C语言中不能在函数内部定义函数。13、在C语言中,函数返回值的类型最终取决于A、函数定义时在函数首部所说明的函数类型B、return语句中表达式值的类型C、调用函数时主调函数所传递的实参类型D、函数定义时形参的类型标准答案:A知识点解析:C语言中函数的返回值类型是由定义函数时在函数首部所声明的类型确定的。14、当用户要求输入的字符串中含有空格时,应使用的输入函数是A、scanf()B、getchar()C、gets()D、getc()标准答案:C知识点解析:本题考查基本输入输出函数。选项A)中的scanf函数接收输入字符串时会把空格当成结束符;选项B)中的getchar是读取输出的一个字符,不能用作字符串输入;选项C)中的gets满足要求;选项D)没有getc函数。15、avg函数的功能是求整型数组中的前若干个元素的平均值,设数组元素个数最多不超过10,则下列函数说明语句错误的是A、intavg(int*a,intn);B、intavg(inta[10],intn);C、intavg(inta[],intn);D、intavg(inta,intn);标准答案:D知识点解析:本题考查函数的定义。题目要求计算数组的平均值,因此函数必须获取数组的地址(指针),即函数必须要有一个指针类型的参数,选项D)中函数参数都是整型,错误。16、以下叙述中正确的是A、函数名代表该函数的入口地址B、所有函数均不能接受函数名作为实参传入C、函数体中的语句不能出现对自己的调用D、如果函数带有参数,就不能调用自己标准答案:A知识点解析:函数形、实参传递的时候,要求对应位置类型一致即可,如果实参为函数名,可以定义相应的形参为指向函数的指针变量来获得该函数的入口地址,因此选项B)错误的,在C语言中允许进行递归调用,即自己调用自己,选项C)和选项D)是错误的。17、以下叙述中正确的是A、函数既可以直接调用自己,也可以间接调用自己B、任何情况下都不能用函数名作为实参C、函数的递归调用不需要额外开销,所以效率很高D、简单递归不需要明确的结束递归的条件标准答案:A知识点解析:一个C语言源程序可以由一个或多个源文件组成,每个源文件可由一个或多个函数组成,各函数之间是平行的,除了主函数外,函数之间可以相互调用,甚至C语言中的函数可以直接或间接地自己调用自己,称之为递归调用,该调用主要用于把要解决的问题转化为一个新的问题,而这个新问题的解决方法仍与原来的解法相同,只是所处理的对象有规律地递增或递减,可以应用这个转化过程使问题得到解决,同时为了有效使用递归调用必定要有一个明确的结束递归的条件。而每次进行递归调用时候,需要利用栈保存现场信息,因此并不会提高效率,选项C)和选项D)不正确。函数名表名了函数的入口地址,如果函数的形参为指向函数的指针变量,那么对应的实参必须为函数名,因此函数名可以为函数的参数,选项B)错误。18、以下关于return语句的叙述中正确的是A、一个自定义函数中必须有一条return语句B、一个自定义函数中可以根据不同情况设置多条return语句C、定义成void类型的函数中可以有带返回值的return语句D、没有return语句的自定义函数在执行结束时不能返回到调用处标准答案:B知识点解析:return语句主要用于返回函数的值。在一个自定义函数中,可以根据不同的情况设置多条return语句返回函数的值。19、已定义以下函数intfun(int*p){return*p;}fun函数返回值是A、不确定的值B、一个整数C、形参p中存放的值D、形参p的地址值标准答案:B知识点解析:由函数intfun(int*p){return*p;}的定义可知,返回值为整型指针变量p所指向的数据。20、以下叙述中错误的是A、用户定义的函数中可以没有return语句B、用户定义的函数中若没有return语句,则应当定义函数为void类型C、用户定义的函数中可以有多个return语句,以便可以调用一次返回多个函数值D、函数的return语句中可以没有表达式标准答案:C知识点解析:函数值通过return语句返回,return语句的形式如下:return表达式或return(表达式);当程序执行到return语句时,程序的流程就返回到调用该函数的地方,并带回函数值。在同一函数内,可以根据需要,存多处出现return语句,在函数体的不同部位退出函数。无论函数体中有多少个return语句,return语句只可能执行一次,返同一个函数值。rerurn语句中也可以不含有表达式,这时必须定义函数为void类型,它的作用只是使流程返回到调用函数,并没有确定的函数值。函数体内可以没有return语句,这时也必须定义函数为void类型,程序的流程就一直执行到函数末尾的“}”,然后返回调用函数,也没有确定的函数值带回。21、以下叙述中错误的是A、函数调用可以作为一个独立的语句存在B、函数形参的值也可以传回给对应的实参C、若函数有返回值,必须通过return语句返回D、C程序必须由一个或一个以上的函数组成标准答案:B知识点解析:一个C程序中可以包含任意多个不同名的函数,但只能有一个主函数。一个C程序总是从主函数歼始执行。函数的值通过return语句返回,return语句中的表达式的值就是所求的函数值。在C语言中,数据只能从实参单向传递给形参,称为“按值”传递。也即是说,当简单变量作为实参时,用户不可能在函数中改变对应实参的值。22、在函数调用过程中,如果函数如funA调用函数funB,函数funB又调用了函数如funA,则A、称为函数的直接递归调用B、称为函数的间接递归调用C、称为函数的循环调用D、C语言中不允许这样的递归调用标准答案:B知识点解析:本题考查递归的概念,C语言中函数可以直接或间接调用自身,称为递归调用。本题中funA调用funB,然后funB又调用funA,即funA间接调用了自身。23、程序中对fun函数有如下说明voidfun();此说明的含义是A、fun函数无返回值B、fun函数的返回值可以是任意的数据类型C、fun函数的返回值是无值型的指针类型D、指针fun指向一个函数,该函数无返回值标准答案:A知识点解析:本题主要考察函数的声明,voidfun()表示fun函数没有输入参数,函数返回void表示函数无返回值。24、程序中若有如下说明和定义语句charfun(char*);main(){char*s="one",a[5]={0},(*f1)()=fun,ch;……}以下选项中对函数fun的正确调用语句是A、(*f1)(a);B、*f1(*s);C、fun(a);D、ch=*fl(s);标准答案:A知识点解析:本题主要考查函数调用和函数指针的使用。根据定义f1是一个函数指针,且指向fun函数,因此可以使用函数指针来调用函数。使用函数指针调用函数的时候使用*运算符,即*fl和fun是一样的,fun函数有参数,通过fl调用fun函数写法为:(*fl)(a),括号是必须的,这样才能保证各部分正确结合。25、以下程序的主函数中调用了其前面定义的fun函数#include<stdio.h>main(){doublea[15],k;k=fun(a);……}则以下选项中错误的fun函数首部是A、doublefun(doublea[15])B、doublefun(double*a)C、doublefun(doublea[])D、doublefun(doublea)标准答案:D知识点解析:本题考查函数的定义和调用。根据对fun函数的调用可知,fun函数的返回值为double类型的,输入参数是一个double类型的地址(指针),因此选项D)错误。26、有以下程序intadd(inta,intb)main(){return(a+b);}{intk,(*f)(),a=5,b=10;f=add;……}则以下函数调用语句错误的是A、k=add(a,b);B、k=(*f)(a,b);C、k=*f(a,b);D、k=f(a,b);标准答案:C知识点解析:在语句“k(=*f(a,b)”中,由于“()”的优先级高于“*”,所以“*f(a,b);”表示其返回类型为指针的带有两个整型参数的函数,而不是整型数值,因此选项C)为错误的调用形式。27、以下叙述中正确的是A、函数调用时,不必区分函数名称的大小写B、调用函数时,函数名必须与被调用的函数名完全一致C、函数名允许用数字开头D、在函数体中只能出现一次return语句标准答案:B知识点解析:在标准C中,函数的定义形式为:函数返回值的类型名函数名(类型名形式参数1,类型名形式参数2,…){说明部分语句部分}需要说明的是函数名和形式参数都是由用户命名的标识符,在同一程序中,函数名必须惟一,形式参数名只要在同一函数中惟一即可,与其他函数中的变量可以同名。return语句的作用是返回函数的值,在函数中可以出现多个或者没有。28、若有以下函数首部intfun(doublex[10],int,*n)则下面针对此函数的函数声明语句中正确的是A、intfun(double,int);B、intfun(double*x,intn);C、intfun(double*,int*);D、intfun(doublex,int*n);标准答案:C知识点解析:函数说明的一般形式为:类型名函数名(参数类型1,参数类型2,……)。因为函数intfun(doublex[10],int*n)的第1个形式参数是一个双精度型的一维数组,第2个参数是一个整型指针,并返回一个整型值。一维数组的名字表示的是一维数组的地址。29、以下选项中叙述错误的是A、在C程序的同一函数中,各复合语句内可以定义变量,其作用域仅限本复合语句内B、C程序函数中定义的赋有初值的静态变量,每调用一次函数,赋一次初值C、C程序函数中定义的自动变量,系统不自动赋确定的初值D、C程序函数的形参不可以说明为static型变量标准答案:B知识点解析:在函数定义的静态变量,只需要赋值1次,即可保存初始值,不需要每次调用时都赋初始值。国家二级C语言机试(函数和数组)模拟试卷第3套一、选择题(本题共30题,每题1.0分,共30分。)1、有以下程序intf(intx);main(){intn=1,m;m=f(f(f(n)));printf("%d\n",m);}intflintx){returnx*2;}程序运行后的输出结果是A、1B、2C、4D、8标准答案:D知识点解析:程序考查了函数的调用。对于m=f(f(f(n)));首先“算最内层的函数调用f(n),执行t函数,得到返回值2,然后计算f(2),得到返回值为4,最后计算f(4),得到计算结果为8。2、有以下程序#include<stdio.h>intfun(intx,inty)main(){if(x==y)return(x);{inta=4,b=5,c=6;elsereturn((x+y)/2);printf("%d\n",fun(2*a,fun(b,c)));}}程序运行后的输出结果是A、3B、6C、8D、12标准答案:B知识点解析:fun(b,c)即fun(5,6),5!=6,所以返回(5+6)/2=5;fun(2*a,5)即fun(8,5),8!=5,所以返回(8+5)/2=6。3、有以下程序#include<stdio.h>main()intf(intx,inty){inta=3,b=4,c=5,d;{return((y-x)*x);}d=f(f(a,b),f(a,c));printf("%d\n",d);}程序运行后的输出结果是A、10B、8C、9D、7标准答案:C知识点解析:本题考查函数的嵌套调用。首先计算f(a,b)与f(a,c),f(a,b)=(b—a)*a=3,f(a,c)=(c—a)*a=6,然后计算f(3,6)=(6—3)*3=9。4、有以下程序#include<stdio.h>doublef(doublex);main()doubleffdoubleX){doublea=0;inti;{returnx*x+1;}for(i=0;i<30;i+=10)a+=f((double)i);printf("%5.0f\n",a);}程序运行后的输出结果是A、401B、500C、503D、1404标准答案:C知识点解析:由于函数f的作用是对形参x求平方再加1,所以在主函数中,循环第一次执行后变量a的值等于1,第二次执行后,变量a的值等于102,第j次执行后,变量a的值等于503。5、若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是A、形参只是形式上的存在,不占用具体存储单元B、函数的形参和实参分别占用不同的存储单元C、同名的实参和形参占同一存储单元D、函数的实参和其对应的形参共占同一存储单元标准答案:B知识点解析:在C语言中,函数的实参单元与形参单元在内存中分配不同的存储单元。在调用函数时,给形参分配临时存储单元,并将实参对应的值传递给形参,在被调用函数中对形参存储单元中的值进行运算,最后通过return语句把函数值返回调用函数。当调用结束后,形参单元被释放,实参单元仍保留并维持原值。6、有以下程序voidfun(inta,intb,intc){a=b;b=c;c=a;}main(){inta=10,b=20,c=30;fun(a,b,C);printf("%d,%d,%d\n",c,b,a);}程序运行后的输出结果是A、10,20,30B、20,30,10C、30,20,10D、0,0,0标准答案:C知识点解析:函数fun中采用了变量作为参数,那么参数传递以后,形参a,b,c的变化对于实参a,b,c是没有影响的,因此主函数中a,b,c的值经过fun调用以后,值没有变化。7、有以下程序#include<stdio.h>intf(intx);main()intf(intx){inta,b=0;{returnx*x+1;}for(a=0;a<3;a++){b=b+f(a);putchar(’A’+b);}}A、BCDB、BDIC、ABED、BCF标准答案:B知识点解析:在函数main()中,第一次执行for循环时,b的值等于1,此时输出字母B;第二次执行for循环时,b的值等于3,此时输出字母D;第三次执行for循环时,b的值等于8,此时输出字母I。8、若有以下程序voidf(intx)main(){intZ=123456;{if(x>=10)f(z);}{printf("%d-",x%10);f(x/10);}elseprintf("%d",x);}则程序的输出结果是A、6-5-4-3-2-1B、6-5-4-3-2-1-C、1-2-3-4-5-6D、1-2-3-4-5-6-标准答案:A知识点解析:函数f的主要功能为逆置输出整数x的每一位数据,如果z的值为123456,逆置输出的结果为6-5-4-3-2-1。9、以下与函数fseek(fp,OL,SEEK_SET)有相同作用的是A、feof(fp)B、ftell(fp)C、fgetc(fp)D、rewind(fp)标准答案:D知识点解析:本题主要考查文件系IO函数的使用,fseek函数用于设置文件指针的位置,feof函数用于判断是否已经到了文件结束,ftell函数返回文件指针的当前位置,fgetc从文件读取一个字符,rewind函数将文件指针重新指向文件开始。题目当中fseek(fp,OL,SEEK_SET)表示把文件指针移动到文件的开始位置0,和rewilld函数功能一致。10、以下程序的功能是:给r输入数据后计算半径为r的圆面积s。程序在编译时出错main()/*Beginning*/{intr;floats;scanf("%d",r);s=*π*r*r;printf("s=%f\n",s);}出错的原因是A、注释语句书写位置错误B、存放圆半径的变量r不应该定义为整型C、输出语句中格式描述非法D、计算圆面积的赋值语句使用了非法变量标准答案:D知识点解析:本题考查了C语言的基本输入输出函数。选项A)错误,代码里面的注释是正确的,“/*”和“*/”配对;选项B)错误,r变量定义为整型是可以的;选项C)输出语句格式正确;选项D)正确,计算s的时候s=*π*r*r使用了未定义变量北。11、以下程序函数f的功能是:当flag为1时,进行由小到大排序;当flag为0时,进行由大到小排序voidf(intb[],intn,intflag)main(){inti,j,t;{inta[10]={5,4,3,2,l,6,7,8,9,10),i;for(i=0;i<n一1;i++)f(&a[2],5,0);f(a,5,1);for(j=i+1;j<n;j++)for(i=0;i<10;i++)printf("%d,",a[i]);if(flag?b[i]>b[j]:b[i]<b[j])}{t=b[i];b[i]=b[j];b[j]=t;}}程序运行后的输出结果是A、1,2,3,4,5,6,7,8,9,10,B、3,4,5,6,7,2,1,8,9,10,C、5,4,3,2,1,6,7,8,9,10,D、10,9,8,7,6,5,4,3,2,1,标准答案:B知识点解析:本题主要考查函数的调用。在main函数中,两次调用f函数进行排序,f函数有三个参数,第一个参数是数组地址,第二个参数是需要排序的数据个数,第三个参数指定排序依据。第一次调用f函数的时候,从第三个元素开始对5个元素进行从大到小的排序,因此调用f函数转换数组a的值分别为:5,4,7,6,3,2,1,8,9,10;第二次调用f函数对数组a的前5个元素进行从小到大的排序,因此排序完成后数组a的值变成:3,4,5,6,7,2,1,8,9,10。12、有以下程序,其中k的初值为八进制数#include<stdio.h>>main(){intk=011;printf("%d\n",k++);}程序运行后的输出结果是A、12B、11C、10D、9标准答案:D知识点解析:本题主要考查基本数据类型和格式化输出函数printf。变量k的初值为011,表示8进制的11,十进制值为9,printf输出k++的值,++在k的后面表示先使用后自增,因此输出的值为9。13、有以下程序#include<stdio.h>intfun(intx){intp;if(x==0‖x==1)return(3);p==x-fun(x-2);return(p);}=main(){printf("%d\n",fun(9));}程序运行后的输出结果是A、5B、9C、4D、7标准答案:D知识点解析:函数fun的主要功能是:初值x的值为9,因此fun(9)=9-fun(7)=9-(7-(5-(3-3))),因此答案为7。14、有以下程序#include<stdio.h>intfun(intn){inta;main()if(n==1)return1;{a=n+fun(n-1);printf("%d\n",fun(5));return(a);}}程序的输出结果是A、14B、10C、15D、9标准答案:C知识点解析:函数fun为递归定义的函数,当调用fun(5)→5+fun(4)→5+4+fun(3)→5+4+3+fun(2)→5+4+3+2+fun(1),因此最后的结果为15。15、有以下程序#include<stdio.h>intfun(inta,intb){returna+b;}main(){intx=6,y=7,z=8,r;r=fun(fun(x,y),z--);printf("%d\n",r);}程序运行后的输出结果是A、15B、21C、20D、31标准答案:B知识点解析:本题考查函数的调用,函数fun功能为求两个数据的和。主函数中表达式r=fun(fun(x,y),z--),首先计算内层调用fun(x,y),计算结果为13,然后外层调用fun(13,8),结果为21。16、以下选项中函数形参不是指针的是A、fun(int&p){…}B、fun(inta[10]){…}C、fun(int*a){…}D、fun(intP[]){…}标准答案:A知识点解析:C语言中形参数组是指针变量,其数组中元素的个数由传递的实参数组决定,因此可以在定义的时候,不给出元素个数的说明,因此选项B)和D)形参均为指针变量,选项A)的定义在C语言中不存在的。17、设有如下函数定义intfun(intk){if(k<1)return0;elseif(k==1)return1;elsereturnfun(k-1)+1;}若执行调用语句:n=fun(3);,则函数fun总共被调用的次数是A、2B、4C、3D、5标准答案:C知识点解析:这道题目考查了函数的递归调用,当执行调用语句n=fun(3)时,返回n=fun(2)+1,再执行fun(2),返回n=fun(1)+1+1,而fun(1)等于1,所以最后n的值等于3。而函数fun总共被调用了3次。即fun(3),fun(2),fun(1)。18、有以下程序#include<stdio.h>intf(intx)main(){inty;{intz;if(x==0‖x==1)return(3);z=f(3);printf("%d\n",z);y=x*x-f(x-2);}returny;}程序的运行结果是A、9B、0C、6D、8标准答案:C知识点解析:主函数调用f()函数,将实参3传递给x,进行if条件语句的判断不成立,接着执行y=3*3-f(1),再执行f(1),而f(1)满足if条件语句,所以f(1)的值为3,代入y=3*3-f(1)=9-3=6。19、有以下程序(strcat函数用以连接两个字符串)#include<stdio.h>#include<string.h>main(){chara[20]="ABCD\OEFG\0",b[]="IJK";strcat(a,b);printf("%s\n",a);}程序运行后的输出结果是A、ABCDE\OFG\OIJKB、ABCDIJKC、IJKD、EFGIJK标准答案:B知识点解析:在字符串中字符’\0’表示字符串的结束标志,所以字符串a和b相连接的结果为ABCDIJK。20、有以下程序intfun(intn)main(){if(n==1)return1;{intx;Elsescanf("%d",&x);x=fun(x);return(n+fun(n—1));printf("%d\n",x);}}执行程序时,给变量x输入10,程序的输出结果是A、54B、65C、45D、55标准答案:D知识点解析:在C语言中函数可以递归调用,即直接或间接地自己调用自己。本题在函数intfun(intn)的定义中又出现了对函数fun的调用,所以函数fun是递归函数。因而在主函数中调用x=fun(x)时,当输入10赋给变量x时,递归调用的过程为:fun(10)=10+fun(9)=10+9+fun(8)=10+9++8+fun(7)=10+9++8+7+fun(6)=10+9++8+7+6+fun(6)=10+9++8+7+6+5+fun(4)=10+9++8+7+6+5+4+fun(3)=10+9++8+7+6+5+4+3+fun(2)=10+9++8+7+6+5+4+3+2+fun(1)=10+9++8+7+6+5+4+3+2+1=5521、有以下程序fun(intx)main(){intp;{if(x==0‖x==1)return(3);printf("%d\n",fun(7));p=x—fun(x-2);}returnp;}执行后的输出结果是A、3B、7C、0D、2标准答案:D知识点解析:因为在函数fun(intx)中,如果参数x等于0或等于1时,返回值为“3”。否则“p=x-fun(x-2)”这是一个递归函数,所以在主函数调用fun(7)的时候,其过程为:“fun(7)=7一fun(5)=7一(5一fun(3))=7一(5一(3一fun(1)))=7一(5一(3一3))=7—5=2”,所以最后的输出结果为2。22、若有以下程序intf(inta[],intn)main(){if(n>1){inta[]={8,2,9,1,3,6,4,7,5};{intt;t=f(a,n-1);printf("%d\n",f(a,9));returnt>a[n-1]?t:a[n—1];}}elsereturna[0];}则程序的输出结果是A、9B、1C、8D、5标准答案:A知识点解析:主函数中调用f(a,9),递归函数的调用过程如下:f(a,9)→f(a,8)→f(a,7)→f(a,6)→f(a,5)→f(a,4)→f(a,3)→f(a,2)→f(a,1),f(a,1)得到返回值为a[0],值为8,递归过程开始回归,回归过程描述如下:8>a[1],返回8→8>a[2]不成立,返回a[2]的值为9……因此函数f的主要功能为计算数组中的最大值。主函数中输出最大值为9。23、在一个C源程序中所定义的全局变量,其作用域为A、所在文件的全部范围B、所在程序的全部范围C、所在函数的全部范围D、由具体定义位置和extern说明来决定范围标准答案:D知识点解析:本题考查C语言的作用域规则。在C语言中,全局变量的有效范围从定义变量的位置开始到本源文件结束。如果需要在其他源文件中使用该全局变量,则可以在其他源文件中使用extern关键宁来声明该全局变量,这样该全局变量的作用域就被扩展到以extern声明了该全局变量的位置开始到此源文件结束。24、以下叙述中正确的是A、只有全局变量才有自己的作用域,函数中的局部变量没有作用域B、只要是用户定义的标识符,都有一个有效的作用域C、只有在函数内部定义的变量才是局部变量D、局部变量不能被说明为static标准答案:B知识点解析:在函数内定义的变量是局部变量,而存函数之外定义的变量称为外部变量,也是全局变量。全局变量可以为源文件中其他函数所共用,其作用域为从定义变量的位置开始到源文件结束。因此只要用户定义的标识符,全部都有作用域。局部变量可以说明为auto、register以及static。25、以下叙述中正确的是A、对于变量而言,“定义”和“说明”这两个词实际上是同一个意思B、在复合语句中不能定义变量C、全局变量的存储类别可以是静态类D、函数的形式参数不属于局部变量标准答案:C知识点解析:用static说明符说明全局变量时,此变量可称作静态全局变量。静态全局变量只限于本编译单位使用,不能被其他编译单位所引用。存一个函数内部定义的变量(包括形参)是局部变量,它只存本函数范围内有效。不同函数中可以使用相同名字的局部变量,它们代表不同的对象,Ⅱ不影响。在函数内部复合语句中也可以定义变量,这些变量都是局部变量,只在本复合语句中有效。26、有以下程序intd=1;voidfun(intP)main(){inta=3;{intd=5;fun(a);d+=p++;d+=a++;printf("%d",d);}printf("%d\n",d);}程序的输出结果是A、96B、94C、84D、85标准答案:C知识点解析:代码考查点为全局变量和局部变量的同名问题,若全局变量和某个函数中的局部变量同名,则在该函数中,此全局变量被屏蔽,在该函数内,访问的是局部变量,与同名的全局变量不发生任何关系。主函数执行fun(3)时候,执行调用函数fun,使用局部变量d=5,执行d+=p++,相当于d=d+(p++),得到d的值为8,输出。函数调用结束,转到主函数,继续执行d+=a++,此时d为全局变量,执行语句以后,d值为4。27、有以下程序#include<stdio.h>inta=1,b=2;voidfun1(inta,intb)main(){printf("%d%d",a,b);}{fun1(5,6);fun2();voidfun2()printf("%d%d\n",a,b);{a=3;b:4;}}程序运行后的输出结果是A、3456B、1256C、5612D、5634标准答案:D知识点解析:函数fun1()的作用是输出局部变量a和b的值,在主函数中执行fun1(5,6)的结果是输出5,6;函数。fun2()的作用是给变量a和b分别赋值3,4;执行fun2()的作用是输出3,4。28、在一个C源程序文件中所定义的全局变量,其作用域为A、由具体定义位置和extern说明来决定范围B、所在程序的全部范围C、所在函数的全部范围D、所在文件的全部范围标准答案:A知识点解析:全局变量是在函数外部任意位置上定义的变量,它的作用域是从变量定义的位置开始,到整个源文件结束止。在同一编译单位内用extern说明符扩展全局变量的作用域(当全局变量定义在后,引用它的函数在前时,应该在引用它的函数中用extern对此全局变量进行说明,以便通知编译程序:该变量是一个已在外部定义了的全局变量,已经分配了存储单元,不需要再为它分配存储单元。这时全局变量的作用域从extern说明处起,延伸到该函数末尾)。当一个程序由多个编译单位构成,并且在每个文件中均需要引用同一个全局变量,这时只在其中一个文件中定义所有的全局变量,而在其他用到这些全局变量的文件中用extern对这些变量进行说明。29、有以下程序voidfun2(chara,charb)main(){printf(“%c%c”,a,b);}{fun1();chara=’A’,b=’B’;printf("%c%c",a,b);voidfun1()fun2(’E’,’F’);}{a=’C’;b=’D’;}程序的运行结果是A、ABEFB、CDEFC、ABCDD、CDAB标准答案:B知识点解析:在fun1()函数之前定义了全局字符变量a和b。这两个变量的作用域是从其定义处到整个程序结束。在fun1()函数之内定义了两个变量a和b,并且分别初始化为字符’C’和’D’。在C语言中,若全局变量和某个函数中的局部变量同名,则在该函数中此全局变量被屏蔽,在该函数内访问的是局部变量,与同名的全局变量不发生任何关系。所以在主函数中,执行fun1()后,变量a、b的值分别等于’C’、’D’,打印输出CD,接着执行fun2(’E’,’F’)语句,变量a、b的值变为’E’、’F’并输出。30、有以下程序#include<stdio.h>main(){intk=4,m=1,p;fun(inta,intb){intstaticm=0,i=2;p=fun(k,m);i=i+m+1;printf("%d,",p);m=i+a+b;p=fun(k,m);returnm;}printf("%d\n",p);}程序运行后的输出结果是A、8,17B、7,16C、8,8D、7,17标准答案:A知识点解析:本题考查了静态变量以及局部变量的同名问题。主函数中调用fun函数两次,第一次调用fun(4,1),形参a和b接收以后,i值为3,m的值为8,调用结束返回8存放到p中并且输出p的值为8,除了静态变量m和i,变量a,b撤销。第二次调用fun(4,1),接收实参值以后,i为3+8+1,而m为12+4+1,即输出函数值17。国家二级C语言机试(函数和数组)模拟试卷第4套一、选择题(本题共29题,每题1.0分,共29分。)1、以下选项中叙述错误的是A、在C程序的同一函数中,各复合语句内可以定义变量,其作用域仅限本复合语句内B、C程序函数中定义的赋有初值的静态变量,每调用一次函数,赋一次初值C、C程序函数中定义的自动变量,系统不自动赋确定的初值D、C程序函数的形参不可以说明为static型变量标准答案:B知识点解析:在函数定义的静态变量,只需要赋值1次,即可保存初始值,不需要每次调用时都赋初始值。2、有以下程序intflintx);main(){intn=1,m;m=f(f(f(n)));printf("%\n",m);}intf(intx){returnx*2;}程序运行后的输出结果是A、1B、2C、4D、8标准答案:D知识点解析:程序考查了函数的调用。对于m=f(f(f(n))));首先计算最内层的函数调用f(n),执行f函数,得到返回值2,然后计算f(2),得到返回值为4,最后计算f(4),得到计算结果为8。3、有以下程序#includeintfun(intx,inty)main(){if(x==y)return(x);{inta=4,b=5,c=6;elsereturn((x+y)/2);printf("%d\n",fun(2*a,fun(b,c)));}}程序运行后的输出结果是A、3B、6C、8D、12标准答案:B知识点解析:fun(b,c)即fun(5,6),5!=6,所以返回(5+6)/2=5;fun(2*a,5)即fun(8,5),8!=5,所以返回(8+5)/2=6。4、有以下程序#includemain()intflintx,inty){inta=3,b=4,c=5,d;{return((y-x)*x);)d=f(f(a,b),f(a,c));printf("%d\n",d);}程序运行后的输出结果是A、10B、8C、9D、7标准答案:C知识点解析:本题考查函数的嵌套调用。首先计算f(a,b)与f(a,c),f(a,b)=(b-a)*a=3,f(a,c)=(c-a)*a=6,然后计算f(3,6)=(6-3)*3=9。5、有以下程序#includedoublef(doublex);main()doublef(doublex){doublea=0;inti;{returnx*x+1;}for(i=0;i<30;i+=10)a+=f((double)i);printf("%5.0f\n",a);}程序运行后的输出结果是A、401B、500C、503D、1404标准答案:C知识点解析:由于函数f的作用是对形参x求平方再加1,所以在主函数中,循环第一次执行后变量a的值等于1,第二次执行后,变量a的值等于102,第三次执行后,变量a的值等于503。6、若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是A、形参只是形式上的存在,不占用具体存储单元B、函数的形参和实参分别占用不同的存储单元C、同名的实参和形参占同一存储单元D、函数的实参和其对应的形参共占同一存储单元标准答案:B知识点解析:在C语言中,函数的实参单元与形参单元在内存中分配不同的存储单元。在调用函数时,给形参分配临时存储单元,并将实参对应的值传递给形参,在被调用函数中对形参存储单元中的值进行运算,最后通过return语句把函数值返回调用函数。当调用结束后,形参单元被释放,实参单元仍保留并维持原值。7、有以下程序voidfun(inta,intb,intc){a=b;b=c;c=a;}main(){inta=10,b=20,c=30;fun(a,b,c);printf("%d,%d,%d\",c,b,a);}程序运行后的输出结果是A、10,20,30B、20,30,10C、30,20,10D、0,0,0标准答案:C知识点解析:函数fun中采用了变量作为参数,那么参数传
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 分离操作(教案)
- 稀土沸石抗菌吸附卫生尿裤(征求意见稿)
- 中小学冬至传统节日主题班会教案
- 上海市县(2024年-2025年小学五年级语文)统编版期末考试((上下)学期)试卷及答案
- 九年级化学上册全册教案
- 卫生行业信息管理系统调查表
- 河北省石家庄市2025届高三教学质量摸底检测生物试题(含答案)
- 职业学院海洋工程技术专业人才培养方案
- 医用眼罩市场发展预测和趋势分析
- 光学字符识别装置市场需求与消费特点分析
- DB11/T 147-2015-检查井盖结构、安全技术规范
- 室内移动脚手架施工方案及流程
- 内蒙古呼和浩特市回民区2023-2024学年九年级上学期期中考试历史试题(含答案)
- 校园文化知识讲座
- 开展法律宣传知识讲座
- 连锁经营与管理职业生涯规划书
- 傅青主女科之带下病
- 2024年八年级语文上册期末专项复习:病句的辨识与修改
- 法院服务外包电子卷宗随案生成扫描服务方案
- 浙教版劳动二年级上册全册教案
- 铁血将军、建军元勋-叶挺 (1)讲解
评论
0/150
提交评论