1.算法分析的目的是( )
A.找出数据结构的合理性
B.找出算法中输入和输出之间的关系
C.分析算法的易懂性和可靠性
D.分析算法的效率以求改进
分析:算法分析是指对一个算法的运行时间和占用空间做定量的分析,一般计算出相应数量级,常用时间复杂度和空间复杂度表示。分析算法的目的就是要降低算法的时间复杂度和空间复杂度,提高算法的执行效率。
2.在单链表中,增加头结点的目的是( )
A.方便运算的
B.使单链表至少有一个结点
C.标识表结点中首结点的位置
D.说明单链表是线性表的链式存储实现
分析:头结点不仅标识了表中首结点的位置,而且根据单链表(包含头结点)的结构,只要掌握了表头,就能够访问整个链表,因此增加头结点目的是为了便于运算的实现。
3.软件开发离不开系统环境资源的支持,其中必要的测试数据属于( )
A.硬件资源
B.通信资源
C.支持软件
D.辅助资源
分析:D
4.分布式数据库系统不具有的特点是( )
A.数据分布性和逻辑整体性
B.位置透明性和复制透明性
C.分布性
D.数据冗余
分析:分布式数据库系统具有数据分布性、逻辑整体性、位置透明性和复制透明性的特点,其数据也是分布的;但分布式数据库系统中数据经常重复存储,数据也并非必须重复存储,主要视数据的分配模式而定。若分配模式是一对多,即一个片段分配到多个场地存放,则是冗余的数据库,否则是非冗余的数据库。
5.下列数据模型,有坚实理论基础的是( )
A.层次模型
B.网状模型
C.关系模型
D.以上3个都是
分析:关系模型较之格式化模型(网状模型和层次模型)有以下方面的优点,即数据结构比较简单、具有很高的数据性、可以直接处理多对多的联系,以及有坚实的理论基础。
6.栈底到栈顶依次存放元素A、B、C、D,在第五个元素E入栈前,栈中元素可以出栈,则出栈序列可能是( )
A.ABCED
B.DCBEA
C.DBCEA
D.CDABE
分析:栈操作原则上“后进先出”,栈底至栈顶依次存放元素A、B、C、D,则表明这4个元素中D是最后进栈,B、C处于中间,A最早进栈。所以出栈时一定是先出D,再出C,最后出A。
7.在结构化程序设计思想提出之前,在程序设计中曾强调程序的效率,现在,与程序的效率相比,人们更重视程序的( )
A.安全性
B.一致性
C.可理解性
D.合理性
分析:C
8.软件开发的结构化生命周期方法将软件生命周期划分成( )
A.定义、开发、运行维护
B.设计阶段、编程阶段、测试阶段
C.总体设计、详细设计、编程调试
D.需求分析、功能定义、系统设计
分析:通常,将软件产品从提出、实现使用维护到停止使用退役的过程称为软件生命周期。它可以分为软件定义、软件开发及软件运行维护3个阶段。
9.在数据管理技术发展过程中,文件系统与数据库系统的主要区别是数据库系统具有( )
A.特定的数据模型
B.数据无冗余
C.数据可共享
D.专门的数据管理软件
分析:在文件系统中,相互的记录其内部结构的最简单形式是等长同格式记录的集合,易造成存储空间大量浪费,不方便使用。在数据库系统中,数据是结构化的,这种结构化要求在描述数据时不仅描述数据本身,还要描述数据间的关系,这正是通过采用特定的数据模型来实现的。
10.实体是信息世界中广泛使用的一个术语,它用于表示( )
A.有生命的事物
B.无生命的事物
C.实际存在的事物
D.一切事物
分析:实体是客观存在且可以相互区别的事物。实体可以是具体的对象,如一个学生,也可以是一个抽象的事件,如一次出门旅游等。因此,实体既可以是有生命的事物,也可是无生命的事物,但它必须是客观存在的,而且可以相互区别。
11.下面叙述中正确的是( )
A.C语言编译时不检查语法
B.C语言的子程序有过程和函数两种
C.C语言的函数可以嵌套定义
D.C语言的函数可以嵌套调用
分析:C语言相对其他高级语言来说,放宽了语法检查,因此程序设计自由度大,并不是不检查语法,C语言的程序是由函数构成的。函数不能嵌套定义,但是可以嵌套调用。
12.以下叙述中正确的是( )
A.构成C程序的基本单位是函数
B.可以在一个函数中定义另一个函数
C.main()函数必须放在其他函数之前
D.所有被调用的函数一定要在调用之前进行定义
分析:本题综合考查C语言概念部分,关于C语言,我们应该了解以下必须要掌握的基础知识:
①C程序是由函数构成的。
②一个函数由两部分组成:函数的首部和函数体。
③一个C程序总是从main函数开始执行的,而不论main函数的整个程序中的位置如何(main函数可以放在程序最开始,也可以放在程序最后,或写在一些函数之前,在另一些函数之后)。
④C程序在书写上,表现形式比较自由,一行内可以写几个语句,一个语句可以分写在几行上。每个语句和数据定义的最后必须有一个分号。
⑤C程序本身没有输入输出语句。输入和输出的操作是由库函数scanf和printf等函数来完成。
⑥可以用/*……*/对C语言的程序的任何部分作注释。
13.下列程序段的输出结果是( )
int a=1234;
float b=123.456;
double c=12345.54321;
printf(″%2d,%2.1f,%2.1f″,a,b,c);
A.无输出
B.12,123.5,12345.5
C.1234,123.5,12345.5
D.1234,123.4,1234.5
分析:
①printf函数的浮点数缺省输出格式:在printf函数的输出中,若无输出宽度,每种数据都有一个缺省的输出宽度,一般浮点数的小数位数是6位,不管输出格式是%f或%1f皆如此。
②printf函数的浮点数宽度输出:小数部分按指定数输出,且对数据做四舍五入处理。
③printf的整数限宽输出:没有宽度制的整数原数输出。
14.设有以下程序段
int x=0,s=0;
while(!x!=0)s+=++x;
printf(″%d″,s);
则( )
A.运行程序段后输出0
B.运行程序段后输出1
C.程序段中的控制表达式是非法的
D.程序段执行无限次
分析:本题中,“!”表示逻辑非运算符,“!=”等于运算符,逻辑非运算符比等于运算符的优先级低。
15.以下程序段的描述,正确的是( )
x=-1;
do
{x=x*x;}while(!x);
A.是死循环
B.循环执行两次
C.循环执行一次
D.有语法错误
分析:do-while语句的一般形式为:
do
循环语句
while(表达式);
本题中,执行“语句”一次后,表达式值为假,终止执行。
16.下列程序执行后的输出结果是( )
void func1(int i);
void func2(int i);
char st[ ]=″hello,friend!″;
void func1(int i)
{ printf(″%c″,st[i]);
if(i<3){i+=2;func2(i);}
}
void func2(int i)
{ printf(″%c″,st[i]);
if(i<3){i+=2;func1(i);}
}
main()
{ int i=0;func1(i);printf(″\n″);}
A.hello
B.hel
C.hlo
D.hlm
分析:函数调用的一般形式为:
函数名(实参列表)
首先调用函数func1(0),输出st[0]=h。i值变为2,并调用函数func2(2),输出st[2]=1。i值此时变为4,调用函数func1(4),输出st[4]=o。此时i值大于等于3,执行完毕。因此,输出结果为hlo。
17.以下程序的输出结果是( )
#include void prt(int *x,int*y,int*z) { printf(″%d,%d,%d\n″,++*x,++*y,*(z++));} main() { int a=10,b=40,c=20; prt(&a,&b,&c); prt(&a,&b,&c); } A.11,42,31 12,42,20 B.11,41,20 12,22,41 C.11,21,40 12,42,22 D.11,41,21 11,21,21 分析:尽管C语言以传值方式进行函数调用,但也可以通过传递指针的值(变量的地址)来达到修改实参变量值的目的,这是此题主要说明的问题。其次是要应注意表达式*(z++)的值是*z。函数调用,由于x,y和z分指向a,b和c,因此,*x,*y和*z就是a,b和c。第一次调用函数时,*x=a=10,*y=b=40,*z=c=20输出结果为11,41,20,至此,已经可以肯定选项B是正确的。在第一次输出后,a=11,b=41,c=20第二次输出为:12,42,20。 18.下列程序执行后的输出结果是( ) main() { int a[3][3],*p,i; p=&a[0][0]; for(i=1;i<9;i++)p[i]=i+1; printf(″%d\n″,a[1][2]); } A.3 B.6 C.9 D.随机数 分析:本题中,a[1][2]是二维数组中的第6个元素,对应for循环中i的值为5,p[5]=5+1。 19.下列程序执行后的输出结果是( ) main() { char arr[2][4]; strcpy(arr,″you″);strcpy(arr[1],″me″); arr[0][3]=′&′; printf(″s\n″,arr); } A.you&me B.you C.me D.err 分析:函数strcpy的功能是字符串拷贝,用法char *strcpy(char *str1,char *str2),作用是将字符串2复制到字符串1中去。二维数组可以看做是一种特殊的一维数组,它的元素又是一个一维数组。本题把arr看做是一个一维数组,它有两个元素:arr[0],arr[1],每个元素又是一个包含4个元素的一维数组。 20.有以下程序 int f(int n) { if(n==1)return 1; else return f(n-1)+1; } main() { int i,j=0; for(i=1;i<3;i++)j+=f(i); printf(″%d\n″,j); } 程序运行后的输出结果是( ) A.4 B.3 C.2 D.1 分析:在main函数中,对f(1)和f(2)的值进行了累加。 f(1)=1 f(2)=f(1)+1=2 最后,j的值为1+2=3 21.对结构体类型变量的定义,不正确的是( ) A.typedef struct aa B.#define AA struct aa { int n; AA{ int n; float m; float m; } AA; } tdl; AA tdl; C.struct D.struct { int n; { int n; float m; float m; } aa; } tdl; struct aa tdl; 分析:定义结构体类型的变量有几种的方法如下: ①定义结构体类型的同时,定义结构体类型的变量,如下面的定义中在定义结构体类型aa的同时定义了该类型的变量td1。上述选项B中将宏名AA用宏体struct aa替换进去后,与该定义形式一样,因此是正确的。这一定义形式中,结构体类型名aa是可以省略的,因此,选项D也是正确的。 struct aa { … }tdl; ②先定义结构体类型,然后再定义结构体类型的变量,形式如下: struct aa { … }; struct aa tdl; 这种定义形式也可演变为,先用类型定义语句typedef将该结构体类型定义成一个类型名AA,然后直接用该类型名AA去定义一个变量(这时不再需要使用关键字struct了)。这就是选项A的形式。 22.若有以下程序 #include void f(int n); main() { void f(int n); f(5); } void f(int n) { printf(″%d\n″,n);} 则以下叙述中不正确的是( ) A.若只在主函数中对函数f进行说明,则只能在主函数中正确调用函数f B.若在主函数前对函数f进行说明,则在主函数和其后的其他函数中都可以正确调用函数f C.对于以上程序,编译时系统会提示出错信息:提示对f函数重复说明 D.函数f无返回值,所以可用void将其类型定义为无返回值型 分析:C语言规定,一个函数中调用另一个函数(即被调用函数)需要具备的条件有: ①首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)。 ②如果使用库函数,一般还应该在本文件开头用#include命令将函数调用有关库函数时所需要到的信息“包含”到本文件中来。 ③如果使用自定义函数,而且该函数与调用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数作声明,即向编译系统声明将要调用此函数,并将有关信息通知编译系统。 23.有以下程序 #include main() { FILE *fp;int i=20,j=30,k,n; fp=fopen(″d1.dat″,″w″); fprintf(fp,″%d\n″,i);fprintf(fp,″%d\n″,j); fclose(fp); fp=fopen(″d1.dat″,″r″); fscanf(fp,″%d%d″,&k,&n);printf(″%d%d\n″,k,n); fclose(fp); } 程序运行后的输出结果是( ) A.20 30 B.20 50 C.30 50 D.30 20 分析:本题中,最主要的是掌握几个有关文件的函数的应用。 函数fopen的功能:打开一个文件 调用方式FILE *fp;fp=fopen(文件名,使用文件方式);函数fprintf的功能:传送格式化输出到一个文件中 调用方式:fprintf(文件指针,格式字符串,输出表列);函数fclose的功能:关闭一个文件 调用方式:fclose(文件指针);函数fscanf的功能:从磁盘文件执行格式化输入 调用方式:fscanf(文件指针,格式字符串,输入表列)。 24.下面4个选项中,均是不合法的用户标识符的选项是( ) A.A P_0 B.float la0 _A C.b-a goto int D._123 temp int 分析:C语言规定的标识符只能由字母、数字和下划线3种字符组成,第一个字符必须为字母或下划线,并且不能使用C语言中的关键字作为标识符。选项C中goto和int是关键字,b-a中′-′不是组成标识符的3种字符之一,选项D中int是关键字。所以,均是不合法用户标识符的选项是C。 25.能正确表示逻辑关系:“a≥10或a≤0”的C语言表达式是( ) A.a>=10 or a<=0 B.a>=0|a<=10 C.a>=10 &&a<=0 D.a>=10||a<=0 分析:本题考查是C语言的逻辑表达式及逻辑或(“||”)运算符的用法。“||”表示或的意思,“|”是按位或的意思,“&&”是并且的意思,C语言中没有“or”。 26.若有说明:int *p,m=5,n;以下正确的程序段是( ) A.p=&n;scanf(″%d″,&p;) B.p=&n;scanf(″%d″,*p) C.scanf(″%d″,&n);*p=n; D.p=&n;*p=m; 分析:“&”是求址运算符,“*”是变量说明符。选项A和B应改为scanf(“%d”,p);选项C中指针变量p未指向一确定的内存单元,不能为其赋值,并且这样做很危险建议不使用。 27.有如下程序 main() { int a=2,b=-1,c=2; if(aif(b<0)c=0; else c++; printf(″%d\n″,c); } 该程序的输出结果是( ) A.0 B.1 C.2 D.3 分析:if语句嵌套使用时,应当注意if与else的配对关系,else总是要与它上面的最近的if配对。因此,本题中先判断(a28.有一堆零件(100到200之间),如果分成4个零件一组的若干组,则多2个零件;若分成7个零件一组,则多3个零件;若分成9个零件一组,则多5个零件。下面程序是求这堆零件总数,在划线处应填入的选项是( ) #include main() { int i; for(i=100;i<200;i++) if((i-2)%4==0) if(!((i-3)%7)) if(〖CD#5〗) printf(″%d″,i); } A.i%9=5 B.i%9!=5 C.(i-5)%9!=0 D.(i-5)%9==0 分析:本题中需要填空的是for循环的第3个条件,即“若分成9个零件一组,则多5个零件”,当总零件数零减去5后,并与9取余为0即可满足本题条件。 29.下面程序段的运行结果是( ) char a[ ]=″lanuage″,*p; p=a; while(*p!=′u′){printf(″%c″,*p-32);p++;} A.LANGUAGE B.language C.LAN D.langUAGE 分析:本段程序的作用是输出字符串“lanuage”中字母u之前的字符,将其转化为大写字母。注意:如果一个字符数组用来作为字符串使用,那么在定义该字符数组时,数组的大小就应该比它将要实际存放的最长字符多一个元素,以存放′\0′。 30.以下不正确的定义语句是( ) A.double x[5]={2.0,4.0,6.0,8.0,10.0}; B.int y[5.3]={0,1,3,5,7,9}; C.char c1[ ]={′1′,′2′,′3′,′4′,′5′}; D.char c2[ ]={′\x10′,′\xa′,′\x8′}; 分析:在一维数组中要注意的是下标表达式的常量表达式的值必须是大于等于零,并且小于自身元素的个数,既数组长度,选项B的下标不是整数,所以错误。 31.当说明一个结构体变量时系统分配给它的内存是( ) A.各成员所需内存量的总和 B.结构中第一个成员所需内存量 C.成员中占内存量最大者所需的容量 D.结构中最后一个成员所需内存量 分析:结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元,而共用体变量所占的内存长度等于最长的成员的长度。 32.函数fun的返回值是( ) fun(char *a,char *b) { int num=0,n=0; while(*(a+num)!=′\0′)num++; while(b[n]){*(a+num)=b[n];num++;n++;} return num; } A.字符串a的长度 B.字符串b的长度 C.字符串a和b的长度之差 D.字符串a和b的长度之和 分析:本题首先通过第一个while循环计算字符串a的长度,再通过第二个循环,将字符串a和b相连,最后返回连接后的总长度。 33.下列程序的输出结果是( ) main() { int a[5]={2,4,6,8,10},*p,**k; p=a; k=&p; printf(″%d″,*(p++)); printf(″%d\n″,**k); } A.4 B.22 C.24 D.46 分析:指针变量p指向数组a的首地址,并把指针变量p的地址赋于指向指针的指针变量k。 34.下列函数的运行结果是( ) main() { int i=2,p; int j,k; j=i; k=++i; p=f(j,k); printf(″%d″,p); } int f(int a,int b) { int c; if(a>b)c=1; else if(a==b)c=0; else c=-1; return(c); } A.-1 B.1 C.2 D.编译出错,无法运行 分析:函数调用相当于f(2,3),程序运算应得结果为“-1”。 35.有如下程序 #define N 2 #define M N+1 #define NUM 2*M+1 main() { int i; for(i=1;i<=NUM;i++)printf(″%d\n″,i); } 该程序中的for循环执行的次数是( ) A.5 B.6 C.7 D.8 分析:该题目测试考生对宏替换的理解。这是一种简单的情况:不带参数的宏。关键要注意在对2*M+1进行宏替换时,要将宏名M原封不动代进去,得到NUM的形式为2*N+1+1(千万不要随意给N+1加上小括号,使NUM变为2*(N+1)+1,这就是宏名和变量名之间的区别),在将N代进去,得到NUM的值为6。