一、选择题 下列各题A) 、B) 、C) 、D) 四个选项中,只有一个选项是正确的。
12. 下面程序
main()
{ int y=9;
for(;y>0;y--){
if(y%3=0)
{ printf("%d",--y);
continue;
}
}
}
的输出是_______。
A B C D
B
[解析] “%”是求余运算符,所以if判断语句中实际是指出只有当y可以被3整除时方可以继续;-y是先进行y的自减运算,再使用y值。所以,最后的打印结果应当为“852”。
14. 下面程序
main()
{
int a=-1,b=4,k;
k=(a++<=0)&&(!(b--<=0));
printf("%d%d%d%d\n",k,a,B) ;
}
的输出是_______。
- A.00 3
- B.0 1 2
- C.1 0 3
- D.1 1 2
A B C D
C
[解析] a++是先使用a值再将a的值加1,b-是先使用b的值再将b的值减1,所以题中的逻辑运算表达式的值应当为真,即为1,而经过运算后,a和b的值已经分别变成0和3了。
17. 下面的程序
main()
{ int x=3,y=0,z=0;
if(x=y+z)printf("***");
else printf("####");
}
_______。
- A.有语法错误不能通过编译
- B.输出****
- C.可以通过编译,但是不能通过连接,因而不能运行
- D.输出####
A B C D
D
[解析] 本题的考查点是运算符在表达式中的处理原则。本题中把y+z的值赋给x,由于y和z都等于0,所以x的值也为0,表达式值为false,输出####。if语句中if后面的表达式—般为逻辑或关系表达式,但也可以是任意的数值类型。
19. 下面函数
int funl(char*x)
{ char *y=x;
while(*y++);
return(y-x-1);
}
的功能是_______。
- A.求字符串的长度
- B.比较两个字符串的大小
- C.将字符串x复制到字符串y
- D.将字符串x连接到字符串y后面
A B C D
A
[解析] 本题的考查点是while()循环语句。
本题首先要注意的是对*y++的运算,由于++和*为同—优先级别,且结合方向为自右向左,因此它相当于*(y++)。由于++在y的右侧是“后加”,因此先对y的原值进行*运算,然后使y的值改变。
21. 已知字母A的ASCII码为十进制的65,下面程序
main()
{ char ch1,ch2;
ch1='A'+'5'-'3';
ch2='A'+'6'-'3';
printf("%d,%c\n",ch1,ch2);
}
的输出是_________。
A B C D
A
[解析] 由于字符“5”和“3”的ASCII码相差为2,所以ch1经过运算后的值应为65+2=67;同理,ch2经过运算后的值应为65+3=68,即是字符“D”。
22. 以下程序的输出结果是________。
#include<stdio.h>
mam()
{
inta,b,d=241;
a=d/100%9;
b=(-1)&&(-1);
printf("%d,%d\n",a,B) ;
}
A B C D
B
[解析] 第—个表达式中,运算的方向是从左至右,所以a的值为2;第二个表达式中,等式右边是—个逻辑表达式,由于结果为真,所以表达式的值为1,即b为1。
24. 以下程序的输出结果是_______。
#include<stdio.h>
main()
{
printf("%d\n",NULL);
}
A B C D
B
[解析] NULL在C编译器中是—个值为0的常量,它的定义在头文件“stdio.h”中,本题的程序在一开始就包含了这个头文件,所以,在打印的时候,将打印出0。
26. 以下程序的输出结果是________。
main()
{ int k=4,m=1,p;
p=func(k,m);printf("%d,",p);
p=func(k,m);printf("%d\n",p);
}
func(int a,int B)
{ static int m=0,i=2;
i+=m+1;m=i+a+b;
return(m);
}
A B C D
A
[解析] 将k和m的值带入函数func中,第—次调用完func()后,其中m和i的值要保留,并在第二次调用时使用,这是因为两者都是局部静态变量。所以最后的结果是8和17。
27. 以下程序调用findmax函数求数组中值最大的元素在数组中的下标,请选择填空:
#include<stdio.h>
findmax(int*s,int t,int*k)
{ int p;
for(p=0,*k=p;p<t;p++)
if(s[p]>s[*k])________;
}
main()
{ int a[10],i,k;
for(i=0;i<10;i++)scanf("%d",&a[i]);
findmax(a,10,&k);
printf("%d,%d\n",k,a[k]);
}
- A.k=p
- B.*k=p-s
- C.k=p-s
- D.*k=p
A B C D
D
[解析] k是—个指针,它的值是—个地址,要通过它为主函数的变量改变数据,必须使用*p,边样就可以把—个下标数赋给p指针指向的那个内存单元,所以横线处应填入*k=p。
28. 在执行以下程序时,为了使输出结果为t=4,给a和b输入的值应该满足的条件是_______。
main()
{
int s,t,a,b;
scanf("%d%d",&a,&B) ;
s=1;t=1;
if(a>0)s=s+1;
if(a>B) t=s+t;
else if(a==B) t=5;
else t=2*s;
printf("t=%d\n",t);
}
- A.a>b
- B.a<b<0
- C.0<a<b
- D.0>a>b
A B C D
C
[解析] 要使输出结果为t=4,必须要执行elset=2*s;和if(a>b)t=s+t;语句。如果执行if(a>b)t=s+t;语句,则条件为a>b,要求 s=3,在该语句前面的语句中没有条件可以满足s=3;如果孰行else t=2*s;语句,则条件为a<b,要求s=2,需要执行if(a>0)s=s+1;语句,所以应满足条件0<a<b。
30. 执行以下程序后,输出的结果是_______。
main()
{
int y=10;
do{y--;}while(--y);
printf("%d\n",y--);
}
A B C D
D
[解析] do-while语句的特点是先执行循环体,然后判断循环条件是否成立,当循环条件的值为0时循环结束。当y=0时循环结束,printf("%d\n",y-)语句是先输出y再自减,所以输出结果为0。
35. 下列程序的输出结果是_______。
fun()
{
static int x=5;
if(x++>5)printf("%d",x);
else printf("%d",x++);
}
main()
{
fun();fun();
}
A B C D
C
[解析] 模块的代码开始运行后,使用static语句声明的变量会—直保持其值,直至该模块复位或重新启动。在第1次调用fun函数时,x的初值为5,if语句的条件不成立,执行else printf("%d"x++);语句,输出6,执行后x的值变为7,由于x是静态局部变量,在函数调用结束后,它并不释放,仍保留x=7。在第2次调用fun函数时,if语句的条件成立,执行printf("%d",x);语句,输出8。
36. 下面程序的输出是_______。
main()
{
int m=0xa,n=2;
m+=n;
printf(""%X\n"",m);
}
A B C D
A
[解析] 格式控制x表示数据按十六进制格式输出(不输出前导符ox)。本题在执行语句m+=n;后,m的值变为字母c,又因为在输出a-f时,如果格式控制符用X,则以大写字母输出;如果用x,则以小写字母输出,故本题答案为A。
37. 以下程序的输出结果是_______。
#include<string.h>
main()
{char*a="abcdefghi";int k;
fun(a) ;puts(a) ;
}
fun(char *s)
{ int x,y; char c;
for(x=0,y=strlen(s)-1; x<y; x++,y--)
{ c=s[y]; s[y]=s[x];s[x]=c;}
}
- A.ihgfedcba
- B.abcdefghi
- C.abcdedcba
- D.ihgfefghi
A B C D
A
[解析] 观察子函数fun()可知,它是实现—个数组首末元素位置互相依次交换。联系主函数,可以看出,是对字符串中的元素依次进行首末位置的对调。
38. 设有如下函数定义,则输出结果为_______。
char*fun(char*str)
{
char*p=str;
while(*p)
{if(*p>'d')continue;
p++;
}
return p;
}
main()
{
printf("%s\n",fun("welcome!"));
}
- A.welcome
- B.come!
- C.w
- D.程序进入死循环
A B C D
D
[解析] continue语句的作用是用于结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。由于'w'>'d',执行continue语句,结束本次循环(即跳过p++;语句),还是继续比较'w'>'d',程序进入死循环。
39. 以下程序的输出结果是_______。
main()
{union { char i[2];
int k;
}r;
r.i[0]=2; r.i[1]=0;
printf("%d\n",r.k);
}
A B C D
A
[解析] 根据共用体的定义可知:共用体r的成员k和成员i[2]是共用同—段内存空间,所以,当程序给r.i[0]赋值后,实际上,共用体成员k的值也确定了,为2。所以打印输出的结果应当为2。
41. 以下程序的输出结果是_______。
#define f(x) x*x
main()
{ int a=6,b=2,c;
c=f(A) /f(B) ;
printf("%d\n",C) ;
}
A B C D
C
[解析] 观察程序段可知,对带参数的宏的展开只是将语句中的宏名后面括号内的实参字符串代替#define命令行中的形参。本题中c=f(a)/f(b)用#define f(x)x*x代替得c=f(6)/f(2),即c=6*6/2*2,结果为36。
43. 以下程序的输出结果是_______。
main()
{ int i;
for(i=1;i<6;i++)
{ if(i%2)(printf("#");continue;}
printf("*");
}
printf("\n");
}
- A.#*#*#
- B.#####
- C.*****
- D.*#*#*
A B C D
A
[解析] i从i到5循环5次,i为1时,满足条件,打印输出“#”;i为2时,条件为假,打印输出“*”。也就是说,当i为奇数时,条件为真,程序打印输出“#”,否则,输出:“*”。
44. 有如下程序
main()
{
int n=9;
while(n>6)
{
n--;
printf("%d",n);
}
}
该程序的输出结果是_______。
A B C D
B
[解析] 符合n>6的n只有7,8,9;所以循环次数为3。选项C、D可以排赊。又因n在输出之前要执行n-,所以输出结果只能是876。
45. 下列程序是将一个十进制正整数转化为一个八进制数,在程序的空白处应填入的语句是_______。
#include<stdio.h>
main()
{
int i=9,a,b[10]={0};
scanf("%d",&A) ;
sub(a,B) ;
for(;i>=0;i--)printf("%d",b[i]);
}
sub(int c,int d[])
{ int e,i=0;
while(c!=0)
{e=c%8;
d[i]=e;
________.
i++;
}
return;
}
- A.c=e/8
- B.c=c%8
- C.c=c/8
- D.c=e%8
A B C D
C
[解析] 本题主要考查了进制转换的除余取整法。本算法中,是先对数c除8取余作为转换后的8进制数的第1位,然后对c整除以8的商作同样的操作,直到商为0为止,因此本题应选C。
46. 执行下面的程序段
int x=35;
char z='A';
int B;
B=((x&15)&&(z<'a'));
后,B的值为_______。
A B C D
B
[解析] 从整个表达式来看是个逻辑表达式,而与运算符“&&”的右边的子表达式中由于z的值为“A”,而A的ASCII码的值小于a的ASCII码值,所以这个子表达式的值为真,即1;在与运算符“&&”的左边的子表达式是个基于位运算的子表达式,将x的值与15做位与运算,表达式值不为零,所以两个子表达式的与值应当为1。
48. 下列程序的输出结果是_______。
#include<stdio.h>
main()
{
union
{
int k;
char i[2];
}*s,a;
s=&a;
s->i[0]=0x39;s->i[1]=0x38;
printf("%x\n",s->k);
}
- A.3839
- B.3938
- C.380039
- D.390038
A B C D
A
[解析] 在主函数定义了—个共用体变量a,及—个指向该变量的指针s。执行s->i[0]=0x39;s->i[1]=0x38;,将分别共用体的第—字节及第二字节存入十六进制数据0x39及0x38,由于在共用体中,变量共同占用存储空间,在输出s->k时,实际上就是输出开始写入的数据,而对于PC机,在存放血型数据时,低位在前,高位在后,故本题输出为3839。
二、填空题 请将每一个空的正确答案写在答题卡的[1]至[20]序号的横线上,答在试卷上不得分。
1. 设一棵完全二叉树共有500个结点,则在该二叉树中有
个叶子结点。
250
[解析] 所谓完全二叉树是指除最后一层外,每—层上的结点数均达到最大值;在最后—层上只缺少右边的若干结点。具有n个结点的完全二叉树,其父结点数为int(n/2),而叶子结点数等于总结点数减去父结点数。本题n=500,故父结点数等于int(500/2)=250,叶子结点数等于500-25=250。
2. 在最坏情况下,冒泡排序的时间复杂度为
。
n(n-1)/2或0(n(n-1)/2)
[解析] 冒泡排序法是一种最简单的交换类排序方法,它是通过相邻数据元素的交换逐步将线性表变成有序。假设线性表的长度为n,则在最坏的情况下,冒泡排序需要经过n/2遍的从:前往后的扫描和n/2遍的从后往前的扫描,需要的比较次数为n(n-1)/2。
3. 面向对象的程序设计方法中涉及的对象是系统中用来描述客观事物的一个
。
实体
[解析] 面向对象的程序设计方法中涉及的对象是系统中用来描述客观事物的—个实体,是构成系统的—个基本单位,它由—组表示其静态特征的属性和它可执行的—组操作组成。
4. 软件的需求分析阶段的工作,可以概括为四个方面:
、需求分析、编写需求规格说明书和需求评审。
需求获取
[解析] 软件的需求分析阶段的工作,可以概括为四个方面:需求获取、需求分析、编写需求规格说明书和需求评审。需求获取的目的是确定对目标系统的各方面需求。涉及到的主要任务是建立获取用户需求的方法框架,并支持和监控需求获取的过程。
5.
是数据库应用的核心。
数据库设计
[解析] 数据库设计是数据库应用的核心。在数据库应用系统中的—个核心问题就是设计—个能满足用户要求,性能良好的数据库,这就是数据库设计。
6. 若由以下定义,则不移动指针p,且通过指针p引用值为98的数组元素的表达式是
。
int w[10]={23,54,10,33,47,98,72,80,61},*p=w;
*(p+5)或p[5]
[解析] 本题的考查点是通过指针引用数组元素。 98是数组w的第5个元素(最开始的为第0个),而通过*p=w已经将p指向了数组w,要想不移动指针p而引用98,可以有以下两种方法:p[5]、*(p+5)。
7. 以下程序的输出结果是
。
#define MAX(x,y)(x)>(y)?(x):(y)
main()
{
int a=5,b=2;c=3,d=3,t;
t+MAX(a+,b,c+D) *10;
printf("%d\n",t);
}
7
[解析] 宏替换后,表达式t=MAX(a+b,c+d)*10即变为:t=(a+b)>(c+d)?(a+b):(c+d)*10;由于(a+b)>(c+d)为真,所以t=(a+b),即为7。
8. 以下程序的输出结果是
。
main()
{
unsigned short a=65536;
int b;
printf("%d\n",b=A) ;
}
0
[解析] 对于—个nusigned short short来说,它能取的最大值是65535。这里给a赋值65536,已经超出了它的取值范围,这样它的高位将被截掉,只把低位赋给它(全零)。所以a的值实际为0。
9. 若已经定义int a=25,b=14,c=19;,以下三目运算符(?:)所构成的语句的执行结果是
。
a++<=2&&b--<=2&&c++? printf("***
a=%d,b=%d,c=%d\n",a,b,C) :printf("a=%d,b=%d,c=%d\n",a,b,C) ;
a=26,b=14,c=19
[解析] 这种条件表达式的—般形式为:表达式1?表达式2:表达式3,三目运算符的执行顺序,先求解表达式1,若非0则求解表达式2,此时表达式2的值就作为整个表达式的值,若表达式1的值为0,则求解表达式3,此时表达式3的值就作为整个表达式的值。C语言在做一系列表达式相与时,从左到右分别计算各表达式的值,一旦遇到一个表达式为false,则剩余的表达式都不再进行运算。该题中,a++<=2的值为false,则b-<=2和c++就都不再运算再运算。
10. 下面的if语句与y=(x>=10)?3*x-11:(x<1)?x:2*x-1;的功能相同,请补充完整。
if(
)
if(
)y=2*x-1;
else y=x;
else y=3*x-11;
【10】 x<10
【11】 x>=1
[解析] 条件表达式的一般形式为,表达式1?表达式2:表达式3条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值;若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。 y=(x>=10)?3*x-11:(x>=1)?x:2*x-1;的功能是先求(x>=1)?x:2*x-1;的值,所的的结果再与前面的语句构成条件表达式进行求值。所以[10]应该填x<10, [11]应该填x>=1。
11. 以下程序中用户由键盘输入一个文件名,然后输入一串字符(用#结束输入)存放到此文件中,形成文本文件,并将字符的个数写到文件的尾部。请填空。
#include<stdio.h>
main()
{ FILE *fp;
char ch,fname[32]; int count=0;
printf(”Input the filename:");
scanf("%s",fname);
if((fp=fopen(
,"w+"))==NULL)
{ printf("Can't open file:%s\n",fname);exit(0);}
printf("Enter data:\n");
while((ch=getchar())!='#')
{ fputc(ch,fp);count++;}
fprintf(
,"\n%d\n",count);
fclose(fp);
}
【11】fname
【12】fp
[解析] fopen()函数实现打开文件的功能,通常的调用方式为:FILE *fp;fp=fopen(文件名,使用文件方式),因此,第一个横线处要求填写要打开文件的名字fname。fprintf()函数的—般调用方式为:fprintf(文件指针,格式字符串,输出表列),所以第二个横线处应填写fp。
12. 函数void fun(float*sn,int n)的功能是:根据以下公式计算S,计算结果通过形参指针sn传回;n通过形参传入,n的值大于等于0。请补全程序。
S=1-1/3+1/5-1/7+…+1/(2n+1)
void fun(float*sn,int n)
{ float s=0.0,w,f=-1.0;
int i=0;
for(i=0;i<=n;i++)
{ f=
*f;
w=f/(2*i+1);
s+=w;
}
=s;
}
【14】-1或-1.0
【15】*sn
[解析] 由于在对S求和时,相邻两项的符号刚好相反,而在函数fun中没有对数据进行取反的操作,故第—空的目的是对数据进行取反,以保证序列中相邻两项的符号不同。故第—个应填-1 或-1.0。在执行完循环体后,要将求和结果通过指针参数的形式传递绐调用fun的函数,故第二空应填*sn。
13. 下面的函数strcat(str1,str2)实现将字符串str2拼接到字符串str1后面的功能。请填空使之完整。
char*strcat(str1,str2)
char*str1,*str2;
{ char*t=str1;
while(
)str1++;
while(
);
return(t);}
【16】*str1 或 *str1!='\0' 或 *str1!=0 或 *str1!=NUL
【17】*str1++=*str2++ 或 *str1++=*str2,*str2++
[解析] 函数strcat(str1,str2)实现将字符串str2连接到字符串str1后面,所以首先要找到字符串str1的串尾,根据C语言的语法规定,一个串的串尾—定是—个隐含字符“\0”,而在程序中,对字符串中字符的访问是通过两个指针变量来完成的,因此要找到字符串str1的串尾,要判断:str1是否为“\0”,要找到字符串str2的串尾,要判断*str2是否为“\0”,程序中必须以使字符串中字符逐—顺序体现,所以在题中我们应填写“*str1”和“*str1++=*str2++”。
14. 以下函数fun用于求两个整数a和b的最大公约数。
fun(a,B)
int a,b;
{int i,j,m,n;
if(a>B)
{m=a;a=b;
;}
i=a;j=b;
while((n=
)!=0)
{j=i;i=
;}
return(i);
}
【18】b=m
【19】j%i.
【20】n
[解析] 函数中的变量i和j分别存放两个形参的最小数和最大数,在语句i=a和j=b执行之前,要将a和b分别变为最小数和最大数,当a>b时,程序使用中间变量将两者交换,所以题中第—个空中应当填写“b=m”;为求两个整数的最大公约数,程序的where循环条件必须为j整除i成立,所以题中第二个空中应当填写“j%i”;程序要通过i的值返回最大公约数,因此在循环中要将每次整除的公钓数赋给i,以保证最后返回的是两个,整数的最大公约数,所以第三个空中应当填写“n”。