选择题题库
1.下列数据结构中,属于非线性结构的是( )。
A) 循环队列
B) 带链队列
C) 二叉树
D) 带链栈
1、参考答案:C
【解析】树是简单的非线性结构,所以二叉树作为树的一种也是一种非线性结构。
2.下列数据结构中,能够按照”先进后出”原则存取数据的是( )。
A) 循环队列
B) 栈
C) 队列
D) 二叉树
2、参考答案:B
【解析】栈是按先进后出的原则组织数据的。队列是先进先出的原则组织数据
3.对于循环队列,下列叙述中正确的是( )。
A) 队头指针是固定不变的
B) 队头指针一定大于队尾指针
C) 队头指针一定小于队尾指针
D) 队头指针可以大于队尾指针,也可以小于队尾指针
3、参考答案:D
【解析】循环队列的队头指针与队尾指针都不是固定的,随着入队与出队操作要进行变化。因为是循环利用的队列结构所以对头指针有时可能大于队尾指针有时也可能小于队尾指针。
4.算法的空间复杂度是指( )。
A) 算法在执行过程中所需要的计算机存储空间
B) 算法所处理的数据量
C) 算法程序中的语句或指令条数
D) 算法在执行过程中所需要的临时工作单元数
4、参考答案:A
【解析】算法的空间复杂度是指算法在执行过程中所需要的内存空间。所以选择A)。
5.软件设计中划分模块的一个准则是( )。
A) 低内聚低耦合
B) 高内聚低耦合
C) 低内聚高耦合
D) 高内聚高耦合
5、参考答案:B
【解析】一般较优秀的软件设计,应尽量做到高内聚,低耦合,即减弱模块之间的耦合性和提高模块内的内聚性,有利于提高模块的独立性。
6.下列选项中不属于结构化程序设计原则的是( )。
A) 可封装
B) 自顶向下
C) 模块化
D) 逐步求精
6、参考答案:A
【解析】结构化程序设计的思想包括:自顶向下、逐步求精、模块化、限制使用goto语句,所以选择A)。
7.软件详细设计生产的图如下:
该图是( )
A) N-S图
B) PAD图
C) 程序流程图
D) E-R图
7、参考答案:C
【解析】N-S图提出了用方框图来代替传统的程序流程图,所以A)不对。PAD图是问题分析图,它是继承程序流程图和方框图之后提出的又一种主要用于描述软件详细设计的图形表示工具,所以B)不对。E-R图是数据库中的用于表示E-R模型的图示工具,所以D)不对。根据图中所示表示方法是进行软件详细设计时使用的程序流程图。
8.数据库管理系统是( )。
A) 操作系统的一部分
B) 在操作系统支持下的系统软件
C) 一种编译系统
D) 一种操作系统
8、参考答案:B
【解析】数据库管理系统是数据库的机构,它是一种系统软件,负责数据库中数据组织、数据操纵、数据维护、控制及保护和数据服务等。是一种在操作系统之上的系统软件。
9.在E-R图中,用来表示实体联系的图形是( )。
A) 椭圆形
B) 矩形
C) 菱形
D) 三角形
9、参考答案:C
【解析】在E-R图中实体集用矩形,属性用椭圆,联系用菱形。
10.有三个关系R、S和T如下:则关系T是由关系R和S通过某种操作得到,该操作为( )。
A) 选择
B) 投影
C) 交
D) 并
10、参考答案:D
【解析】在关系T 中包含了关系R与S中的所有元组,所以进行的是并的运算。
11.计算机高级语言程序的运行方法有编译执行和解释执行两种,以下叙述中正确的是( )。
A) C语言程序仅可以编译执行
B) C语言程序仅可以解释执行
C) C语言程序既可以编译执行又可以解释执行
D) 以上说法都不对
11、参考答案:A
【解析】解释程序是将源程序(如BASIC)作为输入,解释一句后就提交计算机执行一句,并不形成目标程序。编译程序是把高级语言(如FORTRAN、COBOL、Pascal、C等)源程序作为输入,进行翻译转换,产生出机器语言的目标程序,然后再让计算机执行这个目标程序,得到计算结果。
12.以下叙述中错误的是( )。
A) 用户所定义的标识符允许使用关键字
B) 用户所定义的标识符应尽量做到”见名识意”
C) 用户所定义的标识符中,大、小写字母代表不同标识
D) 用户所定义的标识符必须以字母或下划线开头
12、参考答案:A
【解析】C语言规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线,排除D);用户定义标识符中大小写字母之间是有区别的并且应尽量做到”见名识意”,排除选项B)和C);C语言中还规定标识符不能为C语言的关键字,故选项A)叙述错误,正确答案是选项A)。
13.若有说明语句:char c=’\72’;则变量c( )。
A) 包含1个字符
B) 包含2个字符
C) 包含3个字符
D) 说明不合法,c的值不确定
13、参考答案:A
【解析】C语言的字符型常量中,允许用一种特殊形式的字符常量,就是以一个””开头的字符。其中,”\ddd“表示用ASCII码(八进制数)表示一个字符,本题中的char c=’\2’即表示占一个字符的变量c的ASCII码值。
14.现有定义int a;double b;float c;char k;,则表达式a/b+c-k值的类型为( )。
A) int
B) double
C) float
D) char
14、参考答案:B
【解析】双目运算中两边运算量类型转换规律:
15.以下定义语句中正确的是( )。
A) int a=b=0;
B) char A=65+1,b=′b′;
C) float a=1,*b=&a,*c=&b;
D) double a=0.0;b=1.1
15、参考答案:B
【解析】本题考查变量的定义方法。如果要一次进行多个变量的定义,则在它们之间要用逗号隔开。因此选项A)和D)错误;在选项C)中,变量c是一个浮点型指针,它只能指向一个浮点型数据,不能指向指针变量b;所以正确答案为B)。
16.若在定义语句int a,b,c,*p=&c;之后,接着执行以下选项中的语句,则能正确执行的语句是( )。
A) scanf(“%d”,a,b,c);
B) scanf(“%d%d%d”,a,b,c);
C) scanf(“%d”, &p);
D) scanf(“%d”, p);
16、参考答案:D
【解析】scanf函数中的输入项必须是指针,只有选项D)符合这个要求。
17.以下程序的运行结果是( )。
int k=0;
void fun(int m)
{ m+=k;k+=m;printf(“m=%d k=%d “,m,k++);}
main()
{ int i=4;
fun(i++); printf(“i=%d k=%d\n”,i,k);
}
A) m=4 k=5 i=5 k=5
B) m=4 k=4 i=5 k=5
C) m=4 k=4 i=4 k=5
D) m=4 k=5 i=4 k=5
17、参考答案:B
【解析】由于在main()函数中,变量 i=4,所以就调用fun(4),则输出”m=4 k=4″。然后变量k增1等于5,变量i增1等于5,所以main()函数的”printf(“i=%d k=%d\n“,i,k);”语句输出”i=5 k=5″。
18.在执行下述程序时,若从键盘输入6和8,则结果为( )。
main()
{ int a,b,s;
scanf(“%d%d”,&a,&b);
s=a ;
if(a<b)
s=b;
s*=s;
printf(“%d”,s); }
A) 36
B) 64
C) 48
D) 以上都不对
18、参考答案:B
【解析】本题中a的值为6,b的值为8,最后s的值为8,s*=s等价于s=s*s。
19.有以下程序:
main()
{ int k=5,n=0;
while(k>0) { switch(k) {
default : break;
case 1 : n+=k;
case 2 :
case 3 : n+=k;
}
k--;
}
printf(“%d\n”,n);
}
程序运行后的输出结果是( )。
A) 0
B) 4
C) 6
D) 7
19、参考答案:D
【解析】本题考查的是switch语句。在switch语句中,表达式的值与某一个case后面的常量表达式的值相等时,就执行此case后面的语句,若所有的case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句,各个case和default的出现次序不影响执行结果。所以在本题中,当k=5和k=4的时候,case都没有与其匹配的值,所以执行了default语句;当k=3时,执行”case 3 : n+=k;”得n=3,然后执行default;当k=2时,执行”case 2 : case 3 : n+=k;”得n=5,然后执行default;当k=1时,执行”case 1 : n+=k; case 2 : case 3 : n+=k;”使得n加两次k,得到n=7。
20.有以下程序:
#include <stdio.h>
main() { int x;
scanf(“%d”,& x);
if(x<=3); else
if(x!=10) printf(“%d\n”,x);
}
程序运行时,输入的值在哪个范围才会有输出结果( )。
A) 不等于10的整数
B) 大于3且不等10的整数
C) 大于3或等于10的整数
D) 小于3的整数
20、参考答案:B
【解析】if…else控制结构中,else总是与最近的未配对的if匹配。本题的执行过程为:如果输入整数小于3则不进行任何操作,否则判断是否不等于10,若为真则进行输出。因此程序输出的数据为大于3且不等于10的整数。
21.有以下程序:
#include <stdio.h>
main(){ int a=1,b=0;
printf(“%d,”,b=a+b);
printf(“%d\n”,a=2*b)}
程序运行后的输出结果是( )。
A) 0,0
B) 1,0
C) 3,2
D) 1,2
22.有以下程序:
main(){ int num[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}},i,j;
for(i=0;i<4;i++) { for(j=0;j<=i;j++)printf(“%4c”, ’ ‘);
for(j= ;j<4;j++)printf(“%4d”,num[i][j]);
printf(“\n”);
}
}
若要按以下形式输出数组右上半三角
1 2 3 4
6 7 8
11 12
16
则在程序下划线处应填入的语句是( )。
A) i-1
B) i+1
C) i
D) 4-i
22、参考答案:C
【解析】此题中嵌套了两个for语句,第一个用来输出空格,第二个用来输出数字。如此类型的输出某种格式的考题,一般是采用多重循环来解决,需要考生找出输出数据的特点,并用相对应的数学公式表达出来。
23.以下程序段中,与语句:k=a>b?(b>c?1:0):0;功能相同的是( )。
A) if((a>b)&&(b>c))k=1;
else k=0;
B) if((a>b)‖(b>c))k=1;
else k=0;
C) if(a<=b)k=0;
else if(b<=c)k=1;
D) if(a>b)k=1;
else if(b>c) k=1;
else k=0;
23、参考答案:A
【解析】表达式k=a>b?(b>c?1∶0)∶0表示:如果(a>b)条件为真,则k取值(b>c?1∶0),否则k取值0;当a>b的情况下,如果b>c,则k值为1,否则为0。所以该表达式与选项A)功能相同。
24.有以下程序:
void ss(char *s,char t)
{ while(*s)
{ if(*s==t)*s=t-a+A;
s++; } }
main()
{ char str1[100]=”abcddfefdbd”,c=d;
ss(str1,c); printf(“%s\n”,str1);}
程序运行后的输出结果是( )。
A) ABCDDEFEDBD
B) abcDDfefDbD
C) abcAAfefAbA
D) Abcddfefdbd
24、参考答案:B
【解析】在内存中,字符数据以ASCII码存储,它的存储形式与整数的存储形式类似。C语言中,字符型数据和整型数据之间可以通用,也可以对字符型数据进行算术运算,此时相当于对它们的ASCII码进行算术运算,在本题中,s++相当于s=s+1,即让s指向数组中的下一个元素。
25.现有如下程序段:
#include “stdio.h”
main()
{ int k[30]={12,324,45,6,768,98,21,34,453,456};
int count=0,i=0;
while(k[i])
{ if(k[i]%2==0||k[i]%5==0)count++;
i++; }
printf(“%d,%d\n”,count,i);}
则程序段的输出结果为( )。
A) 7,8
B) 8,8
C) 7,10
D) 8,10
25、参考答案:D
【解析】在C语言中,定义一维数组的语句一般形式如下:
类型名 数组名[常量表达式];
一维数组的引用形式为:数组名[下标表达式]。count表示能被2整除或被5整除的个数,i则计算有多少个数组元素。
26.以下程序运行后的输出结果是( )。
#include<string.h>
void f(char *s,char *t){ char k;
k=*s;
*s=*t;
*t=k;
s++;t--;
if(*s)f(s,t);
}
main(){ char str[10]=”welcome”,*p;
p=str+strlen(str)/2+1;
f(p,p-2);
printf(“%s\n”,str);
}
A) eelcomw
B) weoclme
C) welcome
D) emoclew
26、参考答案:D
【解析】该程序中f函数的功能是交换两个位置字符的值,f函数共调用3次,依次更改了字符串中l和o、e和m、w和e的值,因此更改后的字符串的值是emoclew。
27.设有如下程序段:
int x=2004,y=2008;
printf(“%d\n”,(x,y));
则以下叙述中正确的是
A) 输出值为2004
B) 输出值为2008
C) 运行时产生出错信息
D) 输出语句中格式说明符的个数少于输出项的个数,不能正确输出
27、参考答案:B
【解析】(x,y)考查逗号表达式,逗号运算符的结合性为从左到右,因此,最后一个表达式的值就是此逗号表达式的值,因此选项B)正确。
28.有以下程序:
#include <stdio.h>
void fun(char*c,int d){ *c=*c+1;d=d+1;
printf(“%c,%c,”,*c,d);
}
main(){ char b=a,a=A;
fun(&b,a); printf(“%c,%c\n”,b,a);
}
程序运行后的输出结果是( )。
A) b,B,b,A
B) b,B,B,A
C) a,B,B,a
D) a,B,a,B
28、参考答案:A
【解析】函数fun的第一个参数传指针,可以将更改后的值传回调用函数,第二个参数传值,不能将更改后的值传回调用函数,故选A)。
29.有以下程序:
#include <stdio.h>
#include <string.h>
main(){ char a[10]=”abcd”;
printf(“%d,%d\n”,strlen(a),sizeof(a));
}
程序运行后的输出结果是( )。
A) 7,4
B) 4,10
C) 8,8
D) 10,10
29、参考答案:B
【解析】strlen()用来返回字符串的长度,而sizeof()返回的是一个对象或者类型所占的内存字节数,即数组所占的内存。
30.若有定义int a[2][3];,则对a数组的第i行第j列(假设i,j已正确说明并赋值)元素值的正确引用为( )。
A) *(*(a+i)+j)
B) (a+i)[j]
C) *(a+i+j)
D) *(a+i)+j
30、参考答案:A
【解析】本题考查了二维数组元素的引用方法。选项A)中a+i指向了数组a的第i+1行,*(a+i)则是第i+1行第0列的地址值,*(a+i)+j指向了数组a第i+1行,j+1列,*(*(a+i)+j)取到的是数组a的a[i][j]元素。
31.有以下程序:
#include <stdio.h>
main()
{ char c1,c2,c3,c4,c5,c6;
scanf(“%c%c%c%c”,&c1,&c2,&c3,&c4);
c5=getchar(); c6=getchar();
putchar(c1);putchar(c2);
printf(“%c%c\n”,c5,c6);
}
程序运行后,若从键盘输入(从第1列开始)
123<回车>
45678<回车>
则输出结果是( )
A) 1267
B) 1256
C) 1278
D) 1245
31、参考答案:D
【解析】putchar(c1)输出1,putchar(c2)输出2,printf(“%c%c\n“,c5,c6)输出45。
32.以下程序的运行结果是( )。
#include <stdio.h>
int a=1;
int f(int c){ static int a=2;
c=c+1;
return(a++)+c;}
main(){ int i,k=0;
for(i=0;i<2;i++){int a=3;k+=f(a);}
k+=a;
printf(“%d\n”,k);
}
A) 17
B) 16
C) 15
D) 14
32、参考答案:D
【解析】fun函数语句return(a++)+c;中访问的a,是其内部定义的静态局部变量,main函数中语句k+=f(a)访问的a是其局部变量,所以两次调用实际上都是调用f(3)。第一次调用时,fun函数中c=4,表达式(a++)+c的值为6,a递增为3,k=6。第二次调用时,fun函数中c=4,表达式(a++)+c的值为7,a递增为4,k=6+7=13。语句k+=a中的a是全局变量,所以k=13+1=14。
33.设有定义:int n1=0,n2,*p=&n2,*q=&n1;,以下赋值语句中与n2=n1;语句等价的是( )。
A) *p=*q;
B) p=q;
C) *p=&n1;
D) p=*q;
33、参考答案:A
【解析】本题考查的是指针变量的赋值。题目中各变量定义后,指针变量p指向了变量n2所在的存储单元,指针变量q指向了变量n1所在的存储单元,要使得n1的值赋给n2,可用指针变量q所指向的存储单元的值赋给指针变量p所指向的存储单元,即*p=*q。
34.设有如下说明:
typedef struct ST
{ long a;
int b;
char c[2];
}NEW;
以下说法正确的是( )。
A) NEW是一个结构体变量
B) NEW是一个结构体类型
C) ST是一个结构体类型
D) 以上说明形式非法
34、参考答案:B
【解析】以上形式定义NEW表示ST的结构类型,然后可以用NEW来说明结构体变量。因此选项B)正确
35.有以下程序:
#include <stdio.h>
#include <string.h>
typedef struct{ char name[9]; char sex; float score[2]; }STU;
void f(STU a)
{ STU b={“Zhao”,’m’,85.0,90.0}; int i;
strcpy(a.name,b.name);
a.sex=b.sex;
for(i=0;i<2;i++) a.score[i]=b.score[i];
}
main()
{ STU c={“Qian”,’ f ‘,95.0,92.0};
f(c);
printf(“%s,%c,%2.0f,%2.0f\n”,c.name,c.sex,c.score[0],c.score[1]);
}
程序的运行结果是( )。
A) Qian,f,95,92
B) Qian,m,85,90
C) Zhao,f,95,92
D) Zhao,m,85,90
35、参考答案:A
【解析】本题考查的是函数调用时的参数传递以及结构体变量的引用的问题。程序在调用函数f时,传给函数f的参数只是结构变量c在栈中的一个拷贝,函数f的所有操作只是针对这个数据拷贝进行的修改,这些都不会影响变量c的值。
36.有以下程序:
#include <stdio.h>
#define N 4
void fun(int a[][N],int b[]){ int i;
for(i=0;i<N;i++) b[i]=a[i][i];
}
main(){ int x[][N]={{1,2,3},{4},{5,6,7,8},{9,10}},y[N],i;
fun(x,y);
for(i=0;i<N;i++)printf(“%d,”,y[i]);
printf(“\n”);
}
程序的运行结果是( )。
A) 1,2,3,4,
B) 1,0,7,0,
C) 1,4,5,9,
D) 3,4,8,10,
36、参考答案:B
【解析】该题目中fun函数的功能是将二维数组a中符合条件的值赋给一维数组的符合条件的元素。主函数的功能是将符合条件的一维数组的元素进行输出。
37.有以下程序:
#include<stdio.h>
int fun(int x,int y){ if(x!=y)return((x+y)/2);
else return(x);
}
main(){ int a=4,b=5,c=6;
printf(“%d\n”,fun(2*a,fun(b,c)));
}
程序运行后的输出结果是( )。
A) 3
B) 6
C) 8
D) 12
37、参考答案:B
【解析】本题中对函数fun()进行了嵌套的调用。首先调用fun(5,6),返回值为5,2*a的值为8,然后调用fun(8,5),最终输出值为6.
38.若x是int型变量,且有下面的程序片段:
for(x=3;x<6;x++) printf((x%2)?(“**%d”):(“##%d\n”),x);
上面程序片段的输出结果是( )。
A) **3
##4
**5
B) ##3
**4
##5
C) ##3
**4##5
D) **3##4
**5
38、参考答案:B
【解析】& 按位与,如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。| 按位或,两个相应的二进制位中只要有一个为1,该位的结果值为1。2的二进制为00000010,4的二进制为00000100,所以做或运算结果为00000110,该数与5即00000101做与操作结果为00000100,即4。
39.有以下程序:
#include <stdio.h>
#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
40.有以下程序:
#include<stdio.h>
main(){ unsigned char a=8,c;
c=a>>3;
printf(“%d\n”,c);
}
程序运行后的输出结果是( )。
A) 32
B) 16
C) 1
D) 0
40、参考答案:C
【解析】本题中将8赋值给字符变量a,则a的二进制为”00001000″,a>>3的位运算是把a向右移动三位,结果为”00000001″,输出其十进制的值1。