c语言面试题

来源:互联网 发布:建筑三维软件有哪些 编辑:程序博客网 时间:2024/06/05 20:17
一、选择题((1)~(10)每小题2分,(11)~(50)每小题1分,共60分)

下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确的选

项涂写在答题卡相应位置上,答在试卷上不得分。

(1)数据的存储结构是指________。

A)存储在外存中的数据    B)数据所占的存储空间量

C)数据在计算机中的顺序存储方式    D)数据的逻辑结构在计算机中的表示

答案:D

评析:数据的逻辑结构在计算机存储空间中的存放形式形式称为数据的存储结构(也称数据的物理结构)。

 

(2)下列关于栈的描述中错误的是________。

A)栈是先进后出的线性表

B)栈只能顺序存储

C)栈具有记忆作用

D)对栈的插入与删除操作中,不需要改变栈底指针

答案:B

评析:栈是一种特殊的线性表,又称先进后出表(FILO—First In Last Out)。

 

(3)对于长度为n的线性表,在最坏情况下,下列各排序法所对应的比较次数中正确的是

________。

A)冒泡排序为n2    B)冒泡排序为n

C)快速排序为n     D)快速排序为n(n一1)/2

答案:D

评析:假设线性表的长度为n,则在最坏情况下,冒泡排序需要经过n/2遍的从前往后扫描和n/2遍的从后往前扫描,需要比较次数为n(n-1)/2。快速排序法的最坏情况比较次数也是n(n-1)/2。

 

(4)对长度为n的线性表进行顺序查找,在最坏情况下所需要的比较次数为________。

A)log2n    B)n/2      C)n      D)n+l

答案:C

评析:顺序查找过程中,如果被查找的元素是线性表中的最后一个元素,或者元素不在线性表中,则需要与线性表中所有的元素进行比较。对长度为n的线性表进行顺序查找,在最坏情况下需要比较n次。

 

(5)下列对于线性链表的描述中正确的是________。

A)存储空间不一定是连续,且各元素的存储顺序是任意的

B)存储空间不一定是连续,且前件元素一定存储在后件元素的前面

C)存储空间必须连续,且前件元素一定存储在后件元素的前面

D)存储空间必须连续,且各元素的存储顺序是任意的

答案:A

评析:在链式存储结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。

 

(6)下列对于软件测试的描述中正确的是________。

A)软件测试的目的是证明程序是否正确

B)软件测试的目的是使程序运行结果正确

C)软件测试的目的是尽可能多地发现程序中的错误

D)软件测试的目的是使程序符合结构化原则

答案:C

评析:关于软件测试的目的,Grenford J.Myers再《The Art of Software Testing》一书中给出了深刻的阐述,整体来说,软件测试的目的就是尽可能多地发现程序中的错误。

 

(7)为了使模块尽可能独立,要求________。

A)模块的内聚程度要尽量高,且各模块间的耦合程度要尽量强

B)模块的内聚程度要尽量高,且各模块间的耦合程度要尽量弱

C)模块的内聚程度要尽量低,且各模块间的耦合程度要尽量弱

D)模块的内聚程度要尽量低,且各模块间的耦合程度要尽量强

答案:B

评析:模块独立性是指每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。软件设计,应尽量做到高内聚,低耦合,有利于提高模块的独立性。

 

(8)下列描述中正确的是________。

A)程序就是软件

B)软件开发不受计算机系统的限制

C)软件既是逻辑实体,又是物理实体

D)软件是程序、数据与相关文档的集合

答案:D

评析:计算机软件是计算机系统中与硬件相互依存的另一部分,是包括程序、数据及相关文档的完整集合。

 

(9)数据独立性是数据库技术的重要特点之一,所谓数据独立性是指________。

A)数据与程序独立存放

B)不同的数据被存放在不同的文件中

C)不同的数据只能被对应的应用程序所使用

D)以上三种说法都不对

答案:D

评析:数据独立性是数据与程序间的互不依赖性,即数据库中数据独立于应用程序而不依赖于应用程序。也就是说,数据的逻辑结构、存储结构与存取方式的改变不会影响应用程序。选项A、B、C三种说法都是错误的。

 

(10)用树形结构表示实体之间联系的模型是________。

A)关系模型    B)网状模型    C)层次模型    D)以上三个都是

答案:C

评析:层次模型是最早发展起来的数据库模型,它的基本结构是树形结构。

 

(11)算法具有五个特性,以下选项中不属于算法特性的是________。

A)有穷性    B)简洁性    C)可行性    D)确定性

