1、选择题((1)至(10)每题2分,(11)至(50)每题1分,共60分)
下列问题A)、B)、c)、D)的四个选项中,只有一个选项是正确的。 请将正确选项写在答题卡相应位置上。 试卷上的答案不会被计分。
(1)算法的空间复杂度是指。
A) 算法程序的长度 B) 算法程序中的指令数
c) 算法程序占用的存储空间 D) 算法执行过程中所需的存储空间
答案:D
点评:算法的空间复杂度一般是指执行该算法所需的内存空间。
算法占用的存储空间包括算法程序占用的空间、输入初始数据占用的存储空间以及算法执行过程中需要的额外空间。
(2) 下列关于栈的说法正确的是?
A)只有数据可以插入堆栈 B)只有数据可以从堆栈中删除
C) 栈是一个先进先出的线性表 D) 栈是一个先进先出的线性表
答案:D
注释:栈是一种仅限于一端进行插入和删除的线性列表。
堆栈按照“先进后出”或“后进先出”的原则组织数据。 因此,栈又称为“先进后出”表或“后进先出”表。
(3) 在深度为5的满二叉树中,叶子节点的个数为。
A)32B)31C)16 D)15
答案:C
点评:所谓满二叉树,是指除最后一层外,每一层的所有节点都有两个子节点。 也就是说,在满二叉树中,每一层的节点数达到最大,即满二叉树的第K层有2K-1个节点,深度为m 有 2m 个节点。 。
在满二叉树中,最后一层的节点数就是叶节点数。 本题深度为5,所以叶子节点数为25-1=24=16。
(4) 对于建立良好的编程风格,下列描述正确的是。
A) 程序应该简单、清晰、可读。 B) 符号名称的命名应符合语法。
c) 充分考虑程序的执行效率 D) 程序的注释是可选的
答案:A
点评:要形成良好的编程风格,应注意和考虑以下因素:符号名称的命名应具有一定的实际意义,以利于程序功能的理解; 正确的注释可以帮助读者理解程序; 程序编写应优先考虑清晰性。 除非对效率有特殊要求,否则编程首先要写得清晰,其次才是效率。
(5)下列对对象概念的描述错误的是?
A) 任何对象都必须具有继承 B) 对象是属性和方法的封装
C) 对象之间的通信依赖于消息传递。 D) 操作是对象的动态属性。
答案:A
点评:对象是由数据和允许的操作组成的封装,与客观实体有直接的对应关系。 对象之间通过传递消息来进行通信,模拟现实世界中不同事物之间的关系。
(6)下列哪项不属于软件工程三要素?
A) 512 工具 B) 流程 C) 方法 D) 环境
答案:D
点评:软件工程包括三个要素,即方法、工具和过程。
(7)程序流程图(PFD)中的箭头表示。
A) 数据流 B) 控制流 C) 调用关系 D) 组合关系
答案:B
点评:程序流程图(PFD)是一种传统的、广泛使用的软件过程设计表示工具。 它通常也称为程序框图。 它的箭头代表控制流。
(8)数据管理技术的发展过程中,经历了手工管理阶段、文件系统阶段和数据库系统阶段。 其中,数据独立性最高的阶段是。
A) 数据库系统 B) 文件系统 c) 手工管理 D) 数据项管理
答案:A
点评:在数据管理技术的发展过程中,经历了手工管理阶段、文件系统阶段和数据库系统阶段。 数据独立性最高的阶段是数据库系统。
(9) 调用使用树结构表示实体之间关系的模型。
A) 关系模型 B) 层次模型 C) 网络模型 D) 数据模型
答案:B
点评:层次模型是最早开发的数据库模型。 它的基本结构是树形结构,这在现实世界中很常见,比如家庭结构、行政组织,都是自上而下、层次分明的。
(10)关系数据库管理系统可以实现的专门的关系操作包括。
A) 排序、索引、统计 B) 选择、投影、连接
C) 关联、更新、排序 D) 显示、打印、制表
答案:B
点评:关系数据库管理系统可以实现专门的关系操作,包括选择操作、投影操作和连接操作。
(11)下列语句中,符合C语言语法的赋值语句是。
A)a--7+b+c--a+7B)a=a+7
C)a=7+b,b++,a+7; D)a=7+b,c=a+7;
答案:D
注释:由于赋值语句是由赋值表达式加分号组成,因此选项A和B不是合法的赋值语句; 选项c中有两个运算符:逗号运算符和赋值运算符,其中赋值运算符优先级最高,即使选项c也不是。
(12)以下程序
主要的()
{int y=9;
for(;y>O;y--i){
如果 (y%3==O)
{("%d",--y);
输出是。
A)741B)852C)963D)
答案:B
注释:“%”是求余运算符,所以if判断语句实际上是说只有当y能除以3时才能继续; --y 是先进行y的自减操作,然后再使用y值。 因此,最终打印的结果应该是“852”。
(13)下列四种说法错误的是?
A)C语言中的关键字必须小写
B)C语言中的标识符必须全部由字母组成
C) C语言不提供输入输出语句
D) C语言中的注释行可以出现在程序的任何地方
答案:B
注释:C语言规定标识符只能由字母、数字和下划线三个字符组成,且第一个字符必须是字母或下划线。
(14)以下程序
主要的()
int a=-l,b=4,k;
k=(a++0) 0 (x>0)
0 (xC)y= -1(x=O) D)y=l (x=O)
1 (x>O)0 (x>O)
答案:C
点评:本题的考点是根据程序写出数学函数关系。
题中的两个判断语句实际上指出了y取值的条件,即当x大于零时,y取l; 当x小于0时,y取0; 当x等于0时,y的值保持不变,为-1。
(17)以下程序
主要的()
{int x=3,y=O,z=O;
if(x=y+z)("* * * *");
别的 (”####”);
。
A) 有语法错误,无法编译。
B) 输出 * * * *。
c) 可以编译,但是无法连接,所以无法运行。
D)输出####
答案:D
点评:这道题的考点是表达式中运算符的处理原理。
在这道题中,y+z的值被赋给x。 由于y和z都等于0,所以x的值也为0,表达式值为假,输出为 。 if语句中if后面的表达式一般是逻辑表达式或关系表达式,但也可以是任意数值类型。
(18) 在C语言中,合法的长整型常量是。
A)OLB)))
答案:A
注释:如果在整型常量后添加字母l或L,则认为该常量是long int常量。
(19)以下函数
int funl(char*x)
{字符*y=x;
而(*y++);
(yx-1);
函数是.
A) 计算字符串的长度 B) 比较两个字符串的大小
C) 将字符串 x 复制到字符串 y D) 将字符串 x 连接到字符串 y
答案:A
点评:本题的测试点是while()循环语句。
这题首先要注意的是*y++的操作。 由于++和*具有相同的优先级,且组合方向是从右到左,因此等价于*(y++)。 由于++在y的右边,是“后加”的,所以先对y的原值进行*操作,然后改变y的值。
(20) 假设int i=2j=l,k=3,则表达式i&&(i+j)&k︱i+j的值为。
A)OB)2C)lD)3
答案:C
评语:本题表达式中的优先顺序从高到低依次是括号、+、&、︱、&&。
(21) 已知字母A的ASCII码十进制为65。 下面的程序
主要的()
{字符chl,ch2;
Chl='A'+'5'-'3':
ch2='A'+'6'-'3':
("%d,%Cn",chl,ch2);
输出。
A)67, DB) B, CC) C, DD) 不确定值
答案:A
注释:由于字符“5”和“3”的ASCII码相差2,所以运算后ch1的值应为65+2=67; 同样,运算后ch2的值应为65+3=68。 那是字符“D”。
(22)下列程序的输出结果是。
#
主要的()
int a,b,d=24l:
a=d/l00%9;
b=(-1)&&(-1);
("%d,%d\n",a,b);
A)6,1B)2,1C)6,0D)2,0
答案:B
注释:第一个表达式中,运算方向是从左到右,所以a的值为2; 在第二个表达式中,等式右侧是逻辑表达式。 由于结果为 true,因此表达式 的值为 l,即 b 为 1。
(23)下列选项中非法的表述是。
A) 0'd'执行语句结束本次循环(即跳过p++;语句),或者继续比较'w'>'d',程序进入无限循环。
(39)下列程序的输出结果是。
主要的()
{联合{char i[2];
墨水:
} r;
河我[0]=2; r. 我[1]=0;
("%d\n",rk);
A)2B)l C)0D)不确定
答案:A
点评:根据联合体的定义,可以看出联合体r的成员k和成员i[2]共享相同的内存空间。 因此,当程序给出 r 时。 i[0]被赋值后,实际上联合体成员k的值也确定了,为2。所以打印输出应该是2。
(40)假设p1和p2是指向同一个int型一维数组的指针变量,k是int型变量,则下列语句不能正确执行的是。
A)l(=*pl+*p2; B)p2=k; C)p1=p2; D)k=*pl*(*p2);
答案:B
注释:指针变量中仅存储地址(指针)。 不要将整数(或任何其他非地址类型数据)分配给指针变量,因此 B 不正确。
(41)下列程序的输出结果是。
# f(x)X*X
主要的()
{int a=6, b=2, c;
c=f(a)/f(b);
("%d\n",c);
A)9B)6 C)36D)18
答案:C
注释:观察程序段可以看出,宏带参数扩展只是将#命令行中的形式参数替换为语句中宏名称后面括号内的实际参数字符串。 本题将c=f(a)/f(b)替换为#f(x)X*X,得到c=f(6)/f(2),即c=6*6/2 *2,结果是 36 。
(42) 假如有如下定义:
char s[20]="",*ps=s;
它不能代表字符。 表达式是.
A)ps+2B)s[2] C)ps[2]D)ps+=2,*ps
答案:A
注释:ps+2是s[21的地址,存放字符。 地址,所以A是错误的。
(43)下列程序的输出结果是。
主要的()
{因蒂;
for(i=1;i{if(i%2){(“∥);;}
(“带领');
(“\n”);
A B C D)*#*#*
答案:A
评语:我从1到5循环了5次。 当i为1时,满足条件并打印“#”。 当 i 为 2 时,条件为假并打印“*”。 也就是说,当i为奇数时,条件为真,程序打印“#”,否则打印“*”。
(44)有以下程序
主要的()
整数n=9:
同时(n>6)
n--;
(“%d|.,n);
该程序的输出是。
A)987B)876 C)8765D)9876
答案:B
点评:n>6对应的n只有7、8、9; 因此循环次数为3。选项c和D可以被消除。 并且由于n在输出之前需要执行n--,所以输出结果只能是876。
(45) 以下程序将十进制正整数转换为八进制数。 程序空白处应填入的语句是。
#
主要的()
int I=9,a,b[10]={0};
scanf("%d",&a);
子(a,b);
for(;i>=O;i--)("%d",b[I]);
子(int c,int d[])
{int e,i=O;
而(c!= 0)
{e=c%8;
d[i]=e;
;
我++:
;
A)c=e/8B)C=C%8 C)C=C/8D)c=e%8
答案:C
点评:本题主要考察基数转换的除法和余数舍入方法。 在该算法中,首先将数c除以8的余数作为转换后的八进制数的第l位,然后对c除以8的商进行相同的操作,直到商为0,所以本题应选c。
(46) 执行以下程序段
整数x=35;
字符 z='A';
整数B:
B=((x&15)&&(zI[l]=0x38;
("%x\n",s->k);
A)3839B)3938 C))
答案:A
注释:main函数定义了一个共享变量a和一个指向该变量的指针s。 执行s->i[0]=0x39; s->i[1]=0x38;,并将union的第一个和第二个字节存储为十六进制数据0x39和0x38。 在主体中,变量一起占用存储空间,在输出中s->k。 当时,它实际上输出的是最开始写入的数据。 对于PC来说,存储int类型数据时,低位在前,高位在后,所以这题的输出是3839。
(49) 假如有如下定义:int t[3][2]; 能正确表示t数组元素地址的表达式是。
A)&t[3][2]B)t[3] C)t[1]D)*t[2]
答案:C
点评:选项A和B的表达式均越界; 选项D中,*t[2]是目标变量,它是一个整数值,而不是地址值。
(50) 下列结构类型变量的定义哪一个是错误的?
A)aa
整数n:
浮动米:
}aa;
aatdl;
B)# 啊啊啊
啊啊{
整数n:
浮动米:
}tdl;
C)
整数n:
浮动米:
}aa;
;
D)
整数n:
浮动米:
}tdl;
答案:C
点评:本题的考点是结构体类型变量的定义。
选项c中,aa是结构体变量,不是结构体名,所以aatdl; 是非法的。
2.填空(每空2分,共40分)
请在答题卡上编号为 [1] 至 [20] 的水平线上的每个空白处写下正确答案。 试卷上的答案不会被计分。
(1) 假设一棵完全二叉树共有 500 个节点,则二叉树中有 [1] 个叶子节点。
答案:[l]250
点评:所谓完全二叉树,是指除最后一层外,每一层的节点数均达到最大值; 最后一层只有右侧的几个节点缺失。
对于n个节点的完全二叉树,父节点的数量为int(n/2),叶子节点的数量等于汇总点的数量减去父节点的数量。 本题中,n=500,所以父节点数量等于int(500/2)=250,叶子节点数量等于500-250=250。
(2) 在最坏情况下,冒泡排序的时间复杂度为[2]。
答案:【2】n(n-1)/2 或 O(n(n-1)/21
点评:冒泡排序是最简单的交换排序方法。 它通过交换相邻的数据元素逐渐将线性列表变成有序的。
假设线性表的长度为n,在最坏的情况下,冒泡排序需要从前往后n/2次扫描和从后往前n/2次扫描,需要的比较次数为n。 (n-1)/2。
(3)面向对象编程方法中涉及的对象是用来描述系统中客观事物的对象[3]。
答案:[3] 实体
点评:面向对象编程方法中涉及到的对象是用来描述系统中客观事物的实体。 它是构成系统的基本单元。 它由一组表示其静态特性的属性和一组它可以执行的操作组成。 作品。
(4)软件需求分析阶段的工作可以概括为四个方面:[4]、需求分析、编写需求规格说明和需求评审。
答案:【4】需求获取
评估:软件需求分析阶段的工作可以概括为四个方面:需求获取、需求分析、编写需求规格说明和需求评审。 需求获取的目的是确定目标系统需求的各个方面。 涉及的主要任务是建立获取用户需求的方法框架,并支持和监控获取用户需求的过程。
(5)[5]是数据库应用的核心。
答案:[5]数据库设计
点评:数据库设计是数据库应用的核心。 数据库应用系统的一个核心问题是设计一个既能满足用户需求又具有良好性能的数据库。 这就是数据库设计。
(6) 如果定义如下,则指针p不移动,通过指针p引用值为98的数组元素的表达式为[6]。
int w[10]: {23,54,10,33,47,98,72,80,61}, *p=w;
答案:[6]*(p+5) 或 p[5]
点评:本题的考点是通过指针引用数组元素。
98是数组w的第5个元素(第一个是第0个),+p=w已经将p指向了数组w。 如果想引用98而不移动指针p,有两种方法:p[5],*(p+5)。
(7) 以下程序的输出结果为[7]。
# MAX(x,y)(x)>(y)?(x):(y)
主要的()
int a=5,b=2,c=3,d=3,t;
t=MAX(a+b,c+d)*10;
("%d\n",t);
答案:【7】7
注释:宏替换后,表达式 t=MAX(a+b, c+d)*10 变为: t=(a+b)>(c+d)?(a+b): (c+d )* 10;
由于 (a+b)>(c+d) 成立,因此 t=(a+b),即 7。
(8) 以下程序的输出结果为[8]。
主要的()
短a=65536;
整数b:
primf("%d\n", b=a);
答案:[8]0
注释:简单来说,它可以取的最大值是65535。在这里指定一个值。 65536,已经超出了它的取值范围,所以它的高位将被截断,只分配低位给它(全零)。 所以a的值实际上是0。
(9)若im a=25,b:14,c=19; 定义完毕后,下面三元运算符(?:)组成的语句的执行结果为[9]。
一个++。 10)?3. x-1 1: (x>=1)?x: 2*x-1; 功能是先求出(x>=1)?x: 2*x-1:的值,然后将结果与前面的语句进行比较,形成条件表达式进行求值。 因此,[10]应填写x=1。
(11)在下面的程序中,用户通过键盘输入一个文件名,然后输入一串字符(以mix结束输入)并存储在这里。
file,形成一个文本文件,并将字符数写入文件末尾。 请填空。
#
主要的()
{文件*fp;
,fname[32];im 计数=0;
(“输入:”);
scanf("%s",fname);
if((coin=fopen([12],"w+"))==NULL)
{print无法打开文件:%s\n",fname};exit(0);}
(“输入数据:在”);
while((ch=())!_1≠)')
{fputc(ch, fp); 计数++;}
(【13】,"\n%d\n",计数);
(fp);
答案:【12】fname
【13】fp
注释:fopen()函数实现了打开文件的功能。 通常的调用方法是:FILE*fp; fp=fopen(文件名,使用文件模式)。 因此,第一条水平线需要要打开的文件的名称,fname。 。 ()函数的一般调用方式为:(文件指针、格式字符串、输出表列),因此第二横行处应填写fb。
(12)函数void fun(noat*sn, int n)的功能为:根据以下公式计算s,计算结果通过形参指针sn返回; n通过形参传入,n的值大于等于0,请完成程序。
S=I-1/3+1/5-1/7+. . . +1/(2n+1)
无效乐趣(浮点* sn,int n)
{ 浮点数 s=O. O,w,f=-1.0;
整数i = 0:
对于(I=0;ib)
{m=a;a=b;【18】;}
我=a。 j=b;
while((n=【19】)!=O)
{j=i;i=【20】;}
返回(一);
答案:【18】b=m
【19】j%i
【20】n
注释:函数中的变量i和j分别存储两个形参的最小和最大数。 在执行语句 i=a 和 i=b 之前,必须将 a 和 b 分别更改为最小数和最大数。 当a>b时,程序使用中间变量来交换两者,所以题中第一个空格应填“b=m”; 为了找到两个整数的最大公约数,当j整除i时,程序的where循环条件必须为真。 因此,问题_中的第二个空格应填写“j%i”; 程序应该通过i的值返回最大公约数,因此在循环中应该将每次整数除法的公约数赋值给i,以保证最终返回的值为两个整数的最大公约数,因此“n”应填写在第三个字段中。