1.一个栈的初始状态为空。现将元素1、2、3、4、5、A、B、C、D、E依次入栈,然后再依次出栈,则元素出栈的顺序是( )。
A) 12345ABCDE
B) EDCBA54321
C) ABCDE12345
D) 54321EDCBA
参:B
【解析】栈是先进后出的原则组织数据,所以入栈最早的最后出栈,所以选择B)。
2.下列叙述中正确的是( )。
A) 循环队列有队头和队尾两个指针,因此,循环队列是非线性结构
B) 在循环队列中,只需要队头指针就能反映队列中元素的动态变化情况
C) 在循环队列中,只需要队尾指针就能反映队列中元素的动态变化情况
D) 循环队列中元素的个数是由队头指针和队尾指针共同决定
参:D
【解析】循环队列有队头和队尾两个指针,但是循环队列仍是线性结构的,所以A)错误;在循环队列中只需要队头指针与队尾两个指针来共同反映队列中元素的动态变化情况,所以B)与C)错误。
3.在长度为n的有序线性表中进行二分查找,最坏情况下需要比较的次数是( )。
A) O(n)
B) O(n2)
C)
D)
参:C
【解析】当有序线性表为顺序存储时才能用二分法查找。可以证明的是对于长度为n的有序线性表,在最坏情况下,二分法查找只需要比较次,而顺序查找需要比较n次。
4.下列叙述中正确的是( )。
A) 顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的
B) 顺序存储结构只针对线性结构,链式存储结构只针对非线性结构
C) 顺序存储结构能存储有序表,链式存储结构不能存储有序表
D) 链式存储结构比顺序存储结构节省存储空间
参:A
【解析】链式存储结构既可以针对线性结构也可以针对非线性结构,所以B)与C)错误。链式存储结构中每个结点都由数据域与指针域两部分组成,增加了存储空间,所以D)错误。
5.数据流图中带有箭头的线段表示的是( )。
A) 控制流
B) 事件驱动
C) 模块调用
D) 数据流
参:D
【解析】数据流图中带箭头的线段表示的是数据流,即沿箭头方向传送数据的通道,一般在旁边标注数据流名。
6.在软件开发中,需求分析阶段可以使用的工具是( )。
A) N-S图
B) DFD图
C) PAD图
D) 程序流程图
参:B
【解析】在需求分析阶段可以使用的工具有数据流图DFD图,数据字典DD,判定树与判定表,所以选择B)。
7.在面向对象方法中,不属于"对象"基本特点的是( )。
A) 一致性
B) 分类性
C) 多态性
D) 标识唯一性
参:A
【解析】对象有如下一些基本特点:标识唯一性、分类性、多态性、封装性、模块性好。所以选择A)。
8.一间宿舍可住多个学生,则实体宿舍和学生之间的联系是( )。
A) 一对一
B) 一对多
C) 多对一
D) 多对多
参:B
【解析】因为一间宿舍可以住多个学生即多个学生住在一个宿舍中,但一个学生只能住一间宿舍,所以实体宿舍和学生之间是一对多的关系。
9.在数据管理技术发展的三个阶段中,数据共享最好的是( )。
A) 人工管理阶段
B) 文件系统阶段
C) 数据库系统阶段
D) 三个阶段相同
参:C
【解析】数据管理发展至今已经历了三个阶段:人工管理阶段、文件系统阶段和数据库系统阶段。其中最后一个阶段结构简单,使用方便逻辑性强物理性少,在各方面的表现都最好,一直占据数据库领域的主导地位,所以选择C)。
10.有三个关系R、S和T如下:
由关系R和S通过运算得到关系T,则所使用的运算为( )。
A) 笛卡尔积
B) 交
C) 并
D) 自然连接
参:D
【解析】自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉,所以根据T关系中的有序组可知R与S进行的是自然连接操作。
11.以下不能用于描述算法的是
A) 文字叙述
B) 程序语句
C) 伪代码和流程图
D) E-R图
参:D
【解析】算法的描述有伪代码、流程图、N-S结构图等。E-R是实体联系模型。所以选择D。
12.以下选项中合法的实型常量是
A) 0
B) 3.13e-2.1
C) .914
D) 2.0*10
参:C
【解析】A选项为整型数据。B选项中e后面必须为整数。D选项是表达式,不是常量,所以选择C。
13.以下叙述中正确的是
A) a是实型变量,a=10在C语言中是允许的,因此可以说:实型变量中可以存放整型数
B) 在赋值表达式中,赋值号的右边可以是变量,也可以是任意表达式
C) 若有int a=4,b=9; 执行了a=b后,a的值已由原值改变为b的值,b的值变为0
D) 若有int a=4,b=9; 执行了a=b;b=a;之后,a的值为9,b的值为4
参:B
【解析】B选项中a是实型变量,a=10在C语言中是允许的,但是实型变量中不可以存放整型数。C选项中执行a=b后,a的值变为b的值,为9,b的值不变,仍为9。D选项中执行a=b后,a的值为9,b的值为9,执行b=a后,a的值为9,b的值也为9,所以选择B。
14.以下选项中合法的变量是
A) 5a
B) _10_
C) A%
D) sizeof
参:B
【解析】变量的命名要符合标识符的命名规则,即由下划线、字母或数字组成,且必须以下划线或字母开始,也不能和关键字相同,所以选择B。
15.不能正确表示数学式的表达式是
A) a/c*b
B) a*b/c
C) a/ b* c
D) a*(b/c)
参:C
解析】/号和*号的优先级处于平级,结合性都是自左至右。所以选择C,C式子表示的是。
16.有以下程序
#include main() { int a=3; printf("%d\\n", ( a+=a-=a*a )); } 程序运行后的输出结果是 A) 3 B) 9 C) 0 D) -12 参:D 【解析】首先计算a*a,结果为9,然后执行a=a-9,即3-9,结果为-6,然后执行a=(-6)+(-6),即a=的值为-12。所以选择D。 17.若变量已正确定义,以下选项中非法的表达式是 A) a!=4||'b' B) 'a'=1/2*(x=y=20,x*3) C) 'a' % 4 D) 'A' + 32 参:B 【解析】A选项中'a'即表示a为字符常量,再给'a'赋值1/2*(x=y=20,x*3),是不正确的。因此B选项正确。 18.有以下程序 #include main() { int x=35, B; char z='B' ; B = (( x ) && ( z <'b' )); printf("%d\\n", B ); } 程序运行后的输出结果是 A) 1 B) 0 C) 35 D) 66 参:A 【解析】本题重点考察逻辑运算符和关系运算符的相关知识,已知变量x为整型变量,并赋值为35,变量z为字符型变量,并赋值为'B'。语句B=((x)&&(z<'b'));中,(x)的值为1,'B'的asscii码小于'b'的asscii码,所以(z<'b')的值也为1,1&&1结果为1。因此A选项正确。 19.与数学表达式x≥y≥z对应的C语言表达式是 A) (x>=y)||(y>=x) B) (x>=y>=z) C) (x>=y)!(y>=z) D) (x>=y)&&(y>=z) 参:D 【解析】本题考察关系表达式和逻辑表达式,y大于等于x同时y小于等于z,因此x<=y和y<=z是逻辑与的关系。因此D选项正确。 20.有以下程序 #include main() { double x=2.0, y; if( x<0.0 ) y=0.0; else if( (x<5.0) && (!x) ) y=1.0 / ( x+2.0 ); else if( x<10.0 ) y=1.0 / x; else y=10.0; printf(" %f\\n ", y ); } 程序运行后的输出结果是 A) 0.000000 B) 0.250000 C) 0.500000 D) 1.000000 参:C 【解析】本题重点考察if语句,变量x和y均为double类型,由于变量x赋值为2.0,因此执行if((x<5.0)&&(!x)),即条件为0,继续执行if( x<10.0 ),条件为1,即执行y=1.0 / x;。依据printf()函数输出类型中f是以小数形式输出单、双精度实数。因此C选项正确。 21.有以下程序 #include main() { int i, sum; for( i=1; i<6; i++ ) sum+=i; printf("%d\\n", sum); } 程序运行后的输出结果是 A) 随机值 B) 0 C) 15 D) 16 参:A 【解析】本题重点考察for语句,变量没有初始化的情况下,默认值与编译器有关系,不同的编译器有不同的值。因此A选项正确。 22.有以下程序 #include main() { int a = 3; do { printf("%d,", a-=2 ); } while( ! (--a) ); printf("\\n"); } 程序运行后的输出结果是 A) 1 B) 1, -2, C) 3,0, D) 1,0 参:B 【解析】本题重点考察do……while语句,该循环语句的特点是,先执行循环中的语句,然后再判断表达式是否为真, 如果为真则继续循环;如果为假, 则终止循环。因此, do-while循环至少要执行一次循环语句。变量a赋初值为3,每循环一次需执行语句a-=2一次,同时循环条件使变量a自减1,所以第一次循环后变量a变为1,第2次循环后变量a变为-2。因此A选项正确。 23.有以下程序 #include void fun( int a, int b, int c ) { a=b; b=c; c=a; } main() { int a=10 , b=20, c=30; fun( a, b, c ); printf("%d,%d,%d\\n",c,b,a); } 程序运行后的输出结果是 A) 10,20,30 B) 30,20,10 C) 20,30,10 D) 0,0,0 参:B 【解析】函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。因此B选项正确。 24.有以下程序 #include main() { int c[6]={10,20,30,40,50,60}, *p,*s; p = c; s = &c[5]; printf("%d\\n", s-p ); } 程序运行后的输出结果是 A) 5 B) 50 C) 6 D) 60 参:A 【解析】首先初始化一维数组c[6],语句p = c;指将c[0]元素的地址赋给指针变量p;语句s = &c[5];指将c[5] 元素的地址赋给指针变量s。程序最后输出s-p,即结果为5。因此A选项正确。 25.有以下程序 #include main() { int a[3]={0}, i, j, k=2; for( i=0; i } 程序运行后的输出结果是 A) 0 B) 2 C) 1 D) 3 参:D 【解析】该题首先初始化一维数组a[3]所有元素都为0;执行嵌套循环for语句,当i=0、j=0时,a[0]=a[0]+1=1;当i=0、j=1时,a[1]=a[0]+1=2;当i=1、j=0时,a[0]=a[1]+1=3;当i=1、j=1时,a[1]=a[1]+1=3;因此D选项正确。 26.有以下程序 #include main() { int a[5]={2,4,6,8,10}, *p,**k; p = a; k = &p; printf("%d ", *( p++ ) ); printf("%d\\n", **k ); } 程序运行后的输出结果是 A) 4 6 B) 4 4 C) 2 2 D) 2 4 参:D 解析】首先通过p=a使p指向数组的第1个元素,所以输出2;在输出2以后,由于p++,即p就指向数组的第2个元素,**k就是取出p所指向元素的值,而p指向的是数组的第2个元素,即输出4。因此D选项正确。 27.有以下程序 #include main() { int aa[3][3]={ {2},{4},{6} }, i, *p = &aa[0][0]; for ( i=0; i<2; i++ ) { if( i == 0 ) aa[i][i+1] = *p + 1; else ++p; printf("%d ", *p ); } } 程序运行后的输出结果是 A) 2 6 B) 2 3 C) 4 3 D) 4 6 参:B 【解析】观察题目,可以发现,*p=&aa[0][0]语句实际是将数组aa的首地址赋给了指针变量p,将i的值带入for循环中,i=0时,aa[0][1]=3,*p=2;*p输出的是指针所指向的数组值,此时p所指向的是aa[0][0],输出2,而i=1时执行了++p操作使指针向后移动指向了aa[0][1],所以在输出*p时应为3。因此B选项正确。 28.以下fun函数返回数组中最大值的下标 #include int fun( int *s,int n ) { int i , k; for( i=0 , k=i; i return ( k ) ; } 在横线处应填入的内容是 A) ++k B) i = k C) k++ D) k = i 参:D 【解析】fun函数的功能是返回数组中最大值的下标。通过for循环语句,每次将最大的数给k,即k=i。因此D选项正确。 29.有以下程序 #include int fun( char s[] ) { char *p = s; while( *p != 0 ) p++; return ( p-s ); } main() { printf("%d\\n", fun("0ABCDEF") ); } 程序运行后的输出结果是 A) 1 B) 6 C) 7 D) 0 参:C 【解析】本题考查字符串作为函数参数以及while语句,本题中传入字符串OABCDEF,然后执行fun后,就得到了该字符串中字符的个数,不包括结尾符,该字符串有7个字符,所以答案为C。 30.若有以下程序段 char str[4][12]={ "aa int i; for( i = 0; i< 4; i++ ) strp[i] = str[i]; 不能正确引用字符串的选项是 A) str[0] B) strp C) strp[3] D) *strp 参:B 【解析】本题考查字符串指针作为函数参数,本题中p作为字符串指针传入fun中,p指向的内容并没有发生变化,所以选项B正确。 31.有以下程序 #include #include void fun ( char *s ) { char a[10]; strcpy( a, "STRING" ); s = a; } main() { char *p="PROGRAM"; fun( p ); printf("%s\\n",p); } 程序运行后的输出结果是(此处□代表空格) A) STRING B) STRING□□□□ C) STRING□□□ D) PROGRAM 参:D 【解析】本题考查字符串指针作为函数参数,本题中p作为字符串指针传入fun中,p指向的内容并没有发生变化,所以选项D正确。 32.有以下程序 #include void fun ( int n ,int *s ) { int f; if( n==1 ) *s = n+1 ; else { fun( n-1, &f) ; *s = f ; } } main() { int x =0; fun( 4,&x ); printf("%d\\n",x); } 程序运行后的输出结果是 A) 3 B) 1 C) 2 D) 4 参:C 【解析】本题考查函数的递归调用,将函数参数带入函数中,一步步递归即可得到结果,结果为2,选项C正确。 33.有以下程序 #include main() { char c[2][5]={"6938 int i, j, s=0; for( i=0; i<2; i++ ) p[i]=c[i]; for( i=0; i<2; i++ ) for( j=0; p[i][j]>0 ; j+=2 ) s=10*s+p[i][j]-'0'; printf("%d\\n",s); } 程序运行后的输出结果是 A) 9284 B) 9824 C) 6982 D) 6385 参:D 【解析】本题中首先是将二维字符数组c赋值指针数组p,然后遍历p找到两个字符串中的偶数位置的字符并组成一个数值输出,根据代码执行即可得到结果为6385 34.有以下程序 #include void fun ( int *s ) { static int j=0; do s[j] += s[ j+1]; while(++j<2); } main() { int i, a[10]={1,2,3,4,5}; for( i=1; i<3; i++ ) fun( a ); for( i=1; i<5; i++ ) printf("%d",a[i]); printf("\\n"); } 程序运行后的输出结果是 A) 34756 B) 5745 C) 5795 D) 35745 参:B 【解析】本题主要考查do…while语句,执行fun函数后,a数组里面的元素变为35745,输出后四个字符,所以结果为5745,选项B正确。 35.有以下程序段 int *p; p= __________ malloc( sizeof( int )); 若要求使p指向一个int 型的动态存储单元,在横线处应填入的是 A) (int *) B) int C) int * D) ( *int ) 参:A 【解析】本题考查malloc函数,题目中要求p指向一个int型的动态存储单元,那么就应该将分配的存储单元转化为int,所以选项A正确。 36.有以下程序 #include #define SUB( X, Y ) (X+1)*Y main() { int a=3, b=4; printf("%d\\n",SUB(a++ ,b++ )); } 程序运行后的输出结果是 A) 25 B) 20 C) 12 D) 16 参:D 【解析】本题考查宏定义,宏定义只是做个简单的替换,执行SUB(a++ ,b++)=(a++ +1)*b++=16,选项D正确。 37.有以下程序 #include main() { char c[2][5]={"6938 int i, j, s=0; for( i=0; i<2; i++ ) p[i]=c[i]; for( i=0; i<2; i++ ) for( j=0; p[i][j]>0 ; j+=2 ) s=10*s+p[i][j]-'0'; printf("%d\\n",s); } 程序运行后的输出结果是 A) 6938 B) 9824 C) 4528 D) 6385 参:D 【解析】本题中首先是将二维字符数组c赋值指针数组p,然后遍历p找到两个字符串中的偶数位置的字符并组成一个数值输出,根据代码执行即可得到结果为6385 38.若有以下程序段 struct st{ int n; struct st *next; }; struct st a[3]={ 5,&a[1],7,&a[2],9,'\\0' }, *p; p=&a[0]; 则以下选项中值为6的表达式是 A) p->n B) (*p).n C) p->n++ D) ++(p->n) 参:D 【解析】本题考查结构体变量的引用,其中a为定义的结构体数组,D选项中p->n为5,++(p->n)为6,所以D选项正确。 39.有以下程序 #include main() { int i=1; i = i^i; printf("%d\\n", i ); } 程序运行后的输出结果是 A) 1 B) -1 C) 0 D) 7 参:C 【解析】本题考查位运算中按位异或运算符,异或运算只有在两个比较的位不同时其结果是1,否则结果为0,i^i运算符两边相同,所以结果为0,选项C正确。 40.以下程序用来统计文件中字符的个数(函数feof用以检查文件是否结束,结束时返回非零) #include main() { FILE *fp; long num=0; fp=fopen("fname.dat while( __________ ){ fgetc(fp); num++;} printf("num=%d\\n",num); fclose( fp ); } 下面选项中,填入横线处不能得到正确结果的是 A) feof(fp)==NULL B) !feof(fp) C) feof(fp) D) feof(fp)==0 参:C 【解析】本题考查文件的定位,feof函数的用法是从输入流读取数据,如果到达文件末尾(遇文件结束符),eof函数值为非零值,否则为0,while判断条件应是如果没有到达文件末尾,所以选项C不能得到正确的结果。