答案:B

评析:有穷性、确定性、有零个或多个输入、有一个或多个输出、有效性是算法的基本特性。

 

(12)以下选项中可作为c语言合法常量的是________。

A)-80.    B)-080    C)-8e1.0    D)-80.0e

答案:A

评析:c语言的常量分为整型常量、实型常量和字符型常量。选项A属于实型常量中的十进制小数形式的表示法,是合法的。

 

(13)以下叙述中正确的是________。

A)用C程序实现的算法必须要有输入和输出操作

B)用C程序实现的算法可以没有输出但必须要输入

C)用C程序实现的算法可以没有输入但必须要有输出

D)用C程序实现的算法可以既没有输入也没有输出

答案:C

评析:算法的特性中包括“有零个或多个输入”及“有一个或多个输出”这两个特性。一个算法得到的结果就是算法的输出,没有输出的算法是没有意义的,所以一个算法必须至少有一个输出。

 

(14)以下不能定义为用户标识符的是________。

A)Main    B)_0      C)_int     D)sizeof

答案:D

评析:C语言规定标识符只能由字母、数字和下划线三种符号组成,而且第一个字符必须是字母或下划线。注意:大写字母和小写字母被认为是两个不同的字符。A中Main与主i函数名main不同。

 

(15)以下选项中不能作为合法常量的是________。

A)1.234e04    B)1.234e0.4    C)1.234e+4 D)1.234e0

答案:B

评析:指数形式的实型常量要求字每e(或E)之前必需有数字,且e后面的指数必须为整数,所以本题中选项B非法。

 

(16)数字字符0的ASCII值为48,若有以下程序

main()

{char a=”1″,b=”2″;

printf(“%c,”,b++);

printf(“%d\n”,b-a);

)

程序运行后的输出结果是________。

A)  3,2    B)50,2    C)2,2    D)2,50

答案:C

评析l执行语句“printf(“%c,ll,b++);”后,b的值变成字符3,执行“printf(“%d\n”,b-a);”,即‘3’-‘1’。

 

(17)有以下程序

main(  )

{

int m=12, n=34;

printf(“%d%d”,m++,++n);

printf(“%d%d\n”,n++,++m);

}

程序运行后的输出结果是________。

A)12353514    B)12353513    C)12343514    D)12343513

答案:A

评析:执行“printf(“%d%d”m++,++n);”后,输出的是m和n+l的值1235,接着执行

“printf(“%d%d\n”,n++,++m);”输出n和m+l的值3514。

 

(18)有定义语句:int b;char c[10】;,则正确的输入语句是________。

A)  scanf("%d%s",&b,&C);    B)  scanf("%d%s",&b,C);

C)  scanf("%d%s",b,C);      D)  scanf("%d%s",b,&C);

答案:B

评析:scanf函数中的“格式控制”后面应当是地址,而不是变量名。对于变量,通过地址运算符“&”求出内存中的地址;对于数组c[10],数组名c即为数组在内存中的地址。

 

(19)有以下程序

main()

{int m,n,p;

scanf(“m=%dn=%dp=%d”,&m,&n,&p);

printf(“%d%d%d\n”,m,n,p);

}

若想从键盘上输入数据,使变量m中的值为123,n中的值为456,p中的值为789,

则正确的输入是________。

A)  m。123n=456p=789      B)  m=123  n=456  p=789

C)  m=123,n=456,p=789    D)  123  456  789

答案:A

评析:根据本题的数据输入形式“scanf(“m=%dn=%dp=%d”&m,&n,&p);”说明在输入数据时,必须输入“m=”、“n=”、“p=”字符,且中间不能含有空格。

 

(20)有以下程序

main()

{ int a,b,d=25;

a=d/10%9;

b=a&&(-1);

printf(”%d,%d\n”,a,b);

}

程序运行后的输出结果是________。

A)6,l      B)2,l      C)6,0      D)2,0

答案:B

评析:本题中“a=d/10%9;”的值为25/10%9=2; “b=a&&(-1);”为2&&(-1)=1(注意:-1表示真,只有O才表示假),所以a,b的值分别为2,1。

 

(21)有以下程序

main()

{

int i=1 j=2,k=3;

if(i++==1&&(++j==3||k++==3))

printf(“%d%d%d\n”,i,j,k);

}

程序运行后的输出结果是________。

A)l 2 3     B)2 34      C)  2 2 3.    D)2 3 3

答案:D

