一、选择题2. 有以下程序:
#include <stdio.h>
main()
{ char a='a', b;
printf("%c,", ++a);
printf(1%c\n", b=a++);
}
程序运行后的输出结果是( )。
A B C D
A
[解析] 本题考核的知识点是运算符++的用法。程序中的第一个输出语句输出表达式++a的值,该++a是在使用a之前,先使a的值加1,即a加1为字符b,此时a的值为b,所以第一个输出语句输出的值为b,第二个输出语句中输出的b的值,这时b的值为表达式a++的值,a++是在使用a之后(此时a的值为b,所以赋给b的值为b),使a的值加一,因此第二个输出的值也为b。所以,4个选项中选项A)符合题意。
12. 有以下程序:
struct STU
{char name[10];int num;float TotalScore;};
void f(struct STU*P)
{struct STU s[2]={{"SunDan",20044,550},{"Penghua",20045,537}},*q=s;
++P;++q;*P=*q;
}
main()
{struct STU s[3]={{"YangSan",20041,703),{"LiSiGuo",20042,580}};
f(s);
printf("%s%d%3.0f\n",s[1].name,s[1].num,s[1].TotalScore);
}
程序运行后的输出结果是______。
- A.SunDan 20044 550
- B.Penghua 20045 537
- C.LiSiGuo 20042 580
- D.SunDan 20041 703
A B C D
B
[解析] 本题将结构体数组s的首地址传给了结构体指针变量p,并在函数f中改变了指针变量p所指向的第二个结构体中的成员变量,这一改变,也就改变了主函数中s[1]的成员变量。
16. 有以下程序
main()
{int k=5;
while(-k) printf("%d",k-=3);
printf("\n");
}
执行后的输出结果是______。
A B C D
A
评析:此题中首先给k赋初值5,执行while语句:中的表达式“--k”,k先自行减1结果为4,满足while执行条件输出:k=k-3=4-3=1;此时输出结果为1。返回执行while语句,重复上面的操作,while后的表达式为0,退出循环,所以最后的输出结果为1。
17. 以下程序的输出结果是______。
#include<sulio.h>
#defme SQR(x)x*x
main()
{ int a,k=3;
a=++SQR(k+1);
printf("%d\n",a) ;
}
A B C D
B
[解析] 本题宏替换中遇到形参x以实参k+l代替,其他字符不变。SQR(k+1)展开后应为字符串k+l*k+l。
24. 下面程序
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了。
25. 有以下程序,其中函数f的功能是将多个字符串按字典顺序排序:
#include<string.h>
voidf(char*p[],intn)
{ char*t;int i,j;
for(i=0;i<n-1;i++)
for (j=i+1;j<n;j++)
if(strcmp(p[i],p[j])>0)
{
t=p[i];
p[i]=p[j];
p[j]=t;
}
}
main()
{ char*p[5]={"abc","aabdfg","abbd","dcdbe","cd"};
f(p,5);
printf("%d\n",strlen(p[1]));
}
程序运行后的输出结果是______。
A B C D
D
[解析] 函数f的功能是将字符串数组中的每个字符串元素按照由小到大的顺序进行排列,调用f(p,5)后,字符串数组p变为{“aabdfg”,“abbd”,“abc”,“cd”,“dcdbe”},所以最后输出p[1]即"abbd"的长度应为4。
26. 有如下程序:
main()
{
int a[3][3]={{1,2},{3,4},{5,6}},i,j,s=0;
for(i=1;i<3;i++)
for(j=0;j<=i;j++)
s+=a[i][j];
printf("%d\n",s);
}
该程序的输出结果是______。
A B C D
A
[解析] 题中的外循环只执行了2次:
第1次:a[1][0]=3,a[1][1]=4,所以s=7;
第2次:a[2][0]=5,a[2][1]=6,a[2][2]=0,所以s=7+5+6+0=18。
28. 有如下程序:
main()
{
int a[3][3]={{1,2},{3,4},{5,6}},i,j,s=0;
for(i=1;i<3;i++)
for(j=0;j<=i;j++)
s+=a[i][j];
printf("%d\n",s);
}
该程序的输出结果是______。
A B C D
A
[解析] 题中的外循环只执行了2次:
第1次:a[1][0]=3,a[1][1]=4,所以s=7;
第2次:a[2][0]=5,a[2][1]=6,a[2][2]=0,所以s=7+5+6+0=18。
29. 下列程序的输出结果是
。
main()
{double d=3.2;int x,y;
x=1.2; y=(x+3.8)/5.0:
printf{"%d\n",d*y};}
A B C D
C
[解析] 考查复合的赋值表达式。本题中,程序先执行语句x=12;,根据赋值运算的类型转换规则,先将double型的常量12转换为int型,即取整为1,然后将1赋值给变量x。接下来执行语句y=(x+3.8) /5.0;,根据运算符的优先级,先计算小括号内,再计算除法,最后执行赋值运算。小括号内的运算过程:先将整型变量x的值1转换为double型1.0,然后与3.8进行加法运算,得到中间结果4.8。接着进行除法运算4.8/5.0,其结果小于1.0,这里没有必要计算出精确值,因为接着进行赋值运算,赋值号左边变量y的类型为整型,于是对这个小于1.0的中间结果进行取整,结果为0,于是变量y的值为0,d*y的也为0。故本题应选择C) 。
32. 运行下面的程序时,从键盘输入字母H,则输出结果是
#include <stdio.h>
main()
{char ch;
ch=getchar();
switch(ch)
{ case 'H':printf("Hello!\n");
case 'G':printf("Good moming!\n");
default:printf("Bye_Bye!\n");
}
}
- A.Hello!
- B.Hello!
Good Moring! - C.Hello!
Good morning!
Bye_Bye! - D.Hello!
Bye_Bye!
A B C D
C
[解析] 本题主要对switch语句进行了考查。switch语句的执行过程为:进入switch结构后,对条件表达式进行运算,然后从上至下寻找与条件表达式值相匹配的case,以此作为入口,执行switch结构中后面的各语句,直到遇到break语句,则跳出switch语句,如果各case都不匹配时,则执行default后面的语句。本题中ch为字符'H',所以case'H'条件中的语句将被执行,由于没有break语句,所以case'G'后的语句也被执行,由于同样没有break语句,所以default后的语句也被执行了。
33. 下列程序中函数son()的功能是对数组a中的数据进行由大到小的排序。
#include<stdio.h>
void sort(int a[],int n)
{ int i,j,t;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(a[i]<a[j])
{ t=a[i];a[i]=a[j];a[j]=t;
}
}
main()
{ int a[10]={1,2,3,4,5,6,7,8,9,10},i;
sort(&a[1],7);
for(i=0;i<10;i++)printf("%d,",a[i]);
}
程序运行后的输出结果是
。
- A.1,2,3,4,5,6,7,8,9,10,
- B.10,9,8,7,6,5,4,3,2,1,
- C.1,8,7,6,5,4,3,2,9,10,
- D.1,2,10,9,8,7,6,5,4,3,
A B C D
C
[解析] 本程序中的函数sort(int a[],int n)实现的功能是将数组a中的前n个数进行从大到小排序。sort(&a[1],7)是将数组中从a[1]到a[7]这7个数进行从大到小排序,其他数不变。
34. 如下程序的输出结果是______。
#include<stdio.h>
main()
{ int x=1,a=3,b=4;
switch(x)
{ case 0:a--;
case 1:b--;
case 2:a--;b--;
}
printf("a=%d,b=%d\n",a,b);
}
- A.a=2,b=2
- B.a=3,b=3
- C.a=1,b=2
- D.a=3,b=2
A B C D
35. 阅读如下程序段
#include"stdio.h"
main()
{ int x,a,b;
scanf("%d",&x);
a=b=x;
for(;x!=0;)
{ if(x<b)b=x;
if(x>a)a=x;
scanf("%d",&x);}
printf("a=%d,b=%d\n",a,b);}
输入后输出结果是
- A.a=7569,b=789
- B.a=5,b=365
- C.a=7,b=789
- D.a=7569,b=5
A B C D
D
[解析] 本题的功能是求出输入序列的最大值和最小值,并打印输出。
39. 下面函数的功能是______。
exchange(int*ptr1,*ptr2)
{ int*ptr;
ptr=-ptr1;
ptr1=ptr2;
ptr2=ptr;
}
- A.交换*ptr1和*ptr2的值
- B.无法改变*ptr1和*ptr2的值
- C.可能造成系统故障,因为使用了空指针
- D.交换*ptr1和*pb2的地址
A B C D
B
[解析] 函数中将指针变量ptr1和ptr2中的值交换,而不是交换指针ptr1和ptr2所指变量中的值。
40. 有以下程序
#include<stdio.h>
void fun(int n,int*p)
{ int f1,f2;
if(n==1||n==2)*p=1;
else
{ fun(n=1,&f1);fun(n-2,&f2);
*p=f1+f2;
}
}
main()
{ int s;
fun(3,&,s);printf("%d",s);
}
程序的运行结果是
。
A B C D
A
[解析] 在函数fun中对参数n的值进行判断,如果其值等于1或2,则*p=1,否则,函数fun进行递归调用fun(n.1,&f1);fun(n.2,&f2);*p=n+f2;在主函数调用fun函数时传递给参数n的值为3,fun函数又递归用了两次自身fun(2,&n);fun(1,&f1);所以n和f2的值都为1,通过指针p的引用,变量s的值为2。
43. 以下程序运行后的输出结果是
#include<stdio.h>
void fun(int x){
if(x/2>1) fun(x/2);
printf("%d", x);
}
main(){
fun(7); printf("\n");
}
A B C D
D
[解析] 本题考查的要点是函数的递归调用。本题的调用可以用以下图示做出说明。
根据递归的特点,程序运行结果是先输出3再输出7。
44. 若有下面的说明和定义,则sizeof(struct aa)的值是______。
struct aa
{
int r1;double r2;float r3;
union uu{char u1[5];long u2[2]}ua;
}mya;
A B C D
D
[解析] 结构伸变量所占内存长度是各成员占的内存长度之和,每个成员分别占有自己的内存单元;共用体变量所占的内存长度等于最长的成员的长度。结构体变量aa中,成员r1占2个字节,r2占8个字节,r3占4个字节,共用体ua占8个字节,所以共占用2+8+4+8=22个字节。
45. 有以下程序
#define f(x) x*x
main( )
{ int i;
i=f(4+4)/f(2+2);
printf(“%d\n”,i); }
执行后输出结果是( )
A B C D
A
[解析] f(4+4)/f(2+2)=4+4*4+4/2+2*2+2=28。
49. 以下程序的输出结果是( )。
main()
{ int a=0,i;
for(i=1;i<5;i++)
{ switch(i)
{ casc 0:
case 3:a+=2;
case 1:
case 2:a+=3;
default:a+=5;
}
}
printf("%d\n",a);
}
A B C D
A
[解析] 在本题中,因为每个case语句后面都没有break语句,所以,第一轮循环(i=1)执行过后a的值为8,第2轮(i==2)执行过后a的值为16,第3轮(i==3)执行过后a的值为26,第 4轮(i==4)执行过后a的值为31,然后执行“i++”语句,这时循环条件为假,循环结束。所以,4个选项中A正确。
50. 下面程序输出的结果是( )。
#include<stdio.h>
main()
{
char *a="1234";
fun(a);
printf("\n");
}
fun(char *s)
{
char t;
if(*s)
{ t=*S++;fun(s);}
else return;
if(t!='\0')
putchar(t);
}
A B C D
B
[解析] 本题的fun()函数是用递归法实现逆序输出一个字符串。函数中首先定义一个局部变量t,然后s所指的内容是否为字符串结束符,不是的话将s所指的内容赋给t,同时使s后移一位,然后递归调用fun(s)。到这条语句为止是递归过程,即接下来连续递归调用fun(s)都只会执行到这一半,直到回朔条件(s所指内容是字符串结束符)出现,fun()函数连续返回,判断t不等于0的话,就输出t,所以输入的字符串被逆序输出,故本题的正确答案应该是B。
二、填空题1. 以下程序运行后的输出结果______。
struct NODE
{int k;
struct NODE *link;
};
main()
{structNODEm[5],*p=m,*q=m+4;
int i=0;
while(p!=q){
p->k=++i;p++;
q->k=i++;q-;
}
q->k=i;
for(i=0;i<5;i++)printf("%d",m[i].k);
printf("\n");
}
13431
[解析] 程序执行过程如下:
p=m,q=m+4,条件9!=q成立,执行p->k=++i;,由于是“前加”,所以m[0].k=1,执行p++后p=m+1;执行q->k=i++;,由于是“后加”,所以m[4].k=1,然后使得i加上1,即i=2,q-后,q=m+3: p=m+1,q=m+3,条件p!=q成立,执行p->k=++i;,由于是“前加”,所以i=3,m[0].k=3,执行p++后p=m+2:执行 p->k=++i;,由于是“后加”,所以m[4].k=3,i=4,q-后,q=m+2; p=m+2,q=m+2,条件p!=q不成立,则执行p->k=i;即m[2].k-4;故输出的值为13431。
2. 程序测试分为静态分析和动态测试。其中_______是指不执行程序,而只是对程序文本进行检查,通过阅读和讨论,分析和发现程序中的错误。
静态分析(静态测试)
[解析] 原则上讲,可以将软件测试方法分为两大类,即静态测试和动态测试。静态测试无须执行被测代码,而是借助专用的软件测试工具评审软件文档或程序,度量程序静态复杂度,检查软件是否符合编程标准,借以发现编写程序的不足之处,减少错误出现的概率。动态测试,是被测代码在相对真实环境下运行,从多角度观察程序运行时能体现的功能、逻辑、行为、结构等的行为,以发现其中的错误现象。程序测试分为静态测试和动态测试。静态测试一般是指人工评审软件文档或程序,借以发现其中的错误。由于被评审的文档或程序不必运行,所以称为静态测试。
3. 以下程序运行后的输出结果是______。
int a=5;
fun (int b)
{ static int a=10;
a+=b++;
printf("%d ",a);
}
main()
{ int c=20;
fun(c);
a+=c++;
Printf("%d\n",a);
}
30 25
[解析] 本题fun()函数中使用的a是其自身定义的静态局部变量a,所以算术运算中a+=b++相当于a=a+b,b=b+1结果为 10+20=30。所以,在fun()函数中的printf("%d ",a)输出结果为30。而主函数中使用的a是全局变量a,所以算术运算中a+=c++相当于a=a+c,c=c+1结果为5+20=25。所以,主函数中的printf("%d\n",a)输出的结果为25。故最终输出结果是30 25。
4. 软件需求规格说明书应具有完整性、无歧义性、正确性、可验证性、可修改性等特性,其中最重要的是______。
无歧义性
[解析] 软件需求规格说明书是需求分析阶段的最后成果,其最重要的特性是无歧义性,即需求规格说明书应该是精确的、无二义的。
5. 以下程序用来输出结构体变量student所占存储单元的字节数,请填空。
struct st
{ char name[20];double score;
};
main()
{ struct st student;
printf("student size:%d\n",sizeof(______));
}
6. 以下程序运行后的输出结果是______。
fun(int a)
{int b=0;static int c=3;
b++;c++;
return(a+b+c);
}
main()
{int i,a=5;
for(i=0;i<3;i++)printf("%d%d",i,fun(a));
printf("\n");
}
010111212
[解析] 静态局部变量是在编译时赋初值的,在程序运行时它已有初值。
7. 以下说明语句中,______是结构体类型名。
typedef struct
{ int n;
char ch[8];
}PER;
PER
[解析] 本题中,typedef声明新的类型名PER来代替已有的类型名,PER代表上面指定的一个结构体类型,此时,也可以用 PER来定义变量。
8. 求任意一个数(用16位二进制码表示)的补码。
main( )
{ unsigned int a;
______;
scanf("%O",& a);
printf("%o\n",getbits(a));
}
unsigned int getbits(value)
unsigned int value;
{unstgned int z;
z=______;
if(z==0100000)
______;
else
z=value;
return(z);
}
unsigned int getbits( )
value&0100000
z=~value+1
9. 对于图书管理数据库,将图书表中“人民邮电出版社”的图书的单价涨价5%。请对下面的SQL语句填空:
UPDATE图书______WHERE出版单位="人民邮电出版社"
SET单价=单价*1.05
[解析] 更新表中元组的值,使用UPDATE命令,一次可以更新表中的一个或多个属性值。UPDATE短语之后指定更新数据所属的表,将新的属性值或表达式赋值给对应的属性名(SET单价=单价*1.05),并置于SET短语之后。要求对人民邮电出版社的图书涨5%,需要用WHERE短语对元组进行限制,即对符合条件的元组进行更新。
10. 在先左后右的原则下,根据访问根结点的次序,二叉树的遍历可以分为三种:前序遍历、______遍历和后序遍历。
中序
[解析] 在先左后右的原则下,根据访问根结点的次序,二叉树的遍历可以分为三种:前序遍历、中序遍历和后序遍历。
11. 以下程序运行后的输出结果是______。
main()
{ int i,j,a[] [3]={1,2,3,4,5,6,7,8,9);
for(i=0;i<3;i++)
for(j=i+1;j<3;j++) a[j] [i]=0;
for(i=0;i<3;i++)
{ for(j=0;j<3;j++) printf("%d ",a[i][j]);
printf("\n");
}
}
1 2 3
0 5 6
0 0 9
[解析] 本题中,定义了一个元素类型为整型的二维数组a[][3]={1,2,3,4,5,6,7,8,9},它是一个3*3的矩阵,“for(i=0; i<3;i++)for(j=i=1;j<3;j++) a[j][i]=0;”将列下标i小于行下标j的元素a[1][0]、a[2][0]、a[2][1]赋值为0,最后“for(j=0;j<3; j++)printf("%n",a[i][j]);printf("\n");”进行换行输出,所以输出结果为:
1 2 3
0 5 6
0 0 9
12. 下列程序的输出结果是______。
#include<stdio.h>
main0
{intx=1,y=1,a=1,b=1;
switch(x)
{case1:
switch(y)
{case 0:a++;break;
case 1:b++;break;
}
case2:
a++;b++;break;
}
printf("a=%d,b=%d\n",a,B);
}
a=2,b=3
[解析] 分析程序,程序从x=l语句开始执行,之后执行第一个switch语句,switch(x)=switch(1),所以执行case1,casel语句中包含一个复合switch语句;这时执行第二个switch语句,此时y=1,所以switch(y)= switch(1),因此执行case1,将b加1,得到b=2,遇到break语句,退出第二个switch语句,则整个case 1的复合语句执行完毕,由于在这个case 1的后面没有break语句使其退出第一个switch语句,所以接着执行下列的case 2后面的语句,即将a、b各加1,得到a=2,b=3。
13. 下列程序的功能是将字符串s中所有的字符c删除。请填空。
#include<stdio.h>
main()
{char s[80];
int i,j;
gets(S);
for(i=j0;s[i]!'\0';i++)
if(s[i]!='c')______;
s[j]='\0;
puts(S);
}
s[j++]=s[i]
[解析] 循环开始后如果数组s中储存值与字符c相同,则i++直接跳过当前值;如果不相同,则将当前值赋予数组指定位置,并通过.j++将下标加1,指向下一元素要存储的位置。
14. 若有以下程序
main()
{ int a=4,b=3,c=5,t=0;
if(a<b)t=a;a=b;b=t;
if(a<c)t=a;a=c;c=t;
pfintf("%d%d%d\n",a,b,c) ;
}
执行后输出结果是______。
5 0 3
[解析] 如果if后面的条件为真,只执行其后的一条语句或一条复合语句,如果if后面的条件为假,只执行else后面的一条语句或一条复合语句。先判断表达式“a<b”为假,不执行“t=a”,但执行“a=b;b=t;”,a的值为3,b的值为0。在判断表达式“a<c”,值为真,所以执行后面的3条语句“t=a;a=c;c=t”,结果a的值为5,c的值为3,所以最后输出的结果为5、0和3。
15. 在面向对象方法中,对象之间进行通信的构造称为______。
消息
[解析] 对象之间进行通信的构造叫做消息,它请求对象执行某一处理或回答某一要求的信息,它统一了数据流和控制流。
16. 若有定义:int k;,以下程序段的输出结果是______。
for(k=2;k<6;k++,k++)printf("##%d",k);
##2##4
[解析] 本题中第一次输出##2,接着k两次自加为4输出##4,接着k再两次自加为6,此时不满足循环条件,退出循环,所以输出结果为“##2##4”
17. 数据字典是各类数据描述的集合,它通常包括5个部分,即数据项、数据结构、数据流、______和处理过程。
数据存储
[解析] 数据字典是各类数据描述的集合,它通常包括5个部分,即数据项,是数据的最小单位;数据结构,是若干数据项有意义的集合;数据流,可以是数据项,也可以是数据结构,表示某一处理过程的输入或输出;数据存储,处理过程中存取的数据,常常是手工凭证、手工文档或计算机文件;处理过程。
18. 以下程序将数组a的4个元素和数组b的6个元素写到名为lett.dat的二进制文件中,请填空。
#include <stdio.h>
#include <stdlib.h>
main()
{ FILE *fp;
char a[5]="1234",b[7]="abcedf";
if((fp=fopen("______","wb"))==NULL) exit(0);
fwrite(a,sizeof(char),4,fp);
fwrite(b,______,1,fp);
fclose(fp);
}
lett.dat 6*sizeof(char)
[解析] 本题主要考查函数fwrite(char *pt,unsigned size,unsigned n,FILE *fp),把pt所指向的n*size个字节输出到fp所指定的文件中。
19. 下列程序的输出结果是______。
main()
{int i,sum;
for(i=1;i<7;i++)
sum+=i;
primf("%d",sum);
}
无定值
[解析] for(i=l;i<7;i++)决定了循环次数为6次,每次执行的操作是sum+=i,但由于sum没有初始化,并不知道sum的初值是多少,所以结果无定值。
20. 以下程序输出的最后一个值是______。
int ff(int n)
{static int f=1;
f=f*n;
return f;
}
main()
{int i;
for(i=1;i<5;i++) printf("%d\n",ff(i));}
120
[解析] 静态变量的类型说明符是static,静态局部变量属于静态存储方式,它具有以下特点:
①静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。
②对静态局部变量是在编译时赋被值的,即只赋被值一次,在程序运行时它已有被值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。
③如在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。(注意:C语言中的非静态变量在定义时,系统并不会自动给它赋被值)
④虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。
本题中函数的功能是:与for语句一起求一个整数的阶乘。