全国二级C语言复习资料3.docx
《全国二级C语言复习资料3.docx》由会员分享,可在线阅读,更多相关《全国二级C语言复习资料3.docx(13页珍藏版)》请在冰豆网上搜索。
![全国二级C语言复习资料3.docx](https://file1.bdocx.com/fileroot1/2023-1/10/2b2ccc39-78e1-44f0-b213-385ff3758677/2b2ccc39-78e1-44f0-b213-385ff37586771.gif)
全国二级C语言复习资料3
一、选择题
在下列各题的A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确的选项涂写在答题卡相应位置上,答在试卷上不得分。
(11)以下不正确的叙述是
A)在C程序中,逗号运算符的优先级最低
B)在C程序中,APH和aph是两个不同的变量
C)若a和b类型相同,在计算了赋值表达式a=b后b中的值将放入a中,而b中的值不变
D)当从键盘输入数据时,对于整型变量只能输入整型数值,对于实型变量只能输入实型数值
(11)D 【解析】在C语言所有的运算符中,逗号运算符的优先级最低。
C语言中区分大小写,所以APH和aph是两个不同的变量。
赋值表达式a=b表示将b的值付给a,而b本身的值保持不变;通过键盘可以向计算机输入允许的任何类型的数据。
选项D)中当从键盘输入数据时,对于整型变量可以输入整型数值和字符,对于实型变量可以输入实型数值和整型数值等。
(12)请选出可用作C语言用户标识符的是
A)void,define,WORD B)a3_b3,_123,IF
C)FOR,--abc,Case D)2a,Do,Sizeof
(12)B 【解析】C语言规定用户标识符由字母、数字和下划线组成,且第一个字符必须是字母或下划线,可见选项C),D)是错误的;此外,C语言不允许用户将关键字作为标识符,而选项A)中的void正是C语言的关键字。
(13)以下选项中,不能作为合法常量的是
A)1.234e04 B)1.234e0.4 C)1.234e+4 D)1.234e0
(13)B 【解析】C语言的语法规定,字母e(E)之前必须有数字,且e(E)后面的指数必须是整数,而选项B)中,e(E)后面的指数是小数,所以不合法。
(14)在C语言中,运算对象必须是整型数的运算符是
A)% B)\ C)%和\ D)**
(14)A 【解析】在C语言中,"%"运算符两侧的运算数必须是整型。
(15)若变量均已正确定义并赋值,以下合法的C语言赋值语句是
A)x=y==5; B)x=n%2.5;
C)x+n=i; D)x=5=4+1;
(15)A 【解析】赋值运算符左侧的操作数必须是一个变量,而不能是表达式或者常量,选项C)和D)错误。
"%"运算符两侧都应当是整型数据,选项B)错误。
(16)有以下程序段
char ch; int k;
ch=′a′; k=12;
printf("%c,%d,",ch,ch,k); printf("k=%d\n",k);
已知字符a的ASCII码值为97,则执行上述程序段后输出结果是
A)因变量类型与格式描述符的类型不匹配输出无定值
B)输出项与格式描述符个数不符,输出为零值或不定值
C)a,97,12k=12 D)a,97,k=12
(16)D 【解析】输出格式控制符%c表示将变量以字符的形式输出;输出格式控制符%d表示将变量以带符号的十进制整型数输出,所以第一个输出语句输出的结果为a,97;第二个输出语句输出的结果为k=12。
(17)已知字母A的ASCII代码值为65,若变量kk为char型,以下不能正确判断出kk中的值为大写字母的表达式是
A)kk>=′A′&&′Z′ B)!
(kk>=′A′||kk<=′Z′)
C)(kk+32)>=′a′&&(kk+32)<=′Z′ D)isalpha(kk)&&(kk<91)
(17)B 【解析】C语言的字符以其ASCII码的形式存在,所以要确定某个字符是大写字母,只要确定它的ASCII码在'A'和'Z'之间就可以了,选项A)和C)符合要求。
函数isalpha用来确定一个字符是否为字母,大写字母的ASCII码值的范围为65到90,所以如果一个字母的ASCII码小于91,那么就能确定它是大写字母。
(18)当变量c的值不为2、4、6时,值也为"真"的表达式是
A)(c==2)||(c==4)||(c==6) B)(c>=2&&c<=6)||(c!
=3)||(c!
=5)
C)(c>=2&&c<=6)&&!
(c%2) D)(c>=2&&c<=6)&&(c%2!
=1)
(18)B 【解析】满足表达式(c>=2&&c<=6)的整型变量c的值是2,3,4,5,6。
当变量c的值不为2,4,6时,其值只能为3或5,所以表达式c!
=3和c!
=5中至少有一个为真,即不论c为何值,表达式B)都为"真"。
(19)若有条件表达式(exp)?
a++:
b--,则以下表达式中能完全等价于表达式(exp)的是A)(exp==0) B)(exp!
=0) C)(exp==1) D)(exp!
=1)
(19)B 【解析】条件运算符要求有3个操作对象,称三目(元)运算符,它是C语言中惟一的一个三目运算符。
条件表达式的一般形式为:
表达式1?
表达式2:
表达式3其求解顺序是:
先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。
若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值,注意++、--的用法。
(20)以下不正确的定义语句是
A)doublex[5]={2.0,4.0,6.0,8.0,10.0};
B)inty[5]={0,1,3,5,7,9};
C)charc1[]={′1′,′2′,′3′,′4′,′5′};
D)charc2[]={′\x10′,′xa′,′\x8′};
(20)B 【解析】在一维数组中要注意的是作为下标表达式的常量表达式的值必须是大于等于0,选项B)中定义有5个元素,但赋值时有6个元素,所以是错误的。
(21)下列程序执行后的输出结果是
main()
{inta[3][3],*p,i;
p=&a[0][0];
for(i=1;i<9;i++)p[i]=i+1;
printf("%d\n",a[1][2];)
A)3 B)6 C)9 D)随机数
(21)B 【解析】本题中,a[1][2]是二维数组中的第6个元素,对应for循环中i的值为5,p[5]=5+1。
(22)设有以下程序段
intx=0,s=0;
while(!
x!
=0)s+=++x;
printf("%d",s);
则
A)运行程序段后输出0 B)运行程序段后输出1
C)程序段中的控制表达式是非法的 D)程序段执行无限次
(22)B 【解析】本题中,"!
"表示逻辑非运算符,"!
="表示不等于运算符,逻辑非运算符比不等于运算符的优先级高。
(23)下面程序段的运行结果是
char*s="abcde";
s+=2;printf("%d",s);
A)cde B)字符′c′ C)字符′c′的地址 D)无确定的输出结果
(23)C 【解析】对于字符串指针,其保留的是整个串的首地址,即第一个字符的起始地址;当该指针做算术运算时,就是该指针根据其类型向后移动相应的存储空间。
(24)阅读下列程序,则执行后的结果为
#include"stdio.h"
main()
{ intc[][4]={1,2,3,4,5,6,7,34,213,56,62,3,23,12,34,56};
printf("%x,%x\n",c[2][2],*(*(c+1)+1));}
A)3e,6 B)62,5 C)56,5 D)3E,6
(24)A 【解析】数组c[][4]表示一个4行4列数组,c[2][2]表示第3行第3列上的元素62,*(*(c+1)+1))表示第2行第2列上的元素6,通过十六进制输出为3e,6。
(25)下面判断正确的是
A)char*a="china";等价于char*a;*a="china";
B)charstr[5]={"china"};等价于charstr[]={"china"};
C)char*s="china";等价于char*s;s="china";
D)charc[4]="abc",d[4]="abc";等价于charc[4]=d[4]="abc";
(25)C 【解析】选项A)char*a;*a="china"应改为a=china;,选项B)应该是charstr[6];D)项表述方法有错误。
(26)若有定义:
int a[2][3];,以下选项中对a数组元素正确引用的是
A)a[2][!
1] B)a[2][3] C)a[0][3] D)a[1>2][!
1]
(26)D 【解析】C语言中数组下标是从0开始的,所以二维数组a[2][3]的第一维下标取值为0、1;第二维的下标取值为0、1、2,因而选项A)、B)、C)都是错误的,选项D)表示数组元素a[0][0]。
(27)有定义语句:
char s[10];,若要从终端给s输入5个字符,错误的输入语句是
A)gets(&s[0]); B)scanf("%s",s+1); C)gets(s); D)scanf("%s",s[1]);
(27)D 【解析】在格式输入中,要求给出的是变易的地址,而D)答案中给出的s[1]是一个值的表达式。
(28)有以下程序
#include
#define N 5
#define M N+1
#define f(x) (x*M)
main()
{int i1,i2;
i1=f
(2);
i2=f(1+1);
printf("%d%d\n",i1,i2);
}
程序的运行结果是
A)12 12 B)11 7 C)11 11 D)12 7
(28)B 【解析】根据宏替换的替换规则,我们可知,f
(2)=2*N+1=2*5+1=11,f(1+1)=1+1*N+1=1+1*5+1=7。
(29)若有以下说明和定义
uniondt
{inta;charb;doublec;}data;
以下叙述中错误的是
A)data的每个成员起始地址都相同
B)变量data所占内存字节数与成员c所占字节数相等
C)程序段:
data.a=5;printf("%f\n",data.c);输出结果为5.000000
D)data可以作为函数的实参
(29)D 【解析】选项A),共用体的每个成员的起始地址都相同;选项B),共用体变量所占的内存长度等于最长的成员的长度;选项C)因为每个成员的起始地址相同,所以整型数5以浮点型输出时为5.000000;选项D)C语言规定,不能把共用体变量作为函数的参数。
(30)有以下程序
#include
main()
{FILE*fp;intk,n,a[6]={1,2,3,4,5,6};
fp=fopen("d2.dat","w");
fprintf(fp,"%d%d%d\n",a[0],a[1],a[2]);
fprintf(fp,"%d%d%d\n",a[3],a[4],a[5]);
fclose(fp);
fp=fopen("d2.dat","r");
fscanf(fp,"%d%d",&k,&n);printf("%d%d\n",k,n);
fclose(fp);
}
程序运行后的输出结果是A)1 2 B)1 4 C)123 4 D)123 456
(30)D 【解析】将有6个元素的整型数组分两行输出到一个文件中,因为输出的都是数字并且每行都没有分隔符,所以当再对其进行读取操作时,每一行都会被认为是一个完整的数,而换行符则作为它们的分隔符。
(31)若已定义
inta[]={0,1,2,3,4,5,6,7,8,9},*p=a,i;
其中则对a数组元素不正确的引用是
A)a[p-a] B)*(&a[i]) C)p[i] D)a[10]
(31)D 【解析】通常,引用一个数组元素可以用下标法,如a[p-a]形式,或指针法,如*(&a[i])的形式。
本题中a[9]=9,a[10]显然超出数组范围,注意,数组的下标是从0开始的。
(32)有以下程序
#include
void fun(int *s,int n1,int n2)
{ int i,j,t;
i=n1; j=n2;
while(i}
main()
{ int a[10]={1,2,3,4,5,6,7,8,9,0},k;
fun(a,0,3); fun(a,4,9); fun(a,0,9);
for(k=0;k}
程序的运行结果是A)0987654321 B)4321098765 C)5678901234 D)0987651234
(32)C 【解析】函数fun(int*s,intn1,intn2)的功能是对数组s中的元素进行首尾互相调换。
所以在主函数中,当fun(a,0,3)执行完后,数组a[12]={4,3,2,1,5,6,7,8,9,0};再执行fun(a,4,9),数组a[12]={4,3,2,1,0,9,8,7,6,5};再执行fun(a,0,9)后,数组a[12]={5,6,7,8,9,0,1,2,3,4}。
(33)阅读下列程序,当运行函数时,输入asdafaaz67,则输出为
#include
#include
#include
intfun(char*str)
{inti,j=0;
for(i=0;str[i]!
=′\0′;i++)
if(str[i]!
=′′)str[j++]=str[i];
str[j]=′\0′;
}
main()
{
charstr[81];
intn;
printf("Inputastring:
");
gets(str);
puts(str);
fun(str);
printf("%s\n",str);
}
A)asdafaaz67 B)asdafaaz67 C)asd D)z67
(33)A 【解析】本题题意要求删除所有空格,即除了空格以外的其他所有字符都要留下。
由于C语言中没有直接删除字符的操作,所以我们对于删除字符的操作都是采用"留下"字符的算法,以前的题目亦是如此。
用str[i]从串头到串尾逐一走动,每走到一个字符都判断其是否为空格,若不是空格(注意在if()的单引号之间有一个空格),则将其保存str[j]中。
注意j的下标变化、初值及最后加串结束符'\0'。
(34)有以下程序
intfun(intn)
{if(n==1)return1;
else
return(n+fun(n-1));
}
main()
{intx;
scanf("%d",&x);x=fun(x);printf("%d\n",x)
}
执行程序时,给变量x输入10,程序的输出结果是
A)55 B)54 C)65 D)45
(34)A 【解析】本程序考察的是函数的递归调用,在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用,执行结果为1+2+3+4+5+6+7+8+9+10=55。
(35)下面程序段中,输出*的个数是
char*s="\ta\018bc";
for(;*s!
='\0';s++)printf("*");
A)9 B)5 C)6 D)7
(35)C 【解析】本题中,格式符0表示的是八进制无符号形式输出整型数(不带前导0),字符常量在内存中占一个字节,存放的是ACSII码代码值。
C语言规定,所有字符常量都作为整型量来处理,在计算机内部,其对应的整数值就是ACSII字符集中该字符的序号,即&*s中有几个字符就输出几个*。
(36)C语言结构体类型变量在程序运行期间
A)TC环境在内存中仅仅开辟一个存放结构体变量地址的单元
B)所有的成员一直驻留在内存中
C)只有最开始的成员驻留在内存中
D)部分成员驻留在内存中
(36)B 【解析】结构体类型的变量在程序运行期间要作为一个整体占用连续的内存单元。
(37)已知函数的调用形式为fread(buf,size,count,fp),参数buf的含义是
A)一个整型变量,代表要读入的数据项总数 B)一个文件指针,指向要读的文件
C)一个指针,指向要读入数据的存放地址 D)一个存储区,存放要读的数据项
(37)C 【解析】这是一道考查fread函数的题。
buf是一个指针,fread是读入数据的存放地址;fwrite是输出数据的地址(以上指的是起始地址)。
(38)设有以下语句
charx=3,y=6,z;
z=x^y<<2;
则z的二进制值是
A)00010100 B)00011011 C)00011100 D)00011000
(38)B 【解析】本题考查两个位运算符。
按位异或运算符"^"是双目运算符,其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异或时,结果为1。
左移运算符"<<"是双目运算符,其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0,并且"<<"运算符的优先级于"^"。
(39)在C语言中,只有在使用时才占用内存单元的变量,其存储类型是
A)auto和register B)extern和register
C)auto和static D)static和register
(39)A 【解析】在C语言中只有自动变量和寄存器变量在使用时才占用内存单元。
(40)设有定义语句int (*f)(int);,则以下叙述正确的是
A)f是基类型为int的指针变量
B)f是指向函数的指针变量,该函数具有一个int类型的形参
C)f是指向int类型一维数组的指针变量
D)f是函数名,该函数的返回值是基类型为int类型的地址
(40)B 【解析】本题考查的是指向函数的指针。
语句int(*f)(int);是对一个函数的声明,其中f是指向该函数的指针,该函数有一个整型的参数,函数返回值类型为整型。
二、填空题
请将每一个空的正确答案写在答题卡序号的横线上,答在试卷上不给分。
(6)阅读下面程序段,则执行后输出的结果是 【6】 。
#include"stdio.h"
main()
{ charfun(char,int);
chara=′A′;
intb=13;
a=fun(a,b);
putchar(a);}
charfun(chara,intb)
{ chark;
k=a+b;
returnk;}
(6)【6】N 【解析】函数说明语句中的类型名必须与函数返回值的类型一致。
本题实现的是在字符'A'的ASCII码值上加上一个常数,使之变成另一个ASCII码值,从而输出字符。
(7)函数fun的返回值是 【7】
fun(char*a,char*b)
{intnum=0,n=0;
while(*(a+num)!
='\0')mm++;
while(b[n]){*(a+num)=b[n];num++;n++;}
returnnum;
}
(7)【7】字符串a和b的长度之和 【解析】本题首先通过第一个while循环计算字符串a的长度,再通过第二个循环,将字符串a和b相连,最后返回连接后的总长度。
(8)以下程序的功能是:
删去一维数组中所有相同的数,使之只剩一个。
数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。
例如,若一维数组中的数据是:
2223445666677899101010
删除后,数组中的内容应该是:
2345678910。
请填空。
#include
#defineN80
intfun(inta[],intn)
{inti,j=1;
for(i=1;i if(a[j-1] 【8】 a[i])
a[j++]=a[i];
【9】 ;
}
main()
{inta[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10},i,n=19;
printf("Theoriginaldata:
\n");
for(i=0;i n=fun(a,n);
printf("\nThedataafterdeleted:
\n");
for(i=0;i}
8)【8】!
= 【9】returnj 【解析】本题程序的流程是:
让i,j都从1开始,其中j用于控制删除后剩下的数中的下标,i用于搜索原数组中的元素。
j始终是新数组已有元素中最后一个元素的下一个元素的下标,所以if()中的条件是a[j-1]!
=a[i],其中a[j-1]就是新数组中的最后一个元素,若条件成立则表示出现了不同的值,所以a[i]要留到新数组中。
注本题中i、j的初值都要从1开始,该算法只能用于数组已排序的题目中。
(9)以下程序的运行结果是 【10】 。
#include
main()
{ int x=1,y=0,a=0,b=0;
switch(x)
{ case 1:
switch(y)
{ case 0:
a++; bre