评析:执行“i++==1&&(++j==3‖k++==3)”时,表达式“i++==1”嗨值为真,其值为1,表达式“++j=3”的值为真,根据短路原理,右边的表达式“k++==3”不再进行运算。括号中表达的值为l,作与运算后整个表达式的值也为l,输出i.j,k时,由于未执行过k,所以它们的值分别为2,3,3。

 

(22)若整型变量a、b、c、d中的值依次为:1、4、3、2。则条件表达式a<b?a:c<d?c:d的值是________。

A)l      B)2      C)3      D)4

答案:A

评析:条件表达式的一般形式为:表达式17表达式2:表达式3

本题先求的是a<b的值,为真,所以整个表达式“a<b?a:c<d?c:d”的值为a的值1。

 

(23)有以下程序

main( )

{

int p[8]={11,12,13,14,15,16,17,18},i=O,j=0;

while(i++<7)if p[i]%2)j+-=p[i];

printf(“%d\n”,j);

}

程序运行后的输出结果是________。

A)42     B)45     C)56    D)60

答案:B

评析:本程序的作用是求除p[O]外的其它奇数的和。

 

(24)有以下程序

main()

{

char a[7]= “a0\OaO\0”; int i,j;

i=sizeof(a);j=strlen(a);

printf(“%d%d\n”,i,j);

)

程序运行后的输出结果是________。

A)2 2     B)76     C)7 2     D)6 2

答案:C

评析:c语言中以‘\0’作为字符串的结束符,且strlen()函数计算的是‘\0’字符前的所有字符的个数。数组定义以后系统就为其分配相应大小的内存空间,而不论其中有没有内容。

 

(25)以下能正确定义一维数组的选项是________。

A)int a[5]={0,1,2,3,4,5;       B)char a[]={0,1,2,3,4,5};

C)char a={’A’,’B’,’C’};     D)int a[5]=”0123″;

答案:B

评析:选项A中定义的是5个数组元素,但赋值的时候赋的是6个元素,所以出错;选项c不符合数组定义形式,数组名后应加上“[]”;选项D的类型说明符错误,如果用char定义就对了;选项B中的0,1,2,3,4,5分别表示对应字符的ASCII码,所以选项B是正确的。

 

(26)有以下程序

int fl(int x,int y){return x>y?x:y;}

int f2(int x,int y){return x>y?y:x;}

main()

{

int a=4,b=3,c=5,d=2,e,f,g;

e=f2(f1(a,b),f1(c,d));f=fl(f2(a,b),f2(c,d));

g=a+b+c+d-e-f;

printf(“%d,%d,%d\n”,e,f,g);

)

程序运行后的输出结果是________。

A)4,3,7      B)3,4,7      C)5,2,7      D)2,5,7

答案:A

评析:函数n的功能是返回两个数中比较大的值,f2的功能是返回两个数中比较小的值。

 

(27)已有定义:char a[]=”xyz”,b[]={’x’,’y’,’z};,以下叙述中正确的是________。

A)数组a和b的长度相同       B)a数组长度小于b数组长度

C)a数组长度大于b数组长度    D)上述说法都不对

答案:C

评析:c语言规定‘\0’为字符串结束标志。所以“char a[]=“xyz””的数组长度为4,而“b[]={‘x’,‘y’,‘z’};”的数组长度为3,数组长度与strlen函数所求的长度不同,本题是指数组占内存空间的大小。

 

(28)有以下程序

Void f(int *x, int *y)

{

int t;

t= *x; *x=*y;’*y=t;

)

main( )

{

int a[8]={1,2,3,4,5,6,7,8},i,*p,*q;

p=a;q=&a[7];

while(p<q)

{f(p,q); p++; q–;}    。

for(i=0;i<3;i++) printf(“%d”,a[1][i]);

}

程序运行后的输出结果是________。

A)8,2,3,4,5,6,7,1,    B)5,6,7,8,1,2,3,4.

C)1,2,3,4,5,6,7,8,    D)8,7,6,5,4,3,2,l,

答案:D

评析;本程序中函数f的作用是交换指针变量x和y所指向的存储单元的值。

 

(29)有以下程序

main()

{

im a[3][3],*p,i;

p=&a[0][o];

for(i=0;j<9;i++) p[i]=I;

for(i=0;j<3;i++)printf(“%d”,a[1][i]);

)

程序运行后的输出结果是________。

A)012    B)123    C)234    D)345

答案:D

