(28)以下选项中,非法的字符常量是 ______。
A)'\t' B)'\17' C)"\n" D)'\xaa'
答案:C
评析:C语言中字符常量是以单引号括起来的单个字符,或为以"\"与三位八进制数值或两位十六进制数值代替单个字符。
(29)以下程序的输出结果是______ 。
#include<stdio.h>
main()
{
int a=200;
#define a lOO
printf("%d",a);
#undef a
printf ("%dt",a);
}
A)200 100 B)100 100 C)100 200 D)200 200
答案:C
评析:#define宏名的有效范围为定义命令之后到本源文件结束,可以在程序中使用#undef命令终止宏定义的作用域。本题由于#undef的作用,使a的作用范围在#define a 100到#undefa之间,故答案为c。
(30)若有说明:int i,j=2,*p=&i;,则能完成i=j赋值功能的语句是______。
A)i=*p; B)*p=*&j; C)i=&j; D)i=**p;
答案:B
评析:指针是一种用来存放变量地址的特殊变量。本题中指针变量p用于存放整型变量i的地址,改变*p的值即为改变i的值。又因为"&"和"∥两个运算符的优先级别相同,按自右而左的方向结合,所以。&j先进行&j运算,得j的地址,再进行+运算,取所得地址里面的值,故t&j与i等价。
(31)假定int类型变量占用两个字节,若有定义:int x[10]={0,2,4};,则数组x在内存中所占字节数是______。
A)3 B)6 C)10 D)20
答案:D
评析:当数组定义后,系统就为其分配内存空间,而不论其中有没有内容。因此,本题中数组x[10]不论是否为其元素初始化,它所分配的存储空间仍为2+10=20个字节。
(32)执行以下的程序段后,m的值是______。
int a[2][3]={{l,2,3},{4,5,6}};
int m,*p;
p=&a[0][0];
m=p[41;
A)4 B)5 C)3 D)不确定
答案:B
评析:程序中定义了一个指向整型变量的指针变量,并对其赋值为二维整型数组a的首元素的地址。P[4]等价于*(p+4),即二维数组a中第四个元素的值,而a是一个2*3的二维数组,其第四个元素为a[1][1],即5。
(33)以下程序的输出结果是______。
main()
{int i,a[10];
for(i=9;i>=O;i--) a[i]=lO-i;
printf("%d%d%d",a[2],a[5],a[8]);
}
A)258 B)74l C)852 D)369
答案:C
评析:在本题运行时主要注意的是当i=9时,a[i]=10-9=1;i=8时,a[i]=10-8=2;i=7时,a[i]=10-7=3:……依此类推,,直到i=0时,a[i]=10-0=10;此时,i的值已变为.1,判断for的循环条件,不成立,然后输出a[2],a[5],a[8]分别为8,5,2。
(34)下面程序的输出结果为______ 。
#include<string.h>
main()
{
char pl[7]="abc",p2[]="ABC",str[50]= "xyz";
strcpy(str,strcat(pl,p2));
printf("%s",str);
}
A)xyzabcABC B)abcABC C)xyzabc D)xyzABC
答案:B
评析:strcpy(strl,s1):作用是将字符串s1拷贝到字符数组strl中去。strcat(字符数组1,字符数组2):把。字符串2接到字符串l的后面,结果放在字符数组1中,函数调用后返回字符数组l的地址。
本题定义了三个字符数组pl,p2,str,strcat(p1,p2)函数的作用是将字符串数组p2接到字符串p1的后面,结果放在字符数组p1,再通过sffcpy()函数将该字符串拷贝到str数组中,原str数组中的字符串xyz被覆盖,因此打印输出字符串str即可得到abcABC。
(35)以下数组定义中不正确的是______。
A)int a[2Ⅱ3]; B)int b[][3]={0,1,2);
C)int c[100][100]={0}; D)int d[3][]={{l,2},{l,2,3},{1,2,3,4}};
答案:D
评析:一维数组的定义方式为:
类型说明符数组名[常量表达式];
选项A符合此定义形式,正确;c语言中多维数组赋初值时可以部分赋值,也可以不指定除第一维以外的其它维的大小,故选项c正确;另外,如果对全部数组元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省,所以选项B正确,而选项D是错误的。
(36)以下程序的输出结果是______。
main()
{ jnt a[4][4]:{{1,3,5},{2,4,6},{3,5,7}};
printf("%d%d%d%d\n",a[0][3],a[1][2],a[2][1],a[3][0]);
}
A)0650 B)1470 C)5430 D)输出值不定
答案:A
评析:对未给出初始值的整数数组元素,被缺省初始化为零。
(37)在说明语句:int *f();中,标识符f代表的是______。
A)一个用于指向整型数据的指针变量 B)一个用于指向一维数组的行指针
C)一个用于指向函数的指针变量 D)一个返回值为指针型的函数名
答案:D
评析:带回指针值的函数,其一般定义形式为:
类型标识符 *函数名(参数表);
例如:int *f(x,y);
其中,f是函数名,调用它以后能得到一个指向整型数据的指针(地址),x,y是函数f的形参。在f的两侧分别为。运算符和()运算符,而()优先级高于s,因此f先与()结合,显然是函数形式。这个函数前面有一个。,表示此函数是指针型函数(函数值是指针)。前面的int表示返回的指针指向整型变量。
(38)以下程序的输出结果是______。
main()
{ char st[20]= "hello\0\t\\";
printf("%d%d\n",strlen(st),sizeof(st));
}
A)99 B)520 C)1320 D)2020
答案:B
评析:c语言中字符串是以'\0'字符结束的,且strlen()函数计算的是'\0'字符前的所有字符的个数。本题中strlen(st)应为5。数组定义以后系统就为其分配相应大小的内存空间,而不论其中有没有内容。sizeof()函数是计算变量或数组的所分配到的内存空间的大小。所以本题的sizeof(st)为20。
(39)下面程序运行后的输出结果是______。
int d=1:
fun(int p)
{ static int d=5;d+=p;
printf("%d",d);return d;
}
main()
{int a=3;printf("%d\n",fun(a+fun(d)));}
A)6 9 9 B)6 6 9 C)6 15 15 D)6 6 15
答案:C
评析:静态局部变量在编译时赋初值,即只赋初值一次,在程序运行时它已有初值。以后每次调用时不再重新赋初值而只是保留上次函数调用结束时的值,而对自动变量赋初值,不是在编译时进行的,而在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
本题在程序开头定义了全局变量d并赋初值1,在被调函数fun()中,定义了静态局部变量d,初值为5。在第一次调用函数fun时,d初值为5,p由主函数传递过来的值为1,则d=d+p=5+l=6,由于d是静态局部变量,在函数调用结束后,它仍保留d=6。再次调用fun函数,d的初值为6,而由主函数传递的p的值为9,则此时d=d+p=6+9=15,最后打印输出d的值并返回主函数。
(40)以下选项中,不能正确赋值的是______。
A)char s1[10];sl="chest"; B)char s2[]。{'C','t','e','s','t');
C)char s3[20]= "Chest"; D)char*s4="Ctest\n"'
答案:A
评析:c语言中不能将字符串常量直接赋给数组。但在赋初值时可以。
(41)以下程序输出正确的是______。
alnovep(int *p,int(*a)[3],int n)
{int i,j;
for(i=0;i<n;i++)
for(j=0 ;j<n;j++){ *p=a[i][j];p++;}
}
main()
{int *p,a[3][3]={{1,3,5},{2,4,6}};
p=(int*)malloc(100);
amovep(p,a,3);
printf("%d%d\n",p[2],p[5]);free(p);
}
A)56 B)25 C)34 D)程序错误
答案:A
评析:本题main函数中定义了指针p和二维数组a,通过函数amovep将数组的值存入指针p所指向的存储单元中,a的各元素分别为:a[0][0]=l,a[0][1]=3,a[0][2]=5,a[1][0]=2,a[l][1]=4,a[1][2]=6,a[2][O]=0,a[2][1]=0,a[2][2]=0a
通过malloc()函数给指针分配内存空间,free()函数用于释放指针变量所用内存空间。在主函数中通过amovep(p,a,3)调用函数amovep,使得实参p与形参p,实参数组a与形参中指向数组的指针变量共用同一存储空间。最后输出p[2],p[5]为56。
(42)下面程序的输出结果是______。
#define a 121
const b=12:
enum c{a1,a2};
main()
{
printf("%d,%d,%d.",sizeOf(a),sizeOf(b),sizeof(enum C));
}
A)121,0,4 B)2,2,2 C)0,2,4 D)0,2,2
答案:B
评析:sizeof函数是取变量所占的存储空间的字节数,标识a代表常量121;const b=12;,其中数据类型可以缺省,默认为整型;enum c{al,a2};定义了一个枚举类型enum c,al,a2为枚举元素,在c编译时,对枚举元素按常量处理,它们的值按定义顺序依次为0,1。因此它们的字节数均为2,2,2。
(43)以下程序的输出结果是______。
struct HAR
{int x,y;struct HAR *p;} h[2];
main()
{ h[0].X=1; h[O].y=2;
h[1].x=3;h[1].y=4;
h[0].p=&h[1];h[1].p=h;
printf("%d%d\n",(h[O].p)->x,(h[1].p)->y);
}
A)12 B)23 C)14 D)32
答案:D
评析:本题中是一个含有两个结点的循环链表。
c语言中结构体的定义为:.
struct结构体类型名
{
成员项表:
};
(44)变量a所占的内存字节数是______ 。
A)4 B)5 C)6 D)8
Union U
{ char st[4];
Int i:
Long l;
};
Struct A
{ int c;
Union U u;
}a;
答案:C
评析:结构体变量所占内存长度是各成员占内存长度之和,而共用体变量所占的内存长度等于最长的成员的长度。本题结构体变量a中成员c为整型占2个字节,共用体变量u最大长度为4个字节,故选C。
(45)以下程序的结果是______。
int a,b;
void fun()
{ a=100;b=200;)
main()
{int a=5,b=7;
fun();
printf("%d%d\n",a,b);
}
A)100200 B)57 C)200100 D)75
答案:B
评析:全程变量是可以在子函数中对其值作改变,且它也可作为函数间的值传递。但当函数或子函数中定义了与全程变量名称相同的局部变量,则全程变量将被屏蔽。
(46)以下程序的输出结果是______。
#define M(x,y,z) x*y+z
main()
{ int a=l,b=2,c=3;
printf("%d\n",M(a+b,b+c,c+a));
}
A)19 B)17 C)15 D)12
答案:D
评析:c语言的宏定义包括不带参数的宏定义与带参数的宏定义。本题为带参数的宏定义,其形式为:#define宏名(形参表) 字符串,本题的M(a十b,b+c,c+a)被字符串a+b*b+c+c+a代替。
(47)若有以下说明和语句:
struct st
{int n;char *ch;);
struct st a[3]={5,"abc",7,"def',9,"ghK"},*p=a;则值为6的表达式是______。
A)p++ ->n B)p一>n++ C)(*p).n++ D)+十p->n
答案:D
评析:根据结构变量的存储特点,p+l意味着增加地址值为结构体数组a的一个元素所占的字节数,'即p++使p由a[0]指向a[1]起始地址。本题++p>n得到p指向的结构体变量中成员n的值使之加l。因为p指向数组a起始地址,p->n的值为5,再执行自加l运行,结果为6。
(48)整型变量x和Y的值相等,且为非O值,则以下选项中结果为0的表达式是______。
A)x||Y B)X|Y C)X&Y D)X^Y
答案:D
评析:"‖"为或运算符,当其左右表达式中只要一个为非零则整个表达式的值1。︱是按位或,&是按位与,^是按位异或,这三位运算符是按值的二进制位来比较的。
(49)C语言中,组成数据文件的成分是______。
A)记录 B)数据行 C)数据块 D)字符(字节)序列
答案:D
评析:c语言中的文件是流式文件。流式文件是一种无结构文件,即整个文件是一串字符流或二进制流。文件的存取以字符或字节为单位。
(50)下面的程序执行后,文件test.t中内容是______。
#include<stdio.h>
void fun(char *fname,char *st)
{ FILE *myf;int i;
myf=fopen(fname, "w");
for(i=0;i<strlen(st);i++)fputc(st[i],myf);
fclose(myf);
}
main()
{fun("test.t","new world");fun("test.t","hello,");}
A)hello, B)new worldhello C)new world D)hello,rid
答案:A
评析:c语言中文件有文本文件与二进制文件,对文件的使用前必须先打开,打开方式有只读、写入、读写等方式。
二、填空题(每空2分,共40分)
请将每一个空的正确答案写在答题卡的【1】至【20】序号的横线上,答在试卷上不得分。
(1)实现算法所需的存储单元多少和算法的工作量大小分别称为算法的 【1】 。
答案:【1】空间复杂度和时间复杂度
评析:算法的复杂性是指对一个在有限步骤内终止算法和所需存储空间大小的估计。算法所需存储空间大小是算法的空间复杂性,算法的计算量是算法的时间复杂性。
(2)数据结构包括数据的逻辑结构、数据的 【2】 以及对数据的操作运算。
答案:【2】存储结构
评析:数据结构包括3个方面,即数据的逻辑结构、数据的存储结构及对数据的操作运算。
(3)一个类可以从直接或间接的祖先中继承所有属性和方法。采用这个方法提高了软件的 【3】 。
答案:【3】可重用性
评析:继承的优点:相似的对象可以共享程序代码和数据结构,从而大大减少了程序中的冗余,提高软件的可重用性。
(4)面向对象的模型中,最基本的概念是对象和 【4】 。
答案:【4】类
评析:面向对象模型中,最基本的概念是对象和类。对象是现实世界中实体的模型化;将属性集和方法集相同的所有对象组合在一起,可以构成一个类。
(5)软件维护活动包括以下几类:改正性维护、适应性维护、 【5】 维护和预防性维护。
答案:【5】完善性
评析:软件维护活动包括以下几类:改正性维护、适应性维护、完善性维护和预防性维护。完善性维护是指为了满足用户对软件提出的新功能与性能要求,需要修改或再开发软件,以扩充软件功能、增强软件性能、改进加工效率、提高软件的可维护性。
(6)语句:X++;、++X;、X=X+1;、X=l+X;,执行后都使变量X中的值增l,请写出一条同一功能的赋值语句(不得与列举的相同) 【6】 。
答案:【6】X+=1:
评析:在c语言中使变量增l的方法有:自增运算符与赋值语句。其中自增运算符有前置与后置方式,赋值语句也有两种类型。
本题中的主要增l方式有:x++;、++x;、X=X+I;、x=1+x;、x+=l;。
(7)设Y是int型变量,请写出判断Y为奇数的关系表达式 【7】
答案:【7】Y%2==1 或Y%2!=0
评析:判断变量是否为奇数可以用变量与2取模,判断结果是为1或不为0。本题具体做法如下:Y%2==1或Y%2 1=0。
(8) 以下程序的输出是 【8】 。
main()
{
char strl[]="How do you do",*pl=strl:
strcpy(strl+strlen(strl)/2,"es she");
printf("%s\n",p1);
}
答案:【8】How does she
评析:strcpy(strl,s1):字符串拷贝函数,作用是将字符串s1拷贝到字符数组strl中去。strlen(str):测试字符串str的长度,函数的值为字符串中实际长度,不包括'\O'在内。本题中strlen(strll的值为13,则strcpy(strl+strlen(strl)/2,"es she",);相当于strcpy(strl+6,"es she");,因此可得答案为How does she。
(9)以上程序运行后的输出结果是 【9】 。
main()
{int i=10,J=0;
do
{j=j+i;i--;}
while(i>2);
printf("%d\n",j);
}
答案:【9】52
评析:do...while语句的形式为:
do
{
语句:
}while(条件表达式)
当条件表达式为非零时,继续执行循环体,直到条件表达式为零时退出循环。
(10)设有如下程序:
main()
{int nl,n2;
scanf("%df",&n2);
while(n2!=0)
{ nl=n2%lO;
n2=n2/10:
printf("%d",n1);
}
}
程序运行后,如果从键盘上输入1298,则输出结果为 【10】 。
答案:【10】8921
评析:本题的程序的功能是将输入的整数反向输出。
(11)以下程序输出的最后一个值 【11】 。
Int ff(int n)
{static int f=1:
f=f*n:
retun f
}
main()
{ int i;
for(i=1;i<=5;i++)printf("%d\n",ff(i));
}
答案:【ll】120
评析:
静态变量的类型说明符是static,静态局部变量属于静态存储方式,它具有以下特点:
①静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。
②对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。
③如在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。(注意:c语言中的非静态变量在定义时,系统并不会自动给它赋初值)
④虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。
本题中函数的功能是:与for语句一起求一个整数的阶乘。
(12)以下函数的功能是:求x的y次方,请填空.
double fun(double x,int y)
{int i;
double z;
for(i=1,z=x;i<y;i++)z=z* 【12】 ;
return z:
)
答案:【12】x
评析:函数的定义形式为:
函数类型函数名(形参表)
{
类型说明语句;
执行语句:
}
本题中函数的功能是:累积变量以求得变量的Y次方。
(13)下列程序的输出结果是 【13】 。
main()
{
int a[]={2,4,6},*ptr=&a[0],x=8,y,z;
for(y=O;y<3;y++)
z=(*(ptr+y)<x)?*(ptr十y):x;
printf("%d\n",z);
}
答案:【13】6
评析:条件运算符的优先级高于赋值运算符,因此本题先计算关系表达式(*(ptr+y)<x)?*(ptr+y):x的值,再赋给变量z。当y=O时,*(ptr+y)=2,而x=8,(*ptr+y)<x)条件为真,则整个条件表达式的值为*(ptr+y)=2,所以Z=2;当y=l时,*(ptr+y)=4,(*(pty+y)<x)条件为真,则整个条件表达式的值为*(ptr+y)=4,所以z=4;当y=2时,*(ptr+y)=6,(*(ptr+y)<x)条件为真,则整个条件表达式的值为*(ptr+y)=6,所以z=6;循环结束。因此输出z的结果为6。
(14)以下程序运行后的输出结果是 【14】 。
main()
{ char s[]="9876",*p;
for(p=s;p<s+2;p++)printf("%s\n",p);
}
答案:【14】9876
876
评析:指针是一种数据类型,这种数据类型的变量用来存放内存中分配的存储单元的首地址。
指针的定义:
类型说明符 *指针变量名;
(15)若有定义语句:char s[100],d[100];int j=0,i=0;且s中已赋字符串,请填空以实现拷贝。(注:不使用逗号表达式)
while(s[i]){d[j]= 【15】 ;j++;}
d[j]=0;
答案:【15】s[i++]
评析:本题中为了能实现字符串的拷贝,需要使字符数组s从头到尾依次遍历其所有元素。本题应使用i的自增后置来实现。
(16)若有如下结构体说明:
struct STRU
{ int a,b;char c:double d:
struct STRU *pl,*p2;
};
请填空,以完成对t数组的定义,t数组的每个元素为该结构体类型。
【16】 t[20]
答案:【16】struct STRU
评析:结构体类型是构造数据类型,是用户自己定义的一种类型。
结构体类型的定义:
struct结构体类型名
{
成员项表:
};
定义结构体变量的的形式为:
struct结构体类型名 变量1,变量2,...
其中变量包括:一般变量、指针变量、数组变量等。
(17)下面的程序可对指定字符串中的字符串进行从大到小排序,请将程序填完整(注:程序采用了冒泡排序算法)
#include<stdio.h>
#include<string.h>
main()
{ char *str="ABCDabcd",temp;
Int n,i;
n=strlen(str);
while(n-->1)
for(i=0;i<n;i++)
if(str[i]<str[i+1])
{ temp= 【17】 ;
str[i]=str[i+1];
_【18】 =temp;
}
Printf(_【19】 );
}
答案:【17】str[i]
【18】str[i+1]
【19】"%s",str
评析:本题要求将字符串str中的字符用冒泡排序算法从大到小排列,其实现过程是将相邻两个字符进行比较,如果当前字符小于下一个字符,则通过中间变量temp将字符两两交换,所以第一空应填:str[i],第二空应填:str[i+1]。最终打印输出得到的字符串str,所以第三空应填;"%s",str。
(18)以下程序段打开文件后,先利用fseek函数将文件位置指针定位在文件末尾,然后调 用ftell函数返回当前文件位置指针的具体位置,从而确定文件长度,请填空。
FILE *myf;long fl;
myf=_【20】 ("test.t","rb");
fseek(myf,(),SEEK_END);fl+ftell(myf);
fclose(myf);
printf("%l d\n",f1);
答案:【20】fopen
评析:C语言中的文件分为:ASCII文件与二进制文件。文件在使用前打开,使用后要关闭。
打开文件的函数为:fopen(),调用形式为:fp=fopen("文件名","使用文件方式");
关闭文件的函数为:fclose(),调用形式为:fclose(fp);其中fp为文件指针。