05年9月等级考试二级C语言考前密卷4
选择题(1)~(10)每小题2分,(11)~(50)每小题1分,共60分)
下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确的选项涂写在答题卡相应位置上,答在试卷上不得分。
(1)数据的存储结构是指________。
A)存储在外存中的数据 B)数据所占的存储空间量
C)数据在计算机中的顺序存储方式 D)数据的逻辑结构在计算机中的表示
答案:D
评析:数据的逻辑结构在计算机存储空间中的存放形式形式称为数据的存储结构(也称数据的物理结构)。
(2)下列关于栈的描述中错误的是________。
A)栈是先进后出的线性表
B)栈只能顺序存储
C)栈具有记忆作用
D)对栈的插入与删除操作中,不需要改变栈底指针
答案:B
评析:栈是一种特殊的线性表,又称先进后出表(FILO---First In Last Out)。
(3)对于长度为n的线性表,在最坏情况下,下列各排序法所对应的比较次数中正确的是
________。
A)冒泡排序为n2 B)冒泡排序为n
C)快速排序为n D)快速排序为n(n一1)/2
答案:D
评析:假设线性表的长度为n,则在最坏情况下,冒泡排序需要经过n/2遍的从前往后扫描和n/2遍的从后往前扫描,需要比较次数为n(n-1)/2。快速排序法的最坏情况比较次数也是n(n-1)/2。
(4)对长度为n的线性表进行顺序查找,在最坏情况下所需要的比较次数为________。
A)log2n B)n/2 C)n D)n+l
答案:C
评析:顺序查找过程中,如果被查找的元素是线性表中的最后一个元素,或者元素不在线性表中,则需要与线性表中所有的元素进行比较。对长度为n的线性表进行顺序查找,在最坏情况下需要比较n次。
(5)下列对于线性链表的描述中正确的是________。
A)存储空间不一定是连续,且各元素的存储顺序是任意的
B)存储空间不一定是连续,且前件元素一定存储在后件元素的前面
C)存储空间必须连续,且前件元素一定存储在后件元素的前面
D)存储空间必须连续,且各元素的存储顺序是任意的
答案:A
评析:在链式存储结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。
(6)下列对于软件测试的描述中正确的是________。
A)软件测试的目的是证明程序是否正确
B)软件测试的目的是使程序运行结果正确
C)软件测试的目的是尽可能多地发现程序中的错误
D)软件测试的目的是使程序符合结构化原则
答案:C
评析:关于软件测试的目的,Grenford J.Myers再《The Art of Software Testing》一书中给出了深刻的阐述,整体来说,软件测试的目的就是尽可能多地发现程序中的错误。
(7)为了使模块尽可能独立,要求________。
A)模块的内聚程度要尽量高,且各模块间 的耦合程度要尽量强
B)模块的内聚程度要尽量高,且各模块间的耦合程度要尽量弱
C)模块的内聚程度要尽量低,且各模块间的耦合程度要尽量弱
D)模块的内聚程度要尽量低,且各模块间的耦合程度要尽量强
答案:B
评析:模块独立性是指每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。软件设计,应尽量做到高内聚,低耦合,有利于提高模块的独立性。
(8)下列描述中正确的是________。
A)程序就是软件
B)软件开发不受计算机系统的限制
C)软件既是逻辑实体,又是物理实体
D)软件是程序、数据与相关文档的集合
答案:D
评析:计算机软件是计算机系统中与硬件相互依存的另一部分,是包括程序、数据及相关文档的完整集合。
(9)数据独立性是数据库技术的重要特点之一,所谓数据独立性是指________。
A)数据与程序独立存放
B)不同的数据被存放在不同的文件中
C)不同的数据只能被对应的应用程序所使用
D)以上三种说法都不对
答案:D
评析:数据独立性是数据与程序间的互不依赖性,即数据库中数据独立于应用程序而不依赖于应用程序。也就是说,数据的逻辑结构、存储结构与存取方式的改变不会影响应用程序。选项A、B、C三种说法都是错误的。
(10)用树形结构表示实体之间联系的模型是________。
A)关系模型 B)网状模型 C)层次模型 D)以上三个都是
答案:C
评析:层次模型是最早发展起来的数据库模型,它的基本结构是树形结构。
(11)算法具有五个特性,以下选项中不属于算法特性的是________。
A)有穷性 B)简洁性 C)可行性 D)确定性
答案:B
评析:有穷性、确定性、有零个或多个输入、有一个或多个输出、有效性是算法的基本特性。
(12)以下选项中可作为c语言合法常量的是________。
A)-80. B)-080 C)-8e1.0 D)-80.0e
答案:A
评析:c语言的常量分为整型常量、实型常量和字符型常量。选项A属于实型常量中的十进制小数形式的表示法,是合法的。
(13)以下叙述中正确的是________。
A)用C程序实现的算法必须要有输入和输出操作
B)用C程序实现的算法可以没有输出但必须要输入
C)用C程序实现的算法可以没有输入但必须要有输出
D)用C程序实现的算法可以既没有输入也没有输出
答案:C
评析:算法的特性中包括"有零个或多个输入"及"有一个或多个输出"这两个特性。一个算法得到的结果就是算法的输出,没有输出的算法是没有意义的,所以一个算法必须至少有一个输出。
(14)以下不能定义为用户标识符的是________。
A)Main B)_0 C)_int D)sizeof
答案:D
评析:C语言规定标识符只能由字母、数字和下划线三种符号组成,而且第一个字符必须是字母或下划线。注意:大写字母和小写字母被认为是两个不同的字符。A中Main与主i函数名mai n不同。
(15)以下选项中不能作为合法常量的是________。
A)1.234e04 B)1.234e0.4 C)1.234e+4 D)1.234e0
答案:B
评析:指数形式的实型常量要求字每e(或E)之前必需有数字,且e后面的指数必须为整数,所以本题中选项B非法。
(16)数字字符0的ASCII值为48,若有以下程序
main()
{char a="1",b="2";
printf("%c,",b++);
printf("%d\n",b-a);
)
程序运行后的输出结果是________。
A) 3,2 B)50,2 C)2,2 D)2,50
答案:C
评析l执行语句"printf("%c,ll,b++);"后,b的值变成字符3,执行"printf("%d\n",b-a);",即’3’-’1’。
(17)有以下程序
main( )
{
int m=12, n=34;
printf("%d%d",m++,++n);
printf("%d%d\n",n++,++m);
}
程序运行后的输出结果是________。
A)12353514 B)12353513 C)12343514 D)12343513
答案:A
评析:执行"printf("%d%d"m++,++n);"后,输出的是m和n+l的值1235,接着执行
"printf("%d%d\n",n++,++m);"输出n和m+l的值3514。
(18)有定义语句:int b;char c[10】;,则正确的输入语句是________。
A) scanf("%d%s",&b,&C); B) scanf("%d%s",&b,C);
C) scanf("%d%s",b,C); D) scanf("%d%s",b,&C);
答案:B
评析:scanf函数中的"格式控制"后面应当是地址,而不是变量名。对于变量,通过地址运算符"&"求出内存中的地址;对于数组c[10],数组名c即为数组在内存中的地址。
(19)有以下程序
main()
{int m,n,p;
scanf("m=%dn=%dp=%d",&m,&n,&p);
printf("%d%d%d\n",m,n,p);
}
若想从键盘上输入数据,使变量m中的值为123,n中的值为456,p中的值为789,
则正确的输入是________。
A) m。123n=456p=789 B) m=123 n=456 p=789
C) m=123,n=456,p=789 D) 123 456 789
答案:A
评析:根据本题的数据输入形式"scanf("m=%dn=%dp=%d"&m,&n,&p);"说明在输入数据时,必须输入"m="、"n="、"p="字符,且中间不能含有空格。
(20)有以下程序
main()
{ int a,b,d=25;
a=d/10%9;
b=a&&(-1);
printf("%d,%d\n",a,b);
}
程序运行后的输出结果是________。
A)6,l B)2,l C)6,0 D)2,0
答案:B
评析:本题中"a=d/10%9;"的值为25/10%9=2; "b=a&&(-1);"为2&&(-1)=1(注意:-1表示真,只有O才表示假),所以a,b的值分别为2,1。
(21)有以下程序
main()
{
int i=1 j=2,k=3;
if(i++==1&&(++j==3||k++==3))
printf("%d%d%d\n",i,j,k);
}
程序运行后的输出结果是________。
A)l 2 3 B)2 3 4 C) 2 2 3. D)2 3 3
答案:D
评析:执行"i++==1&&(++j==3‖k++==3)"时,表达式"i++==1"嗨值为真,其值为1,表达式"++j=3" 的值为真,根据短路原理,右边的表达式"k++==3"不再进行运算。括号中表达的值为l,作与运算后整个表达式的值也为l,输出i.j,k时,由于未执行过k,所以它们的值分别为2,3,3。
(22)若整型变量a、b、c、d中的值依次为:1、4、3、2。则
(28)有以下程序
void fun(char *a,char *b)
{ a=b;
(*a)++;
}
main()
{
char c1=’A’,c2=’a,*p1,*p2;
clrscr0;
pl=&cl;
p2=&c2;
fun(p1,p2);
printf("%c%c\n",cl,c2);
}
程序运行后的输出结果是__________。
A)Ab B)aa C)Aa D)Bb
答案:A
评析:在函数调用中,可以分值传递和地址传递。若参数传递的是简单数据类型的数值,称为值传递方式。若参数传递的是变量的地址,称为地址传递方式。
(29)若有定义:static int fun(int a,int b),则以下叙述中错误的是_________。
A)定义了一个返回值为整型的静态函数
B)该函数只能被同一文件内的函数调用
C)该函数可以在任何文件中被调用
D)该函数属于内部函数
答案:C
评析:根据函数能否被其他源文件调用,将函数区分为内部和外部函数。如果将函数定义为外部函数,则在函数首部最左端冠以关键字eXtem。如果将函数定义为内部函数,则在函数首部最左端冠以关键字static。内部函数只能被本文件中的其它函数调用。而外部函数则可以被其他任何c程序文件调用。
(30)以下能正确定义一维数组的选项是_________。
A)int num[]; B)int num[0..100];
C)#define N 100; D)int N=100;
int num[N]; int num[N];
答案:C
评析:有二种方法指定数组长度。其一是直接在数组名后面的方括号内输入数组的长度。其二是,在定义数组的同时对其赋值,由实际赋值的元素个数自动确定数组的长度。
(31)有以下程序
fun(int a[],intm,int n)
{ int I,J;
for(i=m;i
a[i+ll=a[I]+3;
}
main()
{
int i,a[6l={2,4,6,8,10,12};
clrscr0;
fun(a,2,5);
for(i=O;i<6;i++)
printf("%"a[I]);
}
程序运行后输出的结果是__________。
A)24691315 B)24691215 C)249121518 D)249121415
答案:B
评析:在调用函数时,既可以用单个的变量作为参数,也可以用数组名作为参数。还可将数组的下标值作为实参使用。在本题中,是将数组名和数组的下标值作为实参。
(32)以下不正确的叙述是__________.
A)在C程序中,逗号运算符的优先级最低。
B)在C程序中,T和t是两个不同的变量
C)若a和b类型相同,在执行了赋值表达式a=b后,b中的值将放入a中,而b中的值不变。
D)当从键盘输入数据时,对于整型变量只能输入整型数据。对于实型变量只能输入实型数据。
答案:D
评析:在c语言中,为方便表达式的运算,对所有的运算符都设定了一定的优先级,其中逗号运算符的优先级最低。c语言中的数据有常量和变量之分,其中变量是区分大小写的,也就是说T和t是两个不同的变量名。将某个变量的值赋给其它的变量之后,并不影响其本身的值。当定义一个整型变量后,可以从键盘上对其输入整型值,也可以是字符型的数据。如果将字符型的值赋给整型变量,则它接受的是字符常量的ASCII码值。实型变量也可以接收整型值。
(33)有以下程序
pf(char *p,int n)
{ int i;
for(i=0;i
p[i]=p[I]+32;
}
main()
{
char a[]="ABCD";
int i:
clrscr();
pf(a,4);
for(i=0;i<4;i++)
printf("%c",a[I]);
}
程序运行后的输出结果是________。
A)ABCD B)ABCD\0 C)abcd D)abed\0
答案:C
评析:通过指向数组的指针可以引用数组中的任何元素,并且对其进行各种运算。本题中就是通过指向数组的指针将一字符数组中的所有大写字母转换成相应的小写字母。
(34)有以下程序
main()
{
int a[3][3],*p,i;
clrscr( );
p=&a[0][0];
for(i=0;i<9;i++)
p[i]:i+2;
printf("%d\n",a[2][11);
}
程序运行后的输出结果是_________。
A)3 B)6 C)9 D)2
答案:C
评析:当某个指针变量指向多维数组时,可以用其每次加l来顺序操作数组中的元素。在此题中,a[3][3]={{2,3,4},{5,6,7},{8,9,10}}。而最后输出的a[2][1]就是第3行的第2列的元素,即9。
(35)有以下程序
#include
#define F(X,Y)(X)*(Y)
main()
{
int a=3,b=4;
clrscr();
printf("%d\n",F(a--,++b));
}
程序运行后的输出结果是_________。
A)8 B)10 C)12 D)15
答案:D
评析。在带参数的宏定义中,不是简单的字符替换。其方法是:在程序中如果有带实参的宏, (如F(x,Y)),则按#define命令行中指定的字符串进行置换。如果串中包含宏中的形参(女NX,Y),、则将程序语句中相应的实参代替形参。本题中的宏定义展开后为:(a.--)*(++b)=(3)* (5)=15。
(36)有以下程序
main()
{
int x=3,y=2,z=l;
printf("%d\n",x/y&&z);
}
程序运行后的输出结果是_________。
A)0 B)l C)2 D)3
答案:B
评析:在c程序的标准输出函数prim冲,要注意表达式的优先级。如本题的表达式x/y&&z,先运算的是算术运算x/v,结果是1,然后才运算l&&z,结果是1。
(37)下列关于c程序编译的描述中,错误的是_________。
A)在程序的编译过程中可以发现所有的语法错误
B)在程序的编译过程中可以发现部分的语法错误
C)在程序的编译过程中不能发现逻辑错误
D)程序编译是调试程序的必经过程
答案:B
评析:编译过程实际上就是调试程序,找出程序中所有可能存在的语法错误。但是,对于程序逻辑上的一些错误,编译过程无能为力,只有程序编写人员自己通过一些良好的编程技巧和方法来排除。
(38)若有以下说明和定义
union、s
{ int i;
char ch
float e
}a;
下列对共用体的操作正确的是________。
A)a=’A’; B)re=a;
C)a.i=3; D)printf("%dha",a);
答案:C
评析:共用体实际上用同一内存段来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是现时存放几种。因此,不能对共用体名赋值,不能引用共用体名以得到某一个值,也不能把共用体变量作为函数参数。
(39)下列选项中 正确的语句组是_________。
A)char s[8];s={"Beijing"}; B)char *s;s={"Beijing"};
C)char s[8];s="Beijing"; D)char *s;s="Beijing";
答案:D
评析:字符串通常是指用一对双引号括起来的一组字符常量序列。在c语言中,可以直接定义一个指向字符串的指针变量,然后对其赋值为字符串常量后,指向字符串的指针就指向了字符串的首地址。
(40)如果一个C程序由多个文件组成,在将多个文件编译连接成一个统一的可执行文件时,可采用的方法有多种,以下叙述中错误的是__________。
A)可以利用Turbo c集成环境 B)在MS C上进行编译连接
C)用#include命令 D)用文字处理软件Word
答案:D
评析:运算多个文件的程序有3种方法,第1种是利用Turbo c集成环境,先将每个文件输入并存储在磁盘上,然后在编译在状态下建立一个"项目文件",最后再编译连接。第2种方法是在MS c上先分别对多个文件进行编译得到.obj文件,然后用link命令把四个文件连接起来。第3种方法是用#include命令将多个文件包含进某个文件中。
(41)有以下程序
main()
{
int n,s=0;
clrscr0;
for(n=10;n<30;n++)
{
if(n%3==O)
{ s+=n;
continue;
}
if(s>100)break;
}
printf("%d",s);
}
程序运行后的输出结果是___________。
A)117 B)147 C)127 D)137
答案:A
评析:continue语句的功能是结束本次循环,即跳过循环体中下面尚未执行的语句,接着执行下一次是否执行循环的判定。而break语句是从循环体内跳出,即提前结束循环。
(42)有以下程序
main()
{
char s[]={’T’,’E’,’A’,’C’,’H’,’E’,’R’},*p;
clrscr0;
p=s+3;
printf("%c",*p++);
printf("%c",*p++);
}
程序运行后的输出结果是________。
A)AC B)CH C)HE D)TEA
答案:B
评析:如果有指向字符数组的指针,那么字符数组中的元素可以用指针变量表示,执行第一个输出语句printf("%c",*p++);后,输出字符’C’,执行第二个输出语句printr("%c",*p++);后,输出字符’H’。
(43)已定义以下函数
fun(char *pl,char*p2)
{
while((’pl=’p2)『-’\0’』
{
pl++;
p2++;
}
}
函数的功能是__________。
A)将p2所指字符串复制到pl所指内存空间
B)将p2所指字符串的地址赋给指 针p1
C)对pl和p2两个指针所指字符串进行比较
D)检查pl和p2两个指针所指字符串中是否有’\O’
答案:A
评析:指针的白加或自减运算,表示指针向前或向后移动一个存储单
(12)以下选项中可作为c语言合法常量的是________。
A)-80. B)-080 C)-8e1.0 D)-80.0e
答案:A
评析:c语言的常量分为整型常量、实型常量和字符型常量。选项A属于实型常量中的十进制小数形式的表示法,是合法的。
(13)以下叙述中正确的是________。
A)用C程序实现的算法必须要有输入和输出操作
B)用C程序实现的算法可以没有输出但必须要输入
C)用C程序实现的算法可以没有输入但必须要有输出
D)用C程序实现的算法可以既没有输入也没有输出
答案:C
评析:算法的特性中包括"有零个或多个输入"及"有一个或多个输出"这两个特性。一个算法得到的结果就是算法的输出,没有输出的算法是没有意义的,所以一个算法必须至少有一个输出。
(14)以下不能定义为用户标识符的是________。
A)Main B)_0 C)_int D)sizeof
答案:D
评析:C语言规定标识符只能由字母、数字和下划线三种符号组成,而且第一个字符必须是字母或下划线。注意:大写字母和小写字母被认为是两个不同的字符。A中Main与主i函数名main不同。
(15)以下选项中不能作为合法常量的是________。
A)1.234e04 B)1.234e0.4 C)1.234e+4 D)1.234e0
答案:B
评析:指数形式的实型常量要求字每e(或E)之前必需有数字,且e后面的指数必须为整数,所以本题中选项B非法。
(16)数字字符0的ASCII值为48,若有以下程序
main()
{char a="1",b="2";
printf("%c,",b++);
printf("%d\n",b-a);
)
程序运行后的输出结果是________。
A) 3,2 B)50,2 C)2,2 D)2,50
答案:C
评析l执行语句"printf("%c,ll,b++);"后,b的值变成字符3,执行"printf("%d\n",b-a);",即’3’-’1’。
(17)有以下程序
main( )
{
int m=12, n=34;
printf("%d%d",m++,++n);
printf("%d%d\n",n++,++m);
}
程序运行后的输出结果是________。
A)12353514 B)12353513 C)12343514 D)12343513
答案:A
评析:执行"printf("%d%d"m++,++n);"后,输出的是m和n+l的值1235,接着执行
"printf("%d%d\n",n++,++m);"输出n和m+l的值3514。
(18)有定义语句:int b;cha r c[10】;,则正确的输入语句是________。
A) scanf("%d%s",&b,&C); B) scanf("%d%s",&b,C);
C) scanf("%d%s",b,C); D) scanf("%d%s",b,&C);
答案:B
评析:scanf函数中的"格式控制"后面应当是地址,而不是变量名。对于变量,通过地址运算符"&"求出内存中的地址;对于数组c[10],数组名c即为数组在内存中的地址。
(19)有以下程序
main()
{int m,n,p;
scanf("m=%dn=%dp=%d",&m,&n,&p);
printf("%d%d%d\n",m,n,p);
}
若想从键盘上输入数据,使变量m中的值为123,n中的值为456,p中的值为789,
则正确的输入是________。
A) m。123n=456p=789 B) m=123 n=456 p=789
C) m=123,n=456,p=789 D) 123 456 789
答案:A
评析:根据本题的数据输入形式"scanf("m=%dn=%dp=%d"&m,&n,&p);"说明在输入数据时,必须输入"m="、"n="、"p="字符,且中间不能含有空格。
(20)有以下程序
main()
{ int a,b,d=25;
a=d/10%9;
b=a&&(-1);
printf("%d,%d\n",a,b);
}
程序运行后的输出结果是________。
A)6,l B)2,l C)6,0 D)2,0
答案:B
评析:本题中"a=d/10%9;"的值为25/10%9=2; "b=a&&(-1);"为2&&(-1)=1(注意:-1表示真,只有O才表示假),所以a,b的值分别为2,1。
(21)有以下程序
main()
{
int i=1 j=2,k=3;
if(i++==1&&(++j==3||k++==3))
printf("%d%d%d\n",i,j,k);
}
程序运行后的输出结果是________。
A)l 2 3 B)2 3 4 C) 2 2 3. D)2 3 3
答案:D
评析:执行"i++==1&&(++j==3‖k++==3)"时,表达式"i++==1"嗨值为真,其值为1,表达式"++j=3" 的值为真,根据短路原理,右边的表达式"k++==3"不再进行运算。括号中表达的值为l,作与运算后整个表达式的值也为l,输出i.j,k时,由于未执行过k,所以它们的值分别为2,3,3。
(22)若整型变量a、b、c、d中的值依次为:1、4、3、2。则
(39)下列选项中正确的语句组是_________。
A)char s[8];s={"Beijing"}; B)char *s;s={"Beijing"};
C)char s[8];s="Beijing"; D)char *s;s="Beijing";
答案:D
评析:字符串通常是指用一对双引号括起来的一组字符常量序列。在c语言中,可以直接定义一个指向字符串的指针变量,然后对其赋值为字符串常量后,指向字符串的指针就指向了字符串的首地址。
(40)如果一个C程序由多个文件组成,在将多个文件编译连接成一个统一的可执行文件时,可采用的方法有多种,以下叙述中错误的是__________。
A)可以利用Turbo c集成环境 B)在MS C上进行编译连接
C)用#include命令 D)用文字处理软件Word
答案:D
评析:运算多个文件的程序有3种方法,第1种是利用Turbo c集成环境,先将每个文件输入并存储在磁盘上,然后在编译在状态下建立一个"项目文件",最后再编译连接。第2种方法是在MS c上先分别对多个文件进行编译得到.obj文件,然后用link命令把四个文件连接起来。第3种方法是用#include命令将多个文件包含进某个文件中。
(41)有以下程序
main()
{
int n,s=0;
clrscr0;
for(n=10;n<30;n++)
{
if(n%3==O)
{ s+=n;
continue;
}
if(s>100)break;
}
printf("%d",s);
}
程序运行后的输出结果是___________。
A)117 B)147 C)127 D)137
答案:A
评析:continue语句的功能是结束本次循环,即跳过循环体中下面尚未执行的语句,接着执行下一次是否执行循环的判定。而break语句是从循环体内跳出,即提前结束循环。
(42)有以下程序
main()
{
char s[]={’T’,’E’,’A’,’C’,’H’,’E’,’R’},*p;
clrscr0;
p=s+3;
printf("%c",*p++);
printf("%c",*p++);
}
程序运行后的输出结果是________。
A)AC B)CH C)HE D)TEA
答案:B
评析:如果有指向字符数组的指针,那么字符数组中的元素可以用指针变量表示,执行第一个输出语句printf("%c",*p++);后,输出字符’C’,执行第二个输出语句printr("%c",*p++);后,输出字符’H’。
(43)已定义以下函数
fun(char *pl,char*p2)
{
while((’pl=’p2)『-’\0’』
{
pl++;
p2++;
}
}
函数的功能是__________。
A)将p2所指字符串复制到pl所指内存空间
B)将p2所指字符串的地址赋给指针p1
C)对pl和p2两个指针所指字符串进行比较
D)检查pl和p2两个指针所指字符串中是否有 ’\O’
答案:A
评析:指针的白加或自减运算,表示指针向前或向后移动一个存储