评析:本题赋值后,a的数组元素的值分别为a[01[0]=0,a[0][1]=1,a[0][2]=2,a[1][0]=3,a[1][1]=4,a[1][2]=5,a[2][0]=6,a[2][1]=7,a[2][2]=8,故本题输出的值为345。

 

(30)以下叙述中错误的是________。

A)对于double类型数组,不可以直接用数组名对数组进行整体输入或输出

B)数组名代表的是数组所占存储区的首地址,其值不可改变

C)当程序执行中,数组元素的下标超出所定义的下标范围时,系统将给出“下标越

界”的出错信息

D)可以通过赋初值的方式确定数组元素的个数

答案:C

评析:在c语言中,如果出现下标越界的情况,系统不管在编译还是执行时都不会给出“下标越界”的错误提示。

 

(31)有以下程序

#define N20

fun(int a[],int n,int m)

{    int i,j;

for(i=m;i>=n;i–)a[i+1]=a[i];

}

main()

{

int i,a[N]={1,2,3,4,5,6,7,8,9,10};

fun(a,2,9);

for(i=O;i<5;i++) printf(“%d”,a[i]);

}

程序运行后的输出结果是________。

A)10234    B)12344    C)12334    D)12234

答案:C

评析:本题函数fun的作用是将指定的数组元素(从下标n到下标m)向后移一位。由函数调用“fun(a,2,9);”可知,函数fun用于将a[2]到a[9]的各元素依次向后移一位,移完后,a数组中各元素的值分别为1,2,3,3,4,5,6,7,8,9,10,故输出的前5个数组元素为12334。

 

(32)有以下程序

main()

{

int a[3][2]={0},(*ptr)[2],i,j;

for(i=0;i<2;i++)  {ptr=a+i;  scanf(“%d”,ptr);  ptr++;}

for(i=0;i<3;i++)

{  for(i=0;j<2;j++) printf(“%2d”,a[i][j]);

printf(“\n”);

}

}

若运行时输入:1 2 3,则输出结果是________。

A)产生错误信息

B)l0    C)l 2    D)l 0

2 O      3 0      2 0

0 0      0 O      3 0

答案:B

评析:二维数组a,通过a[3][2]={0}将数组中的各个元素初始化为0,指针变量ptr,指向包含2个元素的一维数组。a[0][0]:l,a[1][0]=2,故本题的输出选B。

 

(33)有以下程序

prt(int *m, int n)

{  int i;

for(i=O;i<n;i++) m[i]++;

)

main()

{

int a[]={ 1,2,3,4,5 },i;

prt(a,5);

for(i=O;i<5;i++)

printf(“%d,”,a[i]);

程序运行后的输出结果是________。

A)l,2,3,4,5,    B)2,3,4,5,6,    C)3,4,5,6,7,    D)2,3,4,5,1,

答案:B

评析:用数组名作函数实参时,不是把数组的值传递给形参,而是把实参数组的起始地址传递给形参数组,这样两个数组就共同占用同一段内存单元。

 

(34)有以下程序

main()

{  int a[]={1,2,3,4,5,6,7,8,9,0},*p;

for(p=a;p<a+10;p++)printf(“%d,”,*p);

}

程序运行后的输出结果是________。

A)l,2,3,4,5,6,7,8,9,0,    B)2,3,4,5,6,7,8,9,10,1,

C)0,1,2,3,4,5,6,7,8,9,    D)l,l,1,l,l,l,l,l,l,l,

答案:A

评析:c语言规定数组变量名代表数组的首地址,即第0号元素的地址。本题将a数组中的值全部输出,即为l,2,3,4,5,6,7,8,9,0,。

 

(35)有以下程序

#define P 3

void F(int x){return(P*x*x);}

main()

{printf(“%d\n”,F(3+5));}

程序运行后的输出结果是________。

A)192    B)29    C)25    D)编译出错

答案:D

评析:return语句用于从被调函数带回一个函数值。void关键字表示“无类型”,即不需要从被调函数中带回函数值,所以不需要return语句,故编译时出错。

 

(36)有以下程序

main()

{int c=35;printf(“%d\n”,c&C);}

程序运行后的输出结果是________。

A)0    B)70    C)35    D)1

答案:C

评析:按位“与”时,1&1=1,其他都等O。因为本题中相与的两个值相等,即对应位上的二进制值相等,所以“与”的结果也即为其值本身。

 

(37)以下叙述中正确的是________。

A)预处理命令行必须位于源文件的开头

B)在源文件的一行上可以有多条预处理命令

C)宏名必须用大写字母表示

D)宏替换不占用程序的运行时间

答案:D

