(28)以下程序的输出结果是_______。
fun(int x,inty,int z)
{z=x*x+y*y;}
main()
{
int a=3l:
fun(5,2,a);
printf("%d",a);
}
A)0 B)29 C)3l D)无定值
答案:C
评析:本题中,a的值并没有改变,因为传递到函数中的是变量值。
(29)下列程序段的输出结果是__________。
void fun(、int *x,int *y)
{primf("%d%d",*x,*y);*x=3;*y=4;}
main()
{
int x=l,y=2;
fun(&y,&x);
printf("%d%d",x,y);
}
A)2 1 4 3 B)1 2 l 2 C)l 2 3 4 D)2 1 l 2
答案:A
评析:本题中函数传递的是变量的地址,如果形参在函数中发生改变,相对应的实参也就有了改变。
(30)对于下面的程序
#include<stdio.h>
#include<string.h>
char*scmp(char*s1,char*s2)
{
if(strcmp(sl,s2)<0)retum(s1);
else return(s2);
}
main()
{
int i;char string[20],str[3][20];
for(I=0;i<3;i++)gets(str[i]);
strcpy(string,scmp(str[0],str[1]));
strcpy(string,scmp(string,str[2]));
printf("%s\n",string);
}
若运行时依次输入:abcd、abba和abc三个字符串,则输出结果为________。
A)abcd B)abba C)abc D)abca
答案:B
评析:本题自定义函数semp()的作用是比较字符串s1和s2的大小,如果sl<s2,函数返回s1的值,否则返回s2的值。若运行时依次输入abed、abba和abe三个字符串,执行strcpy(string,scmp(str[O],str[1]));后,string的值为abba,再执行strepy(string,scmp(string,str[2]));,由于scmp(string,str[2])返回string的值
abba,再拷贝到字符串数组string中,所以本题输出abba。
(31)下列程序的输出结果是__________。
main()
{
char a[10]={9,8,7,6,5,4,3,2,1,O},*p=a+5;
print"%d*--p);
}
A)非法 B)a[4]的地址 C)5 D)3
答案:C
评析:本题中char*p=a+5;即相当于p=&a[5],而--p,是先要减1,则printf语句要输出的值就是a[4]。
(32)对下面的程序进行编译与连接生成可执行文件c.exe,并在DOS命令提示符下输入:
c I said"I love China"!
程序代码如下:
main(、int argc,char*argv[])
{
printf("%d",argC);
}
其输出结果为________。
A)4 B)5 C)6 D)7
答案:B
评析:带参数的main()函数常用形式为:main(int argc,ehar*argv[])
其中,参数的个数由C程序运行时自动计算出来。字符型指针数组argv的第一个元素存放命令名,其后各个元素依次存放命令行中各个参数的首地址;整型变量arge用来记录命令行中的参数个数,文件名也作为一个参数,对于命令行中双引号内的字符串,即使有空格分开,也只算是一个参数,同时双引号本身不算参数的内容,因此本题argc的值等于5
(33)下列程序的运行结果是________。
void fun(int *a,int *b)
{
int *k:
k=a;a-b;b=k;
}
main()
{
int a=3,b=6,*x=&a,*y=&b;
fun(x,y);
printf["%d%d.f,a,b);
}
A)6 3 B)3 6 C)编译出错 D)0 0
答案:B
评析:本题中主函数里的x、y,fun函数里的a、b、k,这些都是指针,fun函数中只是将a、b这两个指针交换了位置,而并没有改变主函数中变量a、b的值。
(34)若有定义:int*p[3];,则以下叙述中正确的是________。
A)定义了一个基类型为int的指针变量p,该变量有三个指针
B)定义了一个指针数组p,该数组含有三个元素,每个元素都是基类型为int的指针
C)定义了一个名为+p的整型数组,该数组含有三个int类型元素
D)定义了一个可指向一维数组的指针变量p,所指一维数组应具有三个int类型元素
答案:B
评析:由于运算符[]优先级比*高,int*p[3];相当于int *(p[3]);表示数组p的三个元素都是指针变量,且每个元素都是基类型为int的指针。
(35)有以下程序:
void swapl(int *a,int *b)
{int *c=a;
a=b,b=c;
}
void swap2(int *a,int *b)
{
int c=*a:
*a=*b,*b=c;
}
main()
(int a=lO,b=15;
swapl(&a,&b);
printf("%d,%d,",a,b);
a=lO,b=15;
swap2(&a,&b);
printf("%d,%dt.,a,b);
}
其输出结果为_________。
A)15,10,10,15 B)15,10,15,10 C)10,15,10,15 D)10,15,15,10
答案:D
评析:C语言规定,实参变量对形参变量的数据传递是"值传递",只由实参传给形参,而不能由形参传回来给实参。在内函数调用结束后,形参单元被释放,实参单元仍保留并维持原值。本题中swapl()函数中,虽然改变了形参指针的值,但实参指针的值并没有改变,所以执行第一个printf后应输出10,15,;swap2()函数实现了交换两个变量a和b的值,因此执行第二个printf后输出交换后的值15,10,所以本题答案为D。
(36)当调用函数时,实参是一个数组名,则向函数传送的是__________。
A)数组的长度 B)数组的首地址
C)数组每一个元素的地址 D)数组每个元素中的值
答案:B
评析:当调用函数时,实参是一个数组名,则向函数传送的是数组的首地址,函数中的形参可定义成以下三种形式:
①形参定义成数组;
②形参定义成可变长数组;
③形参定义为指针变量。
(37)下面的程序输出结果是________。
#define r16
#ifr==16
void p(int a)
{
printf("%x",a);
}
#else
voidp(int a)
{
printf("%d",a);
}
#endif
main()
{
p(32);
}
A)32 B)20 C)编译时错误 D)运行时错误
答案:B
评析:"#define r16"的作用是指定用标识符r来代替16,因此程序编译时只编译#if部分,故程序运行时,打印输出十六进制的32,即20。
(38)设有以下声明语句
struct ex
{ intx;floaty;char z;}example;
则下面的叙述中不正确的是_________。
A)struct是结构体类型的关键字 B)example是结构体类型名
C)x,y,z都是结构体成员名 D)struct ex是结构体类型
答案:B
评析:example是结构体变量名。
(39)以下只有在使用时才为该类型变量分配内存的存储类说明是_________。
A)auto和stmic B)auto和register
C)register和static D)extem和register
答案:B
评析:extem、register、static、auto分别是定义外部变量、寄存器变量、静态变量、自动变量,其中,自动变量和寄存器变量属于动态存储,调用时临时分配单元;而静态变量和外部变量属于静态存储,在整个程序运行时都存在。
(40)下面程序运行后的输出结果是__________。
fut(int**s,int p[2][3])
{
**s=p[l][1];
}
main()
{
int a[2][3]={1,3,5,7,9,1l},*p;
p=(int*)malloc(sizeof(int));
fut(&p,a);
printf("%d\n",*p);
}
A)l B)7 C)9 D)ll
答案:C
评析:本题a[2][3]定义为一个具有两行三列的元素的数组,malloc()函数的作用是开辟了一个长度为sizeof(int)的内存区,p为指向整型数据的指针变量,程序调用fur()函数,将第一行第一列对应的元素值赋给一s,由于数组中第一行第一列对应的元素为9,所以本题输出值9。
(41)以下程序的输出结果是_________。
main()
{
inti,k,a[10],p[3];
k=5;
for(I=O;i<10;i++)a[i]=i;
for(i=0;i<3;i++)p[i]=a[I*(i+1)];
fbr(i=O;i<3;i++)k+=p[I]*2;
printf("%d\n",k);
}
A)20 B)2l C)22 D)23
答案:B
评析:按照程序的流程走一遍,可以得到,p[O]=0,p[1]=2,p[3]=6;执行三次k+=p[i]*2,相当于k=5+0*2+2*2+6*2=21
(42)当执行下面的程序时,其输出结果为__________。
union st
{
int a:
charb:
}
main()
{
union st s:
char*p=(char*)&s;
s.a=Ox3132;
s.b=Ox33;
printf("%c",*p);
}
A)l B)2 C)3 D)不确定
答案:C
评析:共用体类型结构的特点是使几个不同的变量共占同一段内存,但在每一瞬时只能存放其中一种,而不是同时存放几种,共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。因此本题起作用的是成员b的值,所以程序打印输出3。
(43)当执行下面的程序时,如果输入ABc,则输出结果是________。
#include"stdio.h"
#include"string.H"
main()
{ char ss[10]="12345";
gets(ss);strcat(ss,"6789");
printf("%s\n",ss);
}
A)ABC6789 B)ABC67 C)12345ABC6 D)ABC456789
答案:A
评析:strcat(str1,str2)合并字符串函数的作用是把str2所指字符串的内容连接到strl字符串的后面,自动删去strl原来串中的'\0'。为了进行这项操作,要求strl所指的字符串后面有足够的空间来容纳'str2所指字符串中的内容。函数值为strl所指第一个字符的地址。
(44)main(im argo,char*argv[])
{
while(--argc>0)printf("%s",argv[argc]);
printf("\n");
}
假定以上程序经编译和连接后生成可执行文件PROG.ExE,如果在此可执行文件所
在目录的Dos提示符下键入:PROG ABcDEFGHIJKL↙,则输出结果为_________。
A)ABCDEFG B)IJHL
C)ABCDEFGHIJKL D)lJKLABCDEFGH
答案:C
评析:本题主函数带有两个参数,一个int型变量argc,另一个是char型的一维一级指针数组argv。当主函数被执行时,系统自动将根据命令行的情况,分别给主函数的两个参数赋值。Arge中存放命令行中命令字和参数的总和的个数,argv用来存放命令行中命令字和所有参数的字符串的,并规定argv[0]存放命令字字符串,argv[1]用来存放第一个参数的字符串,argv[2]用来存放第2个参数的字符串,依次类推。
题中argc的值是2,执行完--argc后为1,输出argv[1],此数组存在第一个参数的字符串ABCDEFGHIJKL。
(45)设char型变量x中的值为10100lll,则表达式(2+x)"(~3)的值为_________。
A)10101001 B)10101000 C)lll11101 D)0101010l
答案:D
评析:异或运算符(n)的运算规则是:参加运算的两个相应位同号,则结果为0(假):异号则为-1(真)。
取反运算符(~)的运算规则是:对一个二进制数按位取反,即将0变为l,l变为O。本题(~3)是对3(二进制形式为00000011)按位取反即11111100。
表达式(2+x)n(~3)的值就等价于(00000010+10100111)^11111100,结果为01010101。
(46)以下程序的输出结果是________。
long fun(int n)
{ long s;
if(n==1‖n==2)s=2;
else s=n-fun(n-1);
return S:
}
main()
{primf("%ld\n",fun(3));}
A)l B)2 C)3 D)4
答案:A
评析:这是一个递归函数。递归的结束条件是,n=l或者n=2。按照程序顺序,即可得出本题结果为l。
(47)以下程序试图把从终端输入的字符输出到名为abe.txt的文件中,直到从终端读入字 符串撑号时结束输入和输出操作,但程序有错
#include<stdio.h>
main()
{
FILE*fout:
char ch:
fout=fopen('abc.txt','w');
ch=fgetc(stdin);
while(chI_'))')
{
fputc(ch,fout);
ch=fgetc(stdin);
}
fclose(fout);
}
出错的原因是_________。
A)函数fopen调用形式错误 B)输入文件没有关闭
C)函数龟etc调用形式错误 D)文件指针stdin没有定义
答案:A
评析:本题考查的是文件的打开函数fopen(),其调用方式通常为:FLIE*fp;fp=fopen(文件名,使用文件方式);,如:fp=fopen("abc.txt","w");表示要打开名字为abc.txt的文件,使用文件方式写入。fopen函数带回指向abc.txt文件的指针并赋给fp,即审指向文件abc.txt。
(48)以下程序的输出结果是_______。
#define SQR(X) X*X
main()
{ int a=16,k=2,m=l;
a/=SQR(k+m)/SQR(k+m);
printf("%d\n",a);
}
A)16 B)2 C)9 D)l
答案:B
评析:c语言在预编译时遇到带实参的宏名,则按命令行中指定的字符串从左到右进行置换。在做这题时,也不妨将运用置换法。得到:a/=k+m*k+m/k+m*k+m=16/7=2。注:a为整型,所以在做除法时,自动取整。
(49)假定建立了以下链表结构,指针p、q分别指向如图所示的结点,则以下可以将q所指结点从链表中删除并释放该结点的语句组是________。
↓p ↓q
8
4
3
head→ →…→ → →……
datanext
A)free(q);p->next=q->next;
B)(*p).next=(*q).next;free(q);
C)q=(*q).next;(*p).next=q;free(q);
D)q=q->next;p->next=q;p=p->next;free(p);
答案:B
评析:选项A的错误在于,先已经把q结点给释放,无法再进行余下语句了:选项c和D的错误在于因为有了q=(*q).next做了赋值,则free(q)释放了原来q后面的一个结点。
(50)以下程序的输出结果是__________。
main()
{ int x=05;char z='a';
printf("%d\n",(x&1)&&(z<'z'));)
A)0 B)1 C)2 D)3
答案:B
评析:"&"是位运算符表示按位与运算,"&&"是逻辑运算符当其两边的表达式都为真时返回真值。关系表达式()&1)&&(z<'z'),(x&1)为真,(Z<'Z')也为真,两者相与,自然也为真,以整型输出,则输出1。
二、填空题(每空2分,共40分)
请将每一个空的正确答案写在答题卡的【1】至【20】序号的横线上,答在试卷上不得分。
(1)栈的基本运算有三种:入栈、退栈和 【1】 。
答案:【1】读栈顶元素
评析:栈的基本运算有三种:入栈、退栈和读栈项元素。
入栈运算是指在栈项位置插入一个新元素。这个运算有两个基本操作:首先将栈顶指针进一(即top加1),然后将新元素插入到栈顶指针指向的位置。
退栈运算是指取出栈顶元素并赋给一个指定的变量。这个运算有两个基本操作:首先将栈顶元素(栈项指针指向的元素)赋给一个指定的变量,然后将栈项指针退一(即top减1)。
读栈顶元素是指将栈顶元素赋给一个指定的变量。这个运算不删除栈顶元素,只是将它的值赋给一个变量。
(2)在面向对象方法中,信息隐蔽是通过对象的 【2】 性来实现的。
答案:【2】封装
评析:软件工程的基本原则包括抽象、信息隐蔽、模块化、局部化、确定性、一致性、完备性和可验证性。
信息隐蔽是指采用封装技术,将程序模块的实现细节隐藏起来,使模块接口尽量简单。
(3)数据流的类型有 【3】 和事务型。
答案:【3】变换型
评析:典型的数据流类型有两种:变换型和事务型。
变换型:是指信息沿输入通路进入系统,同时由外部形式变换为内部形式,进入系统的信息通过变换中心,经加工处理以后再沿输出通路变换成外部形式离开软件系统。
事务型:在很多软件应用中,存在某种作业数据流,它可以引发一个或多个处理,这些处理能够完成该作业要求的功能,这种数据流就叫做事务。
(4)数据库系统中实现各种数据管理功能的核心软件称为 【4】 。
答案:【4】数据库管理系统或DBMS
评析:数据库管理系统是数据库的机构,它是一种系统软件,负责数据库中的数据组织、数据操纵、数据维护、控制及保护和数据服务等。数据库管理系统是数据库系统的核心。
(5)关系模型的数据操纵即是建立在关系上的数据操纵,一般有 【5】 、增加、删除 和修改四种操作。
答案:【5】查询
评析:关系模型的数据操纵即是建立在关系上的数据操纵,一般有查询、增加、删除和修改四种操作。
数据查询:用户可以查询关系数据库中的数据,它包括一个关系内的查询以及多个关系间的查询。
数据删除的基本单位是一个关系内的元组,它的功能是将指定关系内的指定元组删除。
数据插入仅对一个关系而言,在指定关系中插入一个或多个元组。
数据修改是在一个关系中修改指定的元组和属性。
(6)下列程序的输出结果是 【6】 。
main()
{
int a=l,b=2;
a=a+b;b=a-b;a=a-b;
printf("%d,%d\n",a,b);
}
答案:【6】2,1
评析:本题中,执行a=a+b时,a=l,b=2,a=l+2=3;b=a-b时,a=3,b=2,b=3-2=1;a=a-b时,a=3,b=l,a=3.1=2;因此,本题的输出是2,1.
(7)下列程序的输出结果是16.00,请填空;,
main()
{
int a=9,b=2:
float x= 【7】 ,y=1.1,z;
z=a/2+b*x/y+l/2;
printf("%5.2tin",z);
}
答案:【7】6.6
评析:本题,已知结果z=16.00,即16.0=a/2+b*x/y+l/2,分别把a、b代入,得到16.0=9/2+2"x/1.1+1/2。
因为a=9,a是整型,所以9/2的值在没有进行类型转换时,等于4,1/2同理,等于0。代入求一元一次方程,很容易就可以得出x=6.6。
(8)用以下语句调用库函数malloc,使字符指针st指向具有11个字节的动态存储空间, 请填空。
st=(chhr*) 【8】 ;
答案:181 malloc(11)
评析:malloc函数的格式是:void*(或char*)malloc(size),size表示应分配的存储区。此题要分配11字节的单元,把11代入即可。
(9)下列程序段的输出结果是 【9】 。
main()
{char b[]="Hello,you";
b[5]=0;
printf("%s\n",b);
}
答案:【9】Hello
评析:字符串中,数值0或符号'\O'表示字符串的结束。本题中,b[5]被赋了0值,表明字符串b的第六个字符就是结束标志。因此,只输出前五个字符,即Hello。
(10)下列程序段的输出结果是 【10】 。
int n='c':
switch(n++)
{default:printf("error");break;
case。a':
case'A。:
caseIb':
tase'B':printf("good");break;
case'c':case'C':printf("pass");
case'd':case'D':printf("warn");
}
答案:【10】passwarn
评析:n++是在执行完其所在的语句后再加l,因此,在执行case的时候,n的值依然为'c',执行case'c'后面的语句,先打印出"pass";在执行完case'c'后,未遇到break跳出switch,便接着执行下面的语句,又打印出warn。所以此题输出结果是:passwarn。
(11)以下程序通过函数指针p调用函数mn,请在填空栏内,写出定义变量p的语句。
void fun(int'x,int*y)
{ …… }
main()
{ int a=lO,b=20;
【11】 :
p=fun; p(&a,&b);
……
}
答案:【11】void(*p)();
评析:要定义p为指向函数的指针变量,需写成:void(*p)();注意+p两侧的括弧不可以省略,表示p先与*结合,是指针变量,再与后面的()结合,表示此指针变量指向函数,这个函数无返回值(同fun函数)。
(12)以下程序的输出结果 【12】 。
main()
{
int p[7]={ll,13,14,15,16,17,18};
int i=0,J=0;
while(1<7&&p[i]%2==1)j+=p[i++];
printf("%d\n"J);
}
答案:【12】24
评析:本题程序定义了一维数组p,有七个数组元素,整型变量i,.j初值分别为0,当while的条件表达式(i<7&&p[i]%2==1)的值为真时,执行语句j+=p[i++];,如:当i=0时,i<7为真,p[I]%2=11%2=1,表达式(p[i]%2:=1)的值为真,所以整个表达式(i<7&&p[i]%2==1)的值为真,执行j=j+p[i++]=0+11=11,i=l;依次类推可以得出答案24。
(13)下列程序的输出结果是 【13】 。
void fun(int *n)
{
while((*n)--);
printf("%d",++(*n));
}
main()
{ int a=100;
fun(&a);
}
答案:【13】0
评析:在函数fun()中,while((*n)--)是先引用+n的值,再做(*n)--运算,所以循环结束时*n的值为O,再做(+n)--运算后,*n的值为-1;执行++(*n)后,*n的值是O。
(14)以下程序的输出结果是 【14】 。
main()
{
int arr[]={30,25,20,15,10,5},*p=arr;
p++;
printf("%d\n",*(p+3));
)
答案:【14】10
评析:整型指针最初被赋的值是数组art的头指针,即指向数组的第一个元素30,p++后,指针指向数组的下一个元素,即*p=arr[1]=25,在执行*(p+3)时,则相当于a[1+3],即10。因此,输出应为10。
(15)以下程序运行后的输出结果是 【15】 。
main()
{
char a[]="Language",b[]="Programe";
char *p1,*p2;
int k:
pl=a,p2=b;
for(k=0;k<=7;k++)
if(*(pl+k)==*(p2+k))printf("%c",*(pl+k));
}
答案:【15】gae
评析:本题定义了两个字符串数组a[],b[],字符型指针变量p1和p2,且分别指向字符串数组a和b,执行for循环,当if(*(pl+k)==*(p2+k))条件为真,执行输出*(pl+k)对应的字符。即当k=0时,*(pl+k)对应的字符串数组a.中的字符L,*(p2+k)对应的字符串数组b中的字符P,因此if(*(pl+k)==*(p2+k))条件为假,不执行printf语句,依次类推,将字符串数组a和b中对应位置上的字符一一比较,如果对应位置上的字符相同,则输出该字符。
(16)下面程序把从终端读入的文本(用@作为文本结束标志)输出到一个名为bi.dat的新文 件中,请填空。
#include "stdio.H"
FILE *fp;
main()
{ char ch;
if((fp=fopen( 【16】 ))==NULL)exit(0);
while((ch=getchar())!='@')fputc(ch,fp);
fclose(fp);
}
答案:【l6】"bi.Dat", "w"或"bi.dat","w+"或"bi.dat","r+"
评析:本题的考点是fopen()函数,此函数的格式是fopen(文件名,使用文件方式),题目的要求是将从键盘读入的文本写到文件中,因此选择的打开方式应该是"w"(只写)。或者是读写"r+"或"w+"。
(17)以下程序是从终端读入数据到数组中,统计其中正数的个数,并计算它们的和。请填空。
main()
{
int i,a[20],sum,count;
sum=count= 【17】 ;
for(i=0;i<20;i++)scanf("%d", 【18】 );
for(i=0;i<20;i++)
{
if(a[I]>0)
{ count++;
sum+= 【19】 ;
}
}
printf("sum=%d,count=%d\n",sum,count);
}
答案:【17】0
【18】&a[i]
【19】a[i]
评析:本题要求从终端读入数据到数组中,统计其中正数的个数,并计算它们的和。程序中首先要对存放正数个数的变量count及存放和值的变量sum初始化为0,所以第一空应填:0。接着要求从终端读入数据到数组中,可以通过scanf函数实现,因此第二空应填:&a[i]。最后通过sum+=a[i];语句累加正数a[i]的值到sum中,因此第三空应填:a[i]。
(18)若变量n中的值为24,则pint函数共输出 【20】 行。
void prnt(int n,int aa[])
{ int i;
for(I=1;i<=n;i++)
{ printf("%6d",aa[I]);
if(!(i%5,J)printf("\n");
}
printf("\n");
}
答案:【20】5
评析:本题的关键在于if(!(i%5))printf("\n");这句,即如果i可被5整除时,则换行。i值为24,可以被5整除4次,并余4,因此,prnt函数共输出5行,最后一行有4个