选择题
公共知识
【1】设线性表的长度为12。最坏情况下冒泡排序需要的比较次数为()。
最坏情况下冒泡排序需要的比较次数为n(n - 1) / 2, 本题中n = 12, 故需要比较66次。
【2】设栈与队列初始状态为空。将元素A, B, C, D, E, F, G, H依次轮流入栈和入队, 然后依次轮流退队和出栈, 则输出序列为()。
栈是先进后出的线性表, 队列是先进先出的线性表。
将元素A, B, C, D, E, F, G, H依次轮流入栈和入队, 这时栈中的元素为ACEG, 队列中的元素为BDFH; 然后依次轮流退队和出栈, 即队列中B元素退队, 然后栈中G元素出栈, 队列中D元素退队, 栈中E元素出栈, 以此顺序, 完成所有元素退队和出栈, 则输出序列为B, G, D, E, F, C, H, A。
将元素A, B, C, D, E, F, G, H依次轮流入栈和入队, 这时栈中的元素为ACEG, 队列中的元素为BDFH; 然后依次轮流退队和出栈, 即队列中B元素退队, 然后栈中G元素出栈, 队列中D元素退队, 栈中E元素出栈, 以此顺序, 完成所有元素退队和出栈, 则输出序列为B, G, D, E, F, C, H, A。
【3】树的度为3, 共有29个结点, 但没有度为1和2的结点。则该树中叶子结点数为()。
树的度为3, 即树中只存在度为0、1、2、3的结点, 假设叶子结点数为n, 由于没有度为1和2的结点, 则度为3的结点数为29 - n, 根据树中的结点数=树中所有结点的度之和+1, 得3×(29 - n) + 0×1 + 0×2 + n×0 + 1 = 29, 得出的n不为整数, 因此不存在这样的树。
【4】循环队列的存储空间为Q(0 : 59), 初始状态为空。经过一系列正常的入队与退队操作后, front = 25, rear = 24。循环队列中的元素个数为()。
设循环队列的存储空间为Q(1 : m), 初始状态为空。
在循环队列运转起来后, 如果rear - front > 0, 则队列中的元素个数为rear - front个; 如果rear - front < 0, 则队列中的元素个数为rear - front + m。
本题中front = 25, rear = 24, rear - front < 0, 则元素个数为24 - 25 + 60 = 59。
在循环队列运转起来后, 如果rear - front > 0, 则队列中的元素个数为rear - front个; 如果rear - front < 0, 则队列中的元素个数为rear - front + m。
本题中front = 25, rear = 24, rear - front < 0, 则元素个数为24 - 25 + 60 = 59。
【5】下面描述正确的是()。
计算机软件是由程序、数据及相关文档构成的完整集合, 它与计算机硬件一起组成计算机系统。
【6】单元测试不应涉及的内容是()。
单元测试主要针对模块的5个基本特征进行:模块接口测试, 局部数据结构测试, 重要的执行路径的检查, 检查模块的错误处理能力, 影响以上各点及其他相关点的边界条件测试。
【7】面向对象方法中, 将数据和操作置于对象的统一体中的实现方式是()。
封装是指从外面看只能看到对象的外部特性, 对象的内部对外是不可见的, 即将数据和操作置于对象的统一体中。
【8】在数据库设计中, 将ER图转换成关系数据模型的过程属于()。
数据库的逻辑设计主要工作是将ER图转换成指定RDBMS中的关系模式。
【9】学校的每个社团都有一名团长, 且一个同学可同时担任多个社团的团长, 则实体团长和实体社团间的联系是()。
每个社团都有一名团长, 一个同学可同时担任多个社团的团长, 则实体团长和实体社团间的联系是一对多。
【10】定义学生选修课程的关系模式如下:
SC(S#, Sn, C#, Cn, G, Cr)(其属性分别为学号、姓名、课程号、课程名、成绩、学分)
该关系可进一步归范化为()。
关系SC的主键为复合键(学号, 课程号), 但明显存在课程号→课程名, 课程号→学分等, 存在非主属性对主属性的部分依赖。
对关系SC进行如下的分解, 就可以消除对非主属性的部分依赖, 满足第二范式:S(S#, Sn), C(C#, Cn, Cr), SC(S#, C#, G)。
对关系SC进行如下的分解, 就可以消除对非主属性的部分依赖, 满足第二范式:S(S#, Sn), C(C#, Cn, Cr), SC(S#, C#, G)。
专业知识
【11】以下叙述中错误的是()。
计算机只能接受和处理由0和1的代码构成的二进制指令或数据, 这种形式的指令是面向机器的, 称为机器语言, 而C语言属于高级语言, 用高级语言编写的程序称为源程序, 选项A错误, B正确;
源程序通过编译器编译生成二进制代码, 由二进制代码表示的程序称为目标程序, 选项C正确;
由顺序结构、选择结构、循环结构这三种基本结构构成的程序是结构化程序, 选项D正确;
本题答案A
【12】以下合法的用户标识符是()。
C语言中, 标识符的命名规则是:由字母、数字和下划线组成, 并且第一个字符必须是字母或下划线, 选项A中, $符号不合法;
选项B中以数字开头, 不合法;
选项D中, -符号不合法;
选项C正确;
本题答案C
【13】以下定义变量i、j、k并赋初值的语句, 正确的是()。
C语言中一条语句必须以分号结尾, 在使用变量前必须要给出变量的定义, 定义时必须指明变量的类型, 选项A中使用关键字int定义三个变量i, j, k, 并初始化, 中间使用逗号分隔, 属于同一条语句, 可以只使用同一种类型, 正确;
选项B、C、D中, 变量j和k未定义就使用, 错误;
本题答案A
【14】以下叙述中错误的是()。
整型变量可以存放实数, 但是由于整型数值的数值范围比实数小, 所以在存放较大实数时, 会有误差, 选项A错误;
实型数的数值范围比整数大, 所以实型可以精确存放一个整数, 选项B正确;
无符号整数最高位不用来存放整数符号, 所以无符号数不可能是负数, 选项C正确;
负整数在内存中是以"补码"形式存放的, 选项D正确;
本题答案A。
【15】若有定义语句:int a = 2;, 则以下表达式值不等于3的是()。
题意中a的初值为2, 表达式++a的值为3, 将表达式的值重新赋值给a, a的值是3, 所以整个表达式的值是3, 选项A正确;
a = a + 1是将a自增1, a的值为3, 所以整个表达式的值是3, 选项B正确;
a += 1等价于a = a + 1, 也是将a自增1, a的值为3, 所以整个表达式的值是3, 选项C正确;
a = a++首先将a的值重新赋给a, 此时a的值是2, 整个表达式的值是2, 执行完了之后, a的值自增1, 变成3, 所以整个表达式的值是2, 选项D错误;
本题答案D
【16】设有定义:double x = 5.1012;, 若要求只输出x的整数部分, 以下不能实现此要求的语句是()。
x是double类型数据, 输出格式符要使用%f或%lf, 而不是%d, 选项A错误, 输出实数时, 可以指定输出宽度:n1.n2, 其中n1指定输出数据的宽度, 包括小数点;
n2指定小数点后小数位的位数, 所以选项B、C、D都是输出整数部分, 正确;
本题答案A
【17】设有定义:int a = 0, b = 1;, 则执行以下表达式后, 不能使变量a和b的值都增1的是()。
a的初值为0, b的初值为1, 表达式a++ && b++首先执行a++, 由于是后缀自增运算符, 所以a++的值是0, 整个表达式的值确定是假, 由于逻辑与运算符的短路原则, 后续b++不再执行, 所以b没有自增1, 选项A不能使a和b都自增1, 其他选项都可以, 本题答案A
【18】有以下程序
#include <stdio.h>
void main() {
int s, m = 10;
scanf("%d", &s);
if (s < 30)
m--;
if (s < 40)
m--;
else if (s < 50)
m--;
else
m++;
printf("m=%d
", m);
}
程序运行时输入:25<回车>, 则输出结果是()。
程序首先定义整型变量s和m, m初值为10, 接着通过scanf函数输入25赋给s, if语句判断s < 30成立, 所以执行m--, 此时m的值是9;
接着if语句判断s < 40成立, 再次执行m--, 此时m的值是8;
由于第二个if语句执行了, 所以else语句不再执行, 输出m的值是8, 本题答案C
【19】有以下程序
#include <stdio.h>
void main() {
int m = 10247, a = 0, b = 0, c = 0;
do {
switch (m % 10) {
case 0:
m /= 10;
a++;
case 1:
case 3:
case 5:
case 7:
case 9:
m /= 10;
b++;
case 2:
case 4:
case 6:
case 8:
m /= 10;
c++;
}
} while (m != 0);
printf("%d,%d,%d
", a, b, c);
}
程序运行后的输出结果是()。
程序定义整型变量m初值10247, a, b, c初值为0, 接着执行do...while循环, 使用switch语句从个位开始判断m的数值位
第1轮循环:m = 10247, 个位数字是7, 执行case 7, case9, m除以10等于1024, b自增1后值为1;
接着执行case 2, case 4, case 6, case 8, m再除以10等于102, c自增1后值为1;
第2轮循环:m = 102, 个位数字是2, 执行case 2, case 4, case 6, case 8, m除以10等于10, c自增1后值为2;
第3轮循环:m = 10, 个位数字是0, 执行case 0, m除以10等于1, a自增1后值为1;
继续执行case 1, case 3, case 5, case 7, case 9, m除以10等于0, b自增1后值为2;
继续执行case 2, case 4, case 6, case 8, m除以10等于0, c自增1后值为3
循环结束;
综上, a的值为1, b的值为2, c的值为3
本题答案:B
【20】有以下程序
#include <stdio.h>
void main() {
int m = 128, n = 256, k = 100;
while (n / k > m / k) {
n %= k;
m %= k;
k /= 10;
}
printf("n=%d
", n);
}
程序运行后的输出结果是()。
程序定义整型变量m初值为128, n初值为256, k初值为100, while循环的循环条件:n / k > m / k, n / k为2, m / k为1, 2 > 1为真, 执行循环体
第1次循环:n %= k, n的值为56, m %= k, m的值为28, k /= 10, k的值为10, 此时n / k值为5, m / k的值为2, 循环条件满足, 执行循环体;
第2次循环, n %= k, n的值是6, m %= k, m的值是8, k /= 10, k的值是1, n / k > m / k, n / k = 6, m / k = 8, 6 < 8为假, 循环结束, 输出n的值为6, 本题答案D。
【21】以下合法的字符常量是()。
题意中的字符都以开头, 都属于转义字符, 选项A以x开头, 表示十六进制数6D代表的ASCII码字符, 合法;
不允许大写字母X也不能使用0x开头, 选项B和C不合法;
选项D中 68表示八进制068代表的ASCII字符, 但是068是不合法的八进制数, 选项D不合法;
本题答案:A
【22】有以下程序
#include <stdio.h>
#include <ctype.h>
void main() {
char ch;
do {
ch = getchar();
if (islower(ch))
ch -= 32;
else
continue;
printf("%c", ch);
} while (ch != '!');
}
程序运行时输入:1aB2cD !<回车>, 则输出结果是()。
程序定义字符变量ch, do...while()循环中每次读入一个字符, 使用islower函数判断该字符是否是小写字母, 如果是, 则将该字符的ASCII码值减去32(由于英文字母的ASCII码按照字母表顺序连续递增, 且小写字母的ASCII码值比对应的大写字母的ASCII码值大32, 所以小写字母减去32, 可以得到对应的大写字母), 得到对应的大写字母, 然后输出, 如果不是大写字母, 执行continue, 跳过剩余循环体, 执行下一次循环;
直到输入的字符为 !, 表示循环结束;
本题对于输入1aB2cD !, 仅有两个小写字母ac被转换成大写字母输出AC, 本题答案A。
【23】有以下程序
#include <stdio.h>
double fun(double s, double a, double b) {
a = (int) (s);
b = s - a;
return a + b;
}
void main() {
double s = 12.654, a = 11, b = 22;
printf("%5.2lf,", fun(s, a, b));
printf("%5.2lf,%5.2lf
", a, b);
}
程序运行后的输出结果是()。
(1) 函数fun的功能是将参数s的整数部分赋给形参a, 小数部分赋给形参b, 然后返回a + b, 所以可知fun函数返回值等于s;
(2)C语言的参数是按值传递, 所以对形参值的修改不会影响实参(3)格式控制符%lf输出double类型的值, 5.2表述输出宽度为5(包含小数点), 输出2位小数
综上, main函数调用函数fun, 传入s, a, b时, 返回值是s, 输出12.65, 输出a, b的值为:11.00, 22.00
本题答案:C
【24】有以下程序
#include <stdio.h>
int fun(int x) {
return (x / 10);
}
void main() {
int t = 96195;
printf("%d
", fun(fun(fun(t))));
}
程序运行后的输出结果是()。
fun函数的功能是将形参值除以10后返回, 由于参数和返回值都是int类型, 所以舍去小数部分;
main函数连续三次调用函数fun, 将整数t连续除以三次10, 每次调用返回值分别为:9619, 961, 96, 最终程序输出96, 本题答案C。
【25】设有定义:int a[3][2] = { { 1 }, { 2 }, { 3 } };, 则数组元素a[2][1]的值是()。
int a[3][2] = { { 1 }, { 2 }, { 3
}
}
是将数组a的三个元素分别赋值:a[0] = { 1 }, a[1] = { 2 }, a[2] = { 3 }, 即对三个数组的第一个元素赋值为a[0][0] = 1, a[1][0] = 2, a[2][0] = 3, 其他元素全部初始化为0, 所以a[2][1]的值为0, 本题答案C。
【26】有以下程序
#include <stdio.h>
void main() {
int a[3][3] = { { 1 }, { 2 }, { 3 } }, *p[3], i;
for (i = 0; i < 3; i++) {
p[i] = a[i];
a[i][i] = *p[i] + 2;
}
for (i = 2; i >= 0; i--)
printf("%d,", a[i][i]);
}
程序运行后的输出结果是()。
程序首先定义一个二维数组a, 并对其初始化, 初始化后, 数组a的各个元素值分别为:a[0][0] = 1, a[0][1] = 0, a[0][2] = 0, a[1][0] = 2, a[1][1] = 0, a[1][2] = 0, a[2][0] = 3, a[2][1] = 0, a[2][2] = 0, 另外还定义整型指针数组p, 通过第一个for循环, 将a的三个数组元素的地址赋给p的对应元素, 此时p[0]指向a[0], p[1]指向a[1], p[2]指向a[2], 接着将p所指向的数组的第一个元素值+2, 赋值给数组a的对应主对角线上的元素, 通过第一个for循环, a[0][0] = a[0][0] + 2 = 3, a[1][1] = a[1][0] + 2 = 4, a[2][2] = a[2][0] + 2 = 5, 第二个for循环将a的主对角线上的元素逆序输出为5, 4, 3, 本题答案:A
【27】设有以下定义:int a[6], *p = a, i;, 下面循环语句中, 不能从终端读入数据依次放入数组a的是()。
题意定义整型数组a和整型指针p, 并将a的地址赋给p, 使用scanf函数时, 输入项必须是地址, 由于a是一个常量, 表示数组a的地址, 它不能被修改, 所以a++这种语法是错误的, 其他选项都是正确的, 本题答案A。
【28】有以下程序
#include <stdio.h>
int fun(int *x) {
int f;
f = *x + *(x + 1);
return f;
}
void main() {
int a[6] = { 1, 3, 5, 4, 2, 6 }, b[6], i = 0, k = 0;
do {
b[k] = fun(a + i);
k++;
i += 2;
} while (i < 5);
for (i = 0; i < k; i++)
printf("%d,", b[i]);
}
程序运行后的输出结果是()。
题意中, 函数fun的功能是将指针x所指向的元素与x所指向元素的下一个元素相加, 返回相加的结果;
main函数定义一个整数数组a, b, 并对a的6个元素完成初始化, 接着通过do...while循环, 将数组a的下标为偶数的3个元素地址传给函数fun, 将每个元素与其相邻的后续元素之和存放到数组b的前3个元素中, 所以b中前三个元素值分别是:b[0] = a[0] + a[1] = 4, b[1] = a[2] + a[3] = 9, b[2] = a[4] + a[5] = 8, 输出结果为:4, 9, 8, 本题答案B。
【29】若有定义和语句:
#include <string.h>
char str1[] = "Hello!", str2[8] = "