评析:通常,预处理命令位于源文件的开头,也可以写在函数与函数之间;不能在一行上写多条预处理命令:宏名一般习惯用大写字母表示,以便与变量名相区别,但这并非规定,也可用小写字母。

 

(38)若有以下说明和定义

union dt

{int a;har b;ouble c;}data;

以下叙述中错误的是________。

A)data的每个成员起始地址都相同

B)变量data所占的内存字节数与成员c所占字节数相等

C)程序段:data.a=5;pintf(“%f\n”,data.C);输出结果为5.000000

D)data可以作为函数的实参

答案:C

评析:union是表示共用体的关键字,成员a,b,c共占用同一个内存空间,data的每个成员起始地址都相同;共用体变量所占的内存长度等于最长的成员的长度,故变量’data所占的内存字节数与成员c所占字节数相等;执行“data.a=5;printf(“%f\n”,data.C);”printf函数只是将内存中的数据以不同的类型输出,而不能将内存中的整型数据自动转换为等值的浮点数,故C是错误的。

 

(39)以下语句或语句组中,能正确进行字符串赋值的是________。

A)char*sp;*sp=”right!”;    B)char s[lO];s=”right! “;

C)char s[10];*s=”right! “;   D)char*sp=”right! “;

答案:D

评析:选项A定义了字符型的指针变量sp,则*sp存储的是第一个字符,而给它赋的是字符串,故错;

选项B表示代表数组的首地址,而题中给它赋的是字符串,所以错误;

选项c定义了一个字符型的数组s[10],再通过+s给数组元素赋初值,这时是与选项A相同的错误。

 

(40)设有如下说明

typedef struct ST

{long a; int b; char c[2];}NEW;

则下面叙述中正确的是________。

A)以上的说明形式非法    B)ST是一个结构体类型

C)NEW是一个结构体类型    D)NEW是一个结构体变量

答案:C

评析:typedef关键字用于声明一个新的类型名代替已有的类型名。

本题中如果没有用typedef进行定义的话,则struct ST为结构体类型,现在用typedef定义后,相当于用NEW代表了struct ST这一结构体类型,故NEW为结构体类型。

 

(41)有以下程序

main()

{    int a=1,b;

for(b=l;b<10;b++)

{  if(a>=8)break;

if(a%2==1){a+=5;continue;}

a-=3;

)

printf(“%d\n”,b);

}

程序运行后的输出结果是________。

A) 3     B)4     C) 5     D) 6

答案:B

评析:break和continue的区别是:continue语句只结束本次循环,而不是终止整个循环的执行;而break语句则是结束整个循环过程,.不再判断执行的条件是否成立。

 

(42)有以下程序

main()

{  char s[]=”l 59″,*p;

p=s;

printf(“%c”,*p++);printf(“%c”,*p++);

}

程序运行后的输出结果是________。

A)15    B)16    C)12    D)59

答案:A

评析:本题通过“p=s”将指针变量p指向字符数组s,在第一次输出时,由于++和*为同一优先级,“*p++”相于“+(p++)”。p指向s[1],输出为s[1]的值。

 

(43)有以下函数

fun(char*a,char*b)

{  while((*a!=’\0’)&&(*b!=’\0’)&&(*a==b))

{a++;b++; }

return(*a-*b);

}

该函数的功能是________。

A)计算a和b所指字符串的长度之差

B)将b所指字符串连接到a所指字符串中

C)将b所指字符串连接到a所指字符串后面

D)比较a和b所指字符串的大小

答案:D

评析:字符串的比较规则是对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到‘\0’为止,相等,则返回0,否则返回第一个不等字符串的ASCII码的差值。

 

(44)有以下程序

main()

{  int num[4][4]={{1,2,3,4},{5,6,7,8),{9,10,11,12},{13,14,15,16}},i,j;

for(i=O;i<4;i++)

{    for(j=0;j<=i.j++)printf(“%4c”,’  ’);

for(j______; j<4;j++)printf(“%4d”,num[i][j]);

printf(“\n”);

}

}

若要按以下形式输出数组右上半三角

l    2    3    4

6    7    8

11  12

16

则在程序下划线处应填入的是________

A)i-l    B)i    C)i+1    D)4-i

答案:B

评析:本题程序为二重循环,外循环控制输出数据的行数,内循环控制输出数据的列数。从本题输出的形式来看,程序要求输出的是4行4列。

 

(45)有以下程序

point(char*p){p+=3;}

main()

{  char b[4]={’at,lb’,’c’,’d.},*p=b;

poim(p);primf(”%c\n”,*p);

}

