(28)有如下程序
main()
{ int x=3;
do
{ printf("%d",x--);}
while(!x);
}
该程序的执行结果是________。
A)321 B)3 C)不输出任何内容 D)陷入死循环
答案:B
评析:本题x赋初值为3,当执行printf("%d",x--);时,由于X--的作用是先运算x,再将x的值减l,所以,printf输出的x值为3,等输出后,x的值减1变为2,继续执行,判断条件!x为假,循环只被执行一次。
(29)设有声明语句:char a='\72';则变量a__________
A)包含1个字符 B)包含2个字符
C)包含3个字符 D)声明不合法
答案:A
评析:转义字符常量'\xx'可以把'\'后面的数字转换为对应的ASCII字符。
(30)有以下程序段:
main()
{
int a=5,*b,**c
c==&b;b=&a;
}
程序在执行了c=&b;b=&a;语句后,表达式ttc的值是__________。
A)变量a的地址 B)变量b中的地址
C)变量a中的值 D)变量b的地址
答案:C
评析:指针变量是用来存放地址的。&:取地址运算符。+:指针运算符。**c为指针变量*c所指向的存储单元,*c为指针指针变量c所指向的存储单元,而c=&b表示c为变量b的地址,b=&a表示b为变量a的地址。表达式一c的值就是变量a中的值。
(31)有如下函数调用语句
func(recl,rec2+rec3,(rec4,rec5));
该函数调用语句中,含有的实参个数是________。
A)3 B)4 C)5 D)有语法错误
答案:A
评析:(rec4,rec5)是逗号表达式,它的值是rec5的值。所以该函数调用语句含有的实参个数是3。
(32)有如下程序
main()
{
char s[115]={.tabc","de","fgh"};
printf("%e",s[2][6]);
}
其输出为__________。
A)不确定 B)编译错误 C)g D)输出null字符
答案:A
评析:由于s[2116]表示字符串已超出了数组s的表示范围,在c中不会对数组越界进行检查,当数组越界时,会得到一个不确定的值。
(33)有如下程序
int rune(ira a,int b)
{ remm(a+b);}
main()
{ int x=2,y=5,z=8,r;
r=func(func(x,y),z);
primf("%d\n",r);
}
该程序的输出结果是________。
A)12 B)13 C)14 D)15
答案:D
评析:调用函数func(x,y),返回x+y,即7;再调用函数func(7,z),返回7+z,即15。
(34)有如下程序段
int *p,a=10,b=l;
p=&a; a=*p+b;
执行该程序段后,a的值为_________。
A)12 B)11 C)10 D)编译出错
答案:B
评析:执行p=&a;后,p指向整数a,*p即p的目标变量,也就是a;所以a=*p+b等价于a=a+b,可知a的值最终为11。
(35)有以下程序:
int*f(int*x,int*y)
{ if(*x<*y)return x;
else returny;
}
main()
{
int a=7,b=8,*p,*q,*r;
p=&a;q=&b;
r=f(p,q);
printf("%d,%d,%d\n",*p,*q,*r);
}
程序运行后输出结果是_________。
A)7,8,8 B)7,8,7 C)8,7,7 D)8,7,8
答案:B
评析:f函数的功能是返回地址为x,y的两个数中值较的数的地址,本题输出结果是7,8,7。
(36)有如下程序
long fib(im n)
{ if(n>2) return(fib(n-1)+fib(n-2));
else return(2);
)
main()
{ printf(%ld\n",fib(3));}
该程序的输出结果是_________。
A)2 B)4 C)6 D)8
答案:B
评析:函数舶内部有两个递归调用,当n=3时,fib(n-1)返回2,fib(n-2)也返回2,所以fib(n-I)+fib(n-21的值为4。
(37)下面程序的输出结果是_________。
main()
{
char str[10],c='a';
inti=0:
for(;i<5;i++)
str[I]=c++;
printf("%s",str);
}
A)abcde B)a C)不确定 D)bcdef
答案:C
评析:字符串少一个结束标志,所以输出的结果不确定。
(38)在c语言中,函数中变量的隐含存储类别是__________。
A)auto B)static C)extern D)无存储类别
答案:A
评析:函数中变量的存储类别包括auto,static,extern,其中auto为隐含存储类别,static为静态存储类别,register是寄存器存储类别。A
评析:函数中变量的存储类别包括auto,static,extern,其中auto为隐含存储类别,static为静态存储类别,register是寄存器存储类别。
(39)有如下程序
#define n 2
#define m N+I
#define NUM 2*m+l
main()
{ int i;
for(i=1;i<=NUM;i++)printtf("%d\n",i);
}
该程序中的for循环执行的次数是_________。
A)5 B)6 C)7 D)8
答案:B
评析:在c语言中,宏定义在编译时将被直接替换,所以NUM最后会被替换成2*N+l+l,即2*2+1+1,值为6。因此,for循环执行的次数为6。
(40)假设在turboc2.0采用small模式编译如下程序
main()
{
char a[4]:{'a','b'};
char%="abc.t:
printf("%d,%d",sizeof(a),sizeof(b));
}
其输出结果为_________。
A)4,2 B)4,4 C)4,3 D)2,2
答案:A
评析:用small模式编译,指针变量占2个字节。sizeof(array):数组名array代表数组本身,sizeof函数测出的是整个数组的大小。a数组的大小为4,b指针变量的大小为2。
(41)有以下函数
char *fun(char *p)
{ retum p; }
该函数的返回值是_________。
A)无确切的值 B)形参p中存放的地址值
C)一个临时存储单元的地址 D)形参p自身的地址值
答案:B
评析:p本身就是一个字符型指针变量,返回p也就是返回变量p中存放的地址值。
(42)有如下程序段:
#include<stdio.h>
#define Max(a,b)a>b?a:b
main()
{
int a=5,b=6,c=4,d;
d=c+Max(a,b);
printf("%d",d);
}
其输出结果为__________。
A)10 B)5 C)6 D)编译错误
答案:B
评析:在c语言中,宏定义是直接替换的,所以在c+a>b?a:b这个条件表达式中,c+a>b为真,所以用a的值作为整个表达式的值,而a的值为5,所以整个表达式的值为5。
(43)有如下程序段
int a=14,b=l 5,x;
char c='A':
x=(a&&b) &&(c<'B');
执行该程序段后,x的值为________。
A)true B)false C)0 D)l
答案:D
评析:a&&b的值为true,c<'B'的值也为true,所以(a&&b)&&(c<'B')的值为true。但x是int型变量,所以(披&b)&&(c<'B')的值最后要从bool型转换为int型赋给x。这样x的值应为l。
(44)下述关于C语言文件的操作的结论中,正确的是________。
A)对文件操作必须先关闭文件
B)对文件操作必须先打开文件
C)对文件操作顺序无要求
D)对文件操作前必须先测文件是否存在,然后再打开文件。
答案:B
评析:在c中对文件操作必须先打开文件,待文件操作完毕后要关闭文件。对文件以读的方式进行打开操作时,同时会执行文件的检查文件是否存在,不存在将会返回空的文件指针,如果对文件以写的方式打开时,文件不存在,将会自动创建文件,.因此在C中打开文件前不必对其检查文件是否存在,故答案为B。
(45)下列关键字中,不属于C语言变量存储类别的是________。
A)register B)auto C)extem D)public
答案:D
评析:变量的存储类别具体包含四种:自动的(auto),静态的(statiC),寄存器的(register),外部的(extern)。
(46)有如下说明
im a[10]={l,2,3,4,5,6,7,8,9,10},*p=a;
则数值为9的表达式是________。
A)木p+9 B)半(p+8) C)牛p+=9 D)p+8
答案:B
评析:p是指针,p+8是地址值,D是错的;*p是p的目标变量,即a[0],值为1,所以+p+9的值是lO,而*p+=9值是重新给a[O]赋了值(1+9);所以A和C也是错的。p+8是地址值,指向a[8],那么*(p+8)。的值就是a[81的值,即9。
(47)若有以下定义:int t[3][2];能正确表示t数组元素地址的表达式是________。
A)&t[3][2] B]t[3] C]t[1] D]*t[2]
答案:C
评析:A和B两个表达式都已越界了;*t[2]是目标变量,即一个整数,而不是地址值。
(48)下面程序运行后的输出结果是________。
struct abc
{
int a,b,c;
}
main()
{
struct abc s[2]={{1,2,3},{4,5,6}};
int t=-s[0].a+s[1].b;
printf("%d\n",t);
}
A)5 B)6 C)7 D)8
答案:B
评析:在main函数中定义了一个struct abc类型的数组,同时分别利用{1,2,3}及{4,5,6}对数组中两个元素进行初始化。在该结构体,依次对其中的a,b,c三个变量进行初始化。故s[O].a=l,s[1].b=5,所以本题输出为6。
(49)有如下程序
main()
{
int a[31131。{{1,2},{3,4},{5,6}},i,j,s=0;
for(i=l;i<3;i++)
for(j=0;j<=i;j++)
s+=a[I][j];
printf("%d\n",s);
}
该程序的输出结果是________。
A)18 B)19 C)20 D)2l
答案:A
评析:题中的外循环只执行了2次:
第1次:a[1][0]=3,a[1][1]=4,所以s=7;
第2次:a[2][O]=5,a[2][1]=6,a[2][2]=0,所以s=7+5+6+0=18。
(50)若己建立如下图所示的单向链表结构:
在该链表结构中,指针p、s分别指向图中所示结点,则不能将s所指的结点插入到链表末尾仍构成单向链表的语句组是__________。
A)p=p->next;s->next:p;p->next=s;
B)p=p->next;s->next:p->next;p->next=s;
C)s->next:NULL;p=p->next;p->next:s;
D)p=(*p).next;(*s).next=(*p).next;(*p).next=s;
答案:A
评析:在答案A中:p=p->next;s->next=p;p->next=s;s的确已插到了链表的末尾,但它的next却并没有为NULL,而是指向了它的直接前趋p,这样它就不是一个单向链表(单向链表最后一个结点的next指针一定是一个NULL)。
二、填空题(每空2分,共40分)
请将每一个空的正确答案写在答题卡的【1】至【20】序号的横线上,答在试卷上不得分。
(1)在运算过程中,能够使空表与非空表的运算统一的结构是 【1】 。
答案:【1】循环链表
评析:在链表的运算过程中,采用链接方式即循环链表的结构把空表与非空表的运算统一起来。循环链表具有两个特点:
①在循环链表中增加了一个表头结点,其数据域为任意或根据需要来设置,指针域指向线性表的第一个元素的结点。循环链表的头指针指向表头结点。
②循环链表中最后一个结点的指针不是空,而是指向表头结点。
(2)软件工程研究的内容主要包括: 【2】 技术和软件工程管理。
答案:【2】软件开发
评析:基于软件工程的目标,软件工程的理论和技术性研究的内容主要包括:软件开发技术和软件工程管理。
软件开发技术包括:软件开发方法学、开发过程、开发工具和软件工程环境,其主体内容是软件开发方法学。
软件工程管理包括:软件管理学、软件工程经济学、软件心理学等内容。
(3)与结构化需求分析方法相对应的是 【3】 方法。
答案:【3】结构化设计
评析:与结构化需求分析方法相对应的是结构化设计方法。结构化设计就是采用最佳的可能方法设计系统的各个组成部分以及各个成分之间的内部联系的技术。也就是说,结构化设计是这样一个过程,它决定用哪些方法把哪些部分联系起来,才能解决好某个具体且有清楚定义的问题。
(4)关系模型的完整性规则是对关系的某种约束条件,包括实体完整性、 【4】 和自定义完整性。
答案:【4】参照完整性
评析:关系模型允许定义三类数据约束,它们是实体完整性、参照完整性以及用户定义的完整性约束,其中前两种完整性约束由关系数据库系统自动支持。
实体完整性约束要求关系的主键中属性值不能为空,这是数据库完整性的最基本要求,因为主键是惟一决定元组的,如为空则其惟一性就成为不可能的了。
参照完整性约束是关系之间相关联的基本约束,它不允许关系引用不存在的元组:即在关系中的外键要么是所关联关系中实际存在的元组,要么是空值。
自定义完整性是针对具体数据环境与应用环境由用户具体设置的约束,它反映了具体应用中数据的语义要求。
(5)数据模型按不同的应用层次分为三种类型,它们是 【5】 数据模型、逻辑数据模型和物理数据模型。
答案:【5】概念
评析:数据模型按不同的应用层次分为三种类型,它们是概念数据模型、逻辑数据模型和物理数据模型。
概念数据模型简称概念模型,是一种面向客观世界、面向用户的模型;它与具体的数据库管理系统无关。
(6)表示""整数x的绝对值大于5""时值为""真""的C语言表达式是 【6】 。
答案:【6】x>5‖x<-5或k<-5‖x>5
评析:要使整数x的绝对值大于5,则x大于5或x小于-5,用c语言表示即为:x>5‖x<-5或者x<-5‖x>5。
故本题答案为:x>5‖x<-5或者x<-5‖x>5。
(7)以下程序的输出结果是 【7】 。
main()
{ unsigned short a=65536;int b;
printf("%d\n",b=a);
}
答案:【7】0
评析:对于一个unsigned short来说,它能取的最大值是65535。这里给a赋值65536,已经超出了它的取值范围,这样它的高位将被截掉,只把低位赋给它(全零)。所以a的值实际为0。
(8)若有定义:ira a=lO,b=9,c=8;,接着顺序执行下列语句,变量b中的值是 【8】 。
c=(a-=(b-5));
c=(a%11)+(b=3);
答案:【8】3
评析:这里:b-5=4,a.=4之后a的值为6,并把它赋给c。此时b的值并未被改变。在第2个表达式中,也只有赋值表达式b=3改变了b的值。所以两行语句执行完毕,b的值应该为3。
(9)以下程序运行后的输出结果是 【9】 。
main()
{
int p=30;
primf("%d\n",(p/3>O?p/10:p%3));
}
答案:【9】3
评析:条件表达式的一般形式为:表达式17表达式2:表达式3条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值;若表达式l的值为0(假)-,则求解表达式3,表达式3的值就是整个条件表达式的值。30/3=10>0,所以执行p/lO,结果为3。
(10)函数pi的功能是根据以下近似公式求n值:
(∏*∏)/6=1+1/(2*2)+1/(3*3)+…+1(n*n)
现在请你在下面的函数中填空,完成求n的功能。
#include"math.H"
{ double s=0.0;long i;
for(i=1;i<=n;i++)s=s+ 【10】 ;
retum(sqrt(6*s));
}
答案:【10】1.O/(i*i1或(double)l/(i*i)
评析:表达式1+1/(2*2)+l/(3*3)+…+1(n*n)可写为:1/(1*1)+1/(2*2)+1/(3*3)+…+1(n*n)
n
即:∑l÷(i×i)
i-l
对应的c语言的表达式:s=s+1.O/(i*i)。注:必须要写成1.0的形式,否则1/(i*i)返回值为其值截尾取整,即恒为O。
(11)函数pi的功能是根据以下公式近似求得的:
pi*pi/6=1+1/(2*2)+1/(3*3)+…+1/(n*n)
请在下面的函数中填空,完成求pi的功能。
#include<math.h>
double pi(10ng n1
{ double s=O.O,long i;
for(i=1;i<=n;I++)s=s+ 【11】 ;
return(sqrt(6*s));
}
答案:【11】1.0/i/i或1.O/(i*i)
评析:由题面中提供的计算pi的公式可知:在第i项其值为1/(i*i),考虑到运算结果为浮点数,故必须要将l转化为浮点数或采用1.O/(i*i)的形式。故本题应填1.O/(i*i)或其等效形式。
(12)若输入字符串:abcde/,则以下while循环体将执行 【12】 次。
while((ch=getchar())=='e')printf("*");
答案:【12】0
评析:函数getchar()是从键盘得到用户输入的一个字符。用户输入的第1个字符是a,不管后面输入的是什么ch的值都是'a',因此条件(ch=getchar())=='e'为假,这个循环不会被执行。
(13)以下函数用来求出两整数之和,并通过形参将结果传回,请填空。
voidfunc(intx,inty, 【13】 z]
{ *z-x+y;},
答案:【13】int*
评析:从题中代码可知:z应该是一个整型指针,因此应填:int*
(14)若有以下定义,则不移动指针p,且通过指针p引用值为98的数组元素的表达式是 【14】 。
int w[10]={23,54,10,33,47,98,72,80,61},*p=w;
答案:【14】p[5]或*(p+5)
评析:98是数组w的第5个元素(最开始的为第O个),而通过*p=w已经将p指向了数组w,要想不移动指针p而引用98,可以有以下两种写法:p[5]、*(p+5)。
(15)设在主函数中有以下定义和函数调用语句,且fun函数为void类型;请写出fun函 数的首部 【15】 。要求形参名为b。
main()
{ double s[10][22];
int n:
……
fun(s);
……
}
答案:【15】void fun(double b[1011221]
评析:本题答案:void fun(double b[10][22])
(16)有以下程序:
int f(int n)
{ if(n==1)return 1;
else return f(n-1)+1;}
main()
{ int i j=0;
for(i=1;i<3;i++)j+=f(i);
printf("%d\n"'j);
}
程序运行后的输出结果是 【16】 。
答案:【16】3
评析:i=l时,f(1)=1 J=j+f(1)=0+1=1;i=2时,f(2)=f(1)+l=1+1=2 j=j+f(2)=l+3=3;此时循环结束,程序运行后的输出结果是3。
(17)以下程序的输出结果是 【17】 。
void fun()
{ static int a:0;
a+=2;printf("%d",a);
}
main()
{ int cc;
for(CC=1;cc<4;cc++)fun();
printf("\n");
}
答案:【17】246
评析:循环for(cc=l;cc<4;cc++)被执行了3次。在函数fun中,由于a是static型变量,所以函数第1次调用后,a=2;第2次调用后,a=4;第3次调用后,a=6。
(18)实现程序可将磁盘中的一个文件复制到另一个文件中,两个文件的文件名在可执行命令的命令行中(相当于copy命令),假定文件在当前目录下。请补全程序。
#include<stdio.h>
void main(int argc,char。argv[])
{ FILE *f1,*f2;
if(argc< 【18】 )
{ printf("parameter error!\n");exit(0);}
fl=fopen(argv[1],"r");
f2=fopen(argv[2],"w");
while( 【19】 )fputc(fgetc(f1),f2);
fclose(f1);
fclose(f2);
}
答案:【18】3
【19】!feof(f1)
评析:在c语言中,宏定义是直接替换的,所以在对表达式MAX(a+b,c+d)*10进行或替换后,表达式变为:(a+b)>(c+d)?(a+b):(c+d)*10
在这个条件表达式中,(a+b)>(c+d)为真,所以用(a+b)的值作为整个表达式的值(否则用(c+d)*10的值作为整个表达式的值),而(a+b)的值为7。所以整个表达式的值为7。
(19)以下程序的输出结果是 【20】 。
#define MAX(x,y)(x)>(y)?(x):(y)
main()
f int a=5,b=2,c=3,d=3,t;
t=MAX(a+b,c+d)*10;
printf("%d\n",t);
}