11.设有以下定义:int a=0; double b=1.2 #define d 2
则下面语句中错误的是
、a++; B、 b++ C、 c++; D、 d++;
12.在下列选项中,没有构成死循环的是。
A、int i=100;
B、for(;;);
while(1)
{ i=i%100+1;
if(i>100) break;
}
C、int K=10000;
D、int s=36;
do{k++;}while(k>10000); while(s) --s;
13.设int x=1,y=1;表达式(!x||y--)的值是。
A、0
B、1
C、2
D、-1
14.以下能正确定义一维数组的是。
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”;
15.若有说明语句:c=’\72’;则变量c
A、包含1个字符
B、包含2个字符
C、包含3个字符
D、说明不合法,c的值不确定
16.下面叙述中不正确的是。
A、char a[10]=“china”;
B、char a[10],*p=a;p=“china”;
C、char *a;a=“china”;
D、char a[10],*p;p=a=“china”;
17. 有以下程序
main()
{ int a=0,b=0,c=0,d=0;
if(a=1) b=1;c=2;
else d=3;
printf(“%d,%d,%d,%d\n”,a,b,c,d);
}
程序的输出是。
A、0,1,2,0
B、0,0,0,3
C、1,1,2,0
D、编译有错
18. 若要求从键盘读入含有空格字符的字符串,应使用函数。
A、getc()
B、gets()
C、getchar()
D、scanf()
19.以下不能正确计算代数式?sin2(?)值的C语言表达式是______。
A、1/3*sin(1/2)*sin(1/2)
B、sin(0.5)*sin(0.5)/3
C、pow(sin(0.5),2)/3
D、1/3.0*pow(sin(1.0/2),2)
20.以下程序的功能是:给r输入数据后计算半径为r的圆面积s,程序在编译时出错。
main()
/* Beginning */
{int r; float s;
scanf("%d",&r);
s=∏*r*r; printf("s=%f\n",s);
}
出错的原因是______。
A、注释语句书写位置错误
B、存放圆半径的变量r不应该定义为整型
C、输出语句中格式描述符非法
D、计算圆面积的赋值语句中使用了非法变量
21.有以下程序段:
int n,t=1,s=0;
scanf("%d",&n);
do{ s=s+t; t=t-2; }while (t!=n);
为使此程序段不陷入死循环,从键盘输入的数据应该是______。
A、任意正奇数
B、任意负偶数
C、任意正偶数
D、任意负奇数
22.以下四个程序中,完全正确的是。
A、#include
B、#include
main(); main()
{/*programming*/ {/*/programming/*/
printf(“programming!\n”); printf(“programming!\n”);
} }
C、#include
D、include
main() main()
{/*/*programming*/*/ {/*programming*/
printf(“programming!\n”); printf(“programming!\n”);
} }
23.在以下给出的表达式中,与while (E)中的(E)不等价的表达式是。
A、(!E==0)
B、(E>0||E<0)
C、(E==0)
D、 (E!=0)
24.设fp为指向某二进制文件的指针,且已读到词文件末尾,则函数feof(fp)的返回值为
A、EOF
B、非0值
C、0
D、NULL
25.现有如下程序段,此程序段编译有错误,则程序段的错误出在。
#include
main()
{ int a=30,b=40,c=50,d;
d=a>30?b:c;
switch(d){ case a: printf(“%d”,a);
case b: printf(“%d”,b);
case c: printf(“%d”,c)
default: printf(“#”);
}
A、default: printf(“#”);这个语句
B、d=a>30?b:c;这个语句
C、case a: printf(“%d”,a); case b: printf(“%d”,b); case c: printf(“%d”,c);这三个语句
D、switch(d) 这个语句
二、读程题(5’*6=30分)
1.有以下程序
main()
{int i=1,j=1,k=2;
if((j++||k++)&&i++)
printf(“%d,%d,%d”,i,j,k);
}
执行后的输出结果是:。
2.有以下程序
main()
{ int i,j,x=0;
for(i=0;i<2;i++)
{x++;
for(j=0;j<=3;j++)
{if (j%2) continue;
x++;
}
x++;
}
printf(“x=%d\n”,x);
}
程序执行后的输出结果是。
3.有以下程序:
#include
struct STU
{char name[10];
int num;
};
void f(char *name, int num)
{ struct STU s[2]={{"SunDan",20043},{"Penghua",20044}};
num=s[0].num;
strcpy(name,s[0].name);
}
main()
{ struct STU s[2]={{"YangSan",20041},{"LiSiGao",20042}},*p;
p=&s[1]; f(p->name,p->num);
printf("%s %dn",p->name,p->num);
}
程序运行后的输出结果是______。
4.int fac(int n)
{static int f=1;
f=f*n;
return (f);
}
main()
{ int i;
for(i=1;i<=5;i++)
printf(“%d!=%d\n”,i,fac(i));
}
该程序运行结果为。
5.有以下程序
main()
{ int i,s=0,t[]={1,2,3,4,5,6,7,8,9};
for(i=0;i<9;i+=2) s+=*(t+i);
printf(“%d\n”,s);
}
程序执行后的输出结果是。
6.以下程序的输出结果是。
#define MAX(x,y) (x)<(y)? (x) : (y)
main()
{ int a=5,b=2,c=3,d=3,t;
t= MAX(a+b,c+d)*10;
printf(“%d\n”,t);
}
三、程序填空(2’*10=20分)
1.下面的程序实现的是指针p所指向的地址的n个数中,求出最大的和最小的数据,请填空。fun(int *p ,int n)
{ int *q;
int max,min;
max=min=*p;
for(q=p; (1) ;q++)
if( (2) ) max=*q;
else if( (3) ) min=*q;
}
2.以下程序的功能是:输出100以内(不含100)能被4整除且个位数为8的所有整数,请填空。
main()
{ int I,j;
for(i=0; (1) ;i++)
{ j=i*10+8;
if( (2) )continue; /*如果j是4的倍数则打印否则就进行下一次循环*/
printf(“%3d”,j);
}
}
3.以下程序的功能是输入任意整数给n后,输出n行由大写字母A开始构成的三角形字符阵列图形。例如,输入整数5(注意:n不得大于10),程序运行结果如下:
A B C D E
F G H I
J K L
M N
O
请填空完成该程序。
#include
main()
{ int i,j,n; char ch=’A’;
(1) ; /*读入n的值*/
if (n<11)
{ for(i=1;i<=n;i++)
{ for(j=1;j<= n-i+1;j++)
{ printf(“%2c”,ch);
(2) ; /*每个ch的值都不一样*/
}
(3) ;
}
}
else printf(“n is too large!\n”);
}
4.以下函数sstrcat()的功能是实现字符串的连接,即将t所指的字符串复制到s所指字符串的尾部。例如:s所指字符串为abcd,t所指字符串为efgh,函数调用后s所指字符串为abcdefg。请填空完成该程序。
#include
void sstrcat(char *s ,char *t)
{int n;
n= (1) ; /*先确定s的长度*/
while(*(s+n)= (2) ){s++;t++;} /*将t的内容逐一赋给s中*/
}
第二部分(数据结构)
一、填空题(1’*15=15分)
1.两个字符串相等的充分必要条件。
2. 线形表中元素的数目称为线形表的。
3. 一棵树有 n(n>0)个结点的满二叉树共有叶子结点。
4. 一棵深度为4的二叉树最多有个结点。
5. 若一棵二叉树中有10个度为2的结点,则它有个叶子。
6. 具有8个顶点的无向图,边的总数最多为。
7. 折半查找有序表(2,4,8,12,20,25,35),若查找元素35,它将依次与表中元素
比较大小。
8. 在双链表中,每个结点有两个指针域,一个指向前驱结点,另一个指向。
9. 广义表(((a,b)))的表头是,表尾是空。
10. 假定含有30个元素的线形表顺序存储,欲在它的第15个和第16个元素之间插入一个新元素,共需移动个元素。
11. 设数组A[0..6,0..5]的基地址是1024,每个元素占2个存储单元,若以行优先顺序存储,则A[2..4]的存储地址是。
12. 折半查找的时间复杂度为。
13. 算术表达式A+B*(C+D/E)转为后缀表达式后为。
14. 在排序算法中,每次从未排序的记录中挑出最小(或最大)关键码字的记录,加入到已排序记录的末尾,该排序方法是排序。
表示尾指针,则入队时的操作为。
15.循环队列
....存储在数组A[0..m]中,rear
二、选择题(3’*10=30分)
1.顺序存储设计时存储单元的地址()。
A、一定不连续
B、一定连续
C、不一定连续
D、部分连续,部分不连续
2.线性表(a1,a2,…,an)以链式存储时,访问第i位元素的时间复杂性为()。
A、O(1)
B、O(i)
C、O(N)
D、O(i-1)
3.以下数据结构中,非线性数据结构的是()。
A、树
B、字符串
C、队列
D、堆栈
4.输入序列为ABC,可以变为BAC时,经过的栈操作为()
A、push, pop, push, pop, push, pop
B、push, push, push, pop, pop, pop
C、push, push, pop, pop, push, pop
D、push, pop, push, push, pop, pop
5.在解决计算机主机与打印机之间的速度不匹配问题通常设置了一个打印机数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则从该缓冲区中取出数据打印。该缓冲区应该是一个()结构。
A、队列
B、堆栈
C、8数组
D、线性表
6. 含有3个结点的二叉树的深度可能是( ):
A、0或1
B、1或2
C、2或3
D、 3或4
7.设队列
..q=(a1,a2,… ,a n),则在q中删去一个元素后,q为。
A、q=(a1,a2,…,a n-1)
B、 q=(a2,a3, …,a n)
C、q=(a1,a2,… ,a i-1,a i+1,a i+2 ,… ,a n)
D、以上都有可能
8.一个栈的输入序列为1234,则()不可能是其出栈序列。
A、4312
B、1243
C、2134
D、3214
9.广义表L=(A,(B,(C))),进行TAIL(L)操作后的结果为()
A、(C)
B、 B,(C )
C、(B,(C))
D、((B,(C)))10.线索二叉树中结点T没有右孩子的主要条件是()
A、T->RightThread=NULL
B、T->LeftThread=1
C、 T->RightThread=1
D、T->RightThread=0
三、判断题(1’*10=10分)
1.哈希表是一种特殊的线性表。()
2.顺序存储方式只能用于存储线性结构。()
3. (101,88,46,70,34,39,45,58,66,10)是一个堆。()
4.线性表采用链表存储时,结点和结点内部的存储空间可以是不连续的。()
5.栈和队列都是限制存取点的线性结构。()
6.在消除递归时不一定需要使用栈。 ( )
7.若一个广义表的表头为空表,则此广义表亦为空表。 ( )
8.完全二叉树的某结点若无左孩子,则它必定是也结点。 ( )
9.顺序查找法适用于存储结构为顺序或链接存储的线性表。 ( ) 10. 数据元素是数据的最小单位。 ( ) 四、计算画图题(16+9+10+10=45)
1.分别用(1)中序遍历(2)先序遍历(3)后序遍历(4)层序遍历,求图1的遍历序列。
2. 画出图2的邻接表,给出从源点到汇点的最短时间。
3. 给定19个字符组成的电文“AAABBBBAAABBCCDDEEE “,试为字符A ,B ,C ,D ,E 设计哈夫曼(Huffman )编码。(1)、画出相应的哈夫曼树,并计算其路径长度(WPL );(2)、分别列出A ,B ,C ,D ,E 的哈夫曼编码(约定左0右1)。
4.请写出用下面不同的排序方法对关键字序列(64,24,7,89,6,5)进行排序的第一趟排序结果(升序)。 (1)希尔排序: (2)选择排序; (3)冒泡排序; (4)快速排序; (5)归并排序。
a1=6 a2=4 a3=5 a4=1 a5=1 a6=2 a7=9
a8=7 a9=4
a10=2 a11=4 ① ② ③ ④ ⑤
⑥
⑦ ⑧ ⑨ 图2
第一部分答案
一、选择题(2’*25=50分)
1.A
2.C
3.D
4.B
5.D
6.C
7.A
8.D
9.C 10.C 11.D 12.D 13.B 14.B 15.A
16.D 17. D 18. B 19. A 20. D 21. D 22. B 23. B 24. B 25.C
二、(5’*6=30分)
1. 2,2,2
2.x=8
3. SunDan 20042
4. 1!=1↙ 2!=2↙ 3!=6↙ 4!=24↙5!=120 ↙
5. 25
6. 60
三、程序填空(2’*10=20分)
1.(1) q
max(或者max<*q) (3)*q*q)
2.(1)i<10(或者i<=9) (2)j%4!=0 (或者j%4 )
3.(1)scanf(“%d”,&n); (2) ch++ (3)printf(“\n”)(或者putchar(‘\n’))
4.(1)strlen(s) (2)*t
第二部分答案
一、填空题(1’*15=15分)
1.长度相等且各个对应位置上的字符都相等
2. 长度
3. (n+1)/2
4. 24-1=15
5.11
6.28
7.12、25、35
8.后继结点
9. ((a,b)) 10.15 11.1056
12.O(log2 n) 13.ABCDE/+*+ 14.选择 15. rear=(rear+1) mod (m+1)
二、选择题(3’*10=30分)
1. B
2. B
3. A
4. C
5. A
6. C
7. B
8. A
9. D 10. C
三、判断题(1’*10=10分)
1.×
2. ×
3. √
4. ×
5. √
6. √
7. ×
8. √
9.√ 10. ×
四、计算画图题(16+9+10+10=45)
1. 解:(1)先序遍历序列为:abdgcefhi ……4分
(2)中序遍历序列为:dgbaechif……4分
(3)后序遍历序列为:gdbeihfca ……4分
(4)层序遍历序列为:abcdefghi ……4分
2.解:(1)图2的邻接表为:……6分(2)最短时间为:18 ……3分
3. 解:因为个字符的使用频度(即可认为是各字符的权值)分别为:
A:6;B:6;C:2;D:2;E:3;因此按照哈夫曼编码要求可得哈夫曼树为:
路径长度为:……2分 WPL=(2+2)*3+(3+6+6)*2 =42 字符的哈夫曼编码为:……每个1分 A :10 B :11 C :000 D :001 (哈夫曼树 )……3分 E :01
或者为:(路径长度同上)
编码为: 编码为:
A :00 A :00
B :01 B :01
C :110 C :100
D :111 D :101
E :10 E :11
4.解:对关键字序列(64,24,7,89,6,5)的第一趟排序结果分别如下: (1)希尔排序:64,7,6,89,24,5 ……2分 (2)选择排序;5,64,24,7,89,6 ……2分 (3)冒泡排序;24,7,64,6,5,89 ……2分 (4)快速排序;5,24,7,6,64,89 ……2分 (5)归并排序:24,64,7,89,5,6 ……2分 1
3
2
12
2 7 19 6 6 4 1 1 0 1
1 0 0 C D
E
A B 4
1 1 0 3
2 12
2 7 19
6 6 C
D
E
A
B 1 1 0 0 0
2
1999
12
6 6 A
B C D 2
E
3 4 7 0 0
0 1
1 1 1
打卡制度