程序运行后的输出结果是________.

A)a    B)b    C)c    D)d

答案:A

评析:在c语言中,函数的参数传递方式采用按值传递,因此不能通过调用函数的方式来改变指针本身的值,只能改变指针所指变量的值。

 

(46)程序中若有如下说明和定义语句

char fun(char*);

main()

{

char *s=”one; a[5]={O},(*f1)()=fun,ch;

}

以下选项中对函数fun的正确调用语句是________.

A)(*f1)(a);    B)*f1(*s);    C)fun(&a);    D)ch=*fl(s);

答案:A

评析:题中将函数fun的入口地址赋给了指针变量f1,这时f1和fun都指向函数的开头,调用*fl。就是调用函数fun.

 

(47)有以下结构体说明和变量定义,如图所示:

struct node

{int data;struct node *next;} *p,*q,*r;

 

现要将q所指结点从链表中删除,同时要保持链表的连续,以下不能完成指定操作

的语句是________。

A)P->next=q->next;    B)p->next=p->next->next;

C)p->next=r;          D)p=q->next;

答案:D

评析:要想将q所指结点从链表中删除,同时保持链表的连续,必需使p结点的next指向r,在四个选项中,只有选项D不能做到。

 

(48)以下对结构体类型变量td的定义中,错误的是________。

A) typedef struct aa                          B) struct aa

{ int n;                                    { int n;

float m;                                        float m;

}AA;                                }td;

AA td;                                      struct aa td;

C) street                                 D) struct

{ int n;                                   { int n;

float m;                                        float m;

}aa;                                   }td;

struct aa td;

答案:C

评析:选项c中的aa本身就为结构体变量名,所以不能再用它来定义结构体变量,故此种定义方法是错误的:

 

(49)以下与函数fseek(f1),0L,SEEK_SET)有相同作用的是________。

A)feof(fp)     B)ftell(fp)     C)fgetc(fp)    D)rewind(fp)

答案:D

评析:fseek函数用于改变文件的位置指针。

本题中“fseek(fp,0L,SEEK_SET)”的作用是将位置指针移到文件头。

feof的作用是判断文件是否结束,已指到文件的末尾,则返回值为非零,否则为零。

ftell的作用是得到流式文件中的当前位置,用相对于文件开头的位移量来表示。

fgets的作用是指定文件读入二个字符串。

 

(50)有以下程序

#include

void WriteStr(char *fn, char *str)

{  FILE *fp;

fp=fopen(fn,”w”);fputs(str, fp);fclose(fp);

}

main()

{

WriteStr(“t1.dat”,”start”);

WriteStr(“tl.dat”,”end”);

}

程序运行后,文件t1.dat中的内容是________。

A)start      B)end      C)startend       D)endrt

答案:B

评析:两次使用“写入”的方式打开同一个文件,在第二次打开时,文件指针指向文件头,所以此次写入的数据覆盖了文件原有的数据,故本题中t1.dat的内容为end。

 

二、填空题(每空2分,共40分)

请将每空的正确答案写在【1】至【20】序号的横线上,答在试卷上不得分。(1)某二叉树中度为2的结点有18个,则该二叉树中有一___【1】___ 一个叶子结点。

答案:【1】19

评析:二叉树的性质3:在任意一棵二叉树中,度为0的结点(即叶子结点)总是比度为2的结点多一个。本题中度为2的结点数为18,故叶子结点数为18+1=19个。

 

(2)在面向对象方法中,类的实例称为___【2】___.

答案:【2】对象

评析;将属性、操作相似的对象归为类,也就是说,类是具有共同属性、共同方法的对象的集合。所以,类是对象的抽象,它描述了属于该对象类型的所有对象的性质,而一个对象则是其对应类的一个实例。

 

(3)诊断和改正程序中错误的工作通常称为___【3】___.

答案:【3】程序调试

评析:程序调试的任务是诊断和改正程序中的错误。它与软件测试不同,软件测试是尽可能多地发现软件中的错误。先要发现软件的错误,然后借助于一定的调试工具去找出软件错误的具体位置。软件测试贯穿整个软件生命期,调试主要再开发阶段。

 

(4)在关系数据库中,把数据表示成二维表,每一个二维表称为___【4】___。

答案:【4】关系

评析:在关系数据库中,把数据表示成二维表,而一个二维表就是一个关系。

 

(5)问题处理方案的正确而完整的描述称为___【5】___。

答案:【5】算法

评析:所谓算法是指解题方案的准确而完整的描述。

 

