1.树是结点的集合,它的根结点数目是( )
A.有且只有1
B.1或多于1
C.0或1
D.至少2
分析:树是一个或多个结点组成的有限集合,其中一个特定的结点称为根,其余结点分为若干个不相交的集合。每个集合同时又时一棵树。树有且只有1个根结点。
2.在设计程序时,应采纳的原则之一是( )
A.不goto语句的使用
B.减少或取消注解行
C.程序越短越好
D.程序结构应有助于读者理解
分析:滥用goto语句将使程序流程无规律,可读性差,因此A)不选;注解行有利于对程序的理解,不应减少或取消,B)也不选;程序的长短要依照实际情况而论,而不是越短越好,C)也不选。
3.下列叙述中,不属于软件需求规格说明书的作用的是( )
A.便于用户、开发人员进行理解和交流
B.反映出用户问题的结构,可以作为软件开发工作的基础和依据
C.作为确认测试和验收的依据
D.便于开发人员进行需求分析
分析:软件需求规格说明书(SRS,Software Requirement Specification)是需求分析阶段的最后成果,是软件开发中的重要文档之一。它有以下几个方面的作用:①便于用户、开发人员进行理解和交流;②反映出用户问题的结构,可以作为软件开发工作的基础和依据;③作为确认测试和验收的依据。
4.单个用户使用的数据视图的描述称为( )
A.外模式
B.概念模式
C.内模式
D.存储模式
分析:选项A正确,外模式是用户的数据视图,也就是用户所见到的数据模式;选项B)不正确,全局数据视图的描述称为概念模式,即数据库中全部数据的整体逻辑结构的描述;选项C)不正确,物理存储数据视图的描述称为内模式,即数据库在物理存储方面的描述;选项D)不正确,存储模式为内模式。
5.SQL语言又称为( )
A.结构化定义语言
B.结构化控制语言
C.结构化查询语言
D.结构化操纵语言
分析:结构化查询语言(Structured Query Language,简称SQL)是集数据定义、数据操纵和数据控制功能于一体的数据库语言。
6.若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是( )
A.bdgcefha
B.gdbecfha
C.bdgaechf
D.gdbehfca
分析:前序遍历的第一个结点a为树的根结点;中序遍历中a的左边的结点为a的左子树,a右边的结点为a的右子树;再分别对a的左右子树进行上述两步处理,直到每个结点都找到正确的位置。
7.软件工程的理论和技术性研究的内容主要包括软件开发技术和( )
A.消除软件危机
B.软件工程管理
C.程序设计自动化
D.实现软件可重用
分析:软件工程的目标是,在给定的成本、进度的前提下,开发出具有有效性、可靠性、可理解性、可维护性、可重用性、可适应性、可移植性、可追踪性和可互操作性且满足用户需求的产品。基于这一目标,软件工程的理论和技术性研究的内容主要包括:软件开发技术和软件工程管理。
8.软件测试设计中,软件测试的主要目的是( )
A.实验性运行软件
B.证明软件正确
C.找出软件中全部错误
D.发现软件错误而执行程序
分析:使用人工或自动手段来运行或测定某个系统的过程,其目的在于检验它是否满足规定的需求或是弄清预期结果与实际结果之间的差别。软件测试是为了发现错误而执行程序的过程。测试要以查找错误为中心,而不是为了演示软件的正确功能。
9.索引属于( )
A.模式
B.内模式
C.外模式
D.概念模式
分析:内模式(Internal Schema)又称物理模式(Physical Schema),它给出了数据库物理存储结构与物理存取方法,如数据存储的文件结构、索引,集簇及hash等存取方式与存取路径。
10.数据库系统的核心是( )
A.数据库
B.数据库管理系统
C.模拟模型
D.软件工程
分析:数据库管理系统(Database Management System,简称DBMS)是数据库的机构,它是一种系统软件,负责数据中的数据组织、数据操纵、数据维护、控制及保护和数据服务等,数据库管理系统是数据库系统的核心。
11.以下叙述不正确的是( )
A.一个C源程序可由一个或多个函数组成
B.一个C源程序必须包含一个main函数
C.C程序的基本组成单位是函数
D.在C程序中,注释说明只能位于一条语句的后面
分析:本题考查C语言的基本基础知识。是在C程序中,注释用符号“/*”开始,而是以符号“*/”结束。程序的注释可以放在程序的任何位置。通常将注释放在程序的开始,以说明本程序的功能;或者放在程序的某个语句后面,以对此语句的功能进行说明。无论将注释放有何处,在程序进行编译时,编译程序不会处理注释的内容,且注释内容也不会出现在目标程序中。
12.以下叙述正确的是( )
A.在C程序,每行中只能写一条语句
B.若a是实型变量,C程序中允许赋值a=10,因此实型变量中允许存放整型数
C.在C程序中,无论是整数还是实数,都能被准确无误地表示
D.在C程序中,%是只能用于整数运算的运算符
分析:选项A错误,因为在C语言中,各语句间可以用分号隔开,一行可以书写多个语句;选项B错误的原因是,忽略了C语言中进行运算的数据类型必须一致的规定,因此实型变量中不允许存放整型数,存放整型数据其实是把整型转化为实型在存放。选项C错误的原因是由于实型变量是用有限的存储单元存储的,因此能提供的有效数字总是有限的,在有效的位以外的数将被舍去,由此可能产生一些误差。
13.已知各变量的类型说明如下:
int k,a,b;
unsigned long w=5;
double x=1.42;
则以下不符合C语言语法的表达式是( )
A.x%(-3)
B.w+=-2
C.k=(a=2,b=3,a+b)
D.a+=a-=(b=4)*(a=3)
分析:“%”是求余运算符或模运算符,“%”两侧均应为整型数据,选项A中的x是double型数据。
14.设x,y均为整型变量,且x=10 y=3,则以下语句的输出结果是( )
printf(″%d,%d\n″,x--,--y);
A.10,3
B.9,3
C.9,2
D.10,2
分析:在C语言中,自增1运算符记为“++”,其功能是使变量的值自增1。自减1运算符记为“--”,其功能是使变量值自减1。自增1,自减1运算符均为单目运算,都具有右结合性。可有以下几种形式:
++I i自增1后再参与其他运算
--I i自减1后再参与其他运算
i++ i参与运算后,i的值再自增1
i-- i参与运算后,i的值再自减1
在理解和使用上容易出错的是i++和++i。特别是当它们出在较复杂的表达式或语句中时,常常难于弄清,因此应仔细解析。
15.执行下列程序时输入123<空格>456<空格>7<回车>输出结果是( )
main()
{ char s[100];int c,i;
scanf(″%c″,&c);scanf(″%d″,&i);scanf(″%s″,s);
printf(″%c,%d,%s\n″,c,i,s);
}
A.123,456,7
B.1,456,7
C.1,23,456,7
D.1,23,456
分析:当执行输入时,把整数赋给字符型变量c(整型与字符型能相互转化),把23赋给整型变量i,把456赋给字符数组s,7之所以没有被接受是因为字符串输入时,遇空格结束。
16.以下程序的输出结果是( )
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);
}
A.x=4
B.x=8
C.x=6
D.x=12
分析:该题是一个for循环嵌套语句。第一层for循环循环2次,第二次循环3次,但当j等于0和1时,将执行continue语句,不执行x++运算,所以每次执行完内循环后,x的增量为1。最后一个x++运算将每次累加起来就是x的值。
17.有以下定义,能使值为3的表达式是( )
int k=7,x=12;
A.x%=(k%=5)
B.x%=(k-k%5)
C.x%=k-k%5
D.(x%=k)-(k%=5)
分析:运算符“%”的两侧都应该是整型数。另外,本题需要掌握的知识点是:x%=k,等价于x=x%k。
18.以下叙述正确的是( )
A.函数可以嵌套定义但不能嵌套调用
B.函数既可以嵌套调用也可以嵌套定义
C.函数既不可以嵌套定义也不可以嵌套调用
D.函数可以嵌套调用但不可以嵌套定义
分析:在C语言中,所有的函数都是平行的,即在定义函数时是互相的,一个函数并不从属于另一个函数,即函数不能嵌套定义,但可以互相调用,但不能调用main函数。
19.下列说法正确的是( )
int i,x;
for(i=0,x=0;i<=9 &&x!=876;i++)scanf(″%d″,x);
A.最多的执行10次
B.最多执行9次
C.是无限循环
D.循环体一次也不执行
分析:此题中for循环的执行次数取决于关系表达式(i<=9&&!=876)的结果。只要i<=9且x!=876,循环就将继续执行。结束循环取决于两个条件,或者i>9,或者x=876,只要在执行scanf语句时,从终端输入876,循环就将结束。如果从终端一直未输入876,则将由i值的增加使i>9,从而结束循环。按照题中所给定的for语句,每执行一次循环,i自增1,因此执行10次循环后,i的值为10,循环最终也将结束。
20.下面程序的输出结果为( )
main()
{ int a,b;b=(a=3*5,a*4,a*5);
printf(″%d″,b);
}
A.60
B.75
C.65
D.无确定值
分析:对于逗号表达式中的第一个表达式等价为a=15;第二个表达式的值为15×4=60,此时变量a的值仍未改变还是15,第三个表达式的值为b的值。
21.下面程序的输出结果是( )
#include #include main() { char*p1=″abc″,*p2=″ABC″,str[50]=″xyz″; strcpy(str+2,strcat(p1,p2)); printf(″%s\n″,str);} A.xyzabcABC B.zabcABC C.xyabcABC D.yzabcABC 分析:本题考查的重点是拷贝字符串——使用strcpy()函数,该函数的调用方式是: strcpy(字符数组,字符串)其中“字符串”可以是字符串常量,也可以是字符数组。函数的功能是将“字符串”完整地复制到“字符数组”中,字符数组中原有内容被覆盖。使用该函数时注意: ①字符数组必须定义得足够大,以便容纳复制过来的字符串。复制时,同结束标志′\0′一起复制。 ②不能用赋值运算符“=”将一个字符串直接赋值给一个字符数组,只能用strcpy()函数来处理。 另外本题还考查连接字符串的strcat()函数,其调用方式是: strcat(字符数组,字符串) 功能是把“字符串”连接到“字符和数组”中的字符串尾端,并存储于“字符数组”中。“字符数组”中原来的结束标志,被“字符串”的第一个字符覆盖,而“字符串”在操作中未被修改。使用该函数时注意: ①由于没有边界检查,编程者要注意保证“字符数组”定义得足够大,以容纳连接后的目标字符串;否则,会因长度不够而产生问题。 ②连接前两个字符串都会有结束标志′\0′,连接后“字符数组”中存储的字符串的结束标志′\0′被舍弃,只在目标串的最后保留一个′\0′。 22.有如下程序 main() { char ch[2][5]={″6937″,″8254″},*p[2]; int i,j,s=0; for(i=0;i<2;i++)p[i]=ch[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.69825 B.63825 C.6385 D.693825 分析:该题稍微难一点。主要要搞清楚以下几点: ①定义了一个指针数组char *p[2]后,程序中第一个循环for(i=0;i<2;i++)p[i]=ch[i];的作用,是使指针数组的p[0]元素(它本身是一个指针)指向了二维数组ch的第一行字符串,并使指针数组的p[1]元素指向了二维数组ch的第二行字符串,这样,就使指针数组p和二维数组ch建立起了一种对应关系,以后对二维数组ch的某个元素的引用就有两种等价的形式:ch[i][j]或p[i][j]。 ②对二维数组ch的初始化,使其第一行ch[0]中存入了字符串“6937”,第二行ch[1]中的内容为字符串“8254”。 ③程序中第二个循环中的循环体s=s*10+p[i][j]-‘0’;的功能是这样的,每执行一次,将s中的值乘以10(也即,将s中的数值整体向左移动一位,并在空出来的个位上添一个0),再将当前p[i][j]中的字符量转换为相应的数字,然后把这个数字加到s的个位上。 ④注意到内层循环的循环条件p[i][j]>′\0′是指p[i][j]中的字符只要不是字符串结束标志′\0′就继续循环,语句j+=2;是使下标j每次增加2,也即一个隔一个地从p[i]所指向的字符串中取出字符。 经过上述解析后,不难看出,该程序首先从p[0]所指向的字符串“6937”中一个隔一个地取出字符,分别是‘6’和‘3’,然后从p[1]所指向的字符串“8254”中一个隔一个地取出字符,分别是‘8’和‘5’,同时经过转换和相加运算后,结果s中的值应该是6385。 23.下面程序执行后文件test中内容是( ) #include void fun(char *fname,char *st) { FILE *myf;int i; myf=fopen(fname,″w″); for(i=0;i } main() { fun(″test″,″new world″);fun(″test″,″hello,″);} A.hello, B.new worldhello, C.new world D.hello,rld 分析:用“w”方式打开的文件如果原来不存在,则在打开时新建一个以指定的名字命名的文件。如果原来已存在一个以该文件命名的文件,则在打开时将该文件删除,然后重新建立一个新文件。所以,最后文件中只有第2次写入的“hello”。 24.若有定义:int a=8,b=5,c;,执行语句c=a/b+0.4;后,c的值为( ) A.1.4 B.1 C.2.0 D.2 分析:本题考查的知识点很简单:两个整型运算的结果仍为整型,在题中的8/5的应是1,不是1.6,由于c是整型变量,所以,运算结果1.4要转换成整型数据1再赋值给c。 25.设i是int型变量,f是float型变量,用下面的语句给这两个变量输入值:scanf(″i=%d,f=%f″,&i,&f);为了把100和765.12分别赋给i和f,则正确的输入为( ) A.100<空格>765.12<回车> B.i=100,f=765.12<回车> C.100<回车>765.12<回车> D.x=100<回车>,y=765.12<回车> 分析:本题考查scanf函数的输入方法。Scanf()函数是格式输入函数,它从标准输入设备(键盘)读取输入的信息。其调用格式为:scanf(“<格式化字符串>”,<地址表>);,格式化字符串包括以下三类不同的字符: ①格式化说明符:格式化说明符与printf()函数中的格式说明符基本相 ②空白字符:空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符。 ③非空白字符:一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。地址表是需要读入的所有变量的地址,而不是变量本身。这与printf()函数完全不同,要特别注意。各个变量的地址之间同“,”分开,还要注意的是在输入时,输入形式应与格式化字符串对应一致。 26.若有以下程序 main() { int k=2,i=2,m; m=(k+=i*=k);printf(″%d,%d\n″,m,i); } 执行后的输出结果是( ) A.8,6 B.8,3 C.6,4 D.7,4 分析:对表达式逐步求解: k=2,i=2,m=(k+=i*=k) m=(k+=(i=i*k)) k=2,i=4,m=(k+=4) m=(k=k+4) k=6,i=4,m=6 27.以下程序中循环体总的执行次数是( ) int i,j; for(i=6;i>1;i--) for(j=0;j {……} A.20 B.261 C.15 D.25 分析:本题中第1个for循环执行5次后结束,第2个for循环分别执行执行第6次、5次、4次、3次、2次共20次。 28.下列程序的输出结果是( ) main() { int a[3],i,j,k=2; for(i=0;i<3;i++)a[i]=i; for(i=0;i printf(″%d\n″,a[2]); } A.2 B.3 C.1 D.0 分析:本题里有三个for循环,但要分清楚,第一个是单独的给三个元素赋值,赋完值后三个a[0]=0,a[1]=1,a[2]=2;后面的代码是两个for嵌套循环,对数组元素的赋值,但由于k=2,初值已定for里的条件是小于k,所以不管怎么处理都影响不到a[2]。 29.如下程序的执行结果是( ) main() { static int a[ ]={1,7,3,9,5,11}; int *p=a; *(p+3)+=4; printf(″%d,%d″,*p,*(p+3)); } A.1,13 B.1,16 C.3,13 D.1,14 分析:本题考查对指针数组的掌握。指针数组的定义、赋初值、数组元素的引用与赋值等操作和一般数组的处理方法基本相同。需要注意指针数组是指针类型的,对其元素所赋的值必须是地址值。其格式是:存储类型 数据类型*指针数组名1[长度1]{初值1},…功能是定义指向“数据类型”变量或数组的指针型数组,同时给指针数组元素赋初值。这些指针变量具有指定的“存储类型”。 本题中指针*p指向数组a,表达式*(p+3)+=4;的含义是*(p+3)=*(p+3)+4,而*(p+3)在数组中指向的值为9,最后输出的结果为9+4=13,所以应选择A。 30.执行下列程序段,结果是( ) int x=40; char y=′C′; int n; n=(x&0xff)&&(y>′B′); printf(″%d\n″,n); A.0 B.1 C.2 D.3 分析:按位与运算符“&”是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。逻辑与运算符“&&”需要两边的结果都为1时,其结果才为1。 31.以下程序的执行结果是( ) union un { int i; char c[2]; } main() { union un x; x.c[0]=10; x.c[1]=1; printf(″%d″,x.i); } A.266 B.11 C.265 D.138 分析:本题考查共用体的特征。Int类型变量i和字符组c共用两个字节存储单元,通常c[0]位于低字节,c[1]位于高字节,所以i=x.c[1]×256+x.c[0]=266。 32.下面程序的执行结果是( ) #define SUM(X) X*X main() { int a=6;int i=1,j=2; a+=SUM(i+j)/SUM(i+j); printf(″%d\n″,a); } A.15 B.2 C.7 D.0 分析:本题考查带参数的宏定义的应用。本题可以采用逐步求值法。表达式可以转换为:a=a+SUM(i+j)/SUM(i+j),即a=a+i+j*i+j/i+j*i+j,代入数据,则a=a+1+2*1+2/1+2*1+2。 33.下列函数功能是将字符串ss中特定位置上字母实行转化(若该位置上不是字母,则不转换)。 #include #include void fun( char *ss) { int i; for(i=0;ss[i]!=′\0′;i++){ if(i%2==1 && ss[i]>=′z′) ss[i]=ss[i]-32; } } main() { char tt[51]; clrscr(); printf(″Please enter an character string within 50 characters:\n″); gets(tt); printf(″\n\nAfter changing,the string\n %s″,tt); fun(tt); printf(″\nbecomes\n \ %s″,tt); } 若输入abc4Efg,则应输出( ) A.aBc4EFg B.abc4Efg C.ABC4EFG D.abc4dfg 分析:解答本题首先要熟悉判断下标为奇数的C语言表达方法,即i%2==1,同时这个字符必须为小写字母,用ss[i]>=′a′&&ss[i]<=′z′表达式来定义,若符合语句中的条件则直接将该字符的值(ASCII值)减32即可。若题中要求将大写字母转成小写字母则if()条件改成:i%2==1&&ss[i]>=′A′&&ss[i]<=′Z′,同时减32改成加32即可 34.下列程序的输出结果是( ) main() { char *str=″12123434″; int x1=0,x2=0,x3=0,x4=0,i; for(i=0;str[i]!=′\0′;i++) switch(str[i]) { case′1′:x4++; case′2′:x3++; case′3′:x2++; case′4′:x1++; } printf(″%d,%d,%d,%d\n″,x1,x2,x3,x4); } A.8,6,4,1 B.8,6,3,2 C.8,8,4,1 D.8,6,4,2 分析:本题考查循环的嵌套。只要注意在C语言中,系统在字符指针的最后位置会增加一个字符串结束符′\0′,执行8次for循环,再根据switch语句中的条件易知答案。 35.下列函数的功能是计算并输出下列多项式值: 〖JZ〗Sn=∑〖DD(〗n〖〗i=0〖DD)〗(〖SX(〗2.0〖〗2*i-1〖SX)〗-〖SX(〗1.0〖〗2*i〖SX)〗) 例如,若主函数从键盘给n输入8后,则输出为S=0.662872。注意:n的值要求大于1但不大于100。在划线处应填入的选项是( ) #include double fun(int n) { int i; double s=0.0; for(i=1;i<=n;i++) s=s+_____; return s; } main() { int n;double s; printf(″\nInput n:″);scanf(″%d″,&n); s=fun(n); printf(″\ns=%f\n″,s); } A.1.0/(2*i-1)-1.0/(2*i) B.1.0/(2*i-1) C.1.0/(2*i) D.1.0/(2*i)-1.0/(2*i-1 分析:本题中s=s+(1.0/(2*i-1)-1.0/(2*i));语句是用C语言语句去表达题目中的“数学思路”,这是关键,其他问题不难理解。