2013年3月份全国计算机等级考试二级C语
言笔试上机题库
一、选择题
在下列各题的A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确的选项涂写在答题卡相应位置上,答在试卷上不得分。(1)为了避免流程图在描述程序逻辑时的灵活性,提出了用方框图来代替传统的程序流程图,通常也把这种图称为
A)PAD图B)N-S图C)结构图D)数据流图
(2)结构化程序设计主要强调的是
A)程序的规模B)程序的效率C)程序设计语言的先进性D)程序易读性
(3)为了使模块尽可能独立,要求
A)模块的内聚程度要尽量高,且各模块间的耦合程度要尽量强
B)模块的内聚程度要尽量高,且各模块间的耦合程度要尽量弱
C)模块的内聚程度要尽量低,且各模块间的耦合程度要尽量弱
D)模块的内聚程度要尽量低,且各模块间的耦合程度要尽量强(4)需求分析阶段的任务是确定
A)软件开发方法B)软件开发工具C)软件开发费用D)软件系统功能
(5)算法的有穷性是指
A)算法程序的运行时间是有限的
B)算法程序所处理的数据量是有限的
C)算法程序的长度是有限的
D)算法只能被有限的用户使用(6)对长度为n的线性表排序,在最坏情况下,比较次数不是n(n-1)/2的排序方法是
A)快速排序B)冒泡排序C)直接插入排序D)堆排序(7)如果进栈序列为e1,e2,e3,e4,则可能的出栈序列是
A)e3,e1,e4,e2
B)e2,e4,e3,e1 C)e3,e4,e1,e2
D) 任意顺序
(8)将E-R图转换到关系模式时,实体与联系都可以表示成
A)属性B)关系C)键D)域
(9)有三个关系R、S和T如下: R
B C D
a 0 k1
b 1 n1
S
B C D
f 3 h2
a 0 k1
n 2 x1
T
B C D
a 0 k1
由关系R和S通过运算得到关系T,则所使用的运算为
A)并B)自然连接C)笛卡尔积D)交
(10)下列有关数据库的描述,正确的是
A)数据处理是将信息转化为数据的过程
B)数据的物理独立性是指当数据的逻辑结构改变时,数据的存储结构不变
C)关系中的每一列称为元组,一个元组就是一个字段
D)如果一个关系中的属性或
属性组并非该关系的关键字,
但它是另一个关系的关键字,
则称其为本关系的外关键字(11)以下叙述中正确的是
A)用C程序实现的算法必须要有输入和输出操作
B)用C程序实现的算法可以没有输出但必须要有输入
C)用C程序实现的算法可以没有输入但必须要有输出
D)用C程序实现的算法可以既没有输入也没有输出
(12)下列可用于C语言用户标识符的一组是
A)void, define, WORD
B)a3_3,_123,Car C)For, -abc, IF Case D)2a, DO, sizeof (13)以下选项中可作为C语言合法常量的是
A)-80 B)-080
C)-8e1.0 D)-80.0e
(14)若有语句:char *line[5];,以下叙述中正确的是
A) 定义line是一个数组,每个数组元素是一个基类型为char为指针变量
B) 定义line是一个指针变量,该变量可以指向一个长度为5的字符型数组
C) 定义line是一个指针数组,语句中的*号称为间址运算符
D) 定义line是一个指向字符型函数的指针
(15)以下定义语句中正确的是
A)int a=b=0; B)char A=65+1,b=′b′; C)float a=1,*b=&a,*c=&b;
D)double a=0 0;b=1.1;
(16)有以下程序段
char ch; int k;
ch=′a′;
k=12;
printf("%c,%d,",ch,ch,k);
printf("k=%d \n",k);
已知字符a的ASCII码值为97,则执行上述程序段后输出结果是
A)因变量类型与格式描述符的类型不匹配输出无定值
B)输出项与格式描述符个数不符,输出为零值或不定值
C)a,97,12k=12
D)a,97,k=12
(17)有以下程序
main()
{ int i,s=1;
for (i=1;i<50;i++)
if(!(i%5)&&!(i%3)) s+=i;
printf("%d\n",s);}
程序的输出结果是
A)409 B)277 C)1 D)91 (18)当变量c的值不为2、4、6时,值也为"真"的表达式是
A)(c==2)||(c==4)||(c==6)
B)(c>=2&&
c<=6)||(c!=3)||(c!=5)
C)(c>=2&&c<=6)&&!(c%2)
D)(c>=2&& c<=6)&&(c%2!=1) (19)若变量已正确定义,有以下程序段
int a=3,b=5,c=7;
if(a>b) a=b; c=a;
if(c!=a) c=b;
printf("%d,%d,%d\n",a,b,c);
其输出结果是
A)程序段有语法错
B)3,5,3 C)3,5,5 D)3,5,7
(20)有以下程序
#include
main()
{ int x=1,y=0,a=0,b=0;
switch(x)
{ case 1:
switch(y)
{ case 0:a++; break;
case 1:b++; break;
}
case 2:a++; b++; break;
case 3:a++; b++;
}
printf("a=%d,b=%d\n",a,b);
}
程序的运行结果是
A)a=1,b=0
B)a=2,b=2 C)a=1,b=1 D)a=2,b=1
(21)下列程序的输出结果是
#include "stdio.h"
main()
{ int i,a=0,b=0;
for(i=1;i<10;i++) { if(i%2==0)
{a++;
continue;}
b++;}
printf("a=%d,b=%d",a,b); }
A)a=4,b=4 B)a=4,b=5
C)a=5,b=4
D)a=5,b=5
(22)已知
#int t=0;
while (t=1)
{...}
则以下叙述正确的是
A)循环控制表达式的值为0
B)循环控制表达式的值为1
C)循环控制表达式不合法
D)以上说法都不对
(23)下面程序的输出结果是main()
{ int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a; printf("%d\n",*(p+2));}
A)3 B)4 C)1
D)2
(24)以下错误的定义语句是
A)int
x[][3]={{0},{1},{1,2,3}};
B)int
x[4][3]={{1,2,3},{1,2,3},{1,2,3},{1 ,2,3}};
C)int
x[4][]={{1,2,3},{1,2,3},{1,2,3},{1, 2,3}}; D)int x[][3]={1,2,3,4};
(25)有以下程序
void ss(char *s,char t)
{ while(*s)
{ if(*s==t)*s=t-′a′+′A′;
s++; } }
main()
{ char str1[100]="abcddfefdbd",c=′d′;
ss(str1,c); printf("%s\n",str1);}
程序运行后的输出结果是
A)ABCDDEFEDBD
B)abcDDfefDbD
C)abcAAfefAbA
D)Abcddfefdbd
(26)有如下程序
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
(27)有定义语句:char s[10];,若要从终端给s输入5个字符,错误的输入语句是
A)gets(&s[0]);
B)scanf("%s",s+1); C)gets(s);
D)scanf("%s",s[1]);
(28)以下叙述中错误的是
A)在程序中凡是以"#"开始的语句行都是预处理命令行B)预处理命令行的最后不能以分号表示结束C)#define MAX 是合法的宏定义命令行D)C程序对预处理命令行的处理是在程序执行的过程中进行的(29)设有以下说明语句typedef struct
{ int n;
char ch[8];
} PER;
则下面叙述中正确的是
A)PER 是结构体变量名
B)PER是结构体类型名
C)typedef struct 是结构体类型
D)struct 是结构体类型名
(30)以下叙述中错误的是
A)gets函数用于从终端读入字符串B)getchar函数用于从磁盘文件读入字符
C)fputs函数用于把字符串输出到文件D)fwrite函数用于以二进制形式输出数据到文件(31)以下能正确定义一维数组的选项是
A)int a[5]={0,1,2,3,4,5};
B)char a[]={′0′,′1′,′2′,′3′,′4′,′5′,′\0′};
C)char a={′A′,′B′,′C′}; D)int a[5]="0123";
(32)有以下程序
#include
main()
{ char p[]={′a′, ′b′, ′c′},q[10]={ ′a′, ′b′, ′c′}; printf("%d%d\n",strlen(p),strlen(q)) ;}
以下叙述中正确的是
A) 在给p和q数组置初值时,系统会自动添加字符串结束符,故输出的长度都为3
B) 由于p数组中没有字符串结束符,长度不能确定,但q数组中字符串长度为3
C) 由于q数组中没有字符串
结束符,长度不能确定,但p数组中字符串长度为3
D) 由于p和q数组中都没有字符串结束符,故长度都不能确定(33)有以下程序
#include
#include
void fun(char *s[],int n) { char *t; int i,j; for(i=0;i for(j=i+1;j if(strlen(s[i])>strlen(s[j])) {t=s[i];s[i]:s[j];s[j]=t;} } main() { char *ss[]={"b cc","bbcc","xy","aaaacc ","aabcc"}; fun(ss,5); printf("%s,%s\n",ss[0],ss[4]); } 程序的运行结果是 A)xy,aaaacc B)aaaacc,xy C)bcc,aabcc D)aabcc,bcc (34)有以下程序 #include int f(int x) { int y; if(x==0||x==1) return(3); y=x *x-f(x-2); return y; } main() { int z; z=f(3); printf("%d\n",z); } 程序的运行结果是 A)0 B)9 C)6 D)8 (35)下面程序段的运行结果是char str[]="ABC",*p=str; printf("%d\n",*(p+3)); A)67 B)0 C)字符′C′的地址D)字符′C′ (36)若有以下定义: struct link { int data; struct link *next; } a,b,c,*p,*q; 且变量a和b之间已有如下图所示的链表结构: 指针p指向变量a,q指向变量c。则能够把c插入到a和b 之间并形成新的链表的语句组是: A)a.next=c; c.next=b; B)p.next=q; q.next=p.next; C)p->next=&c; q->next=p->next; D)(*p).next=q; (*q).next=&b; (37)对于下述程序,在方式串分别采用"wt"和"wb"运行时,两次生成的文件TEST的长度分别是 #include void main() { FILE *fp=fopen("TEST",); fputc(′A′,fp);fputc(′\n′,fp); fputc(′B′,fp);fputc(′\n′,fp); fputc(′C′,fp); fclose(fp); } A)7字节、7字节B)7字节、5字节C)5字节、7字节D)5字节、5字节 (38)变量a中的数据用二进制表示的形式是01011101,变量b中的数据用二进制表示的形式是 11110000。若要求将a的高4位取反,低4位不变,所要执行的运算是 A)a^b B)a|b C)a&b D)a<<4 (39)下面的程序段运行后,输出结果是 int i,j,x=0; static int a[8][8]; for(i=0;i<3;i++) for(j=0;j<3;j++) a[i][j]=2*i+j; for(i=0;i<8;i++) x+=a[i][j]; printf("%d",x); A)9 B)不确定值C)0 D)18 (40)下列程序执行后的输出结果是 void func(int *a,int b[]) { b[0]=*a+6; } main() { int a,b[5]; a=0; b[0]=3; func(&a,b); printf("%d\n",b[0]);} A)6 B)7 C)8 D)9 二、填空题 请将每一个空的正确答案写在答题卡序号的横线上,答在试卷上不给分。 (1)测试的目的是暴露错误,评价程序的可靠性;而【1】的目的是发现错误的位置并改正错误。 (2)某二叉树中度为2的结点有18个,则该二叉树中有【2】个叶子结点。 (3)当循环队列非空且队尾指针等于队头指针时,说明循环队列已满,不能进行入队运算。这种情况称为【3】。 (4)在关系模型中,把数据看成一个二维表,每一个二维表称为一个【4】。 (5)在计算机软件系统的体系结构中,数据库管理系统位于用户和【5】之间。 (6)以下程序的输出结果是【6】。main() { char c=′z′; printf("%c",c-25); } (7)阅读下面语句,则程序的执行结果是【7】。 #include "stdio.h" main() { int a=-1,b=1,k; if((++a<0)&&!(b--<=0)) printf("%d,%d\",a,b); else printf("%d,%d\n",b,a);} (8)下列程序的输出结果是【8】。main() { int i; for(i=1;i+1;i++) { if(i>4) { printf("%d\n",i); break; } printf("%d\n",i++);}} (9)以下程序的定义语句中,x[1]的初值是【9】,程序运行后输出的内容是【10】。 #include main() { int x[]={1,2,3,4,5,6,7,8,9,10,11,12,13,1 4,15,16}, *p[4],i; for(i=0;i<4;i++) { p[i]=&x[2*i+1]; printf("%d",p[i][0]); } printf("\n");) } (10)以下程序的输出结果是【11】。 #include void swap(int *a, int *b) { int *t; t=a; a=b; b=t; } main() { int i=3,j=5, *p=&i, *q=&j; swap(p,q); printf("%d %d\N,*p,*q)) } (11)以下程序的输出结果是【12】。 main() { char s[]="ABCD", *p; for(p=s+1; p (12)以下程序的输出结果是【13】。 float fun(int x,int y) { return(x+y);} main() { int a=2,b=5,c=8; printf("%3.0f\n",fun((int)fun(a+c,b), a-c));} (13)有如下图所示的双链表结构,请根据图示完成结构体的定义: lhead data rchild struct aa { int data; 【14】}node; (14)fseek函数的正确调用形式是【15】。 一、选择题 (1)B 【解析】N-S图是由Nassi 和Shneiderman 提出的一种符合程序化结构设计原则的图形描述工具。它的提出是为了避免流程图在描述程序逻辑时的随意性上灵活性。 (2)D 【解析】结构化程序设计方法的主要原则可以概括为自顶向下、逐步求精、模块化及限制使用goto语句,总的来说可使程序结构良好、易读、易理解、易维护。 (3)B【解析】模块的独立程度可以由两个定性标准度量:耦合性和内聚性。耦合性是衡量不同模块彼此间互相依赖(连接)的紧密程度;内聚性是衡量一个模块内部各个元素彼此结合的紧密程度。一般来说,要求模块之间的耦合尽可能地低,而内聚性尽可能地高。 (4)D 【解析】需求分析是软件定义时期的最后一个阶段,它的基本任务就是详细调查现实世界要处理的对象(组织、部门、企业等),充分了解原系统的工作概况,明确用户的各种需求,然后在此基础上确定新系统的功能。选项A)软件开发方法是在总体设计阶段需完成的任务;选项B)软件开发工具是在实现阶段需完成的任务;选项C)软件开发费用是在可行性研究阶段需完成的任务。 (5)A 【解析】算法具有5个特性:①有穷性:一个算法必须(对任何合法的输入值)在执行有穷步之后结束,且每一步都可在有限时间内完成,即运行时间是有限的;②确定性:算法中每一条指令必须有确切的含义,读者理解时不会产生歧义;③可行性:一个算法是可行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现;④输入:一个算法有零个或多个输入,这些输入取自于某个特定的对象的集合;⑤输出:一个算法有一个或多个输出。 (6)D 【解析】在最坏情况下,快速排序、冒泡排序和直接插入排序需要的比较次数都为n(n-1)/2,堆排序需要的比较次数为nlog2n。 (7)B 【解析】由栈"后进先出"的特点可知:A)中e1不可能比e2先出,C)中e1不可能比e2先出,D)中栈是先进后出的,所以不可能是任意顺序。B)中出栈过程如下图所示: (8)B 【解析】关系数据库逻辑设计的主要工作是将 E-R 图转换成指定RDBMS中的关系模式。首先,从E-R图到关系模式的转换是比较直接的,实体与联系都可以表示成关系,E-R图中属性也可以转换成关系的属性,实体集也可以转换成关系。 (9)D 【解析】在关系运算中,交的定义如下:设R1和R2为参加运算的两个关系,它们具有相同的度n,且相对应的属性值取自同一个域,则R1 R2为交运算,结果仍为度等于n的关系,其中,交运算的结果既属于R1,又属于R2。(10)D 【解析】数据处理是指将数据转换成信息的过程,故选项A)叙述错误;数据的物理独立性是指数据的物理结构的改变,不会影响数据库的逻辑结构,故选项B)叙述错误;关系中的行称为元组,对应存储文件中的记录,关系中的列称为属性,对应存储文件中的字段,故选项C)叙述错误。 11)C 【解析】算法具有的5个特性是:有穷性;确定性;可行性;有0个或多个输入;有一个或多个输出。所以说,用C程序实现的算法可以没有输入但必须要有输出。 (12)B 【解析】C语言规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线,排除选项C)和D);C 语言中还规定标识符不能为C语言的关键字,而选项A)中void为关键字,故排除选项A)。 (13)A 【解析】选项B)项中,以0开头表示是一个八进制数,而八进制数的取值范围是0~7,所以-080是不合法的;选项C)和D)中,e后面的指数必须是整数,所以也不合法。 (14)A 【解析】C语言中[ ]比*优先级高,因此line先与[5]结合,形成line[5]形式,这是数组形式,它有5个元素,然后再与line前面的"*"结合,表示此数组是一个指针数组,每个数组元素都是一个基类 型为char的指针变量。 (15)B 【解析】本题考查变量的定义方法。如果要一次进行多个变量的定义,则在它们之间要用逗号隔开,因此选项A)和D)错误。在选项C)中,变量c是一个浮点型指针,它只能指向一个浮点型数据,不能指向指针变量b,故选项 C)错误。 (16)D 【解析】输出格式控制符%c表示将变量以字符的形式输出;输出格式控制符%d 表示将变量以带符号的十进制整型数输出,所以第一个输出语句输出的结果为a,97;第二个输出语句输出的结果为k=12。 (17)D 【解析】本题是计算50之内的自然数相加之和,题中if语句括号中的条件表达式!(i%5)&&!(i%3)表明只有能同时被5和3整除的数才符合相加的条件,1~ 49之间满足这个条件的只有,15、30和45,因为s的初始值为1,所以s=1+15+30+45=91。 (18)B 【解析】满足表达式(c>=2&&c<=6)的整型变量c的值是2,3,4,5,6。当变量c的值不为2,4,6时,其值只能为3或5,所以表达式c!=3和c!=5中至少有一个为真,即不论c为何值,选项B中的表达式都为"真"。 (19)B 【解析】两个if语句的判断条件都不满足,程序只执行了c=a这条语句,所以变量c的值等于3,变量b的值没能变化,程序输出的结果为3,5,3。所以正确答案为B)。 (20)D 【解析】本题考查switch语句,首先,x=1符合条件case 1,执行switch(y)语句,y=0符合case 0语句,执行a++并跳出switch(y)语句,此时a=1。因为case 1语句后面没有break 语句,所以向后执行case 2语句,执行a++,b++,然后跳出switch(x),得a=2,b=1。 (21)B 【解析】continue语句的作用是跳过本次循环体中余下尚未执行的语句,接着再一次进行循环条件的判定。当能被2整除时,a 就会增1,之后执行continue语句,直接执行到for循环体的结尾,进行i++,判断循环条件。(22)B 【解析】t=1是将t赋值为1,所以循环控制表达式的值为1。判断t是否等于1时,应用t==1,注意"="与"=="的用法。 (23)A 【解析】在C语言中,数组元素是从0开始的。指针变量p指向数组的首地址,(p+2)就会指向数组中的第3个元素。题目中要求输出的是元素的值。 (24)C 【解析】本题考查的是二维数组的定义和初始化方法。C语言中,在定义并初始化二维数组时,可以省略数组第一维的长度,但是不能省略第二维的长度。故选项C)错误。 (25)B 【解析】在内存中,字符数据以ASCII 码存储,它的存储形式与整数的存储形式类似。C语言中,字符型数据和整型数据之间可以通用,也可以对字符型数据进行算术运算,此时相当于对它们的ASCII码进行算术运算,在本题中,s++相当于s=s+1,即让s指向数组中的下一个元素。 (26)C 【解析】该题稍微难一点。主要要搞清楚以下几点:①定义了一个指针数组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。 (27)D 【解析】在格式输入中,要求给出的是变量的地址,而D)答案中给出的s[1]是一个值的表达式。 (28)D 【解析】C语言中的预处理命令以符号#开头,这些命令是在程序编译之前进行处理的,选项D)的描述错误。 (29)B 【解析】本题中,typedef声明新的类型名PER来代替已有的类型名,PER代表上面指定的一个结构体类型,此时,也可以用PER 来定义变量。 (30)B 【解析】getchar函数的作用是从终端读入一个字符。 (31)B 【解析】选项A)中,定义的初值个数大于数组的长度;选项C)中,数组名后少了中括号;选项D)中,整型数组不能赋予字符串。 (32)A 【解析】在给p和q数组赋初值时,系统会自动添加字符串结束符,从题目中可以看出数组p和q都有3个字符,所以长度均为3。 (33)A 【解析】函数fun(char *s[],int n)的功能是对字符串数组的元素按照字符串的长度从小到大排序。在主函数中执行fun(ss,5)语句后,*ss[]={"xy", "bcc", "bbcc", "aabcc", "aaaacc"},ss[0],ss[4]的输出结果为xy,aaaacc。 (34)C 【解析】函数int f(int x)是一个递归函数调用,当x的值等于0或1时,函数值等于3,其他情况下y=x2-f(x-2),所以在主函数中执行语句z=f(3)时,y=3*3-f(3-2)=9-f(1)=9-3=6。 (35)B 【解析】考查指向字符串的指针变量。在该题中,指针变量p指向的应该是该字符串中的首地址,p+3指向的是字符串结束标志'\0'的地址,因而*(p+3)的值为0。 (36)D 【解析】本题考查链表的数据结构,必须利用指针变量才能实现,即一个结点中应包含一个指针变量,用它存放下一结点的地址。 (37)B 【解析】以"wt"方式写入的是字符文件,转义字符'\n'被看作两个字符来处理。而"wb"方式写入的是二进制文件,转义字符'\n'是一个字符。 (38)A 【解析】本题考查的是位运算的知识,对于任何二进制数,和1进行异或运算会让其取反,而和0进行异或运算不会产生任何变化。 (39)C 【解析】本题主要考查的是用二维数组首地址和下标来引用二维数组元素的方法。通过分析可知,程序中的双重循环定义了一个如下的二维数组: 0 1 2 2 3 4 4 5 6 由于数组的下标是从0开始的,所以二维数组元素a[i][j]表示的是二维数组a的第i+1行、第j+1列对应位置的元素。 (40)A 【解析】函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针型。它的作用是将一个变量的地址传递到另一个函数中。当数组名作参数时,如果形参数组中的各元素的值发生变化,实参数组元素的值也将随之发生变化。 二、选择题 (1)【1】调试【解析】软件测试的目标是在精心控制的环境下执行程序,以发现程序中的错误,给出程序可靠性的鉴定;调试也称排错,它是一个与测试既有联系又有区别的概念。具体来说,测试的目的是暴露错误,评价程序的可靠性,而调试的目的是发现错误的位置,并改正错误。 (2)【2】19 【解析】在任意一棵二叉树中,度为0的结点(即叶子结点)总是比度为2的结点多一个。 (3)【3】上溢【解析】入队运算是指在循环队列的队尾加入一个新元素。这个运算有两个基本操作:首先将队尾指针进一(即rear=rear+1),并当rear=m+1时,置rear=1;然后将新元素插入队尾指针指向的位置。当循环队列非空(s=1)且队尾指针等于队头指针时,说明循环队列已满,不能进行入队运算,这种情况称为"上溢"。 (4)【4】关系【解析】在关系模型中,把数据看成一个二维表,每一个二维表称为一个关系。表中的每一列称为一个属性,相当于记录中的一个数据项,对属性的命名称为属性名;表中的一行称为一个元组,相当于记录值。 (5)【5】操作系统或OS 【解析】数据库管理系统是数据库的机构,它是一种系统软件,负责数据库中的数据组织、数据操纵、数据维护、控制及保护和数据服务。位于用户和操作系统之间。 (6)【6】a 【解析】'z'的ASCII码值为122,经过c-25运算后,得97,以字符形式输出是a。 (7)【7】1,0 【解析】与运算两边的语句必须同时为真时,结果才为真。当执行完if((++a<0)&&!(b--<=0))时,a,b的值已经发生了变化。 (8)【8】1 3 5 【解析】本题考查了for循环语句的使用,break语句用在本题中是结束for循环直接跳出循环体外。当i=1时,因为if语句条件不满足,所以直接执行printf("%d\n",i++);输出1,同时i自加1;执行第二次for循环时,i=3;同样的if语句条件不满足,所以直接执行printf("%d\n",i++);输出3,同时i自加1;执行第三次for循环时,i=5,if 语句条件满足,所以执行printf("%d\n",i),输出 5,然后break语句跳出了for循环。 (9)【9】2 【10】2 4 6 8 【解析】在主函数中根据整型数组x[]的定义可知,x[1]的初值等于2。在for循环语句中,当i=0时,p[0]=&x[1],p[0][0]=2; 当i=1时,p[1]=&x[3],p[1][0]=4;当i=2时,p[2]=&x[5],p[2][0]=6;当i=3时,p[3]=&x[7], p[3][0] =8,所以程序输出的结果为2、4、6、8。 (10)【11】35 【解析】函数swap(int *a,int *b)的功能是实现*a和*b中两个数据的交换,在主函数中调用swap(p,q)后,形参指针变量a 和b分别指向i和j,在swap(int *a,int *b)执行完后,指针变量a和b分别指向j和i,而指针变量p,q所指向变量的值没有发生变化,所以输出结果为35。 (11)【12】BCD CD D 【解析】本题考查指向字符串的指针的运算方法。指针变量p首先指向字符串中的第一个字符A,执行p=s+1后,p指向字符串中的第二个字符B,然后输出值"BCD"并换行,依次执行循环语句。 (12)【13】9 【解析】本题考查函数的综合知识。首先,我们可以利用强制转换类型转换运算符,将一个表达式转换成所需类型。如:(double)a是将a转换成double类型;(int)(x+y)是将x+y的值转换成整型。 本题可按部就班地逐步运算: fun((int)fun(a+c,b),a-c) fun((int)fun(10,5),2-8) fun((int)15.000000,-6) fun(15,-6) 9 (13)【14】struct aa *lhead,*rchild; 【解析】结构体对链表的定义。 (14)【15】fseek(文件指针,位移量,起始点) 【解析】本题考查函数fseek的用法。fseek 函数的调用形式为: fseek(文件指针,位移量,起始点) "起始点"用0,1或2代替,其中,0代表"文件开始";1为"当前位置";2为"文件末尾"。"位移量"指以"起始点"为基点,向前移动的字节数。ANSI C和大多数C版本要求位移量是long 型数据,这样当文件的长度大于64k时不致出现问题。 ANSI C 标准规定在数字的末尾加一个字母L,就表示long型。一、选择题 在下列各题的A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确的选项涂写在答题卡相应位置上,答在试卷上不得分。(1)程序流程图中带有箭头的线段表示的是 A)图元关系B)数据流C)控制流D)调用关系 (2)下面不属于软件设计原则的是 A)抽象B)模块化C)自底向上D)信息隐蔽 (3)下列选项中,不属于模块间耦合的是 A)数据耦合B)标记耦合C)异构耦合D)公共耦合 (4)下列叙述中,不属于软件需求规格说明书的作用的是 A)便于用户、开发人员进行理解和交流B)反映出用户问题的结构,可以作为软件开发工作的基础和依据 C)作为确认测试和验收的依据D)便于开发人员进行需求分析 (5)算法的时间复杂度是指 A)执行算法程序所需要的时间B)算法程序的长度C)算法执行过程中所需要的基本运算次数 D)算法程序中的指令条数 (6)已知数据表A中每个元素距其最终位置不远,为节省时间,应采用的算法是 A)堆排序B)直接插入排序C)快速排序D)B)和C) (7)栈底至栈顶依次存放元素A、B、C、D,在第五个元素E入栈前,栈中元素可以出栈,则出栈序列可能是 A)ABCED B)DCBEA C)DBCEA D)CDABE (8)数据库设计包括两个方面的设计内容,它们是 A)概念设计和逻辑设计B)模式设计和内模式设计C)内模式设计和物理设计D)结构特性设计和行为特性设计 (9)关系表中的每一横行称为一个 A)元组B)字段C)属性D)码 (10)设有表示学生选课的三张表,学生S(学号,姓名,性别,年龄,身份证号),课程C(课号,课名),选课SC(学号,课号,成绩),则表SC的关键字(键或码)为 A)课号,成绩B)学号,成绩C)学号,课号D)学号,姓名,成绩 (11)以下不正确的叙述是 A)在C程序中,逗号运算符的优先级最低B)在C程序中,APH和aph是两个不同的变量 C)若a和b类型相同,在计算了赋值表达式a=b后b中的值将放入a中,而b中的值不变 D)当从键盘输入数据时,对于整型变量只能输入整型数值,对于实型变量只能输入实型数值 (12)请选出可用作C语言用户标识符的是 A)void,define,WORD B)a3_b3,_123,IF C)FOR,--abc,Case D)2a,Do,Sizeof (13)以下选项中,不能作为合法常量的是 A)1.234e04 B)1.234e0.4 C)1.234e+4 D)1.234e0 (14)在C语言中,运算对象必须是整型数的运算符是 A)% B)\ C)%和\ D)** (15)若变量均已正确定义并赋值,以下合法的C语言赋值语句是 A)x=y==5; B)x=n%2.5; C)x+n=i; D)x=5=4+1; (16)有以下程序段 char ch; int k; ch=′a′;k=12; printf("%c,%d,",ch,ch,k); printf("k=%d \n",k); 已知字符a的ASCII码值为97,则执行上述程序段后输出结果是 A)因变量类型与格式描述符的类型不匹配输出无定值B)输出项与格式描述符个数不符,输出为零值或不定值 C)a,97,12k=12 D)a,97,k=12 (17)已知字母A的ASCII代码值为65,若变量kk为char型,以下不能正确判断出kk中的值为大写字母的表达式是 A)kk>=′A′&& kk<=′Z′ B)!(kk>=′A′||kk<=′Z′) C)(kk+32)>=′a′&&(kk+32)<=′Z′ D)isalpha(kk)&&(kk<91) (18)当变量c的值不为2、4、6时,值也为"真"的表达式是 A)(c==2)||(c==4)||(c==6) B)(c>=2&& c<=6)||(c!=3)||(c!=5) C)(c>=2&&c<=6)&&!(c%2) D)(c>=2&& c<=6)&&(c%2!=1) (19)若有条件表达式(exp)?a++:b--,则以下表达式中能完全等价于表达式(exp)的是 A)(exp==0) B)(exp!=0) C)(exp==1) D)(exp!=1) (20)以下不正确的定义语句是 A)double x[5]={2.0,4.0,6.0,8.0,10.0}; B)int y[5]={0,1,3,5,7,9}; C)char c1[]={′1′,′2′,′3′,′4′,′5′}; D)char c2[]={′\x10′, ′xa′, ′\x8′}; (21)下列程序执行后的输出结果是 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)随机数 (22)设有以下程序段 int x=0,s=0; while(!x!=0)s+=++x; printf("%d",s); 则 A)运行程序段后输出0 B)运行程序段后输出 1 C)程序段中的控制表达式是非法的D)程序段执行无限次 (23)(23)下面程序段的运行结果是 char *s="abcde"; s+=2;printf("%d",s); A)cde B)字符′c′ C)字符′c′的地址D)无确定的输出结果 (24)阅读下列程序,则执行后的结果为 #include "stdio.h" main() { int c[][4]={1,2,3,4,5,6,7,34,213,56,62,3,23,12,34,5 6}; printf("%x,%x\n",c[2][2],*(*(c+1)+1));} A)3e,6 B)62,5 C)56,5 D)3E,6 (25)下面判断正确的是 A)char *a="china";等价于char *a;*a="china"; B)char str[5]={"china"};等价于char str[]={"china"}; C)char *s="china";等价于char *s;s="china"; D)char c[4]="abc",d[4]="abc";等价于char c[4]=d[4]="abc"; (26)若有定义:int a[2][3];,以下选项中对a 数组元素正确引用的是 A)a[2][!1] B)a[2][3] C)a[0][3] D)a[1>2][!1] (27)有定义语句:char s[10];,若要从终端给s输入5个字符,错误的输入语句是 A)gets(&s[0]); B)scanf("%s",s+1); C)gets(s); D)scanf("%s",s[1]); (28)有以下程序 #include #define N 5 #define M N+1 #define f(x) (x*M) main() { int i1,i2; i1=f(2); i2=f(1+1); printf("%d %d\n",i1,i2); } 程序的运行结果是 A)12 12 B)11 7 C)11 11 D)12 7 (29)若有以下说明和定义 union dt { int a; char b; double c;}data; 以下叙述中错误的是 A)data的每个成员起始地址都相同 B)变量data所占内存字节数与成员c所占字节数相等 C)程序段:data.a=5;printf("%f\n",data.c);输出结果为 5.000000 D)data可以作为函数的实参 (30)有以下程序 #include main() {FILE *fp;int k,n,a[6]={1,2,3,4,5,6}; fp=fopen("d2.dat","w"); fprintf(fp,"%d%d%d\n",a[0],a[1],a[2]); fprintf(fp,"%d%d%d\n",a[3],a[4],a[5]); fclose(fp); fp=fopen("d2.dat","r"); fscanf(fp,"%d%d",&k,&n);printf("%d%d\n",k,n ); fclose(fp); } 程序运行后的输出结果是 A)1 2 B)1 4 C)123 4 D)123 456 (31)若已定义 int a[]={0,1,2,3,4,5,6,7,8,9}, *p=a,i; 其中则对a数组元素不正确的引用是 A)a[p-a] B)*(&a[i]) C)p[i] D)a[10] (32)有以下程序 #include void fun(int *s,int n1,int n2) { int i,j,t; i=n1; j=n2; while(i } main() { int a[10]={1,2,3,4,5,6,7,8,9,0},k; fun(a,0,3); fun(a,4,9); fun(a,0,9); for(k=0;k printf("\n"); } 程序的运行结果是 A)0987654321 B)4321098765 C)5678901234 D)0987651234 (33)阅读下列程序,当运行函数时,输入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; 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 (34)有以下程序 int fun(int n) {if(n==1)return 1; else return(n+fun(n-1)); } main() {int x; scanf("%d",&x); x=fun(x);printf("%d\n",x) } 执行程序时,给变量x输入10,程序的输出结果是 A)55 B)54 C)65 D)45 (35)下面程序段中,输出*的个数是 char *s="\ta\018bc"; for(;*s!='\0';s++)printf("*"); A)9 B)5 C)6 D)7 (36)C语言结构体类型变量在程序运行期间 A)TC环境在内存中仅仅开辟一个存放结构体变量地址的单元B)所有的成员一直驻留在内存中 C)只有最开始的成员驻留在内存中 D)部分成员驻留在内存中 (37)已知函数的调用形式为fread(buf,size,count,fp),参数buf的含义是 A)一个整型变量,代表要读入的数据项总数B)一个文件指针,指向要读的文件 C)一个指针,指向要读入数据的存放地址 D)一个存储区,存放要读的数据项 (38)设有以下语句 char x=3,y=6,z; z=x^y<<2; 则z的二进制值是 A)00010100 B)00011011 C)00011100 D)00011000 (39)在C语言中,只有在使用时才占用内存单元的变量,其存储类型是 A)auto和register B)extern和register C)auto和static D)static和register (40)设有定义语句int ( *f)(int);,则以下叙述正确的是 A)f是基类型为int的指针变量B)f 是指向函数的指针变量,该函数具有一个int类型的形参 C)f是指向int类型一维数组的指针变量 D)f是函数名,该函数的返回值是基类型为int 类型的地址 二、填空题 请将每一个空的正确答案写在答题卡序号的横线上,答在试卷上不给分。 (1)测试用例包括输入值集和【1】值集。(2)在树形结构中,树根结点没有【2】。(3)数据结构分为逻辑结构与存储结构,线性链表属于【3】。 (4)一个项目具有一个项目主管,一个项目主管可管理多个项目,则实体"项目主管"与实体"项目"的联系属于【4】的联系。 (5)数据库设计分为以下6个设计阶段:需求分析阶段、【5】、逻辑设计阶段、物理设计阶段、实施阶段、运行和维护阶段。 (6)阅读下面程序段,则执行后输出的结果是【6】。 #include "stdio.h" main() { char fun(char,int); char a=′A′; int b=13; a=fun(a,b); putchar(a);} char fun(char a,int b) { char k; k=a+b; return k;} (7)函数fun的返回值是【7】 fun(char *a,char *b) { int num=0,n=0; while(*(a+num)!='\0')mm++; while(b[n]){*(a+num)=b[n];num++;n++;} return num; } (8)以下程序的功能是:删去一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。 例如,若一维数组中的数据是: 2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10 删除后,数组中的内容应该是: 2 3 4 5 6 7 8 9 10。 请填空。 #include #define N 80 int fun(int a[], int n) { int i,j=1; for(i=1;i if(a[j-1] 【8】a[i]) a[j++]=a[i]; 【9】; } main() { int a[N]={ 2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10}, i, n=19; printf("The original data : \n"); for(i=0; i n=fun(a,n); printf("\nThe data after deleted: \n"); for(i=0; i } (9)以下程序的运行结果是【10】。 #include main() { int x=1,y=0,a=0,b=0; switch(x) { case 1: switch(y) { case 0:a++; break; case 1: b++; break; } case 2:a++; b++; break; case 3:a++; b++; } printf("a=%d,b=%d\n",a,b); } (10)以下程序的输出结果是【11】。 fun (int x,int y,int z) { z =x*x+y*y;} main () { int a=31; fun (6,3,a) printf ("%d", a) } (11)函数my_cmp( )的功能是比较字符串s 和t的大小,当s等于t时返回0,否则返回s 和t的第一个不同字符的ASCII码差值,即s>t 时返回正值,s My_cmp(char*s,char*t) { while (*s == *t) { if (*s == ′ \0)return0; ++s; ++t; } return 【12】; } (12)以下程序的输出结果是【13】。 void reverse(int a[],int n) { int i,t; for(i=0;i { t=a[i]; a[i]=a[n-1-i];a[n-1-i]=t;} } main() { int b[10]={1,2,3,4,5,6,7,8,9,10}; int i,s=0; reverse(b,8); for(i=6;i<10;i++)s+=b[i]; printf(" %d\n",s); } (13)以下说明语句中, 【14】是结构体类型名。 typedef struct { int n; char ch[8]; } PER; (14)以下程序的作用是:从名为filea.dat的文本文件中逐个读入字符并显示在屏幕上。请填空。 #include main() {FILE *fp; char ch; fp=fopen( 【15】); ch=fgetc(fp); while(!feof(fp)) { putchar(ch); ch=fgetc(fp); } putchar('\n');fclose(fp); } 一、选择题 (1)C 【解析】程序流程图是人们对解决问题的方法、思路或算法的一种图形方式的描述。其中,图框表示各种操作的类型,图框中的文字和符号表示操作的内容;流程线表示操作的先后次序。带箭头的线段在数据流程图中表示数据流;带箭头的线段在程序流程图中表示控制流。题中给出的选项中,在图元之间用带有箭头的线段表示图元关系。在模块之间用带有箭头的线段表示调用关系。 (2)C 【解析】软件设计遵循软件工程的基本目标和原则,建立了适用于在软件设计中应该遵循的基本原理和与软件设计有关的概念,它们具有抽象、模块化、信息隐蔽和数据独立性。自底向上是集成测试中增量测试的一种。 (3)C 【解析】模块之间的耦合程度反映了模块的独立性,也反映了系统分解后的复杂程度。按照耦合程度从强到弱分别是:内容耦合、公共耦合、外部耦合、控制耦合、标记耦合、数据耦合和非直接耦合,没有异构耦合这种方式。 (4)D 【解析】软件需求规格说明书(SRS,Software Requirement Specification)是需求分析阶段的最后成果,是软件开发中的重要文档之一。它具有以下几个方面的作用:①便于用户、开发人员进行理解和交流;②反映出用户问题的结构,可以作为软件开发工作的基础和依据;③作为确认测试和验收的依据。(5)C 【解析】算法的复杂度主要包括算法的时间复杂度和空间复杂度。所谓算法的时间 复杂度是指执行算法所需要的计算工作量,即算法执行过程中所需要的基本运算的次数;算法的空间复杂度一般是指执行这个算法所需要的内存空间。 (6)B 【解析】堆排序的比较次数为nlog2n;直接插入排序的比较次数为n(n-1)/2;快速排序的比较次数为nlog2n。当数据表A中每个元素 (7)B 【解析】栈操作原则上"后进先出",栈底至栈顶依次存放元素A、B、C、D,则表明这4个元素中D是最后进栈,B、C处于中间,A最早进栈,所以出栈时一定是先出D,再出C,最后出A。 (8)A 【解析】数据库设计包括数据库概念设计和数据库逻辑设计两个方面的内容。(9)A 【解析】关系表中,每一行称为一个元组,对应表中的一条记录;每一列称为一个属性,对应表中的一个字段;在二维表中凡能唯一标识元组的最小属性集称为该表的键或码。 (10)C 【解析】"选课SC" 表是"学生S" 表和"课程C" 表的映射表,主键是两个表主键的组合。 (11)D 【解析】在C语言所有的运算符中,逗号运算符的优先级最低。C语言中区分大小写,所以APH和aph是两个不同的变量。赋值表达式a=b表示将b的值付给a,而b本身的值保持不变;通过键盘可以向计算机输入允许的任何类型的数据。选项D)中当从键盘输入数据时,对于整型变量可以输入整型数值和字符,对于实型变量可以输入实型数值和整型数值等。 (12)B 【解析】C语言规定用户标识符由字母、数字和下划线组成,且第一个字符必须是字母或下划线,可见选项C),D)是错误的;此外,C语言不允许用户将关键字作为标识符,而选项A)中的void正是C语言的关键字。(13)B 【解析】C语言的语法规定,字母e(E)之前必须有数字,且e(E)后面的指数必须是整数,而选项B)中,e(E)后面的指数是小数,所以不合法。 (14)A 【解析】在C语言中,"%"运算符两侧的运算数必须是整型。 (15)A 【解析】赋值运算符左侧的操作数必须是一个变量,而不能是表达式或者常量,选项C)和D)错误。"%"运算符两侧都应当是整型数据,选项B)错误。 (16)D 【解析】输出格式控制符%c表示将变量以字符的形式输出;输出格式控制符%d 表示将变量以带符号的十进制整型数输出,所以第一个输出语句输出的结果为a,97;第二个输出语句输出的结果为k=12。 (17)B 【解析】C语言的字符以其ASCII 码的形式存在,所以要确定某个字符是大写字母,只要确定它的ASCII码在'A'和'Z'之间就可以了,选项A)和C)符合要求。函数isalpha用来确定一个字符是否为字母,大写字母的ASCII码值的范围为65到90,所以如果一个字母的ASCII码小于91,那么就能确定它是大写字母。 (18)B 【解析】满足表达式(c>=2&&c<=6)的整型变量c的值是2,3,4,5,6。当变量c的值不为2,4,6时,其值只能为3或5,所以表达式c!=3和c!=5中至少有一个为真,即不论c为何值,表达式B)都为"真"。 (19)B 【解析】条件运算符要求有3个操作对象,称三目(元)运算符,它是C语言中惟一的一个三目运算符。条件表达式的一般形式为:表达式1?表达式2:表达式3其求解顺序是:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值,注意++、--的用法。 (20)B 【解析】在一维数组中要注意的是作为下标表达式的常量表达式的值必须是大于等于0,选项B)中定义有5个元素,但赋值时有6个元素,所以是错误的。 (21)B 【解析】本题中,a[1][2]是二维数组中的第6个元素,对应for循环中i的值为5,p[5]=5+1。 (22)B 【解析】本题中,"!"表示逻辑非运算符,"!="表示不等于运算符,逻辑非运算符比不等于运算符的优先级高。 (23)C 【解析】对于字符串指针,其保留的是整个串的首地址,即第一个字符的起始地址;当该指针做算术运算时,就是该指针根据其类型向后移动相应的存储空间。 (24)A 【解析】数组c[][4]表示一个4行4列数组,c[2][2]表示第3行第3列上的元素62,*(*(c+1)+1))表示第2行第2列上的元素6,通过十六进制输出为3e,6。 (25)C 【解析】选项A)char *a;*a="china"应改为 a=china ;,选项B)应该是char str[6];D)项表述方法有错误。 (26)D 【解析】C语言中数组下标是从0开始的,所以二维数组a[2][3]的第一维下标取值为0、1;第二维的下标取值为0、1、2,因而选项A)、B)、C)都是错误的,选项D)表示数组元素a[0][0]。 (27)D 【解析】在格式输入中,要求给出的是变易的地址,而D)答案中给出的s[1]是一个值的表达式。(28)B 【解析】根据宏替换的替换规则,我们可知,f(2)=2*N+1=2*5+1=11,f(1+1)=1+1*N+1=1 +1*5+1=7。 (29)D 【解析】选项A),共用体的每个成员的起始地址都相同;选项B),共用体变量所占的内存长度等于最长的成员的长度;选项C)因为每个成员的起始地址相同,所以整型数5以浮点型输出时为5.000000;选项D)C语言规定,不能把共用体变量作为函数的参数。 (30)D 【解析】将有6个元素的整型数组分两行输出到一个文件中,因为输出的都是数字并且每行都没有分隔符,所以当再对其进行读取操作时,每一行都会被认为是一个完整的数,而换行符则作为它们的分隔符。 (31)D 【解析】通常,引用一个数组元素可以用下标法,如a[p-a]形式,或指针法,如*(&a[i])的形式。本题中a[9]=9,a[10]显然超出数组范围,注意,数组的下标是从0开始的。 (32)C 【解析】函数fun(int *s,int n1,int n2)的功能是对数组s中的元素进行首尾互相调换。所以在主函数中,当fun(a,0,3)执行完后,数组a[12]={4,3,2,1,5,6,7,8,9,0};再执行fun(a,4,9),数组a[12]={4,3,2,1,0,9,8,7,6,5};再执行fun(a,0,9)后,数组a[12]={5,6,7,8,9,0,1,2,3,4}。 (33)A 【解析】本题题意要求删除所有空格,即除了空格以外的其他所有字符都要留下。由于C语言中没有直接删除字符的操作,所以我们对于删除字符的操作都是采用"留下"字符的算法,以前的题目亦是如此。用str[i]从串头到串尾逐一走动,每走到一个字符都判断其是否为空格,若不是空格(注意在if()的单引号之间有一个空格),则将其保存str[j]中。注意j的下标变化、初值及最后加串结束符'\0'。 (34)A 【解析】本程序考察的是函数的递归调用,在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用,执行结果为1+2+3+4+5+6+7+8+9+10=55。 (35)C 【解析】本题中,格式符0表示的是八进制无符号形式输出整型数(不带前导0),字符常量在内存中占一个字节,存放的是ACSII 码代码值。C语言规定,所有字符常量都作为整型量来处理,在计算机内部,其对应的整数值就是ACSII字符集中该字符的序号,即&*s中有几个字符就输出几个*。 (36)B 【解析】结构体类型的变量在程序运行期间要作为一个整体占用连续的内存单元。 (37)C 【解析】这是一道考查fread函数的题。buf是一个指针,fread是读入数据的存放地址;fwrite是输出数据的地址(以上指的是起始地址)。 (38)B 【解析】本题考查两个位运算符。按位异或运算符"^"是双目运算符,其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异或时,结果为1。 左移运算符"<<"是双目运算符,其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0,并且"<<"运算符的优先级于"^"。(39)A 【解析】在C语言中只有自动变量和寄存器变量在使用时才占用内存单元。(40)B 【解析】本题考查的是指向函数的指针。语句int (* f)(int);是对一个函数的声明,其中f是指向该函数的指针,该函数有一个整型的参数,函数返回值类型为整型。 二、选择题 (1)【1】输出【解析】软件测试用例是为了有效发现软件缺陷面编写的包含测试目的、测试步骤、期望测试结果的特定集合。正确认识和设计软件测试用例可以提高软件测试的有效性,便于测试质量的度量,增强测试过程的可管理性。软件测试用例包括:输入值集和输出值集。测试用例是软件测试的核心。 (2)【2】前件【解析】在树形结构中,每一个结点只有一个前件,称为父结点;没有前件的结点只有一个,称为树的根结点;每一个结点可以有多个后件,它们都称为该结点的子结点;没有后件的结点称为叶子结点。 (3)【3】存储结构【解析】数据的逻辑结构是指反映数据元素之间逻辑关系的数据结构;数据的存储结构是指数据的逻辑结构在计算机存储空间中的存放形式。在数据的存储结构中,不仅要存放各数据元素的信息,还需要存放各数据元素之间前后件关系的信息。 (4)【4】一对多(或1∶N) 【解析】两个实 体集间的联系实际上是实体集间的函数系,这种函数关系可以有3种,即一对一(1∶1)的联系、一对多(1∶N)或多对一(N∶1)的联系和多对多(N∶N)的联系。 (5)【5】概念设计阶段【解析】数据库设计分为以下6个设计阶段:需求分析阶段、概念设计阶段、逻辑设计阶段、物理设计阶段、实施阶段及数据库运行和维护阶段。 (6)【6】N 【解析】函数说明语句中的类型名必须与函数返回值的类型一致。本题实现的是在字符'A'的ASCII码值上加上一个常数,使之变成另一个ASCII码值,从而输出字符。 (7)【7】字符串a和b的长度之和【解析】本题首先通过第一个while循环计算字符串a的长度,再通过第二个循环,将字符串a和b相连,最后返回连接后的总长度。 8)【8】!= 【9】return j 【解析】本题程序的流程是:让i,j都从1开始,其中j用于控制删除后剩下的数中的下标,i用于搜索原数组中的元素。j始终是新数组已有元素中最后一个元素的下一个元素的下标,所以if()中的条件是a[j-1]!=a[i],其中a[j-1]就是新数组中的最后一个元素,若条件成立则表示出现了不同的值,所以a[i]要留到新数组中。注本题中i、j 的初值都要从1开始,该算法只能用于数组已排序的题目中。 (9)【10】a=2,b=1 【解析】本题考查了switch结构的内容。C语言中,程序执行完一个case标号的内容后,如果没有break语句,控制结构会转移到下一个case继续执行,因为case 常量表达式只是起语句标号作用,并不是在该处进行条件判断。本题程序在执行完内部switch结构后,继续执行了外部switch结构的case 2:分支,最后a和b的值分别为2和1。(10)【11】31 【解析】在函数调用时,形参值的改变,不会改变实参值。 (11)【12】*s-*t 【解析】两字符串大小比较必须从它们的首字符开始,在对应字符相等情况下循环,直至不相等结束。相等时,若字符串已到了字符串的结束标记符,则两字符串相同,函数返回0值;如还有后继字符,则准备比较下一对字符。对应字符不相同,循环结束。循环结束时,就以两个当前字符的差返回,所以在空框处应填入*s-*t,保证在s > t时,返回正值,当s < t时,返回负值。 (12)【13】22 【解析】在main函数中,调用reverse函数将b数组中的前8个成员进行互置,执行完毕后,b数组中的成员为{8,7,6,5,4,3,2,1,9,10},然后再执行for循环结构,将b[6],b[7]...b[9]的值相加,结果为22。(13)【14】PER 【解析】本题中,typedef 声明新的类型名PER来代替已有的类型名,PER代表上面指定的一个结构体类型,此时,也可以用PER来定义变量。 (14)【15】“filea.dat”,“r” 【解析】fopen 函数的调用方式通常为fopen(文件名,使用文件方式)。本题中要求程序可以打开filea.dat 文件,并且是要读取文件中的内容,所以空白处应当填入"filea.dat","r"。 一、选择题 在下列各题的A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确的选项涂写在答题卡相应位置上,答在试卷上不得分。(1)软件是指A)程序B)程序和文档C)算法加数据结构D)程序、数据与相关文档的完整集合 (2)检查软件产品是否符合需求定义的过程称为 A)确认测试B)集成测试C)验证测试D)验收测试 (3)以下不属于对象的基本特点的是 A)分类性B)多态性C)继承性D)封装性 (4)在设计程序时,应采纳的原则之一是 A)不限制goto语句的使用B)减少或取消注解行C)程序越短越好D)程序结构应有助于读者理解 (5)下列叙述中正确的是 A)程序执行的效率与数据的存储结构密切相关B)程序执行的效率只取决于程序的控制结构 C)程序执行的效率只取决于所处理的数据量D)以上三种说法都不对(6)数据结构中,与所使用的计算机无关的是数据的 A)存储结构B)物理结构C)逻辑结构D)物理和存储结构 (7)线性表的顺序存储结构和线性表的链式存储结构分别是 A)顺序存取的存储结构、顺序存取的存储结构B)随机存取的存储结构、顺序存取的存储结构 C)随机存取的存储结构、随机存取的存储结构D)任意存取的存储结构、任意存取 的存储结构 (8)树是结点的集合,它的根结点数目是 A)有且只有1 B)1或多于1 C)0或1 D)至少2 (9)下列有关数据库的描述,正确的是 A)数据库是一个DBF文件B)数据库是一个关系C)数据库是一个结构化的数据集合D)数据库是一组文件 (10)数据库、数据库系统和数据库管理系统之间的关系是 A)数据库包括数据库系统和数据库管理系统B)数据库系统包括数据库和数据库管理系统C)数据库管理系统包括数据库和数据库系统 D)三者没有明显的包含关系 (11)以下4个选项中,不能看作一条语句的是 A); B)a=5,b=2.5,c=3.6; C)if(a<5); D)if(b!=5)x=2;y=6; (12)下面四个选项中,均是不合法的用户标识符的选项是 A)A P_0 do B)float la0_A C)b-a goto int D)_123 temp int (13)以下选项中不属于字符常量的是 A)′C′B)′′C′′C)′\xCC′ D) ′\072′ (14)设变量已正确定义并赋值,以下正确的表达式是 A)x=y*5=x+z B)int(15.8%5) C)x=y+z+5,++y D)x=25%5.0 (15)若变量已正确定义并赋值,以下符合C 语言语法的表达式是 A)a:=b+1 B)a=b=c+2 C)int 18.5%3 D)a=a+7=c+b (16)以下程序的运行结果是 int k=0; void fun(int m) {m+=k;k+=m;printf("m=%d k=%d ",m,k++);} main() {int i=4; fun(i++); printf("i=%d k=%d\n",i,k); } A)m=4 k=5 i=5 k=5 B)m=4 k=4 i=5 k=5 C)m=4 k=4 i=4 k=5 D)m=4 k=5 i=4 k=5 (17)已有定义:char c;,程序前面已在命令行中包含ctype.h文件,不能用于判断c中的字符是否为大写字母的表达式是 A)isupper(c) B)′A′<=c<=′Z′ C)′A′<=c&&c<=′Z′ D)c<=(′z′-32)&&(′a′-32)<=c (18)设有: int a=1,b=2,c=3,d=4,m=2,n=2; 执行(m=a>b)&&(n=c>d)后,n的值是 A)1 B)2 C)3 D)4 (19)若变量已正确定义,有以下程序段int a=3,b=5,c=7; if(a>b) a=b; c=a; if(c!=a) c=b; printf("%d,%d,%d\n",a,b,c); 其输出结果是 A)程序段有语法错B)3,5,3 C)3,5,5 D)3,5,7 (20)若有定义:float x=1.5;int a=1,b=3,c=2;,则正确的switch语句是 A)switch(x) {case 1.0:printf("*\n"); case 2.0:printf("**\n");} B)switch((int)x); {case 1:printf("*\n"); case 2:printf("**\n");} C)switch(a+b) {case 1:printf("*\n"); case 2+1:printf("**\n");} D)switch(a+b) {case1:printf(**\n);} casec:printf(**\n);} (21)有以下程序 #include main0 { int y=9; for( ; y>0;y--) if(y%3==0) printf("%d",--y); } 程序的运行结果是 A)741 B)963 C)852 D)875421 (22)以下描述中正确的是 A)由于do-while循环中循环体语句只能是一条可执行语句,所以循环体内不能使用复合语句 B)do-while循环由do开始,用while结束,在while(表达式)后面不能写分号 C)在do-while循环体中,是先执行一次循环,再进行判断D)do-while循环中,根据情况可以省略while (23)有以下程序 #include main() { int a[ ]={1,2,3,4},y, *p=&a[3]; --p; y= *p;printf("y=%d\n",y); } 程序的运行结果是 A)y=0 B)y=1 C)y=2 D)y=3 (24)以下数组定义中错误的是 A)int x[][3]={0}; B)int x[2][3]={{l,2},{3,4},{5,6}}; C)int x[][3]={{l,2,3},{4,5,6}}; D)int x[2][3]={l,2,3,4,5,6}; (25)下面说明不正确的是 A)char a[10]="china"; B)char a[10],*p=a;p="china" C)char *a;a="china" D)char a[10],*p;p=a="china" (26)若有定义:int a[2][3];,以下选项中对a 数组元素正确引用的是 A)a[2][!1] B)a[2][3] C)a[0][3] D)a[1>2][!1] (27)若要求从键盘读入含有空格字符的字符串,应使用函数 A)getc() B)gets() C)getchar() D)scanf() (28)阅读下列程序段,则程序的输出结果为#include "stdio.h" #define M(X,Y)(X)*(Y) #define N(X,Y)(X)/(Y) main() { int a=5,b=6,c=8,k; k=N(M(a,b),c); printf("%d\n",k); A)3 B)5 C)6 D)8 (29)在16位IBM-PC机上使用C语言,若有如下定义 struct data { int i; char ch; double f; } b; 则结构变量b占用内存的字节数是 A)1 B)2 C)7 D)11 (30)有以下程序#include main() {FILE *fp; int i,a[6]={l,2,3,4,5,6}; fp=fopen("d3.dat","w+b"); fwrite(a,sizeof(int),6,fp); fseek(fp,sizeof(int)*3,SEEK_SET);/*该语句使读文件的位置指针从文件头向后移动3个int 型数据*/ fread(a,sizeof(int),3,fp); fclose(fp); for(i=0;i<6;i++)printf("%d,",a[i]); } 程序运行后的输出结果是 A)4,5,6,4,5,6, B)1,2,3,4,5,6, C)4,5,6,1,2,3, D)6,5,4,3,2,1, (31)有以下程序 #include main() { int s[12]={1,2,3,4,4,3,2,1,1,1,2,3},c[5]={0},i; for(i=0;i<12;i++) c[s[i]]++; for(i=1;i<5;i++) printf("%d",c[i]); printf("\n"); } 程序的运行结果是 A)1 2 3 4 B)2 3 4 4 C)4 3 3 2 D)1 1 2 3 (32)有以下程序 #include void fun(int *a,int n)/*fun函数的功能是将a所指数组元素从大到小排序*/ { int t,i,j;