(6)以下程序运行时,若从键盘输入:10 20 30,输出的结果是___【6】___.     #include

main()

{  int i=0,j=0,k=0;

scanf(“%d%*d%d”,&i,&j,&k);

printf(“%d%d%d\n”I,j,k);

}

答案:【6】10300

评析:在scanf格式控制符中,如果在%后有一个“*”附加说明符,表示跳过它指定的列数。本题中““%d%*d%d””表示将10赋给i,%+d表示读入整数但不赋给任何变量,然后再读入整数30赋给变量j,那么变量k并没有重新赋值,仍为初始值0。所以输出的结果为10300。

 

(7)以下程序运行后的输出结果是___【7】___。

#define S(x)4*x*x+l

main()

{  inti=6,j=8;

printf(“%d\11″,S(i+j));

}

答案:【7】81

评析;带参数的宏定义是按#define命令行中指定的字符串从左到右进行转换。本题中替换的式子为:4*i+j*i+j+l,代入i,j的值得81。

 

(8)以下程序运行后的输出结果是___【8】___。

main()

{ int a=3,b=4,c=5,t=99;

if(b<a&&a<C)t=a;a=c;c=t;

if(a<c&&b<C)t=b;b=a;a=t;

printf(“%d%d%d\n”,a,b,C);

}

答案:【8】4 5 99

评析:本题需特别注意的是“;”的问题,不能把“t=a;a=c;c=t;”误认为是第一个if的语句,实际上,只有“t=a;”才是第一个if的语句。

 

(9)以下程序运行后的输出结果是___【9】___。

main()

{  int a,b,c;

a=10;b=20;c=(a%b1);

printf(“%d  %d  %d\n”,a,b,C);

}

答案:【9】10 20 0

评析:本题中“(a%b1)”的运算顺序为先算括号→算术运算符→关系运算符→逻辑运算符。其中a%b=10,a/b=0,所以a%bl值也是0,故整个表达式的结果为0,所以输出的a,b,c的值为10 20 0。

 

(10)以下程序运行后的输出结果是___【10】___。

main()

{char c1,c2;

for(c1=’0’,c2=’9’;c1<c2;c1++,c2–)  printf(“%c%c”,c1,c2);

printf(“\n”);

}

答案:【10】0918273645

评析:本题程序的作用是通过for循环将0-9这10个数字从前向后,同时也从后向前依次输出。

 

(11)已知字符A的ASCII代码值为65,以下程序运行时若从键盘输入:B33,

则输出结果是_____。

#include

main()

{chara,b;

a=getchar();scanf(“%dt”,&b);

a=a-’a’+’O’;b=b*2;

printf(“%c%c\n”,a,b);

}

答案:【11】1 B

评析:c语言使字符型数据和整型数据之间可以通用。题中执行“a=getchar();”后,a的值B,在内存中的表现形式为ASCII码66;执行“scanf(“%d”&b);”后,b在内存中的表现形式为33,然后经过“a=a-‘A’+‘0’;b=b*2;”运算,得出a的值为字符‘1’,b的值为ASCII码66,最后以字符型输出为l B。

 

(12)以下程序中,fun函数的功能是求3行4列二维数组每行元素中的最大值。请填空。

void fun(int, int, int(*)[4],int *);

main()

{ int a[a][4]={{12,41,36,28},{19,33,15,27},{3,27,19,1}},b[3],i;

fun(3,4,a,b);

for(i=O;i<3;i++) printf(“%4d”,b [i]);

printf(“\n”);

}

void fun(int m,int n, int ar[][4],int *br)

{  int i,j,x;

for(i=O;i<m;i++)

( x=ar[i][0];

For(j=O;j<n;j++) if(x<ar[i][j]) x=ar[i][j];

___【12】___=x;

}

}

答案:【12】br[I]或*(br+i)

评析:二维数组a存放3行4列的数组元素,一维数组b用于存放每行的最大数。在函数fun中,外层for循环用于控制行数,内层for循环用于控制列数。

 

(13)以下程序运行后的输出结果是___【13】___。

void swap(int x, int y)

{ int t;

t=x;x=y;y=t;printf(“%d %d “,x,y);

}

main()

