计算机等级《二级C语言程序设计》预测试卷(一)
一、单项选择题(共40题,合计40分)
1以下能正确定义一维数组的选项是()。
A.int a[5]={0.1,2.3.4,5);
B.char a口={0,1,2,3,4,5);
C.char a={'A’,'B','C');
D.int a[5]=”0123”;
[正确答案]B
试题解析:
数组下标从0开始,A选项中所赋值的个数超过了数组的长度;c选项中定义a为字符型变量,而不是数组,赋值错误;D选项中,整型数组不能赋字符串。
2视图设计一般有3种设计次序,下列不属于视图设计次序的是( )。
A.自顶而下
B.由内向外
C.由外向内
D.自底向上
[正确答案]C
试题解析:
视图设计的设计次序分3种:自顶向下、自底向上和由内向外。它们为视图设计提供了具体的操作方法,设计者可根据实际情况灵活掌握。
3链表不具有的特点是()。
A.不必事先估计存储空间
B.町随机访问任意元素
C.插入、删除不需要移动元素
D.所需空间与线性表长度成正比
[正确答案]B
试题解析:
链表采用的是链式存储结构,它的结点空间可以动态申请和释放;它的数据元素的逻辑次序靠结点的指针来指示,插入、删除不需要移动数据元素。但是链式存储结构也有不足之处:每个结点中的指针域需额外占用存储空间,它是一种非随机存储结构。
4有以下程序:
main()
{ int x,i;
for(i=l;i<=50;i++)
{x=i;
if(x%2=0)
if(x%3=0)
if(x%7=0)
printf(”%d,i)”;
}
}
输出结果是( )。
A.28
B.27
C.42
D.41
[正确答案]C
试题解析:
只有当3个if条件同时成立,即能够同时被2、3、7整除时,才输出i的值,而从0到50能够同时被2、3、7整除的数只有42,故选择C选项。
5若已定义:int a口一(0,1,2,3,4,5,6,7,8,9),*p=a,i;其中0≤i≤9,则对a 数组元素的引用不正确的是()。
A.a[p-a]
B.*(&a[i])
C.p[i]
D.*(*(a十i))
[正确答案]D
试题解析:
A:P开始是数组a首地址,只要p++则再减去a的首地址aEp—a]就能取到所有元素,B:&a[i]循环取其地址,*(&a[i])是该地址中所存储的元素C:p就是指针变量,相当于a[i],D:*(a+i)则正确。
6设有下列程序段:
char str[]="HelloWorld":
char*ptr;
ptr=str ;
执行上面的程序段后,*(ptr+10)的值为( )。
A.'\O'
B.'0'
C.不确定的值
D.'0'的地址
[正确答案]A
试题解析:
本题主要考查字符数组和指针,在c语言中,字符型数组在存放字符串时会自动在末尾加上'\0',所以数组str有ll个元素;ptr指向数组str的首地址,ptr+10是指向str[10],*(ptr+10)是引用strEl0]的值。
7下列4个关于C语言的结论中错误的是()。
A.可以用do while语句实现的循环一定可以用while语句实现
B.可以用for语句实现的循环一定可以用while语句实现
C.可以用while语句实现的循环一定可以用for语句实现
D.do-while语句与while语句的区别仅是关键字“while”出现的位置不同
[正确答案]D
试题解析:
本题考查对各个循环语句的理解。①do—while语句、for语句、while语句所实现的循环可以相互替代;②d0—while语句至少执行一次,而while是符合条件执行,不符合不执行。
8有以下程序:
#include
main()
{char s[]="012xy\O8s34f4w2‘;
int i;n=0;,
for(i=0;s[i]!=0;i++)
if(s[i]>='0'&&s[i]<='9')n++;
printf("%d\n",n);
}
程序运行后的输出结果是()。
A. 0
B. 3
C. 7
D. 8
[正确答案]B
试题解析:
考查简单的C程序数组和循环。for循环是指i=0,如果s/[3]!=0,则i自动加1。if循环指的是s[i]中的元素大于等于0且小于等于9,则n加l,所以答案为B。
9若有以下说明,则()不是对strcpy库函数正确的调用。
strcpy库函数用于复制一个字符串:char*str1==”abed”,
strZ[10],*str3="hijklmn",*str4[-2],*str5=”aaaa”;
A.strcpy(str2,str1)
B.strcpy(str3,slrl)
C.strcpy(str1,str2)
D.strcpy(str5,strl)
[正确答案]C
试题解析:
strcpy(sl,s2)函数的功能是将字符串s2复制到字符串sl中。要保证sl存储区能容纳下s2字符串。
10数据库系统的核心是()。
A.数据模型
B.数据库管理系统
C.数据库
D.数据库管理员
[正确答案]B
试题解析:
本题考查对数据库系统的理解。数据库系统由数据库(数据)、数据库管理系统(软件)、数据库管理员(人员)、硬件平台(硬件)、软件平台5个部分构成。其中数据库管理系统是数据库系统的核心,它负责数据库中的数据组织、数据操纵、数据维护、控制及保护和数据服务等工作。
11有下列函数定义:
fun(float h)
{ printf(”%f,%f\n”,h,h*h);)
该函数的类型是()。
A.int类型
B.float类型
C.void类型
D.函数无类型说明,定义有错
[正确答案]A
试题解析:
本题考查函数值的类型,在函数定义时,由于函数没有说明其类型,系统默认一律自动按整型(int)处理。
12有以下程序
#include
struct tt
{int x;struct tt*y;)*P;
struct tt a[4]={20,a+1,15,a+2,30,a+3,17,a);
main()
{ int i;
for(i=1;i<=2;i++)(printf(”%d,”,p->x);P
=P->y:}
)
程序的运行结果是()。
A.20,30,
B.30,17,
C.15,30,
D.20,15,
[正确答案]D
试题解析:
程序的结构体数组a的元素形成了一个单向的循环链表,每个元素的指针成员都指向下一个元素的地址。
13 有以下程序:
main()
{ union
{char ch[2];
im d;
d一0x4321;
printf(”%x,%x\n”,s.ch[O],s.ch[1]);
)S;
在16位编译系统上,程序执行后的输出结果是()。
A.21,43
B.43,21
C.43,00
D.21,00
[正确答案]A
试题解析:
s是一个公用体,d的值分别与ch中的两个元素的值相同,d的高位放在eh[1]中、低位放在ch[O]中,因此输出的结果为21,43。
14有以下程序:
main()
{int a=0,b=0;
a=10;/*给a赋值
b=20;给b赋值*/
printf(”a+b=%d\n”,a+b);//输出计算机结果
)
程序运行后的输出结果是()。
B.a+b=30
C.30
D.出错
[正确答案]A
试题解析:
本题中/*……*/为多行注释,所以可知b=20为注释语句,在程序运行时不起作用,b仍为0,所以本题中选项A正确。
15若有定义:“int a[2][3];”,则对a数组的第i行第j列元素的正确引用为()。
A.*(*(a+i)+j)
B.(a+i)[j]
C.*(a+j+j)
D.*(a+i)+j
[正确答案]A
试题解析:
通过地址来引用数组元素的方法有下列5种:①a[i][j];②*(a[i]+J);③*(*(a+i)+j);④*(aEiJEj]);⑤(&a[o]EoJ+3*i十j)。故A正确。
16以下程序的输出结果是()。
main()
{int i,a[4][4]={{1,3,5},{2,4,6},{3,5,7}};
printf(”%d%d%d%d\n”,a[0][3],a[1][2],
a[2][1],a[3][0];
}
A.0650
B.1470
C.5430
D.输出值不定
[正确答案]A
试题解析:
当所赋的值不够其列的宽度时,系统在其后自动补0,因此a[o][3]=0,a[-1][2]=6,a[2][1]=5,a[3][o]=0,故选择A选项。
17软件生命周期中,花费最多的阶段是()。
A.详细设计
B.软件编码
C.软件测试
[正确答案]D
试题解析:
本题考查对软件生命周期的理解,软件生命周期整体上可分为定义阶段、开发阶段和维护阶段。其中定义阶段包括可行性研究与计划制订和需求分析;开发阶段包括概要设计、详细设计、开发和测试;维护阶段是一个单独阶段,不包含在开发阶段内,它是所花费用最多的一个阶段。
18语句“printf(”a\bre”\'hi\’y\\\bou\n”);”的输出结果是( )。
A.a\bre\'hi\'y'\\\bou
B.a\bre\'hi\\y\bou
C.re'hi'you
D.abre'hi'y\bou
[正确答案]C
试题解析:
先输出a、b表示退一格,当执行到:\b后,1光标往后退,接着输出r e’hi’y\(反斜杠后又加一个反斜杠的意思是要输出一个反斜杠),此时又执行:\b后,\就被OU
覆盖。
19有以下程序
#include
void fun(int x)
{if(x/Z>1)fun(x/Z);
printf("%d",x);
}
main()
{fun(7);printf("\n");}
程序运行后的输出结果是( )。
A. 1 3 7
B. 7 3 1
C. 7 3
D. 3 7
[正确答案]D
试题解析:
本程序主要考查递归函数。fun(7),首先将参数代入函数,因为(7/2)>1,所以执行f(3),依此类推直到f(1.5),(1.5/2)<1,所以执行打印函数,此时X值为3,然后退出f(1.5),返回f(3),打印x值即7。所以选D。
20下列运算符中优先级最低的算符是()。
A.||
B.! =
C.<一
D.十
[正确答案]A
试题解析:
C语言中规定运算符的优先顺序:一元算术运算符一>二元算术运算符一>关系运算符一>逻辑运算符一>赋值运算符,A项中为逻辑运算符,B项和C项都为关系运算符,D项为一元运算符。因此最低的是A项。
21软件生命周期可分为定义阶段、开发阶段和维护阶段。详细设计属于()。
A. 定义阶段
B. 开发阶段
C. 维护阶段
D. 上述三个阶段
[正确答案]B
试题解析:
开发阶段在开发初期分为需求分析、总体设计、详细设计3个阶段,在开发后期分为编码、测试两个子阶段。
22有以下程序
#include
main()
{char cl,c2;
c1='A'+'8'-'4'
c2='A'+'8'-'5';
printf("%C,%d\n",cl,c2);
}
已知字母A的ASCIl码为65,程序运行后的输出结果是()。
A. E,69
B. D,69
C. E,D
D. 输出无定值
[正确答案]A
试题解析:
本值输出两个值,%c为输出一个字母,0/4d输出一个数字。“A”的ASCIl码为65,再加4之后为69,也就是字母E,所以本题A正确。
23设有以下语句:
int a=1,b=2,c;
c=a^(b<<2);
执行后,c的值为( )。
A.6
B.7
C.8
D.9
[正确答案]D
试题解析:
本题考查两个知识点,按位异或左移把b左移2位化成二进制c=a^(b<<2)=a^(oooolo<<2)=a^o01000=0000001^001000=9,故选择D。
24设有二元关系R和三元关系s,下列运算合法的是()。
A.Rn S
B.RU S
C.R-S
D.R×S
[正确答案]D
试题解析:
本题给出的两个关系R与s的表结构是不同的(R是二元关系,S是三元关系),它们不能进行“n、U、一”运算,却可以进行笛卡儿积(×)运算。
25结构化程序设计的3种结构是()。
A.顺序结构、选择结构、转移结构
B.分支结构、等价结构、循环结构
C.多分支结构、赋值结构、等价结构
D.顺序结构、选择结构、循环结构
[正确答案]D
试题解析:
结构化程序设计的基本要点:①采用自顶向下、逐步求精的程序设计方法;②任何程序都可由顺序、选择和循环三种基本控制结构构造。
26下面for语句的循环次数为()。
for(x=1,y=0;(Y!=19)&&(x<6);x++);
A.是无限循环
B.循环次数不定
C.最多执行6次
D.最多执行5次
[正确答案]D
试题解析:
本题考查for循环的使用。根据条件考虑X的取值变化,X从1取到5,可以循环5次,但并不知道Y如何变化,有可能出现Y=l9提前跳出循环的情况,所以最多执行5次。
27下列叙述中正确的是()。
A. 可以用关系运算符比较字符串的大小
B. 空字符串不占用内存,其内存空间大小是0
C. 两个连续的单引号是合法的字符常量
D. 两个连续的双引号是合法的字符串常量
[正确答案]D
试题解析:
比较两个字符串大小用函数strcomp(S,t),空字符串有结束符,所以也要占用字节,两个双引号表示的是空字符串。
28以下程序的输出结果是()。
void fun(int*a,int i,int j)
{int t;
if(i
(t=a[i];a[i]=a[j];a[j]=t;
i++;j--;
fun(a,i,j);
)
}
main()
{int x[]={2,6,1.8),i;
fun(x,0,3):
for(i=0;i<4;i++)printf(”%2d”,x[i]);
printf(”\n”);
)
A.1,2,6,8
B.8,6,2,1
C.8,l,6,2
D.8,6,1,2
[正确答案]C
试题解析:
本题用了函数调用,fun中if语句成立则进行i,j的交换,用到主函数中则为把下标为0、3,
1、2互换,因此,当执行完后x的数组为8,1,6,2,故选择C选项
29设有定义"double a[10],*s=a;",以下能够代表数组元素a[3]的是()。
A. (*s)[3]
B. *(s+3)
C. *s[3]
D. *s+3
[正确答案]B
试题解析:
用带下标的指针变量引用一维数组元素若有以下定义和语句:“int*P,s[10],i;P=s}”,且o≤i<10,可以用&.s[i]、s+i和p+i三种表达式来表示s[i]的地址。同时可以用s[i]、*(s+i)和*(p+i)三种表达式来表示数组元素s[i]。
30下列选项中非法的字符常量是()。
A.'\t'
B.'\039'
C.','
D.'\n'
[正确答案]B
试题解析:
水平制表符中,’\t'表示的是横向跳若干格;选项B中,’\039’错误,’\039’是八进制形式表的字符,最大数为7,但其中出现'9',’,’是字符逗号;选项D中,7\n’表示的是换行。
31有以下程序:
main()
{ int x=102,y=012;
printf(”%2d,%2d\n”,x,y);
}
执行后输出结果是()。
A.10,01
B.02,12
C.102,10
D.02,10
[正确答案]C
试题解析:
x的值为十进制数102,而Y的值为八进制数012,根据题意将Y用十进制表示为10%md,m为指定输出数据的宽度,若位数小于m则左端补以空格,若位数大于m则按实际输出,所以答案是C。
32相对于数据库系统,文件系统的主要缺陷有数据关联差、数据不一致性和( )。
A.可重用性差
B.安全性差
C.非持久性
D.冗余性
[正确答案]D
试题解析:
文件系统所管理的数据文件基本上是分散、相互独立的。相对于数据库系统,以此为基础的数据处理存在3个缺点:数据冗余大、数据的不一致性、程序与数据的依赖性强。
33有以下程序:
#include
main()
{ FILE*fp;
int k,n,i,a[6]={1,2,3,4,5,6};
fp=fopen("d2.dat","w");
for(i=0;i<6;i++) fprintf(fp,"%d\n",a[i]);
fclose(fp);
fp(i=0;i<3;i++) fscanf(fp,"%d%d",&k,&n);
fclose(fp);
printf("%d\n,%d\n,k,n);
}
程序运行后的输出结果是()。
A. 1, 2
B. 3,4
C. 5,6
D. 123,456
[正确答案]C
试题解析:
此题是考查fprintf和fscanf,其中fprintf是向文件输出,文件为da2.dat文件,fscanf是向文件输入,所以根据程序循环写入和写出.可知答案为C。
34有以下程序段:
int k,j,s;
for(k=2;k<6;k++,k++)
{ s=1;
for(j=k;j<6;j++)s+=j;
)
print[(”%d\n”,s);
程序段的输出结果是()。
A.9
B.1
C.11
D.10
[正确答案]D
试题解析:
因为首先k一2,然后你进行一次循环后,k自增两次,变成4,所以这时候S又成l了。然后当k一4的时候,s=1,j=4,然后执行内层循环,s=1+4,然后j自增等于5,s=5+5,然后J再自增为6,跳出内层循环。k自增两次后等于6,不成立,跳出外层循环。然后输出s的值,即为10。因此正确选项为D。
35下列叙述中正确的是( )。
A.软件测试应该由程序开发者来完成
B.程序经调试后一般不需要测试
C.软件维护只包括对程序代码的维护
D.以上三种说法都不对
[正确答案]D
试题解析:
程序调试是由程序开发者完成诊断和改正程序中的错误的过程;软件测试是由专门的测试人员完成,是发现错误而执行程序的过程;软件维护是指软件系统交付使用以后,为了改正错误或满足新的需要而修改软件的过程,是软件生存周期中非常重要的一个阶段。
36若有定义:int X,*pb;则正确的赋值表达式是()。
A.pb=&X
B.pb=X
C.*pb=&x
D.*pb=*x
[正确答案]A
试题解析:
*pb是指解除对*pb的引用(也可以认为是取pb所指向的地址的值),被解除引用的指针可以作为左值,&为取地址运算符,&X就是取指向变量X的指针。
37下列叙述中正确的是()。
A. 为了建立一个关系,首先要构造数据的逻辑关系
B. 表示关系的二维表中各元组的每一个分量还可以分成若干数据项
C. 一个关系的属性名表称为关系模式
D. 一个关系可以包括多个二维表
[正确答案]A
试题解析:
元组分量的原子性要求二维表中元组的分量是不可分割的基本数据项。关系的框架称为关系模式。一个称为关系的二维表必须同时满足关系的7个性质。
38设有以下语句
char chl,ch2;scanf("%c%C",&chl,&ch2);
若要为变量chl和ch2分别输入字符A和B,正确的输入形式应该是()。
A. A和B之间用逗号间隔
B. A和B之间不能有任何间隔符
C. A和B之间可以用回车间隔
D. A和B之间用空格间隔
[正确答案]B
试题解析:
scanf输入函数中,格式控制J必须严格按照函数中的要求进行输入,在scanf("%c%c",&chl,&ch2)的格式控制语句中没有任何字符进行间隔,所以在输入时也不能使用任何字符进行间隔,所以答案选择B。
39设x=011050,则x=x&01252的值是()。
A.000000 1000 101000
B.1111110100011001
C.0000001 01 1 100010
D.1100000OOOl0 1 000
[正确答案]A
试题解析:
本题主要考查按位与运算,x—Oll050的二进制形式为O001001000010lo00,01252的二进制形式为0000001010101010,两者相与得0000001000101000。
40有下列程序:
#include
main()
{ int a=6,b=7,m=1;
switch(a%2)
{ case 0:m++;break;
case 1:m++;
switch(b%2)
{default:m++;
case 0:m++;break;
)
)
printf(”%d\n”,m);
程序的运行结果是()。
A.3
B.2
C.4
D.1
[正确答案]B
试题解析:
本题考查switch语句及break的用法。第一个switch语句,因为a=6,a%2=0,所以执行“case0,m++;”,将m加-1,遇到break语句跳出switch语句,结束循环。不执行下面的switch。
二、填空题(共1题,合计18分)
41请补充main()函数,该函数的功能是:把一个字符串中的所有小写字母字符全部转换成大写字母字符,其他字符不变,结果保存在原来的字符串中。
例如,当str[M]=”abcdefl23ABCD”,结果输出:“ABC
DEF123ABCD”。
注意:部分源程序给出如下。
请勿改动main()函数和其他函数中的任何内容,仅在横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
#include
#define M 80
void main()
{
intj;
char str[M]=" abcdefl23ABCD”;
char *pf=str;
system(”CLS”):
printf(”***original string ***\n”):
puts(str);
【1】
while(*(pf+j))
{
if(*(pf+j)>='a' &&*(pf+j)<='Z')
{
*(pf+j)=【2】;
【3】;
)
else
j++;
)
printf(”****new string****\n”);
puts(str);
system(”pause”);}
[正确答案]【1】j=0【2】*(pf+j)-321311j++
试题解析:
由程序中可知,变量j为字符数组的下标,其初始值为0。因此,【l】处填“j=0”;大写字母的ASCIl码值比小写字母的小32,要将小写字母变为大写字母,因此,【2】处填“*(pftj)-32”;要将字符串数组中的所有小写字母变为大写字母,需要检查其中的每一个字符,因此,【3】处填“j++”。
三、改错题(共1题,合计24分)
42下列给定程序中,函数proe()的功能是:对M名学生的学习成绩,按从高到低的顺序找出前m(m<10)名学生来,并将这些学生数据存放在一个动态分配的连续存储区中,此存储区的首地址作为函数值返回。
请修改程序中的错误,使它能得出正确的结果。
注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include%stdlib.h>
#include
#include
#include
#include%malloe.h>
#define M 10
typedef struct ss
{
char num[10];
int s;
}
STU;
STU *proc(STU a[],int m)
{
STU b[-M],*t;
int i,j,k;
//****found****
*t=calloc(m,sizeof(STU));
for(i=0;i for(k=0;k { for(i=j=0;i if(b[i].s>b[j].s)j=i; //****found**** t[k].num=b[j].num; t[k].s=b[j].S; b[j].s=0; } return t: } void outresuh(STU a[],FILE *pf) f int i; for(i=0;i fprintf(pf,”No=%s Mark=%d\n”, a[i] mum,a[i].s); fprintf(pf,”\n\n”); ) void main() {STU stu[M]={{¨A01”,81},{¨A02”,89},{¨A03”,66},{”A04”,87),{”A05”,77),{”A06”,90),{"A07”,79),{”A08”,61),{”A09”,80},{”A10”,71)); STU+pOrder; int i,m; system(”CLS”); printf(”****THE RESULT****\n”);outresuh(stu,stdout); print{(”\nGive the number of the students who have better score:”); scanf(”%d”,&m); while(m>10) printf(”\nGive the number of the students who have better score:”); scanf(”%d”,&m); } p()rder=proc(stu,m); printf(”****THE RESULT****\n”); printf(”The lop:\n”); for(i=0:i printf(”%s%d\n”,pOrder[i].hum, pOrder[i].s); free(pOrder); ) [正确答案] (1)错误:*t=ealloc(m,sizeof(STU)); 正确:t=(structSS*)calloc(m,sizeof(STU));(2)错误:t[kJ.num=b[j].num; 正确:t[k]-h[j+; 试题解析: 因为t是指向一个动态存储空间,因此其是指针,而不是其中的内容,故把“*t=calloc(m,sizeof(STU))”改为“t=(structSS*)calloc(m,sizeof(STU));”,而题目要求把学生的全部内容互换,因此即整个结构体,故把“t[k]. num=bl;”改为“t[k]=;”。 四、编程与应用题(共1题,合计18分) 43学生的记录由学号和成绩组成,M名学生的数据已在主函数中放入结构体数组stu中,请编写函数proc(),其功能是:按分数的高低排列学生的记录,高分在前。 注意:部分源程序给出如下。 请勿改动main()函数和其他函数中的任何内容,仅在函数proc()的花括号中填入所编写的若干语句。 试题程序: # include #define M 16 typedef s truct { char num[10]; inl S; ) STREC; void proc(STREC a[]) int i,j; STREC t;