1.已知二叉树前序遍历和中序遍历为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历为( )
A.GEDHFBCA
B.DGEBHFCA
C.ABCDEFGH
D.ACBFEDHG
分析:利用前序和中序遍历的方法可以确定二叉树的结构,具体步骤如下:
①前序遍历的第一个结点A为树的根结点;
②中序遍历中A的左边的结点为A的左子树,A右边的结点为A的右子树;
③再分别对A的左右子树进行上述两步处理,直到每个结点都找到正确的位置。
2.如果进栈序列为e1,e2,e3,e4,则可能的出栈序列是( )
A.e3,e1,e4,e2
B.e2,e4,e3,e1
C.e3,e4,e1,e2
D.任意顺序
分析:由栈“后进先出”的特点可知:A el不可能比e2先出,C中e3不可能比e4先出,且e1不可能比e2先出,D中栈是先进后出的,所以不可能是任意顺序。B中出栈过程如图所示:
3.程序设计语言基本成分是数据成分、运算成分、控制成分和( )
A.对象成分
B.变量成分
C.语句成分
D.传输成分
分析:程序设计语言是用于来书写计算机程序的语言,其基本成分有以下4种,数据成分:用来描述程序中的数据。运算成分:描述程序中所需的运算。控制成分:用来构造程序的逻辑控制结构。传输成分:定义数据传输成分,如输入输出语言。
4.下列不属于软件工程的3个要素的是( )
A.工具
B.过程
C.方法
D.环境
分析:软件工程包括3要素,即方法、工具和过程。方法是完成软件工程项目的技术手段;工具支持软件的开发、管理、文档生成;过程支持软件开发的各个环节的控制、管理。
5.将E-R图转换到关系模式时,实体与联系都可以表示成( )
A.属性
B.关系
C.键
D.域
分析:数据库逻辑设计的主要工作是将E—R图转换成指定RDBMS中的关系模式。首先,从E—R图到关系模式的转换是比较直接的,实体与联系都可以表示成关系,E—R图中属性也可以转换成关系属性。实体集也可以转换成关系。
6.在深度为5的满二叉树中,叶子结点个数为( )
A.32
B.31
C.16
D.15
分析:所谓满二叉树是指这样的一种二叉树;除最后一层外,每一层上的所有结点都是有两个叶子结点。这就是说,在满二叉树中,层上的结点数都达到最大值,即在满二叉树的第k层上有2 k-1个结点,且深度为m的满二叉树有2 m-1个结点。
7.一些重要的程序语言(如C语言和Pascal语言)允许过程的递归调用。而实现递归调用中的在存储分配通常用( )
A.栈
B.堆
C.数组
D.链表
分析:一些流行的程序语言允许过程的递归调用。递归调用就是过程调用本身。递归实现的是:当过程每一次执行后,都能返回到最近一次调用它的过程中。这样各调用点之间形成一种后进先出关系,而栈结构正适合来存储这些调用点。
8.开发软件时对提高开发人员工作效率至关重要的是( )
A.操作系统的资源管理功能
B.先进的软件开发工具和环境
C.程序人员的数量
D.计算机的并行处理能力
分析:软件工程鼓励研制和采用各种先进的软件开发方法、工具和环境。工具和环境的使用又进一步提高了软件的开发效率、维护效率和软件质量。
9.数据处理的最小单位是( )
A.数据
B.数据元素
C.数据项
D.数据结构
分析:数据处理的最小单位是数据项;由若干数据项组成数据元素;而数据是指能够被计算机识别、存储和加工处理的信息载体;数据结构是指数据之间的相互关系和数据运算。故正确答案为选项C。
10.下述关于数据库系统的叙述中正确的是( )
A.数据库系统减少了数据冗余
B.数据库系统避免了一切冗余
C.数据库系统中数据的一致性是指数据类型一致
D.数据库系统比文件系统能管理更多的数据
分析:数据库系统数据具有高共享性和低冗余性,但不能完全避免数据冗余;数所据的一致性是指在系统中同一数据的不同出现应保持相同的值。
11.以下程序的输出结果是( )
main()
{ int a=21,b=11;
printf(″%d\n″,--a+b,--b+a);
}
A.30
B.31
C.32
D.33
分析:该题考查的是C语言中自减运算符和逗号表达式的应用。自减运算符位于变量之前时,先使变量的值减1,再进行赋值运算。逗号表达式的一般形式为:表达式1,表达式2,其求解过程是:先求解表达式1,再求解表达式2,整个逗号表达式的值是表达式2的值。
12.设x,y和z都是int型变量,且x=3,y=4,z=5,则下面表达式中,值为0的表达式是( )
A.x&&y
B.x<=y
C.x||++y&&y-z
D.!(x 13.设有程序段 int k=10; while(k=0)k=k-1; 则下面描述中正确的是( ) A.while循环执行10次 B.循环是无限循环 C.循环体语句一次也不执行 D.循环体语句执行一次 分析:本题中,首先将0赋给k,表达式变为0,跳出循环,没有执行循环体语句。解答本题的关键是掌握while语句。 14.以下程序的输出结果是( ) main() { int a,i;a=0; for(i=1;i<5;i++) { switch(i) { case 0: case 3:a+=2; case 1: case 2:a+=3; default:a+=5; } }printf(″%d\n″,a); } A.31 B.13 C.10 D.20 分析:本题考查用于多分支选择的switch语句,其一般形式为: switch(表达式) { case常量表达式1:语句1; case常量表达式2:语句2; … case常量表达式n:语句n; default:语句n+1; } 其语义是计算表达式的值。并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。 15.下面程序的功能是将从键盘输入的一对数,由小到大排序输出,当输入一对相等数时结束循环,在划线处应填入的语句是( ) #include main() { int a,b,t; scanf(″%d%d″,&a,&b); while(______) { if(a>b) {t=a;a=b;b=t;} printf(″%d%d\n″,a,b); scanf(″%d%d″,&a,&b); } } A.!a=b B.a!=b C.a==b D.a=b 分析:根据本题提出的条件可知,控制循环的表达式应该是所输入的两数也互不相等(相等时结束循环),也即只有满足这一条件时,两数才能进行排序输出的操作,由此得出循环的控制表达式应该为a!=b。 16.若有说明:int a[][4]={0,0};则下面不正确的叙述是( ) A.数组a的每个元素都可得到初值0 B.二维数组a的第一维大小为1 C.当初值的个数能被第二维的常量表达式的值除尽时,所得商数就是第一维的大小 D.只有元素a[0][0]和a[0][1]可得到初值,其余元素均得不到确定的初值 分析:本题考查二维数组的基本概念。对于二维数组,只可以省略第一个括号中的常量表达式,而不能省略第二个括号中的常量表达式。第一维的大小按以下规则决定: ①当初值的个数能被第二维的常量表达式的值除尽时,所得商数就是第一维的大小。 ②当初值的个数不能被第二维的常量表达式的值除尽时,则: 第一维的大小=所得的商数+1 ③数组中未赋初值的元素系统会自动对它们赋初值0。 17.已知学生记录描述为 struct student { int no; char name[20],sex; struct { int year,month,day; } birth; }; struct student s; 设变量s中的“生日”是“1984年11月12日”,对“birth”正确赋值的程序段是( ) A.year=1984;month=11;day=12; B.s.year=1984;s.month=11;s.day=12; C.birth.year=1984;birth.month=11;birth.day=12; D.s.birth.year=1984;s.birth.month=11;s.birth.day=12; 分析:本题考查结构体变量的基本概念。一般情况下,不能将一个结构体变量作为整体来引用,只能是引用其中的成员(分量)。引用结构体成员的方式:结构体变量名.成员名“.”是“成员运算符”(分量运算符),如果成员本身又属一个结构体类型,则要若干个成员运算符,一级一级地找到最低一级的成员。只能对最低级的成员进行赋值或存取以及运算。 18.有如下程序 int func(int a,int b) { return(a+b);} main() { int x=2,y=5,z=8,r; r=func(func(x,y),z); printf(″%d\n″,r); } 该程序的输出的结果是( ) A.12 B.13 C.14 D.15 分析:表达式r=func(func(x,y),z);中,fun(x,y)是一次调用函数,它的值作为func另一次调用的实参。注意本题调用两次函数。 19.有如下定义 struct person{char name[9];int age;}; struct person class [10]={″John″,17,″paul″,19,″Mary″,18,″Adam″,16}; 根据上述定义,能输出字母M的语句是( ) A.printf(″%c\n″,class[3].name); B.printf(″%c\n″,class[3].name[1]); C.printf(″%c\n″,class[2].name[1]); D.printf(″%c\n″,class[2].name[0]); 分析:这是一个给结构体数组赋初值的问题。它的赋初值过程与上述二维数组赋初值很相似。只是这里的大括号中的初始值没有按行给出(也即没有用大括号分开来),在这种情况下,初始值将按数组的各个元素在内存中的存放次序逐个逐个地赋给各元素。现在结构体数组的各个元素在内存中的存放次序是这样的:class[0].name,class[0].age,class[1].name,class[1].age...,由此可以知道,包含字母‘M’的字符串“Mary”赋值给了元素class[2].name,则与字符‘M’先相对应的表达式是class[2].name[0]。 20.阅读下列程序,当运行函数时,输入asd af aa z67,则输出为( ) #include #include #include int fun(char *str) { int i,j=0; for(i=0;str[i]!=′\0′;i++) if(str[i]!=′ ′)str[j++]=str[i]; str[j]=′\0′; } main () { char str[81]; int n; clrscr(); printf(″Input a string:″); gets(str); puts(str); fun(str); printf(″%s\n″,str); } A.asdafaaz67 B.asd af aa z67 C.asd D.z67 分析:本题题意要求删除所有空格,即除了空格以外的其他所有字符都要留下。由于C语言中没有直接删除字符的操作,所以我们对于删除字符的操作都是采用“留下”字符的算法。用str[i]从串头到串尾逐一走动,每走到一个字符都判断其是否为空格,若不是空格(注意在if()的单引号之间有一个空格),则将其保存str[j]中。注意j的下标变化、初值及最后加串结束符‘\0’。 21.若有定义:char *st=″how are you″;下列程序段中正确的是( ) A.char a[11],*p;strcpy(p=a+1,&st[4]); B.char a[11];strcpy(++a,st); C.char a[11];strcpy(a,st); D.char a[ ],*p;strcpy(p=&a[1],st+2); 分析:本题综合考查字符数组的赋值和strcpy函数的用法。C语言不允许用赋值表达式对字符数组的赋值,如下面的语句就是非法的:str1=″China″,如果想把“China”这5个字符放到数组str1中,除了逐个地输入外,还能使用strcpy函数,该函数的功能是将一个字符串复制到一字符数组中。例如:strcpy(str1,“China”);或strcpy(str1,str2);注意,不能企图用以下语句来实行赋值(将str2的值传给str1):str1=str2;不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。strcpy函数的结构是:strcpy(字符数组1,字符串2)其中,需要注意的是,字符数组1的长度不应小于字符串2的长度,“字符数组1”必须写成数组名形式,如(str1),“字符串2”可以是字符数组名,也可以是字符串常量,不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。 22.请选出正确的程序段( ) A.int *p; B.int *s,k; scanf(″%d″,p); *s=100; … … C.int *s,k; D.int *s,k; char *p,c; char *p,e; s=&k; s=&k; p=&c; p=&c; *p=′a′; s=p; … *s=1; … 分析:本题的选项A和B犯了一个同样的错误,即指针变量p定义后并没有指向具体的变量。也就是说,p中没有确定的地址值,它的值是不可预见的,所指向的单元是不可预见的,因此不能进行赋值操作。另外,在选项D中,s是int型指针变量,p是char型指针变量,所指向的内存单元所占用的字节数是不同的,因而不能将字符指针变量p的值赋给整型指针变量s。 23.下面四选项中,是合法整型常量选项是( ) A.160 -0xffff 011 B.-0xcdf 01a 0xe C.-01 986,012 0668 D.-0x48a 2e5 0x 分析:解答本题时,我们必须要明白“进制”数的表示方法。按不同的进制区分,整型常数有3种表示方法:十进制数,如220,-560,45900八进制数:以0开始的数数字范围0~7如:06,0106,05757;十六进制数:以0X或0x开始的数字范围0~9,a~f或A~F,如:0X0D,0XFF,0x4e,0x48a。另外,可在整型常数后添加一个“L”或“I”字母表示该数为长整型数,如22L,0773L,0Xae4I。 24.假定x和y为double型,则表达式x=2,y=x+3/2的值是( ) A.3.500000 B.3 C.2.000000 D.3.000000 分析:本题需要掌握的知识点是:逗号表达式的求解步骤,另外,注意一下两个整数相除的结果仍为整数。了解了知识点后,本题就可以逐步求解了: x=2 y=x+3/2 y=2.000000+1 y=3.000000 25.已知i,j,k为int型变量,从键盘输入:1,2,3<回车>,使i的值为1,j的值为2,k的值为3,以下选项正确的输入语句是( ) A.scanf(″%2d,%2d,%2d″,i,j,k); B.scanf(″%d%d%d″,&i,&j,&k); C.scanf(″%d,%d,%d″,&i,&j,&k); D.scanf(″i=%d,j=%d,k=%d″,&i,&j,&k); 分析:在使用scanf函数时,我们必须要注意以下问题: ①用scanf函数给普通变量输入数据时,在变量名前没有写地址运算符&。如scanf(″%d%d″,x,y);是错误的。正确的应为scanf(″%d%d″,&x,&y); ②在scanf函数调用语句中,企图规定输入实型数据的小数位。如执行以下语句:scanf(″%6.2f″,&a);C语言规定是不允许指定输入数据的宽度的。 ③是错误不允许输入数字宽度。用scanf函数输入数据时,必须注意要与scanf语句中的对应形式匹配。如:scanf(″%d,%d″,&x,&y);若按以下形式输入数据:2 4是不合法。数据2和4之间应当有逗号。 本题选项A中后面省略了符号&,其他选项也有省略逗号的错误,只要明白了以上解析,可以说,scanf函数的重要用法已经在我们掌握之中了 26.若执行下面的程序时,从键盘上输入5和2,则输出结果是( ) main() { int a,b,k; scanf(″%d,%d″,&a,&b); k=a; if(a else k=b%a; printf(″%d\n″,k); } A.5 B.3 C.2 D.0 分析:本题考查简单的if-else语句。先执行条件if(a27.以下程序的输出结果是( ) main() { int x=1,y=3; printf(″%d″,x++); { int x=0;x+=y*2; printf(″%d,%d″,x,y); } printf(″%d,%d\n″,x,y); } A.1,6,3,1,3 B.1,6,3,6,3 C.1,6,3,2,3 D.1,7,3,2,3 分析:本题考查C语言中常见的运算符及表达式的用法。printf(“%d,”,x++);表达式中,程序先输出x的值,然后再加1,所以,结果为1;在int x=0;x+=y*2;表达式中,将0的值赋给x,然后再运算x+=y*2的值,结果为x=6,y的值不变,为3,在最后的printf函数中的x,是执行了x++语句后的值,所以应为2。 28.请阅读以下程序 main() { int a=5,b=0,c=0; if(a=b+c)printf(″* * *\n″); else printf(″$$$\n″); } 以上程序( ) A.有语法错不能通过编译 B.可以通过编译但不能通过连接 C.输出* * * D.输出$$$ 分析:解答本题时,先判断if语句,因为a=b+c不成立,则执行else语句。 29.设有如下定义 char *s[2]={″abcd″,″ABCD″}; 则下列说法错误的是( ) A.s数组元素的值分别是″abcd″和″ABCD″两个字符串的首地址 B.s是指针数组名,它含有两个元素分别指向字符型一维数组 C.s数组的两个元素分别存放的是含有4个字符的一维字符数组中的元素 D.s数组的两个元素中分别存放了字符′a′和′A′的地址 分析:该定义中指明的是含有两个元素的字符数组指针,对数组存放的都是首地址即串中的第一个字符的地址。 30.有以下程序 struct STU { char num[10];float score[3];}; main() { struct STU s[3]={ {″20021″,90,95,85}, {″20022″,95,80,75}, {″20023″,100,95,90}, },*p=s;〖ZK)〗 int i;float sum=0; for(i=0;i<3;i++) sum=sum+p->score[i]; printf(″%6.2f\n″,sum); } 程序运行后的输出结果是( ) A.260.00 B.270.00 C.280.00 D.285.00 分析:C语言规定数组名代表数组的首地址,也就是第0号元素的地址,在本题中s就是s[0]的地址,指针变量p指向s,也就是指向s[0],所以在for循环累加的是s[0]的score成员值。 31.有如下定义 #define D 2 int x=5;float y=3.83; char c=′D′; 则下面选项中错误的是( ) A.x++; B.y++; C.c++; D.D++; 分析:C语言中++运算符的对象可以是整型、实型和字符型,但不可是常量,本题中D为常量。 32.下列程序的运行结果是( ) void fun(int *a,int *b) { int *k; k=a;a=b;b=k; } main() { int a=2004,b=9,*x=&a,*y=&b; fun(x,y); printf(″%d %d″,a,b); } A.2004 9 B.9 2004 C.0 0 D.编译时出错 分析:本题函数fun中形参是两个指针变量,函数fun只是将这两个指针的指向的地址交换了一下而并没有交换它们所指向的地址中的数据。虽然,主函数中声明的变量a,b是整型变量而函数fun中的形参是两个指针变量,这两个变量仅仅是两个参数,与主函数中的那两个变量含义是不同的。 33.下面程序应能对两个整型变量的值进行交换。以下正确的说法是( ) main() { int a=10,b=20; printf(″(1)a=%d,b=%d\n″,a,b); swap(&a,&b); printf(″(2)a=%d,b=%d\n″,a,b); } swap(int p,int q) { int t; t=p;p=q;q=t; } A.该程序完全正确 B.该程序有错,只要将语句swap(&a,&b);中的参数改为a,b即可 C.该程序有错,只要将swap()函数中的形参p和q以及t均定义为指针(执行语句不变)即可 D.以上说法都不对 分析:本题应该把swap()函数改成这样: swap(int *p,int *q) { int t;t=*p;*p=*q;*q=t;} 这时执行程序时,先将a的地址传递给指针变量p,b的地址传递给指针变量q,然后将*p(a的值)的值传递给t,将*q(b的值)传递给*p,将t的值传递给*q,从而将a和b互换。 34.以下程序的输出结果是( ) int f() { static int i=0; int s=1; s+=i;i++; return s; } main() { int i,a=0; for(i=0;i<5;i++)a+=f(); printf(″%d\n″,a); } A.20 B.24 C.25 D.15 分析:本题应该把swap()函数改成这样: swap(int *p,int *q) { int t;t=*p;*p=*q;*q=t;} 这时执行程序时,先将a的地址传递给指针变量p,b的地址传递给指针变量q,然后将*p(a的值)的值传递给t,将*q(b的值)传递给*p,将t的值传递给*q,从而将a和b互换。 35.C语言程序的基本单位是( ) A.程序行 B.语句 C.函数 D.字符 分析:C语言的主体就是一个主函数,然后有库函数和用户自定义的函数来配合主函数完成一系列的任务,所以说, C语言的基本单位是函数。