一、选择题(1)~(10)每小题2分,(11)-(50)每小题1分,共60分)
下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上,答在试卷上不得分。
(1)下面叙述正确的是________。
A)算法的执行效率与数据的存储结构无关
B)算法的空间复杂度是指算法程序中指令(或语句)的条数
C)算法的有穷性是指算法必须能在执行有限个步骤之后终止
D)算法的时间复杂度是指执行算法程序所需要的时间
答案:C
评析:算法的设计可以避开具体的计算机程序设计语言,但算法的实现必须借助程序设计语言中提供的数据类型及其算法。数据结构和算法是计算机科学的两个重要支柱。
(2)以下数据结构属于非线性数据结构的________。
A)队列 B)线性表 C)二叉树 D)栈
答案:C
评析:线性表、栈和队列等数据结构所表达和处理的数据以线性结构为组织形式。栈又称后进先出表(Last In First Out);队列又称先进先出表(First:In First Out)。二叉树的数据结构是树型结构,结构中数据元素之间存在着一对多的关系,因此它是一种非线性数据结构。
(3)在一棵二叉树上第8层的结点数最多是________。
A)8 B)16 C)128 D)256
答案:C
评析:根据二叉树的性质:二叉树第i(i≥1)层上至多有2i-1个结点。得到第8层的结点数最多是128。
(4)下面描述中,不符合结构化程序设计风格的是________。
A)使用顺序、选择和重复(循环)三种基本控制结构表示程序的控制逻辑
B)自顶向下
C)注重提高程序的执行效率
D)限制使用goto语句
答案:C
评析:结构化程序设计方法的四条原则是:1.自项向下;2.逐步求精;3.模块化;4.限制使用goto语句。
(5)下面概念中,不属于面向对象方法的是________。
A)对象、消息 B)继承、多态 C)类、封装 D)过程调用
答案:D
评析:面向对象方法是一种运用对象、类、封装、继承、多态和消息等概念来构造、测试、重构软件的方法。面向对象方法从对象出发,发展出对象、类、消息、继承等概念。
(6)在结构化方法中,用数据流程图(DFD)作为描述工具的软件开发阶段是________。
A)可行性分析 B)需求分析 C)详细设计 D)程序编码
答案:B
评析:软件开发阶段包括需求分析、总体设计、详细设计、编码和测试五个阶段。其中需求分析阶段常用的工具是数据流图和数据字典。
(7)软件生命周期中所花费用最多的阶段是________。
A)详细设计 B)软件编码 C)软件测试 D)软件维护
答案:D
评析:软件生命周期分为软件定义、软件开发及软件运行维护3个阶段。本题中详细设计、软件编码和软件测试都属于软件开发阶段;维护是软件生命周期的最后一个阶段。
(8)数据库系统的核心是________。
A)数据模型 B)DBMS C)软件工具 D)数据库
答案:B
评析:数据库管理系统DBMS是数据库系统的核心。DBMS是负责数据库的建立、使用和维护的软件。DBMS建立在操作系统之上,实施对数据库的统一管理和控制。用户使用的各种数据库命令以及应用程序的执行,最终都必须通过DBMS。
(9)下列叙述中正确的________。
A)数据处理是将信息转化为数据的过程
B)数据库设计是指设计数据库管理系统
C)如果一个关系中的属性或属性组并非该关系的关键字,但它是另一个关系的关键字,则称其为本关系的外关键字
D)关系中的每列称为元组,一个元组就是一个字段
答案:C
评析:数据处理是指将数据转换成信息的过程,故选项A叙述错误;设计数据库的目的实质上是设计出满足实际应用需求的实际关系模型;关系中的行称为元组,对应存储文件中的记录,关系中的列称为属性,对应存储文件中的字段,故D选项叙述错误。
(10)下列模式中,________是用户模式。
A)内模式 B)外模式 C)概念模式 D)逻辑模式
答案:B
评析:数据库管理系统的三级模式结构由外模式、模式和内模式组成。外模式,指数据库用户所看到的数据结构,是用户看到的数据视图。模式,是数据库中对全体数据的逻辑结构和特性的描述,是所有用户所见到的数据视图的总和。内模式是指数据在数据库系统内的存储介质上的表示,即对数据的物理结构和存取方式的描述。
(11)C语言规定,程序中各函数之间________。
A)既允许直接递归调用也允许间接递归调用
B)不允许直接递归调用也不允许间接递归调用
C)允许直接递归调用不允许间接递归调用
D)不允许直接递归调用允许间接递归调用
答案:A
评析:c语言规定,程序中各函数之间既允许直接递归调用也允许间接递归调用。
(12)在使用程序流程图来表示算法时,菱形用来表示________。
A)输入与输出B)子程序 C)判断分支 D)循环边界
答案:C
评析:美国国家标准化协会ANSI规定了一些常用的流程图符号,其中椭圆框表示起止框,方框表示处理框,菱形框表示判断分支,箭头表示流程线。
(13)C语言中下列叙述正确的是________。
A)不能使用do…while语句构成的循环
B)do…while语句构成的循环,必须用break语句才能退出
C)do…while语句构成的循环,当while语句中的表达式值为非零时结束循环
D)do…while语句构成的循环,当while语句中的表达式值为零时结束循环
答案:D
评析:选项A是错误的,c语言支持d0…while语句;选项B是错误的,do...while构成的循环,当while语句中的表达式值为零时结束循环,而不是非零;选项c也是错误的。
(14)以下选项中属于C语言的数据类型是________。
A)复数型 B)逻辑型 C)双精度型 D)集合型
答案:C
评析:c语言的数据类型分为基本类型、构造类型、指针类型、空类型四大类。其中,基本类型分为整型、字符型、实型三类。实型又称浮点型,包括单精度型和双精度型两种类型。
(15)在C语言中,不正确的int类型的常数是________。
A)32768 B)0 C)037 D)0xAF
答案:A
评析:c语言中int类型的常数的范围是:-32768~32767。c整常数可用三种形式表示:十进制整数,八进制整数,十六进制整数。选项A超出范围,不正确。
(16)以下程序输出的结果是________。
main()
{
int a=65535;
printf(“%d%u”,a,a);
}
A)-1 -1 B)6553565535 C)-1 65535 D)65535 –l
答案:C
评析:printf函数中不同类型的数据用不同的格式字符,其中%d是按整型数据的实际长度输出十进制整数。变量a=65535以%d格式输出时溢出输出值为该数的补码值,即.1;%u用来输出unsigned型数据,无符号整型变量的数值范围为0~65535,所以变量a=65535以%u格式输出的值为65535。
(17)下列描述中不正确的是________。
A)字符型数组中可以存放字符串
B)可以对字符型数组进行整体输入、输出
C)可以对整型数组进行整体输入、输出
D)不能在赋值语句中通过赋值运算符”=”对字符型数组进行整体赋值
答案:C
评析:c语言规定只能逐个引用数组元素而不能一次引用整个数组。字符数组的输入、输出可以将整个字符串一次输入或输出。所以,选项c的说法是不正确的。
(18)以下程序的输出结果是________。
main()
{ int i,x[3][3]={9,8,7,6,5,4,3,2,1},*p=&x[1][1];
for(I=0;i<4;i+=2)printf(”%d”,p[I]);
}
A)5 2 B)5 l C)5 3 D)9 7
答案:C
评析:题中*p=&x[1][1];是指将数组x的数组元素x[1][1]的地址赋值给指针变量p,使p指向x[11[1]这个数组元素,那么p[0]即为指针变量p当前所指向的数组元素x[1][1]的值。
(19)下列可用于C语言标识符的一组是________。
A)voidWORDdefine B)a 6$sysFor
C)2asizeof abc D)Int define sizeof
答案:D
评析:c语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。注意,大写字母和小写字母被认为是两个不同的字符。C语言中的关键字不能用作标识符。
(20)以下程序的运行结果是__________。
#include “stdio.H”
main()
{
int a[]={1,2,3,4,5,6,7,8,9,10,1 1,12};
int*p=a+5,*q=NULL;
*q=*(p十5);
printf(”%d %d、n”,‘p,*q);
}
A)运行后报错 B)6 6
C)6 12 D)5 5
答案:A
评析:题目中没有给q分配存储单元,只是简单的给它赋了一个值,所以程序的运行结果是6 ll NULL pointer assignment,也就是运行后报错。
(21)以下说法中正确的是_________。
A)C语言程序总是从第一个函数开始执行
B)在C语言程序中,要调用函数必须在main()函数中定义
C)c语言程序总是从main()函数开始执行
D)c语言程序中的main()函数必须放在程序的开始部分
答案:C
评析:c语言的程序是由主函数main()开始运行,由主函数来调用其他函数,函数必须是并列的,定义后使用,不能在一个函数中定义其他函数,main()函数不一定要放在程序的开始部分,故选c。
(22)有如下程序
float fun(int x,int y){return(x+y);}
main()
{
int a=2,b=5,c=8;
printf(”%3.0fn”,fun((int)fun(a+c,b),(a-C)));
}
程序运行后的输出结果为__________。
A)编译出错 B)9 C)21 D)9.0
答案:B
评析:本题中先执行(int)fun(a+c,b)函数的调用,值为整型数值15;然后再执行fun(15,(a-e))函数调用,值为单精度实型数值9.000000。输出为%3.0f,即有效数长度为3,没有小数位数,所以最后结果为9。
(23)能正确表示a和b同时为正或同时为负的逻辑表达式是_________。
A)(a>=‖b>=0)&&(a<O‖b<O) B)(a>=0&&b>=O)&&(a<0&&b<O)
C)(a+b>0)&&(a+b<=0) D)a*b>0
答案:D
评析:选项A中,表达式表示的是a,b为异号;选项B中,表达式表示的是0,因为没有满足条件的值;选项c中,表达式表示的是0,因为没有满足条件的值;选项D表示的是a和b为同号。
(24)若己定义:int a[9],*p=a;并在以后的语句中未改变p的值,不能表示a[l]地址的
表达式是__________。
A)p+l B)a+l C)a++ D)++p
答案:C
评析:数组名是指针常量,是个固定的指针,不能对数组名赋予一个新的地址值,也不能使这个指针常量“移动”,指向数组的其它元素。
(25)以下程序的输出结果是__________。
main()
{ int a==-1,b=1,k;
if((++a<0)&&!(b–<=0))
printf(”%d %dn”,a,b);
else
printf(”%d %d\n”,b,a);
}
A)-1 l B)0 l
C)1 0 D)0 0
答案:C
评析:逻辑运算符的优先次序如下:!(非)→&&(与)→‖(或),但本题需特别、注意的是短路的概念。
(26)下面程序的输出结果是__________。
#define P1(x)printf(x)
main()
{
char d[]。”p”;
Pl(d);
P1(”d”);
}
A)pd B)d”d” C)”p”d D)”p””d”
答案:A
评析:带参数的宏定义的一般形式为:#define宏名(参数表)字符串
程序中的Pl(d);经宏置换后为printf(d);,所以输出字符串p;程序中的Pl(“d”);经宏置换后printf(“d”)。
(27)以下选项中,能定义s为合法的结构体变量的是__________。
A) typedef struct abc
{ double a;
charb[10];
}s;
B) struct
{ double a;
char b[10];
}s;
C) struct ABC
{ double a;
char b[10];
}
ABC s:
D) typedef ABC
{ double a;
char b[10];
}
ABC s:
答案:B
评析:定义一个结构体类型的变量,可采用三种方法:
①先定义结构体类型,再定义变量名;②在定义类型的同时定义变量:③直接定义结构类型变量,即不出现结构体名:选项B符合第三种定义方法。
(28)请读程序:
#include<stdiO.h>
#include<string-h>
main()
{
char*s1=”AbCdEf”, *s2=”aB”;
s1++; s2++;
printf(”%d、n”,strcmp(sl,s2));
}
上面程序的输出结果是________。
A)正数 B)负数 C)零 D)不确定的值
答案:A
评析:strcmp(X1,X2)是串比较函数,本题中“s1”、“s2”分别表示这两个串中第一个字符的地址,s1++和s2++是将指针指向串的第二个字符,则*sl为“bCdEf’’,*s2为“B”。在字符串比较中,大小的确定是各个字符串相应位置字符的ASCII码值的大小决定的, sl>s2,返回值为正数。
(29)请读程序:
#include<stdiO.h>
main()
{
int a=5,b=7,c=9;
printf(”%d,%d,”,a,b,C);
printf(”%d,%d,%d,”a,b);
}
上面程序的输出结果是________。
A)5,7,9,5,7 B)5,7,5,7 C)5,7,不定,7,9 D)5,7,5,7,不定
答案:D
评析:printf函数按格式控制符的个数输出表列中对应的数据,若输出表列的个数大于格式控制符个数,则输出与格式控制符对应的输出表列的数据,输出表列中多的则省略;若格式控制符个数大于输出表列的个数,则输出与格式控制符对应的输出表列的数据,格式控制符多的部分输出的数据是随机的。
(30)请读程序:
#incIude<stdio.h>
func(int a,int b){
Int C;
c=a+b:
return C:
}
main(){
int x=6,y=7,z=8,r;
r=func((x–,y++,x+y),z–);
printf(”%dn”,r);
}
上面程序的输出结果是________。
A)ll B)20 C)2l D)31
答案:C
评析:函数func()的作用是返回两个形参的和,第一个形参是x、y分别自减和自增后的和,其中(x–,y++,x+y)是一个逗号表达式,它的值应该等于x+y,所以整个表达式(x–,y++,x+y)的值为13,而第二个形参的值为8(根据语法规则,应当先使用,后自增),所以func()的返回值为13+8=21。
(31)请读程序:
#include<stdiO.h>
main()
{
int a,b;
for(a=l,b=1;a<=100;a十+){
if(b>=20)break;
if(b%3==1){b+=3;continue;}
b-=5:
}
printf(”%dn”,a);
}
上面程序的输出结果是_________。
A)7 B)8 C)9 D)10
答案:B
评析:break语句的作用是用于跳出循环体; continue语句的作用是用于跳出本次循环。执行第一次循环时,(b%3==1)为真,b=4,继续下一次循环,如此反复,当b=22时结束循环,共循环8次,即a=8。
(32)设变量x为float型且已经赋值,则以下语句中能够将x中的数值保留到小数点后面两位,并将第三位四舍五入的是__________。
A)X=X*100+0.5/100.0 B)x=(X*100+0.5)/100
C)x=(int)(x*100+0.5)/100.0 D)x=(x/100+0.5)*100.0
答案:C
评析:本题通过算术表达式的运算实现小数位数保留两位并四舍五入的操作,其中(int)(x*100+0.5)是指将(x*100+0.5)的值强制转换成整型。
(33)请读程序片段(字符串内没有空格字符):
printf(”%dn”,strlen(”ATS\n012\1\”));
上面程序片段的输出结果是____________。
A)ll B)10 C)9 D)8
答案:C
评析:这个语句的目的是输出“ATS\n012\1\\”这个串的长度,在串中“\”代表一个“\”,而“\1”代表数字1,也占一个字符,“\n”是回车换行符,也占一个字符,加上A、T、s、0、l、2,共9个字符。
(34)运行以下程序后,如果从键盘上输入china撑<回车>,则输出结果为_________。
#include<stdio.h>
main()
{
int v1=0,v2=0;char ch:
while((ch=getchar())!=’#’)
switch(ch)
{
case’a’:
case ‘h’:
default:v1++;
case’0’:v2++:
}
printf(”%d,%d\n”,v1,v2);
}
A)2,0 B)5,0 C)5,5 D)2,5
答案:C
评析:执行完一个case后面的语句后,流程控制转移到下一个case继续执行。“case常量表达式”只是起语句标号作用,并不是在该处进行条件判断。在执行switch语句时,根据switch后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。
(35)请选出可用作c语言用户标识符的一组标识符__________。
A)void B)a3.b3 C)For D)2a
define -123 -abc DO
WORD IF case sizeof
答案:B
评析:c语言规定标识符只能由字母、数字和下划线三种符号组成,而且第一个字符必须是字母或下划线。选项A中的void是c语言的关键字,不合法;选项c中的case和c语言的关键字重名,不合法;选项D中的2a是数字打头而且sizeof和c语言的关键字重名,不合法。
(36)下面能正确定义数组,并正确赋值的语句是_________。
A)int N=5,b[N][N] B]int a[1][2]={{1},{3}}
C)int c[2][]={{1,2},{3,4}} D)int d[3][2]={{1,2},{34}}
答案:D
评析:可以用下面的方法对二维数组初始化:
l、分行给二维数组赋初值。如int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
2、可以将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值。如:
int a[3][4]={1,2,3,4,5,6,7,8;9,10,1 l,12);
3、可以对部分元素赋初值:int a[3][4]={{1},{5},{9}};
它的作用是只对各行第一列的元素赋初值,其余元素值自动为0。
4、如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。如:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
与下面的定义等价:int a[][4]={1,2,3,4,5,6,7,8,9,10,1l,12};
(37)请选出以下程序的输出结果___________。
#include<stdio.h>
sub(int*s,int y)
{ static int t=3;
y=s[t];t–;
}
main()
{ int a[]={1,2,3,4},i,x=0;
for(i=0;i<4;i++){
sub(a,x);printf(”%d”,x);)
printf(”\n”);
}
A)1234 B)432l C)0000 D)4444
答案:C
评析:x作为函数sub()的实参时,函数对x值的改变没有返回主函数,并不能使得x的值变化,所以在打印时,x的值是始终不变的,即为0。
(38)假定下面程序可执行文件名prg.exe,则该程序所在的子目录下输入命令行:prg hello
good<回车>后,程序的输出结果是_________。
main(int argc,char*argv[])
{
int i;
for=1;i<argc;i++)printf(”%c”,*argv[I]);
}
A)heUo good B)hg C)hel D)hellogood
答案:B
评析:带参数的main()函数常用形式为:main(int argc,char.*argv[]),其中,整型变量argc用来记录命令行中的参数个数。参数的个数由c程序运行时自动计算出来。字符型指针数组argv的第一个元素存放命令名,其后各个元素依次存放命令行中各个参数的首地址,数组的大小由argc确定。for循环语句实现输出各参数的第一个字母。
(39)若有以下说明和语句,请选出哪个是对c数组元素的正确引用_________。
int c[4][5],(*cp)[5];
cp=c;
A)cp+l B)*(cp+3) C)*(cp+1)+3 D)*(*cp+2)
答案:D
评析:cp=c这个语句是将数组第0行的地址赋给了cp。cp+1使指针指向二维数组c的第一行;+(cp+3)是数组c的第三行的第0列的地址值;+(cp+1)+3是数组c的第一行第三列的地址值。
(40)下列选项中不能正确定义结构体的是_________。
A)typede fstruct B)struct color c1
{ int red; { int red;
int green; int green;
int blue; int blue;
}cOLOR; };
COLOR cl;
C)struct color D)struct
{ int red; { int red;
int green; int green;
int blue; int blue;
}cl; }cl;
答案:B
评析:将一个变量定义为标准类型与定义为结构体类型不同之处在于:后者不仅要求指定变量为结构体类型,而且要求指定为某一特定的结构体类型(例如,struct color),不能只指定结构体名。其中可以不出现结构体名,答案D就是缺省结构体名的情况。而变量名列表必须放在成员列表后面,所以B答案不能正确将c1定义为结构体变量。
(41)设有以下语句
char a=3,b=6,c;
c=a^b<<2:
则c的二进制值是_________。
A)00011011 B)00010100 C)00011100 D)00011000
答案:A
评析:“<<”是c语言中规定的左移运算符,n是异或运算符,所以,c的二进制值应为0001 1011。
(42)设有如下定义
struct ss
{ char name[10];
int age;
char sex;
}std[3],*p=std;
下列各输入语句中错误的是__________.
A)scanf(”%d”,&(*p).age); B)scanf(”%s”,&std.name);
C)scanf(”%c”,&std[O].sex); D)SCanf(”%c”,&(p->SEX));
答案:B
评析:在c语言中,结构体变量的引用有三种等价方式:
1、结构体变量.成员名;2、(*p).成员名;3、p->成员名。
因为std.name是字符数组名,-本身代表地址,其前面不应该使用“&”符号,所以选项B错误。
(43)设有
static char str[]=”Beijing”;
则执行
printf(%d\n”,strlen(strcpy(str,”China”)));
后的输出结果为__________。
A)5 B)7 C)12 D)14
答案:A
评析:在执行printf()函数前,数组str的长度是7,但是当使用strcpy()函数将新的值赋给str后,strlenr)函数返回的应当是现在的str字符串的字符个数,即是5。
(44)下列程序段中,不是死循环的是__________。
A)int i=100; B)unsigned k=0;
while(1) do
{ {
i=i%100+l: ++k;
if(i>=100)break; }
} while(k>=0);
C)for(;;); D)int s=3379;
while(s++%2+s%2)s++;
答案:A
评析:当表达式为非0值时,执行while语句中的内嵌语句,可用break语句跳出循环,用continue语句结束本次循环。选项A不是死循环,当i=100时跳出循环。选项c为空循环语句。
(45)以下程序的输出结果是________。
#include<stdio.h>
main()
{ int i;
for(i=l;i<5;i++){
if(i%2)print引剃’);
else continue;
printf(”≠f”);
}
printf(”$\n”);
}
A)*#*#*#$ B)#*#*#*$ C)*#*#$ D)#*#*$
答案:C
评析:当i不可以整除2时打印“*”,然后打印“拌”,不能整除2则执行continue,跳过printf(“#”):语句,结束本次循环,返回到循环的起始点。当循环结束后,打印“$”。
(46)库函数strcpy用以复制字符串,若有以下定义和语句:
char strl[]=”china”,str2[10],*str3,*str4=”china”;
则对库函数strcpy的正确的调用是_________。
A)strcpy(strl,”people”); B)strcpy(str2,”people”);
C)strcpy(str3,”people”); D)strcpy(str4,”people”);
答案:B
评析:strcpy(字符数组1,字符串2)其作用是将字符串2复制到字符数组l中去。
注:(1)字符数组l必须定义得足够大;(2)“字符数组1”必须写成数组名的形式; (3)复制时连同字符串后面的‘\0’一起复制到字符数组1中。
(47)有以下程序
#include<stdio.h>
main()
{int c;
while((c=getchar())!=’\n’){
switch(C-‘2’){
case 0:case 1:putchar(c+4);
case 2:putchar(c+4);break;
case 3:putchar(c+3);
default:putchar(c+2);break;}
}
}
从第一列开始输入以下数据,↙代表一个回车符。
2473↙
程序的输出结果是_________。
A)668977 B)668966 C)66778777 D)6688766
答案:A
评析:getchar()函数是从键盘接受一个字符输入;当用户键入的字符不是回车符时,会进入一个多分支选择语句,根据C-‘2’的值进行分支选择;putchar()是在屏幕上打印一个字符,最后的结果应当为668977。
(48)下面程序的输出结果是_________。
Union un
{ int a[4];
long b:
char c[6];}
main()
{
union un u:
printf(”%d%d”,sizeof(u),sizeof(u.a));
}
A)82 B)88 C)188 D)182
答案:B
评析:sizeof函数计算已知类型所占的字节数。共用体变量所占的内存长度等于最长的成员的长度。
(49)以下程序的输出结果是________。
main()
{ int w=5;fun(w);printf(”\n”);}
fun(int k)
{ if(k>0) fun(k-1);
printf(”%d.t,k);
}
A)5 4 3 2 l B)0 1 2 3 4 5
C)l 2 3 4 5 D)5 4 3 2 l 0
答案:B
评析:函数的递归调用就是在调用一个函数的过程中又出现直接或间接地调用该函数本身。fun函数共被调用6次,即fun(5)、fun(4)、fun(3)、fun(2)、向n(1)、fun(0)。其中fun(5)是main函数调用的。
(50)若巾是指向某文件的指针,且已读到此文件的末尾,则函数feof(f1))的返回值是
A)EOF B)O C)非零值 D)NULL
答案:C
评析:函数feof是用来判断文件是否已读到末尾,如果已读到末尾则返回非零值,否则返回O。
二、填空题(每空2分,共40分)
请将每一个空的正确答案写在答题卡的【1】至【20】序号的横线上,答在试卷上不得 分。
(1)算法的复杂度主要包括时间复杂度和 【1】 复杂度。
答案:【1】空间
评析:习惯上常常把语句重复执行的次数作为算法运行时间的相对量度,称作算法的时间复杂度。算法在运行过程中需辅助存储空间的大小称为算法的空间复杂度。
(2)数据的物理结构在计算机存储空间中的存放形式称为数据的 【2】 。
答案:【2】内模式或物理模式或存储模式
评析:一个数据库只有一个内模式,它是数据物理结构和存储方式的描述,是数据库内部的表示方法。例如,记录的存储方式是顺序存储、索引按照什么方式组织;数据是否压缩存储,是否加密等。
(3)若按功能划分,软件测试的方法通常分为 【3】 测试方法和黑盒测试方法。
答案:【3】白盒
评析:软件测试的方法有三种:动态测试、静态测试和正确性证明。设计测试实例的方法一般有两类:黑盒测试方法和自盒测试方法。
(4)数据库三级模式体系结构的划分,有利于保持数据库的 【4】 。
答案:【4】数据独立性
评析:数据库的三级模式体系结构把数据的组织管理工作进行了划分,把数据的具体组织留给DBMS管理,使用户能逻辑地、抽象地处理数据,而不必关心数据在计算机中的具体表示方式与存储方式,保证了数据的独立性。
(5)在关系运算中,查找满足一定条件的元组的运算称之为 【5】 。
答案:【5】选择
评析:在关系数据库中,选择运算也是一个元运算,关系R通过选择运算(并由该运算给出所选择的逻辑条件)后仍为一个关系。这个关系是由R中的那些满足逻辑条件的元组所组成。
(6)在C语言中(以16位PC机为例),一个float型数据在内存中所占的字节数为4;一个double型数据在内存中所占的字节数为 【6】 。
答案:【6】8
评析:在一般16位PC机中,一个float型数据在内存中占4个字节(32位),一个double型数据占8个字节。
(7)设有以下变量定义,并已赋确定的值,
char w;int x;float y;double z;
则表达式:w*x+z-y所求得的数据类型为 【7】 。
答案:【7】double型或双精度型
评析:①先进行W*X的运算,先将字符型w转换成整型,运算结果为整型;②再将W*X的结果与z相加,要先将第一步的整型转换为double型,运算结果为double型;③最后将W*X+Z的结果与y相减,要先将float型y转换成double型,结果为double型。
(8)若运行时给变量x输入12,则以下程序的运行结果是 【8】 ;
main(){
int,y;
scanf(””%d””,&X);
y=x>12?x+lO:x-12;
printf(“”%d\n””,y);
}
答案:【8】0
评析:三目运算符的形式为(表达式1)7(表达式2):(表达式3)。当(表达式1)值为真时,返回(表达式2)的值;为假时,返回(表达式3)的值。题中因为x>t2为假,所以结果为x-12,即为0。
(9)四条语句:x++;、++x;、x=x+l;、x=l+x;,执行后都使变量x中的值增l,请写出一条同一功能的赋值语句(不得与列举的相同) 【9】 。
答案:【9】x+=1:
评析:题面中的四条语句的作用是使x的值加1,在c中有多种方法可以对变量进行加1操作,这里可以利用C的复合赋值运算符+=实现,本题答案为x+=1:。
(10)设有以下定义和语句,则*(*(p+2)+1)的值为 【10】 。
int[3][2]={10,20,30,40,50,60},(*p)[2];
p=a;
答案:【10】60
评析:本题定义了一个3行2列的二维数组a,并定义了一个指向两个元素的一维数组指针p,让p指向二维数组a的首行。*(*(p+2)+1)是引用a[2][1],其值是60。
(11)若要使指针p指向一个double类型的动态存储单元,请填空。
p= 【11】 malloc(sizeof(double));
答案:【11】(double*)
评析:函数malloc返回的是void*,所以若要使指针指向一个double类型,则必须进行类型转换,类型转换格式为:(数据类型*)。
(12)下面程序的功能:输出100以内能被3整除且个位数为6的所有整数,请补充完整。
main().
{ int ij;
for(i=O; 【12】 ;i++)
{ j=I*10+6;
if( 【13】 )continue;
printf(“%d”,j);
}
}
答案:【12】i<lO
【13】j%3!=0
评析:本题要求输出100以内能被3整除且个位数为6的所有整数,程序中j=i*10+6;语句是求个位数为6的整数,由此可得出程序的循环次数为i<lO。然后通过if语句判断整数是否能被3整除,若不能则继续下一次循环,若能则输出该整数,所以逻辑表达式为i%3 1=00
(13)函数mycmp(char*s,char。t)的功能是比较字符串s和t的大小,当s等于t时返回0,
当s>t返回正值,当s<t时返回负值。请填空。
mycmp(char*s,char*t)
{ while(*s==*t)
{ if(*s==’\0’)return 0;
++s;++t;
}
return( 【14】 );
}
答案:【14】*s-*t或-*t+*s
评析:函数的两个形参是两个字符指针变量,字符串的首地址是指针变量的值,*s和*t表示字符串数组s和t的第一个字符,在while循环中,是通过s和t值的不断变化来改变指针所指向的字符,要改变s和t所指不同字符的ASCII码的差值,必须使用“*s-*t”得出。
(14)以下程序运行后的输出结果是 【15】 。
void fun(、)
{
static int a=0:
a+=2;printf(”%d”,a);
}
main()
{ int cc;
for(CC=1;cc<4;cc++)fun();
printf(”\n”);
}
答案:【15】2 4 6
评析:static声明的外部变量只限于被本文件引用,而不能被其他文件引用。用static来声明一个变量的作用有:①对局部变量用static声明,则为该变量分配的空间在整个程序执行期间始终存在;②全部变量用static声明,则该变量的作用域只限于本文件模块(即被声明的文件中)。
(15)下列程序的运行结果是 【16】 。
main()
{ union EXAMPLE
{ struct
{int x;int y;}in;
int a;
int b:
}e;
e.a=1;e.b=2;
e.in.x=e.a*e.b;
e.in.y=e.a+e.b;
printf(”%d,%d\n”,e.in.x,e.in.y);
}
答案:【16】4,8
评析:c语言规定,共用体中各个成员变量在内存中占用同一段内存单元,即e.in.x和e.a、e.b占用同一段内存单元,由于e.in.x和e.a、e.b占用的是同一段内存单元,所以程序最后的打印结果为“4,8”。
(16)在对文件进行操作的过程中,若要求文件的位置回到文件的开头,应当调用的函数 是 【17】 函数。
答案:【17】[NNlrewind或fseek
评析:在对文件进行操作的过程中,若要求文件的位置回到文件的开头,可以调用rewind或fseek函数。其中rewind函数的作用是将位置指针重新返回文件的开头,而fseek函数可以实现文件指针的定位。
(17)以下函数用于求出一个2×4矩阵中的最大元素值。
max_value(arr)
int arr[][4];
{
int I,J,max;
max=alT[0][0];
for(i=0;i<2;i++)
for(j=0; 【18】 ;J++)
if( 【19】 >max)max=[2Q];
return(max);
}
答案:【18】j<4
【19】arr[i][j]
【20】arr[i][j]
评析:2*4矩阵实际上就是一个二维数组,结合本题应为arr[2][4],所以在第一个循环中应当填写“4”;第二个横线处是要判断当前的数组元素值是否大于max,所以应填写arr[i][j];第三个横线处是要将当前大于max的数组元素的值赋给变量max,所以应当填写“arr[i][il”。