{  int a=3,b=4;

swap(a,b); printf(“%d %d”,a,b);

答案:【13】4 3 3 4

评析:用变量作为函数的实参时,属单向传递,即“值传送”方式,此种函数参数的传递方式只能由实参传给形参,不能由形参传回来给实参。

 

(14)以下程序运行后的输出结果是___【14】___。

#include

void fun(char *s, int p, int k)

{ int i;

for(i=p;i<k-1;i++) s[i]=s[i+2];

}

main()

{  char s[]=”abcdefg”;

fun(s,3,strlen(s)); puts(s);

}

答案:【14】abcfg

评析:函数fun的作用是将s所指的字符串中从第p十3到第k+1个字符向前移动两个位置。本题程序是将数组s中从第6个元素开始的值分别向前移动两个位置。在执行fun函数时,p的值是3,k的值是7,

所以,具体执行“for(i=p;i<k-1;i++)s[i]=s[i+2];”语句的过程如下:

i=3:判断i<k-1成立,执行s[3]=s[5],此时,s[3l=f;

i=4:判断i<k-1成立,执行s[4]=s[6],此时,s[4]=g;

i=5:判断i<k-l成立,执行s[5]=s[7],此时,s[5]=‘\O’:

i=6:判断i<k-1不成立,返回主函数输出s的值,即为abcfg。

 

(15)以下程序运行后的输出结果是___【15】___。

#include

main()

{  char ch[]=”abc”,x[3][4]; int i;

for(i=O;i<3;i++) strcpy(x[i],ch);

for(i=O;i<3;i++) printf(“%s”,&x[i][i]);

printf(“\n”);

}

答案:【15】abcbcc

评析:字符数组ch的值‘abc’分别复制到了二维数组x的每一行,使得二维数组中每一行的值均为‘abc’,再通过第二个for循环打印出每一行上所要求输出的字符串。

 

(16)以下程序运行后的输出结果是___【16】___。

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”);

}

答案:【16】010111212

评析:静态局部变量是在编译时赋初值的,在程序运行时它已有初值。

 

(17)以下程序运行后的输出结果是___【17】___。

struct NODE

{ int k;

struct NODE *link;

};

main()

{  struct NODE m[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”);

}

答案:【17】13431

评析:程序执行过程如下:

p=m,q=m+4,条件p!=q成立,执行p->k=++i;,由于是“前加”,所以m[O].k=1.执行p++后p=m+l;执行q->k=i++;,由于是“后加”,所以m[4].k=1,然后使得i加上1,即i=2,q–后,q=m+3:

p=m+l,q=m+3,条件p!=q成立,执行p->k=++i;,由于是“前加”,所以i=3,m[0].k=3,执行p++后p=m+2;执行q->k=i++;,由于是“后加”,所以m[4].k=3,i=4,q–后,q=m+2;

p=m+2,q=m+2,条件p!=q不成立,则执行q->k=i;即m[2].k=4;故输出的值为13431。

 

(18)以下程序中函数huiwen的功能是检查一个字符串是否是回文,当字符串是回文,

时,函数返回字符串:yes!,否则函数返回字符串:no!,并在主函数中输出,所谓回

文即正向与反向的拼写都一样,例如:adgda。请填空。

#include

char *huiwen(char *str)

{  char *pl,*p2; int i,t=0;

pl=str;p2=___【18】___;

for(i=0;i<=strlen(str)/2;i++)

if(*pl ++!=*p2–) {t=l ;break;}

if(___【19】___) retum(“yes!”);

else return(“no!”);

}

main()

{ char str[50];

printf(“Input:”); scanf(“%s”,str);

printf(“%s\n”,___【20】___ );

}

答案:【18】pl+(strlen(str)-1)或str+(strlen(str)-1)

【19】t==0或!(tl=0)或t!=l或!t

【20】huiwen(str)

评析:本题的要求是判断从键盘输入的字符串是否是回文,但在主函数中并没有完成此功能的代码,故第20空应该填调用函数huiwen代码,即huiwen(str)。

由于回文字符串是指正向与反向拼写都一样,所以对于一个字符串,如果正向顺序与反向顺序对应位置上的字符一样,则此字符串即为回文。在函数huiwen中,已用“pl=str”使得pl指向字符串str的第一个字符的地址,则第18空语句的功能应该是使得p2指向字符串str的最后一个字符串的地址,故填pl+(strlen(str)-1),由于p1与str指向的是同一个地址,所以,第18空也可以填str+(strlen(str)-1)。

在进行for循环时,如果pl所指向的字符与p2指向的字符不相同,则说明,字符串str不是回文,则用t=l标记,并退出循环,执行下面的if语句,由于题中要求如果是回文,则返回“yes!”,否则,返回“no!”。故当t=O的时候,说明字符串str为回文,所以第19应填t==O或!(t!=O)或t!=l或!t。
原创粉丝点击