C语言笔试题带答案(八)

匿名网友 匿名网友 发布于: 2015-08-30 00:00:00
阅读 242 收藏 0 点赞 0 评论 0

一、选择题((1)~(10)每小题2分,(11)-(50)每小题1分,共60分)

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

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

(1)数据结构中,与所使用的计算机无关的是数据的________。

A)存储结构     B)物理结构           C)逻辑结构          D)物理和存储结构

答案:C

评析:数据结构概念一般包括3个方面的内容,数据的逻辑结构、存储结构及数据上的运算集合。数据的逻辑结构只抽象的反映数据元素之间的逻辑关系,而不管它在计算机中的存储表示形式。

 

(2)栈底至栈顶依次存放元素A、B、C、D,在第五个元素E入栈前,栈中元素可以出栈,

则出栈序列可能是________。

A)ABCED         B)DBCEA             C)CDABE             D)DCBEA

答案:D

评析:栈操作原则上“后进先出”,栈底至栈顶依次存放元素A、B、c、D,则表明这4个元素中D是最后进栈,B、c处于中间,A最早进栈。所以出栈时一定是先出D,再出c,最后出A。

 

(3)线性表的顺序存储结构和线性表的链式存储结构分别是________。

A)顺序存取的存储结构、随机存取的存储结构

B)随机存取的存储结构、顺序存取的存储结构

C)随机存取的存储结构、随机存取的存储结构

D)任意存取的存储结构、任意存取的存储结构

答案:B

评析:顺序存储结构中,数据元素存放在一组地址连续的存储单元中,每个数据元素地址可通过公式LOC(ai)。LOC(a1)+(i-1)L计算得到,从而实现了随机存取。对于链式存储结构,要对某结点进行存取,都得从链的头指针指向的结点开始,这是一种顺序存取的存储结构。

 

(4)在单链表中,增加头结点的目的是________。

A)方便运算的实现                    B)使单链表至少有一个结点

C)标识表结点中首结点的位置          D)说明单链表是线性表的链式存储实现

答案:A

评析:头结点不仅标识了表中首结点的位置,而且根据单链表(包含头结点)的结构,只要掌握了表头,就能够访问整个链表,因此增加头结点目的是为了便于运算的实现。

 

(5)软件设计包括软件的结构、数据接口和过程设计,其中软件的过程设计是指________。

A)模块间的关系                       B)系统结构部件转换成软件的过程描述

C)软件层次结构                       D)软件开发过程

答案:B

评析:软件设计包括软件结构设计、数据设计、接口设计和过程设计。其中结构设计是定义软件系统各主要部件之间的关系;数据设计是将分析时创建的模型转化为数据结构的定义;接口设计是描述软件内部、软件和操作系统之间及软件与人之间如何通信;过程设计则是把系统结构部件转换成软件的过程性描述。

 

(6)为了避免流程图在描述程序逻辑时的灵活性,提出了用方框图来代替传统的程序流程    图,通常也把这种图称为________。

A)PAD图        B)N-S图             C)结构图             D)数据流图

答案:B

评析:常见的过程设计工具有:程序流程图、N-S图、PAD图和HIPO图。其中,为了避免流程图在描述程序逻辑时的灵活性,提出了用方框图来代替传统的程序流程图,通常也把这种图称为N-S图。

 

(7)数据处理的最小单位是________。

A)数据         B)数据元素            C)数据项           D)数据结构

答案:C

评析:数据处理的最小单位是数据项;由若干数据项组成数据元素;而数据是指能够被计算机识别、存储和加工处理的信息载体;数据结构是指数据之间的相互关系和数据运算。

 

(8)下列有关数据库的描述,正确的是________。

A)数据库是一个DBF文件              B)数据库是一个关系

C)数据库是一个结构化的数据集合      D)数据库是一组文件

答案:C

评析:数据库(Database,简称DB)是数据的集合,它具有统一的结构形式并存放于统一的存储介质内,是多种应用数据的集成,并可被各个应用程序所共享。数据库中的数据具有“集成”、“共享”之特点。

 

(9)单个用户使用的数据视图的描述称为 ______ 。

A)外模式        B)概念模式          C)内模式            D)逻辑模式

答案:A

评析:外模式是用户的数据视图,也就是用户所见到的数据模式;全局数据视图的描述称为概念模式,即数据库中全部数据的整体逻辑结构的描述;物理存储数据视图的描述称为内模式,即数据库在物理存储方面的描述;存储模式即为内模式。

 

(10)需求分析阶段的任务是确定______。

A)软件开发方法   B)软件开发工具    C)软件开发费用       D)软件系统功能

答案:D

评析:需求分析是软件定义时期的最后一个阶段,它的基本任务就是详细调查现实世界要处理的对象(组织、部门、企业等),充分了解原系统的工作概况,明确用户的各种需求,然后在此基础上确定新系统的功能。

 

(11)若变量a是int类型,并执行了语句:a=’A’+1.6;,则正确叙述是______。

A)a的值是字符C                     B)a的值是浮点型

C)不允许字符型和浮点型相加          D)a的值是字符’A’的ASCII值加上l

答案:D

评析:在赋值表达式中,赋值符右边的值的类型会自动转换成赋值符左边的变量的类型。在本题中,先用“A”的ASCII码值加上1.46得到66.46,然后将它强制转换成int型,转换后,实数的小数部分全部

 

(12)若以下选项中变量已正确定义,则正确的赋值语句是______。

A)x1=26.8%3;    B)1+2=x2;      C)x3=0x12;          D)x4=1+2=3;

答案:C

评析:赋值符号“=”就是赋值运算符,它的作用是将一个数据赋给一个变量。如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换,所以选项A错误。在赋值表达式中,赋值运算符的左侧必须是一个变量,所以选项B、D错误。选项C是将一个十六进制数赋值给变量x3。

 

(13)以下程序段的输出结果是______。

int a=1234;

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

A)12              B)34               C)1234             D)提示出错、无结果

答案:C

评析:本题主要考查对primf函数域宽描述符的理解,在这里我们要特别注意:输出数据的实际精度并不主要决定于格式项中的域宽与精度,也不决定于输入的数据精度,而主要决定于数据在机器内的存储精度。

 

(14)以下选项中不属于C语言的类型的是______。

A)signed short int                  B)unsigned char

C)signed long                       D)long short

答案:D

评析:c语言中归纳起来,基本类型数据有以下几种:

[signed]char;unsigned char;[signed]short[int];unsigned short[int];[signed]long[int];unsigned long[int];float;double.

 

(15)设有定义:int a,*pa=&a;以下scanf语句能正确为变量a读入数据的是______。

A)scanf(“%d”,B);                  B)scanf(”%d”,a);

C)scanf(“%d”,&pa);               D)scanf(“%d”,*pa);

答案:C

评析:scanf函数要求其中的输入项必须是地址形式,比如:普通变量的地址、数组名、指针变量等。对于普通变量,地址形式为:&变量名;当一个普通变量的地址赋予了一个指针变量名,scanf函数的输入项处就可以直接写这个指针变量名。

 

(16)以下程序的输出结果是______。

main()

{int a=5,b=4,c=6,d;

printf(”%d\n”,d=a>c?(a>c?a:C):(b));

}

A)5              B)4                 C)6                D)不确定

答案:B

评析:本题最重要的分析d=a>c?(a>c?a:C):(b)),首先运算括号内的式子a>c?a:c,它的值是c的值6,即式子化成d=a>c?6:4。显然a=c,所以将4赋给d。

 

(17)以下程序中,while循环的循环次数是______  。

main()

{ int i=0:

while(i<10)

{if(i<1)continue;

if(i==5)break;

i++:

}

……

}

A)1              B)10               C)6               D)死循环,不能确定次数

答案:D

评析:进入循环后,先执行一个条件语句,如果i的值小于l,那么直接进入下一轮循环,因为i的初始值是0,小于l,故直接进入下一轮循环,又因为i的值始终没有改变,所以这个循环成了死循环。

 

(18)有以下程序:

main()

{

char k;int i;

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

{

scanf(”%c”,&k);

switch(k)

{

case’0’:printf[“anothern”];

case’1’:printf[“number\n”);

}

}

}

程序运行时,从键盘输入:0l<回车>,程序执行后输出结果是______。

A)another      B)another           C)another           D)number

number           number               number             number

another              number

答案:C

评析:switch语句是多分支选择语句,执行完一个case后面的语句后,流程控制转移到下一个case继续执行。“case常量表达式”只是起语句标号作用,并不是在该处进行条件判断。在执行switch语句时,根据switch后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。

 

(19)以下程序的输出结果是______。

main()

{Int a=O,i;

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

{switch(i)

{  case 0:

case 3:a+=2:

case l:

case 2:a+=3:

default:a+=5;

}

}

printf(”%d\n”,a)

}

A)3l             B)13               C)10                  D)20

答案:A

评析:switch结构的执行过程同上题。

 

(20)己定义c为字符型常量,则下列语句中正确的是______。

A)C=’97’       B)c=”97”         C)c=97               D)c=”a”

答案:C

评析:字符变量占内存一个字节,只能放一个字符;字符常量为单引号括起的单个字符;字符串常量为双引号括起的一串字符(可以0个字符,即"",称为空串)。选项c为字符ASCII码的整数形式。

 

(21)以下程序的输出结果是_________。

main()

f int a=4,b=5,c=0,d;

d=!a&&!b||!c;

printf(“%dn”,d);

}

A)l             B)0                 C)非0的数          D)-1

答案:A

评析:!a值为0,故!a&&!b的值为0,!c的值为l,而0IIl的值应该是l。所以答案是A。

 

(22)以下程序的输出结果是_________。

#include<stdio.h>

main()

{int i=0,a=0;

while(i<20)

{for(;;)

{if((i%10)==0)break;

else    I–:

}

i+=ll;a+=i;

}

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

}

A)21            B)32                C)33                D)11

答案:B

评析:本题中,有两个循环语句。首先,i=0,进入while循环,for语句中对循环没有任何条件,故直接进入for循环,因为0%10结果还是O,所以跳出for循环,执行i+:11,i的值变为11,执行a+=i,a的值变为11:接着进入下一轮while循环,在for循环中,因为i的值是11,对10取余结果为l,所以执行i自减,i的值变成10,进入又一轮for循环,因为10%10==0,所以跳出for循环,执行i+=1l,i的值变成21,执行a+=i,也就是将21+1 1的和赋给a,a=32,因为此时i的值不再小于20,所以结束循环,

故输出结果是32。

 

(23)有以下程序:

int n(int x,int y)

{retum x>y?x:y;}

Int f2(int x,int y)

{return x>y?y:x;)

main()

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

d=f1(a,b);d=fl(d,C);

e=f2(a,b);e=f2(e,C);

f=a+b+C-d-e;

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

}

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

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

答案:B

评析:函数n是一个求两个整数中最大值的函数,函数f2是一个求两个整数中最小值的函数。在main函数中两次调用函数n,求得变量a、b、、c中的最大值赋值给d;两次调用函数f2,求得变量a、b、c中的最小值赋值给e;表达式a+b+c-d-e得到中间值,输出5,3,4。

 

(24)以下程序的输出结果是_________。

int  f()

{static int i=0;

int s=1:

s+=i;i++;

return s;

}

main()

{inti,a=0;

for(i=0;i<5;j++)a+=f();

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

}

A)20            B)24               C)25                 D)15

答案:D

评析:静态变量,在编译时就为其分配了存储空间,程序一开始执行便被建立,直到该程序执行结束都存在,而不像动态变量只存在于函数或分程序被调用期间。在函数多次被调用的过程中静态局部变量的值具有可继承性。

 

(25)已定义以下函数:

fun(int *p)

{retum *p;}

该函数的返回值是______ 。

A)不确定的值  B)形参p中存放的值  C)形参p所指存储单元中的值  D)形参p的地址值

答案:C.

评析:函数首部fun(int*p)中+p表示这是一个指针变量,指向整型数据,用来从主调函数接收地址;而语句return *p;中的*p代表p所指向存储单元中的值。

 

(26)若有以下程序

#include<stdio.h>

Void f(int n);

main()

{void f(int n);

f(5);

}

Void f(int n)

{print(“%d\n”,n);}

则以下叙述中不正确的是______  。

A)若只在主函数中对函数f进行说明,则只能在主函数中正确调用函数f

B)若在主函数前对函数f进行说明,则在主函数和其后的其它函数中都可以正确调用函数f

C)对于以上函数程序,编译时系统会提示出错信息;提示对f函数重复说明

D)函数f无返回值,所以可用void将其类型定义为无值型

答案:C

评析:一个函数在一个文件中的定义只能有一次,但对它的声明却可以有很多个。一个函数可以正确调用在当前函数之前声明的函数。

 

(27)有以下程序段:

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

b=p[5];

b中的值是______。

A)5             B)6                  C)8                 D)9

答案:D

评析:数组a各元素a[O]~a[9]的值依次为1~10;在程序的说明部分,指针变量p初始化为&a[3](即a+3),则p[5]相当于·(p+5),相当于a[8],所以执行语句b=p[5];后,b的值为9。

 

(28)在C语言中,形参的缺省存储类是______。

A)auto          B)register           C)static            D)extern

答案:A

评析:程序进行编译时,并不为形式参数分配存储穿间。只有在被调用时,形式参数才临时地占有存储空间。形式参数用关键字auto作存储类别的声明时,关键字“auto”可以省略,auto不写则隐含确定为“自动存储类别”,它属于动态存储方式。

 

(29)有以下定义:

#include<stdio.h>

char a[10],*b=a;

不能给数组a输入字符串的语句是______。

A)gets(a);    B)gets(a[0]);    C)gets(&a[0]);  D)gets(b);

答案:B

评析:函数gets的格式为:gets(字符数组名)

c语言中,字符数组名代表数组的首元素地址,即&a[O],字符指针变量lb值也为数组a的首地址,选项A、c、D均能给数组a输入字符串。选项B中a[O]为数组元素,是一个数据变量。

 

(30)若指针p已正确定义,要使p指向两个连续的整型动态存储单元,不正确的语句是  ______.

A)p=2*(int*)malloc(sizeof(int));    B)p=(int*)malloc(2*sizeof(int))

C)p=(int*)malloc(2*2)                D)p=(int*)calloc(2,sizeof(int))

答案:A

评析:malloe函数的作用是在内存开辟指定大小的存储空问,并将此存储空间的地址作为函数值带回,它的原型为void。malloe(unsigned int size),函数值为指针,这个指针是指向void类型。如果要将此返回地址赋给一个指向特定类型的指针变量,则应进行强制类型转换。

calloc函数的模型是:void*calloc(unsigned int num,unsigned int size)作用是分配num个大小为size字节的空间。

 

(31)下面程序段的输出结果是______ 。

main()

{

char strl [10]={‘s’,’t’,’u’,’d’,’e’,’n’,’t’};

printf(“%dn”,strlen(strl));

}

A)7             B)8                 C)10                D)存在语法错误

答案:A

评析:strlen()函数得到字符串的长度,返回值为数值型。字符数组初始化,若提供的初值个数大于数组长度,则按语法错误处理。如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定义为空字符。

 

(32)以下程序的输出结果是______。

main()

{int  x=040;

printf(“%o\n”,x<<1);

}

A)100           B)80                C)64                  D)32

答案:A

评析:040用二进制表示就是00100000,左移一位,得到的值应该是01000000,化成八进制应该是0100。

 

(33)下面程序运行后的输出结果是______。

main()

{

char arr[2][4];

strcpy(arr[0],”you”);strcpy(arr[1],”me”);

arr[0][3]=’&’;

print”%s\n”,arr[0]);

}

A)you&me        B)you               C)me                 D)err

答案:A

评析:在主函数中定义了一个2*4的二维字符数组,执行strcpy(arr[O]“fIyou”);后,arr[0]={‘y’‘o’,‘u’,‘\0’},执行strcpy(arr[1],“me”);后arr[1]={ ‘m’, ‘e’,‘\0’,不定},当执行完arr[O][3];‘&’;从arr[O]开始的存储空间中的字符依次是‘y’,‘o’,‘u’,‘&’,‘m’,‘e’,‘’,故执行printf(“%s\n”,arr[O]);后的输出结果为”you&me”,选A。

 

(34)若要打开A盘上的user子目录下名为abc.txt的文本文件进行读、写操作,下面符合    此要求的函数调用是______。

A)fopen(“A:userabc.txt”,”r”)      B)fopen(“A:\user\abc.txt”,”r+”)

C)fopen(“A:userabc.txt”,”rb”)      D)fopen(“A:\user\abc.txt”,”w”)

答案:B

评析:本题考查点是fopen函数中文件使用方式的指定。

文件使用方式“r”,表示以“只读”方式打开一个字符文件。

文件使用方式“r+”,表示以“读写”方式打开一个字符文件。

文件使用方式”“rb”,表示以“只读”方式打开一个二进制文件。

文件使用方式“w”,表示以“只写”方式打开一个字符文件。

 

(35)以下不能正确进行字符串赋初值的语句为______。

A)char  str[5]= “good! ”          B)char  str[]=”good! ”

C)char  *str=”good! ”              D)char  str[5]={’g’,’0’,’o’,’d’}

答案:A

评析:用字符串作初值为字符数组赋值时,系统总会自动在字符串的末尾补上一个“\O”,如选项A中定义的话,把第6个字符也就是“\0”赋给str数组,但此数组只含5个元素,而放到了s仃数组之后的存储单元中,这就可能会破坏其它数据区或程序本身。

 

(36)有以下程序:

#include<string.h>

main(int argc,char*argv[])

{

int i,len=O;

for(i=1;i<argc;i+=2)len+=strlen(argv[i]);

Print(“%d\n”,len);

}

经编译连接后生成可执行文件ex.exe,若运行时输入以下带参数的命令行

ex abcd efg h3 k44

运行后输出结果是______。

A)14            B)12                 C)8                 D)6

答案:C

评析:main函数的第一个参数argc是int型变量,用来统计命令行中的字符串个数,本题输入带参数的命令行“ex abed efg h3 k44<回车>”,argc的值是5;第二个参数是字符型指针数组,长度由argc的值决定,每个数组元素存放一个指向字符串数据的指针。for语句将命令行中两个字符串abed和h3的长度进行累加,放在变量len中。

 

(37)若有下面的说明和定义:

struct test

{ int ml;char m2;float m3;

union uu{char ul[5];int u2[2];}ua;

}myaa;

则sizeof(stuct test)的值是______。

A)12            B)16                   C)14              D)9

答案:A

评析:在定义了结构体变量后,系统会为之分配内存单元,在内存中一个整型占2个字节,一个字符占1个字节,一个数组元素占1个字节,一个浮点型占4个字节。结构体变量所占内存长度是各成员占的内存长度之和;而共用体变量所占的内存长度等于最长的成员的长度。所以test在内存中占12个字节(2+l+4+5=12)。

 

(38)若有定义:int aa[8];,则以下誊达式中不能代表数组元素aa[1]的地址的是______。

A)&aa[0]+l     B)&aa[1]            C)aa[0]++        D)aa+1

答案:C

评析:答案A中&aa[0]表示aa[0]的地址,加上1就是aa[1]的地址。同样aa[1]的地址也可以直接用&aa[1]或aa+l表示。

 

(39)下面叙述中正确的是______。

A)全局变量的作用域一定比局部变量的作用域范围大

B)静态类别变量的生存期贯穿于整个程序的运行期间

C)函数的形参都属于全局变量

D)未在定义语句中赋值的auto变量和static变量的初值都是随机值

答案:B

评析:c语言中,全局变量的作用范围是从定义处到程序结束,因此全局变量的定义点直接影响其作用范围,因此选项A错误。静态(statiC)存储类别变量是在程序编译时分配存储空间,该类别变量在整个程序运行期间占据着固定的存储单元,当多次调用其所在的函数时,该类别变量的值为上一次调用的值,直至整个程序结束运行后才释放该变量所占存储单元。因此选项B正确,选项D错误。c语言规定:函数的形参是auto型局部变量,因此选项c错误。

 

(40)以下程序的输出结果是______ 。

f(int b[],int m,int n)

{jnt i,s=0;

for(i=m;i<n;i=i+2)s=s+b[i];

return s;

)

main()

{int x,a[]:{1,2,3,4,5,6,7,8,9};

x=f(a,3,7);

printf(”%d\n”,x);

)

A)10            B)18                 C)8                 D)15

答案:A

评析:本题中,主函数调用f函数,在f函数中执行了两次循环,第一次i=3,s=0+b[i]:4,然后i的值被修改成5,仍然满足循环条件,进入第二轮循环,s=4+b[5]=4+6=10,随后,i的值被修改成7,不再满足循环条件,退出循环,返回s的值。所以最后输出结果是10。

 

(41)若有以下定义和语句:

int  s[4][5],(*ps)[5];

ps=s;

则对s数组元素的正确引用形式是______ 。

A)ps+l             B)*(ps+3)          C)ps[0][2]        D)*(ps+1)+3

答案:C

评析:选项A得到的是s数组第一行的地址,选项B得到的是s数组第三行第零列元素的地址,而选项D得到的是s数组第一行第三列元素的地址。只有选项c正确引用了ps数组第零行第二列的元素。

 

(42)以下程序的输出结果是______。

main()

{int b[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=1;

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

fbr(j=I;J<=I;J++)t=t+b[i][b[j][j]];

printf(”%d\n”,t);

}

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

答案:B

评析:`两个循环语句嵌套使用,在第一次外循环中,i=0,执行内循环时,将j赋值为i的值O,执行一次t=t+b[i][b[j][j]],得到t=1,退出内循环,接着进入第二次外循环,在第二次外循环结束时t=2,然后执行第三次外循环,得到t=4,退出循环,输出t的值。

 

(43)有以下程序:

#definef (x)X*X

main()

{

int i:

i=f(4+4)/f(2+2);

printf(”%dn”,i);

}

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

A)28            B)22                 C)16                D)4

答案:A

评析:主函数中f(4+4)/f(2+2)可按带参宏定义展开为4+4*4+4/2+2*2+2(千万不要随意地添加括号),求得结果为28。

 

(44)以下程序的输出结果是______。

#inclue<stdio.h>

#inclue<string.h>

main()

{char b1[8]=”goddwer”,b2[8],*pb=bl+3;

while(–pb>=b1) strcpy(b2,pb);

print(“%dha”,strlen(b2));

)

A)8            B)3                  C)l                  D)7

答案:D

评析:每次执行循环,都是将pb指针指向的内容复制到b2中,第一次循环中,将b1[2]~b1[7]六个字符复制到b2中,第二次循环,将b[1]~b[7]七个字符复制到b2中,第三次循环,将b1数组的全部内容复制到b2中。而后一次复制会覆盖前面的复制,最后b2的实际长度应该是八,而strlen()函数测出的是一个字符串中“\O”之前的全部字符的个数,所以最后输出的值是70

 

(45)在说明语句:int *f();中,标识符f代表的是______。

A)一个用于指向整型数据的指针变量

B)一个用于指向一维数组的行指针

C)一个用于指向函数的指针变量

D)一个返回值为指针型的函数名

答案:D

评析:一个函数在编译时被分配给一个入口地址,这个入口地址就称为函数的指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。Int*f()表示f是一个函数,它带回一个指针值,这个指针是指向一个整型数据的。

 

(46)下面函数中,可以把整数以二进制形式存放到文件中的函数是______。

A)fprintf函数    B)fread函数      C)fwrite函数     D)fputc函数

答案:C

评析:ANSI c标准提出设置两个函数(fread和fwrite),用来读写一个数据块。它们的一般调用形式为:

fread(buffer,size,count,fp);

fwrite(buffer,size,count,fp);

其中:buffer是一个指针;size是要读写的字节数;count是要进行读写多少个size字节的数据项;

fb是指文件型指针。如果文件以二进制形式打开,用fread和fwrite函数就可以读写任何类型的信息。

 

(47)不合法的main函数命令行参数表示形式是______。

A)main(int a,char*c[])             B)main(int arc,char **arv)

C)main(int argc,char *argv)        D)main(int argv,char *arge[])

答案:C

评析:本题主要考查了对main函数参数的了解,main函数可以有两个形参,一般形式是:main(int argc,char*argv[]),也就是说,它的第一个形参是一个整型变量,第二个形参是一个指针数组,其元素指向字符型数据。

 

(48)以下程序的输出结果是______.
int x=3;

main()

{int i;

for(i=l;i<x;i++)incre();

}

incre()

{ static int x=l;

X*=x+l:

printf(”%Di”,x);

}

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

答案:C

评析:incre()中定义一个静态局部变量x,它的作用范围仅限于本函数中,而不会影响main()函数中的x值。

 

(49)有以下结构体说明和变量的定义,且如图所示指针p指向变量a,指针q指向变量b。则不能把结点b连接到结点a之后的语句是________。

 

struct node

{ char data;

struct node *next;

}a,b,*p=&a,*q=&b;

A)a.next=q;  B)p.next=&b;       C)p->next=&b;      D)(*p).next=q;

答案:B

评析:由于p是一个指向struct node型的指针变量,要访问该指针变量指向的结构体成员,必须使用->运算符或“(*p).成员”的形式,故选项B是错误的。

 

(50)若有以下定义:

struct link

{ int data;

struct link*next;

}a,b,c,*p,*q;

且变量a和b之间已有如图所示的链表结构:

 

指针p指向变量a,q指向变量c。则能够把c插入到a和b之间并形成新的链表的语句组是______。

A)a.next=c;c.next=b;             B)p.next=q;q.next=p.next;

C)p->next=&c;q->next=p->next;     D)(*p).next=q;(*q).next=&b;

答案:D

评析:本题考的是指针的运用。即先将元素a的指针指向q指针所指向的元素即c,然后将c的指针指向b元素,采取的是直接取元素地址的方式。

 

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

请将每一个空的正确答案写在答题卡的【1】至【20】序号的横线上,答在试卷上不得分。

(1)算法的基本特征是可行性、确定性、  【1】   和拥有足够的情报。

答案:【1】有穷性

评析:算法是指解题方案的准确而完整的描述。它有4个基本特征,分别是可行性、确定性、有穷性和拥有足够的情报。

 

(2)顺序存储方法是把逻辑上相邻的结点存储在物理位置   【2】   的存储单元中。

答案:【2】相邻

评析:常用的存储表示方法有4种,顺序存储、链式存储、索引存储、散列存储。其中,顺序存储方法是把逻辑上相邻的结点存储在物理位置也相邻的存储单元中。

 

(3)Jackson结构化程序设计方法是英国的M.Jackson提出的,它是一种面向   【3】    的设计方法。

答案:【3】数据结构

评析:结构化分析方法主要包括:面向数据流的结构化分析方法(SA-Structured analysis),面向数据结构的Jackson方法(JSD-Jackson system development method)和面向数据结构的结构化数据系统开发方法(DSSD-Data structured system development method)。

 

(4)数据库设计分为以下6个设计阶段:需求分析阶段、  【4】    、逻辑设计阶段、物理    设计阶段、实施阶段、运行和维护阶段。

答案:【4】概念设计阶段或数据库概念设计阶段

评析:数据库设计分为以下6个设计阶段:需求分析阶段、概念设计阶段、逻辑设计阶段、物理设计阶段、实施阶段及数据库运行和维护阶段。

 

(5)数据库保护分为:安全性控制、  【5】    、并发性控制和数据的恢复。

答案:【5】完全性控制

评析:考查考生对数据库基本知识的了解。

安全性控制:防止未经授权的用户有意或无意存取数据库中的数据,以免数据被泄露、更改或破坏;完整性控制:保证数据库中数据及语义的正确性和有效性,防止任何对数据造成错误的操作;并发性控制:正确处理好多用户、多任务环境下的并发操作,防止错误发生;数据的恢复:当数据库被破坏或数据不正确时,使数据库能恢复到正确的状态。

 

(6)设有int x=ll;,则表达式(x++ *1/3)的值为  【6】   

答案:【6】3

评析:白增自减运算符的作用是使变量的值增1或减1,如:

++i,–i  (在使用i之前,先使i的值加(减)1)

i++,i–  (在使用i之后,使i的值加(减)1)

所以表达式(x++*1/3)的值即11/3的值:3。

 

(7)若从键盘输入58,则以下程序的输出结果是  【7】   

main()

{ int  a;

Scanf(“%d”,&a);

If(a>50)printf(“%d”,a);

If(a>40)printf(“%d”,a);

if(a>30)printf(“%d”,a);

}

答案:【7】585858

评析:本题首先为a输入一个值58,然后执行三个判断语句,在每一个判断中,如果满足判断条件的话,就输出a,因为三次判断,条件都满足,所以三次输出a。

 

(8)下列程序运行的结果是  【8】   

#include<stdio.h>

main()

{

int x=l,i=l:

fOr(;x<50;i++)

{if(x>=10)break;

if(x%2!=1)

{x+=3;continue;}

x-=1;

}

printf(”x=%d,i=%d\n”,x,i);

}

答案:【8】x=11,i=11

评析:本题程序段通过for循环语句实现当x的值为奇数时,x自减1:当x为偶数时自加3的功能。程序共执行了11次循环,当x=11时退出循环。

 

(9)以下程序的输出结果是  【9】   

main()

fint a=177;

printf(“%o\n”,a);

}

答案:【9】261

评析:本题考点是printf函数的格式字符。“%0”表示以八进制整数形式输出。

 

(10)以下程序的输出结果是【10】     

main()

{int a:O;

a+=(a=8);

printf(”%dn”,a);

}

答案:【10】16

评析:本题主要考的是运算符的优先级。

A+=(a=8)可以写成a:=a+(a=8)的形式,括号的优先级高于“+”,而“+”的优先级又高于“=”,所以先执行括号内的运算,将a赋值为8,然后再执行+运算。

 

(11)以下定义的结构体类型拟包含两个成员,其中成员变量info用来存放整型数据;成    员变量link是指向自身结构的指针。请将定义补充完整。

struct node

{int info;

   【11】    link;

};

答案:【11】struct node*

评析:本题考的是如何定义一个指向结构体变量的指针。

一个结构体变量指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。

 

(12)以下程序的输出结果是  【12】  

main()

{int s,i;

for(s=O,i=O;i<3;i++,s+=i);

printf(”%d\n”,s);

}

答案:【12】6

评析:在逗号表达式内按自左至右顺序求解,因此本题共执行三次循环,具体情形如下:

第一次当i=O时,执行i++,s+=i,则i=l,s=l:

第二次当i=l时,执行i++,s+=i,则i=2,s=3;

第三次当i=2时,执行i++,s+=i,则i=3,s=6。

当i=3后退出循环。

 

(13)以下程序的输出结果是   【13】    

main()

{char  *p=”abcdefgh”,*r;

1ong  *q;

q=(1ong*)p;

q++;

r=(char*)q;

printf(”%sn”,r);

}

答案:【13】efgh

评析:指针变量p,r指向字符型数据,而指针变量q指向长整型数据。首先通过类型转换将指针p的值赋给q,然后执行q自加,因为q是定义为指向长整型数据的变量,而长整型数据一般占4个字节的空间,所以实际上,q的值增加了4,当再将q的值经过强行类型转换赋给r的时候,实际上这时候r是指向了字符e,所以最后打印字符串时,得到的结果是“efgh”。

 

(14)以下程序的输出结果是   【14】    

main()

{int  x=0;

sub(&x,8,1);

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

}

sub(int *a,int n,int k、

{if(k<=n) sub(a,n/2,2*k);

*a+:k:

}

答案:【14】7

评析:本题是一个递归调用。

主函数中调用sub函数流程如下:

sub(*x,8,1)-sub(*x,4,2)-sub(*x,2,4)-x=x+k=4

︱               ︱

x=x+k=7          x=x+k=6

 

(15)以下程序可以将从键盘输入的十进制数(1ong型)以二到十六进制数的形式输出,请填空。

#include<stdio.h>

main()

{char b[16]={’O’,’l’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,

’9’,’A’,’B’,C’,’D’,’E’,’F’};

int c[64],d,i=0,base;

long n:

print(“Enter a number:n”);scanlf[“%1d’,&n);

print(“Enter new base:n”);scanf(“%ld”,&base);

do

{

C[i]=   【15】     

i++;n=n/base;

}while [n!=0);

pdntf(”’Transmite new base:\n”);

f0“–i;i>=O;–i)

{  d=c[I];

printf(”%c”,b   【16】    

}

}

答案:【15】n%base

【16】[d]

评析:进制转换的除余取整法。在循环中,是先对数n整除以base取余作为转换后的base进制数的第i位存放到数组元素c[i】中,然后对n整除以base的商作同样的操作,直到商为O为止,故第一空为n%base。

由于存入到数组c中的各个元素为对应数制在十进制上表示的各位的权值,在输出时必须将其转换成对应的字符输出,而在数组b中对应存放了各个数对应的字符,故第二空应填[d]。

 

(16)设有如下宏定义

#define  MYSWAP(z,x,y)  {z=x;x=f;y=z;}

以下程序段通过宏调用实现变量a,b内容的交换,请填空。

float a=5,b=16,c;

MYSWAPI(   【17】     ,a,b);

答案:【17】c

评析:本题最重要的是理解宏MYSWAP(z,x,y)的作用:通过z实现x,y的内容交换。所以MYSWAP(c,a,b)可以通过c实现a,b内容的交换。

 

(17)以下程序用来统计文件字符的个数,请填空。

#include  “stdio.h”

main ()

{FILE  *fp;long num=0;

if((fp=fopen(“fname.dat”,”r”))==NULl)

{printf(“Open errorn”);,exit,(O);}

while(   【18】    )

{num++;}

Printf[“num=%ldn”,num];

Fclose(fp);

)

答案:【18】fgetc(fp)!=EOF或!feof(fp)

评析:本程序考的是龟etc函数。

此函数的功能是从指针变量印所指向的文件中读入一个字符,如果执行龟etc函数时遇到文件结束符,则函数返回文件结束符EOF。

 

(18)以下程序用来输出结构体变量ex所占存储单元的字节数,请填空。

struct st

{char *name;double score;};

main()

{ struct st ex;

print(“ex size:%dn”,sizeof(  【19】   ));

}

答案:【19】ex

评析:sizeof函数计算已知类型所占的字节数。sizeof(ex)即计算结构体变量ex在内存中所占的字节数。

 

(19)以下程序中,select函数的功能是:在N行M列的二维数组中,选出一个最大值作为函数值返回,并通过形参传回此最大值所在的行下标,请填空。

#define    N    3

#define    M    3

select(int a[N][M],int *n)

{int i,j,row=O,colum=O;

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

for(j=0;j<M;j++)

if(a[i][j]>a[row][colum]){row=i;colum=j;}

*n=row;

retum(  【20】     );

}

main()

{int a[N][M]={9,11,23,6,l,15,9,17,20),max,n;

max=select(a,&n);

printf(”max=%d,line=%d\n”,max,n);

}

答案:【20】a[row][colum]

评析:本题通过判断语句,将较大值的行下标赋给row,列下标赋给colum,循环结束后,a[row][colum]中是数组元素的最大值,所以应该把它的行下标赋给*n,将a[row][colum]的值返回。

    (考试时间120分钟,满分100分)

一、选择题((1)~(10)每小题2分,(11)-(50)每小题1分,共60分)

下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上,答在试卷上不得分。

(1)算法分析的目的是________。

A)找出数据结构的合理性      B)找出算法中输入和输出之间的关系

C)分析算法的易懂性和可靠性  D)分析算法的效率以求改进

答案:D

评析:算法分析是指对一个算法的运行时间和占用空间做定量的分析,一般计算出相应的数掌级,常用时间复杂度和空间复杂度表示。分析算法的目的就是要降低算法的时间复杂度和空间复杂度,提高算法的执行效率。

 

(2)n个顶点的强连通图的边数至少有________。

A)n-1    B)n(n-1)    C)n      D)n+l

答案:C

评析:在有向图中,若任意两个顶点都连通,则称该图是强连通图,这样的有向图的形状是环状,因而至少应有n条边。

 

(3)已知数据表A中每个元素距其最终位置不远,为节省时间,应采用的算法是________。

A)堆排序    B)直接插入排序   C)快速排序  D)直接选择排序

答案:B

评析:当数据表A中每个元素距其最终位置不远,说明数据表A按关键字值基本有序,在待排序序列基本有序的情况.下,采用插入排序所用时间最少,故答案为选项B。

 

(4)用链表表示线性表的优点是________。

A)便于插入和删除操作          B)数据元素的物理顺序与逻辑顺序相同

C)花费的存储空间较顺序存储少  D)便于随机存取

答案:A

评析:链式存储结构克服了顺序存储结构的缺点:它的结点空间可以动态申请和释放;它的数据元素的逻辑次序靠结点的指针来指示,不需要移动数据元素。故链式存储结构下的线性表便于插入和删除操作。

 

(5)下列不属于结构化分析的常用工具的是________。

A)数据流图    B)数据字典    C)判定树    D)PAD图

答案:D

评析:结构化分析的常用工具有数据流图、数据字典、判定树和判定表。而PAD图是常见的过程设计工具中的图形设计。

 

(6)软件开发的结构化生命周期方法将软件生命周期划分成________。

A)定义、开发、运行维护

B)设计阶段、编程阶段、测试阶段

C)总体设计、详细设计、编程调试

D)需求分析、功能定义、系统设计

答案:A

评析:通常,将软件产品从提出、实现、使用维护到停止使用退役的过程称为软件生命周期。它可以分为软件定义、软件开发及软件运行维护三个阶段。

 

(7)在软件工程中,白盒测试法可用于测试程序的内部结构。此方法将程序看做是________。

A)  循环的集合  B)地址的集合  C)路径的集合  D)目标的集合

答案:C

评析:软件的白盒测试方法是把测试对象看做一个打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。

 

(8)在数据管理技术发展过程中,文件系统与数据库系统的主要区别是数据库系统具有________。

A)数据无冗余         B)数据可共享

C)专门的数据管理软件    D)特定的数据模型

答案:D

评析:在文件系统中,相互独立的记录其内部结构的最简单形式是等长同格式记录的集合,易造成存储空间大量浪费,不方便使用。而在数据库系统中,数据是结构化的,这种结构化要求在描述数据时不仅描速数据本身,还要描述数据间的关系,这正是通过采用特定的数据模型来实现的。

 

(9)分布式数据库系统不具有的特点是________。

A)分布式                    B)数据冗余

C)数据分布性和逻辑整体性    D)位置透明性和复制透明性

答案:B

评析:分布式数据库系统具有数据分布性、逻辑整体性、位置透明性和复制透明性的特点,其数据也是分布的;但分布式数据库系统中数据经常重复存储,数据也并非必须重复存储,主要视数据的分配模式而定。若分配模式是一对多,即一个片段分配到多个场地存放,则是冗余的数据库,否则是非冗余的数据库。

 

(10)下列说法中,不属于数据模型所描述的内容的是________。

A)数据结构  B)数据操作    C)数据查询    D)数据约束

答案:C

评析:数据模型所描述的内容有3个部分,它们是数据结构、数据操作和数据约束。数据操作主要是描述在相应数据结构上的操作类型与操作方式;数据模型中的数据约束主要描述数据结构内数据间的语法、语义联系,它们之间的制约与依存关系,以及数据动态变化的规则,以保证数据的正确、有效与胡容。

 

(11)在结构化程序设计中,限制使用goto语句的原因是________。

A)提高程序的执行效率

B)提高程序的清晰性和可靠性

C)便于程序的合成

D)该语句对任何结构的程序都不适用

答案:B

评析:在c语言中,限制使用goto语句,其目的是为了提高程序的清晰性与可靠性,一般来说,除了从多重循环中跳出,一般不使用goto语句。

 

(12)以下选项中合法的实型常数是________。

A)5E2.0    B)E-3    C).2E0    D)1.3E

答案:C

评析:以指数形式表示实数时,字母e(或E)之前必须有数字,且e后面指数必须为整数。

 

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

A)C语言中既有逻辑类型也有集合类型

B)c语言中没有逻辑类型但有集合类型

B)C语言中有逻辑类型但没有集合类型

B)C语言中没有逻辑类型也没有集合类型

答案:B

评析:在c语言中只提供了整型、浮点型、字符型这几种基本类型,c语言没有提供逻辑类型,在c中一般用整型来表示逻辑类型。在自定义类型中,c提供了struct,enum及union类型,但没有提供集合类型,在pascal中提供了集合类型set。

 

(14)已知大写字母A的ASCII码是65,小写字母a的ASCII码是97,则用八进制表示的字符常量’\10l’是________。

A)字符A    B)字符a    C)字符e    D)非法的常量

答案:A

评析:八进制101转换为十进制即为65,而字母A的ASCII码是65,所以用八进制表示的字符常量‘\101’是A。

 

(15)设a和b均为double型常量,且a=5.5、b=2.5,则表达式(int)a+b/b的值是________。

A)6.500000  B)6    C)5.500000    D)6.000000

答案:D

评析:各类数值型数据在进行混合运算时,不同类型的数据要先转换成同一类型,然后进行运算。转换的规则为:总是转换为精度更大的数据类型,字符数据转换为整数,short型转为int型,float型数据在运算时转换成双精度型,以提高运算精度。

 

(16)以下四个选项中不能看作一条语句的是________。

A){;}    B)a=0,b:0,c=0;  C)if(a>0);    D)if(b==0)m=l;n=2;

答案:D

评析:选项A为空语句,选项B是一个由逗号运算符表达式形成的语句,选项c为一个条件语句,选项D有两个分号,是由两个语句构成,不能看成一条语句。

 

(17)已知i、j、k为int型变量,若从键盘输入:1,2,3↙,使i的值为l、j的值为2、k的值为3,以下选项中正确的输入语句是________。

A)scanf(”%2d%2d%2 dtt,&i,&j,&k);

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

C)scanf(”%d,%d,%dfI,&i,&j,&k);

D)scanf(”i=%d,j=%d,k=%d-t,&i,&j,&k);

答案:C

评析:如果在“格式控制”字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符。

 

(18)关于goto语句的使用,下面正确的是________。

A)goto 2;      B)goto g;     C)goto g:;      D)goto 2;

2:exit(0);    g:exit(O);    g:exit(O);    2 exit(0);

答案:B

评析:在c中,goto语句后面的标号的命名规则与c语言中标识符的命名规则相同,在goto语句后面的标号后不要加“:”号,在某一行上添加标号时,在标号的后面要添加“:”号。

 

(19)若有以下程序:

main()

{int k=2,i=2,m;

m=(k+=I*=k);

printf(”%d,%d、n”,m,i);

}

执行后的输出结果是__________。

A)8,6    B)8,3    C)6,4    D) 7,4

答案:C

评析:在赋值符“=”之前加上其它运算符,可以构成复合的运算符。此运算为右结合性,即从右往左计算。I*=k即i=i*k=2*2=4,k=k+i=2+4=6,然后将k的值赋给m。

 

(20)以下函数的功能是:通过键盘输入数据,为数组中的所有元素赋值。

#define N 10

void arrin(int x[N])

{  int i=0;

while(i<N)scanf(”%d”,_________);

}

在下划线处应填入的是_________。

A)x+i    B)&x[i+l]    C)x+(i++)    D)&x[++I]

答案:C

评析:在c中,对于一维数组而言,数组变量表示数组中首元素的的地址。当用scanf函数向数组x的第i个元素中输入整型数据时,只要执行scanf(“%d”x+i):由于要循环输入数组中和各个元素,必须要使其地址值不断自增。故本题答案为c。

 

(21)已有定义:int x=3,y=4,z=5;,则表达式!(x+y)+z-l&&y+z/2的值是_________。

A)6    B)0    C)2    D)1

答案:D

评析:在本题中,运算符的优先级分别为:!>/>+,->&&即:!(3+4)+5-1&&4+5/2=0+5-1&&4+2=4&&6=l。

 

(22)以下选项中,与k=11++完全等价的表达式是__________。

A)k=n,n=n+1    B)n=n+1,l(=n    C)l(=什n    D)k+–n+1

答案:A

评析:n++是自增运算,是先使用,然后再使n加1,分开来写即为:k=n,n=n+l。

 

(23)以下程序运行后,输出结果为__________。

main()

{

int y=18,i=0J,a[8];

do

{a[I]=y%2;i++;y。y/2;

}while(y>。1);

for(j=i一1 0>=00一)

printf(“%d”a[j]);

printf(”\n”);

}

A)10000    B)10010    C)00l10    D)10100

答案:B

评析:分析程序不难得知该程序的功能实际上就是采用除余取整法实现将10进制数据转换成二进制数。对于10进制数18,其转化为二进制数后,结果为10010。

 

(24)以下程序的功能是:按顺序读入10名学生4门课程的成绩,计算出每位学生的平均分并输出,程序如下:

main()

{int n,k;

float score,sum,ave;

sum=0.0;

for(n=1;n<=10;n++)

{for(k=l;k<=4;k++)

{seal3f(”%f”,&score);

sum+=score;

}

ave=sum/4.0;

printf(”NO%d:%fn”,n,ave);

}

}

上述程序运行后结果不正确,调试中发现有一条语句出现在程序的位置不正确。这条    语句是________。

A)sum=O.O;         B)sum+=score;

C)ave=sum/4.0;    D)printf(”NO%d:%fua”,n,ave);

答案:A

评析:题目中要求每位学生的平均分数,首先要求每位学生的总分,也就是程序中的Sum,所以sum应在第一个for循环体内赋初值,如果在循环体外赋初值就会得到所有学生的分数总和,不合题意。

 

(25)下面程序执行后的输出结果是__________。

main()

{

charx=Oxddff;

printf(”%d\n”,x);

}

A)-35    B)-1    C)255    D)-8705

答案:B

评析:由于程序中对字符变量x赋值为0xddff,而字符型变量只占一个字节,故实际存入c单元的为该16进制的低字节部分,即ff。对该数按整型格式输出,其结果为-1。

 

(26)有以下程序

main()

{ int a=15,b=21,m=O;

switch(a%3)

{ case O:m++;break;

case l:m++:

switch(b%2)

{ default:m++;

case O:m++;break;

}

}

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

}

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

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

答案:A

评析:因为a%3是个常数,所以只执行一次就跳出switch结构。即只执行m++,此时m为1。

 

(27)若有说明:int n=2,*p=&n,*q=p;,则以下非法的赋值语句是_________。

A)p=q;    B)*p=*q;        C)n=*q;    D)p*n;

答案:D

评析:指针变量不同于整型变量和其它类型的变量,它是用来存放地址(指针)的,不能将一个整型量(或任何其它非地址类型的数据)赋给一个指针变量,这样的赋值是不合法的。

 

(28)已定义以下函数:

fun(char*p2,char*p1)

{while((*p2=*p1)!=’\0’){pl++;p2++;}}

函数的功能是__________。

A)将p1所指字符串复制到p2所指内存空间

B)将pl所指字符串的地址赋给指针p2

C)对p1和p2两个指针所指字符串进行比较

D)检查p1和p2两个指针所指字符串中是否有’\O’

答案:A

评析:由于在while循环的条件中执行了*p2=*pl运算,其作用是将*pl中的内容复制到*p2中,而(*p2=*p1)!=‘\0’的作用是判断当前字符是否为字符串结束字符‘\O’。在循环体中p1++,p2++的目的是移动字

 

(29)有以下程序

void fun(char*c,int d)

{*c=*c+1;d=d+1;

printf(”%c,%c,”,*c,d);

}

main()

{char a:。A’,b。’a’;

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

)

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

A)B,a,B,a    B)a,B,a,B    C)A,b,A,b    D)b,B,A,b

答案:D

评析:将a,b代入函数得+&b=。&b+1=a+l=b,所以打印出第一个字母b;

a=a+l=A+l=B,打印出第二个字符B;

a=‘A’,输出字母A;

b由于是按地址传到函数而被修改,为‘b’,输出字母b

 

(30)以下程序中函数sort的功能是对a所指数组中的数据进行由大到小的排序。

void sort(int a[],im n)

{intiJ,t;

for(i=O;i<n-1;i++)

for=i+1 0<n0++)

if(a[i]<aD))  {t=-a[I];a[I=a[j];a[j]=t;}

}

main()

{int aa[10]:{1,2,3,4,5,6,7,8,9,10},i;

sort(&aa[3],5);

for(i=0;i<lO;i++)primf(”%d,”,aa[I]);

printf(”\n”);

)

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

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

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

答案:C

评析:本题并不是对数组的所有元素进行排序,而是对从a[3]开始往后的4个元素进行排序。

 

(31)对于基类型相同的两个指针变量,不能进行的运算是________。

A)<    B)=    C)+    D)

答案:C

评析:对于指针变量,除了常规的*、&、=运算外,还可以对其比较地址的大小,计算两指针变量的差值,但对于地址执行+、*、/、%等算术运算都是无意义的。

 

(32)有以下程序

main()

{char a[]={‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g’,‘h’,‘\O’};int I,J;

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

printf(”%d,%d\n”,I,J);

}

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

A)9,9    B)8,9    C)1,8    D)9,8

答案:D

评析:sizeof()函数是计算字符数组的长度,因为‘\0’也是一个字符,要计算在内。strlen()是计算字符串长度的函数,遇到‘\0’即认为是字符串结束,不把空字符计入字符串的长度。

 

(33)以下不能正确定义二维数组的选项是_________。

A)int a[2][2]={{1},{2}}    B)int a[][2]={l,2,3,4}

C)int a[2][2]={{l},2,3}    D)int a[2][]={{1,2},{3,4}}

答案:D

评析:在二维数组进行初始化时,可以省略数组的一个维度,但省略的维数只能是高维部分,不能是低维。对于多维数组的初始化时,也是同样处理,因此,本题答案应选D,其它选项均能对数组进行正确的初始化。

 

(34)有一函数

┏   l x>O

y=┨   O x=O

┗  -1 x<O

以下程序段中不能根据x的值正确计算出y的值的是___________。

A)if(x>O)y=l;else if(x==O)y=0;else y=-l;

B)y=O;if(x>O)y=1;else if(x<O)y=-1;

C)y=0;if(x>=0)if(x>O)y=1;else y=-l;

D)if(x>=0)if(x>O)y=l;else y=O;else y=-1;

答案:C

评析:本题应当注意if与else的配对关系。从最内层开始,else总是与它上面最近的(未曾配对的)if配对。

 

(35)以下程序中的函数reverse的功能是将a所指数组中的内容进行逆置。

void reverse(int a[],im n)

{int i,t;

for(i=O;i<n/2;i++)

{t=a[i];a[i]=a[n-l-i];a[n-1-i]=t;}

}

main()

{int b[10]={1,2,3,4,5,6,7,8,9,10};int i,s=0;

reverse(b,8);

for(i=6;i<10;i++)s+=b[I];

printf(”%d\n”,s);

}

程序运行后的输出结果是

A)22    B)10    C)34    D)30

答案:A

评析:本题并不是将整个数组中的内容逆置,而是逆置前8个元素。逆置后的数组为:8,7,6,5,4,3,2,1,9,10通过for循环计算b[6]+b[7]+b[8]+b[9]即2+1+9+10=22。

 

(36)执行下面的程序段后,变量k的值为___________。

int k=3,s[2];

s[0]=k;k=s[1]*10;

A)不确定    B)33    C)30    D)10

答案:A

评析:由于本题中未对数组进行初始化,因此程序运行时,数组s中各个元素的值都是不确定的,虽然在代码中对s[O]进行了赋值,但没有对s[1]进行赋值,故执行l(=s[1]+10;后,k的值不确定。

 

(37)有以下程序

#include<string.h>

main()

{ char‘p=”abcde\0fghjik\O”;

printf(”%d\n”,strlen(p));

}

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

A)12    B)15    C)6    D)5

答案:D

评析:“\0”是字符串结束标志,当遇到此标志时字符串已结束。所以字符串的长度为5。

 

(38)程序中头文件t)rpel_h的内容是:

#define N 5

#define Ml N*3

程序如下:

#include”type 1.h”

#define M2 N*2

main()

{ int i;

i=MI+M2;

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

}

程序编译后运行的输出结果是_________。

A)lO    B)20    C)25    D)30

答案:C

评析:宏定义就是用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为:

#define    标识符      字符串

这种方法使用户能以一个简单的名字代替一个长的字符串,因此把这个标识符(名字)称为“宏名”。

 

(39)若有以下的程序段,则在执行for语句后,*(*(pt+1)+2)表示的数组元素是________。

int t[3][3],*pt[3],k;

for(k=0;k<3;k++)pt[k]=&t[k][O];

A)t[2][0]    B]t[2][2]    C]t[1][2]    D]t[2][1]

答案:C

评析:在题面中定义了一个二维数组l,及一个一维指针数组pt,在循环语句中分别对指针数组赋值为二维数组t的第k行首元素的地址。*(pt+1),表示的是数组pt中下标为1的元素的值,而该值为二维数组t的第l行(从第0行算起)的首元素的地址,故*(*(pt+1)+2)表示的是数组t中t[1][2]的元素的值。

 

(40)以下叙述中错误的是_________。

A)二进制文件打开后可以先读文件的末尾,而顺序文件不可以

B)在程序结束时,应当用fclose函数关闭已打开的文件

C)利用fread函数从二进制文件中读数据,可以用数组名给数组中所有元素读入数    据

D)不可以用FILE定义指向二进制文件的文件指针

答案:D

评析:每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息,这些信息是保存在一个名为FILE的结构体类型的结构体变量中的。而文件又分为ASCII文件和二进制文件,所以,、可以用FILE定义指向二进制文件的文件指针。

 

(41)有以下程序

#include<string.h>

main(int argc,char *argv[])

{ inti,len=0;

for(i=1;i<argc;i++)len+=strlen(argv[I]);

printf(”%d\n”,len);

)

程序编译连接后生成的可执行文件是exl.exe,若运行时输入带参数的命令行是:

exl   abcd   efg   10↙

则运行的结果是________。

A)22    B)17    C)12    D)9

答案:D

评析:本题主函数带有两个参数,一个int型变量argc,另一个是char型的一维一级指针数组argv。当主函数被执行时,系统自动将根据命令行的情况,分别给主函数的两个参数赋值。argc用于存放命令行中命令字和参数的总和的个数4,argv用来存放命令行中命令字和所有参数的字符串,并规定argv[0]存放命令字字符串exl,argv[1]用来存放第一个参数的字符串abcd,argv[21用来存放第二个参数的字符串e龟,argv[3]用来存放第三个参数的字符串10。那么for循环将循环3次分别将argv数组中元素的长度累加到len中,所以答案为9。

 

(42)若有以下说明和定义:__________。

fun(*C){…}

main()

{int(*a)()=fun,(*b)(),w[10],c;}

在必要的赋值后,对fun函数调用正确的是_________。

A)a=a(w);    B) (*a)(&C);    C)b=*b(w);    D)fun(b);

答案:B

评析:在主函数中定义了二个指向函数的指针a,b,其中指针a指向函数fun,指针b未初始化。对于选项A、c,其返回类型是错误的,对于D,其调用的参数是错误的,选项B是正确的,其相当于调用函数fhll(&C);。

 

(43)有以下程序

intfa(intx、

{returnx*x;}

int fb(intxl

{returnX*X*x;}

int f(int(*f1)(),int(*f2)(),int x)

{return f2(x)-fl(x);)

main()

{ int i;

i=f(fa,fb,2);printf(”%d\n”,i);

}

程序运行后的输出结果是

A) 4    B)1    C)4    D)8

答案:C

评析:f[fa,fb,2]即为fb(2)-fa(2)=2*2*2-2*2=8-4=4。

 

(44)有以下程序

void ss(char *s,char t)

{while(*s)

{ if(*s==t)*s=t-’a’+’A’;

s++:

}

}

main()

{char strl[100]=”abcddfefdbd”,c=’d’;

ss(strl,C);  printf(”%s\n”,strl);

}

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

A)ABCDDEFEDBD    B)abcDDfefDbD

C)abcAAfefAbA    D)Abcddfefdbd

答案:B

评析:在主函数中因为c被赋值为字符’d.,所以函数的功能是将字符串中d字母转换为大写。

 

(45)下面程序运行后的输出结果是__________。

intf()

{

static int i=O:

int s=l:

s+=i;i++;

return s:

}

main()

{

inti,a=0;

for(I=0;i<5;i++)a+=f();

printf(”%dha”,a);

)

A)20    B)24    C)25    D)15

答案:D

评析:在主函数main中,当I=0时,f()返回1;当I=1时,f()中保留前次执行后的i,返回2,i为n时;f()返回n+l,,在主函数main中一共调用了5次f(),其返回值分别是1,2,3,4,5,对各次的返回值进行累加,其和为15。

 

(46)设有如下定义:

struct sk

{int a;

float b:

}data;

int*p;

若要使p指向data中的a域,正确的赋值语句是_________。

A)p=&a;    B)p=data.a;    C)p=&data.a;    D)*p。data.a

答案:C

评析:将data.a的起始地址赋给指针变量p,也就是使p指向data.a。

 

(47)有以下程序

#include<stdlib.h>

struct NoDE

{int num;struct NoDE。next;}

main()

{struct NODE *p,*q,*r;

p=(struct NoDE*)malloc(sizeof(struct NODE));

q=(struct NODE*)malloc(sizeof(struct NODE));

r==(struct NODE*)malloc(sizeof(struct NODE));

p->num=10;q->num=20;r->num=30;

p->next=q;q->next=r;

pdntf(“%dn”,p->num+q->next->num);

}

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

A)10    B)20    C)30    D)40

答案:D

评析:p->num即为10,q->next->num即为r->num,为30,所以p->num+q->next=>num=10+30=40。

 

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

typedef int *INTEGER

INTEGER p,*q;

以下叙述正确的是________。

A)p是int型变量              B)p是基类型为int的指针变量

C)q是基类型为int的指针变量  D)程序中可用INTEGER代替int类型名

答案:B

评析:typedef int*INTEGER;(声明INTEGER为整型指针类型):

INTEGER p,*q;(定义p,*q为整型指针类型),所以p是基类型为int的指针变量;*q是基类型为int的指针变量;程序中可用*INTEGER代替int类型名。

 

(49)有以下程序

main()

{unsigned char a,b,c;

a=0x3;b=a︱0x8;c=b<<l;

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

}

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

A)-11  12    B)-6 -13    C)12  24    D)l1  22

答案:D

评析:0x3表示16进制表,“︱”为按位或,“<<”为按位左移,将a,b转换为二进制数进行位运算,再将结果以十进制打印出,结果为11  22。

 

(50)以下程序中函数f的功能是将n个字符串,按由大到小的顺序进行排序。

#include<string.h>

void f(char p[][lO],int n)

{chart[201;int ij;

for(i=0;i<n-1;i++)

for 0=i+l;j<n;j++)

if[strcmp(p[i],p[j])<O]

{strcpy(t,p[i]);strcpy(p[i],pD)};strcpy(p[j],t);)

}

main()

{char p[][10]={“abc”,”aabdfg”,”abbd”,”dcdbe”,”cd”};int i;

f(p,5);print”%d\n”,strlen(p[0]));

}

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

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

答案:C

评析:比较字符串的大小是从字符串的第一个字母开始比较,如果第一个字母相同则比较第二个字母,以此类推,直至字符串结束。

 

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

请将每一个空的正确答案写在答题卡的【l】至【20】序号的横线上,答在试卷上不得    分。

(1)测试的目的是暴露错误,评价程序的可靠性;而  【1】  的目的是发现错误的位置并    改正错误。

答案:【1】调试

评析:软件测试的目标是在精心控制的环境下执行程序,以发现程序中的错误,给出程序可靠性的鉴定:调试是一个与测试有联系又有区别的概念。具体来说,测试的目的是暴露错误,评价程序的可靠性,而调试的目的是发现错误的位置,并改正错误。

 

(2)在最坏情况下,堆排序需要比较的次数为  【2】 

答案:【2】O(nlog2n1)

评析:在最坏情况下,冒泡排序所需要的比较次数为n(n-1)/2;简单插入排序所需要的比较次数为n(n-1)/2;希尔排序所需要的比较次数为O(n^1.5);堆排序所需要的比较次数为O(nlog2n)。

 

(3)若串s=”Program,,,则其子串的数目是  【3】 

答案:【3】29

评析:串s中共有7个字符,由于串中字符各不相同,则其子串中字符个数为0的串有1个,即空串;字符个数为1的字符串有7个;字符个数为2的字符串有6个;字符个数为3的字符串有5个;字符个数为4的字符串有4个;字符个数为5的字符串有3个;字符个数为6的字符串有2个;字符个数为7的字符串有1个;共有1+2+3+4+5+6+7+1=29。

 

(4)一个项目具有一个项目主管,一个项目主管可管理多个项目,则实体””项目主管””与实体””项目””的联系属于  【4】  的联系。

答案:【4】l对多或1:N

评析:两个实体集间的联系实际上是实体集间的函数关系,这种函数关系可以有3种,即一对一(1:1)的联系、一对多(1:N)或多对一(N:1)的联系和多对多(N:N)的联系。

 

(5)数据库管理系统常见的数据模型有层次模型、网状模型和  【5】  三种。

答案:【5】关系模型

评析:数据库管理系统是位于用户与操作系统之间的一层系统管理软件,是一种系统软件,是用户与数据库之间的一个标准接口,其总是基于某种数据模型,可以分为层次模型、网状模型和关系模型。

 

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

main()

{ int x=10,y=20,t=O;

if(x==y)t=x;x=y;y=t;

printf(”%d,%d\n”,x,y);

}

答案:【6】20,0

评析:在本题给出的程序中,if条件为假,不执行t=x;语句,而去执行x=y;和y=t;语句,所以打印出x的值为20,y的值为0;但是如果程序这样写{t=-x;x=y;y=t;},那么就是实现x与y的交换。

 

(7)若已知a=20,b=lO,则表达式!a>b的值为  【7】 

答案:【7】O

评析:c语言中逻辑运算符按由高到低顺序依次为:逻辑非(!)、算术运算符、关系运算符、逻辑与(&&)和逻辑或(1f)、赋值运算符。所以表达式!a>b先运算!a的值为0,再运算0>b,所以结果为0。

 

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

main()

{intx=15;

while(x>10&&x<50)

{x++;

if(x/3){x++;break;)

else continue;

}

print(”%d\n”,x);

}

答案:【8】17

评析:当x=15时,while条件为真,执行x++;,这时x的值为16,if条件为真,执行x++:后跳出循环体,此时x的值为17a

 

(9)有以下程序:

#include<stdio.h>

main()

{charc;

while((c=getchar())!d?。)putchat(–C);

}

程序运行时,如果从键盘输入:Y?N?↙,则输出结果为  【9】 

答案:【9】X

评析:getchar()只能接收一个字符,当从键盘输入Y?N?↙,系统判断出第一个字符Y!=‘?’条件为真,输出x,继续循环,这时while条件不成立,循环结束。

 

(10)以下函数的功能是计算s=1+1/2!+1/3!+……+l/n!,请填空。

double fun(int n)

{double s=0.0,fac=1.O;int i;

for(i=1;i<=n;i++)

{ fac=fac   【10】 

s=s+fac;

}

return s;

}

答案:【10】/i或*1.0/i或*1/I或*(1.0/i)或/(double)i

评析:该程序实现的功能是求各个因式的和,观察表达式可以看出,只要将i的值的倒数乘以fac就得到每个因式的值。

 

(11)下面程序的运行结果是:  【11】 

#define N 10

#define s(x)X*X

#define f(x)(x*x)

main()

{int i1,i2;

il=1000/s(N);i2=1000/f(N);

printf(”%d%d\n”,t1,i2);

}

答案:【11】1000 10

评析:根据宏定义,变量i1的值为1000/10*10=1000,变量i2的值为1000/(10*lO)=lO

 

(12)以下程序的运行结果是 【12】 

main()

{

static int a[]={l,2,3,4};

int iJ=2;

for(I=l;i<3;i++)

{n(a);J++;}

printf(%d,%d\n”,a[0],J);

}

f1(int a[4])

{

int I,J=l;

for(I=1;i<4;i+|+)

a[I-1]=a[I];

j++;

}

答案:【12】3,4

评析:用static对局部变量声明,则为该变量分配的空间在整个程序执行期间始终存在。n函数中定义的变量为局部变量,主函数中j的初值为2,循环执行了两次,所以j=4。主函数通过对n的调用输出原数组a[3]的值。

 

(13)下面程序的运行结果是: 【13】 

typedef union student

{char name[10];

long sno;

char sex;

float score[4];

}STU;

main()

{STU a[5];

primf(”%d\n”,sizeof(a));

}

答案:【13】80

评析:共用体变量所占的内存长度等于最长的成员的长度,所以变量、STU所占的字节数等于其成员score[4]所占的字节数,即为16个字节,最终打印出共用体数组a[5]的长度为J6*5=80。

 

(14)若f1)已正确定义为一个文件指针,d1.dat为二进制文件,请填空,以便为”读”而打开此文件:f1):fopen(【14】  );。

答案:【14】“d1.dat”.“rb”

评析:ANSIC规定了标准输入输出函数库,用fopen()函数来实现打开文件,其调用方式为(fb已定义为一个文件指针):fb=fopen(文件名,使用文件方式)。

 

(15)以下程序的功能是将无符号八进制数构成的字符串转换为十进制的整数,请填空。

#include<stdio-b>

main()

{

char*p,s[6];

int n:

p=s;

gets(p);

n=*p-‘0’;

while(【15】  !=’\0’)n=n*8+*p-’0’;

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

}

答案:【15】*++D

评析:本题中,主要是通过将8进制数各位上的数乘以对应位的权值,然后累加转换成10进制数的。在程序中,n=*p-‘0’,用于将8进制字符串的最高位转换成10进制字符。在while循环中,通过不断对已转换的10进制数*8+*p-‘0’形成新的10进制数。由于在该循环中没有其它地方对指针p的值进行更改,要实现对8进制字符串的遍历,必须要对其进行自加,而在循环的外面己处理了第1个8进制字符,故应该是采用先自加的形式,同时要对自加后的p所对应的字符进行判断以确定该字符串是否结束,故该空应填*++p。

 

(16)设有定义:int n,*k=&n;,以下语句将利用指针变量k读写变量n中的内容,请将语    句补充完整。

scanf(”%d”,【16】);

printf(“%d”,【17】);

答案:【16】k

【17】*k

评析:本题中的笫一空,要求输入变量n的地址,而指针变量k指向整型变量n,故填写k.第二空要求打印输出变量n的值,应该填入*k。

 

(17)以下程序的功能是:从键盘输入一行字符,存入一个字符数组中,然后输出该字符    串,请填空。

#include<ctype.H>

#include<stdio.h>

main()

{

char str[8l],*sptr;

int i:

for(I=0;i<80;i++)

{  str[I]=getchar();

if(str[I]==’\n’)break;

}

str[i]=【18】 

sptr=str;

while(*sptr)putchar(*sptr【19】 );

}

答案:【18】0或NULL

【19】++

评析:在for循环中,其作用是直接从标准输入设备获取字符,直到遇到回车符结束。由于在while循环输出字符时,是根据*sptr来判断字符串是否结束,故在字符串的结束部分必须添加上字符‘\0’。对于第二空,要实现对字符串的遍历,必须要进行自加操作,以使下次访问时能够访问下一个字符,故第二空应为++。

 

(18)fun函数的功能是:首先对a所指的N行N列的矩阵,找出各行中的最大的数,再求这N个最大值中的最小的那个数作为函数值返回。请填空。

#include<stdio.h>

#define N 100

int fun(im(*a)[N])

{ int row,col,max,min;

for(row=0;row<N;row++)

{for(max=a[row][0],col=1;coI<N;col++)

if(【20】]max=a[row][col];

if(row==0)min=max;

else if(max<min)min=max;

}

retummin;

}

答案:【20】max<a[row][col]或max<=a[row][col]或a[row][col]>max或a[row][col]>=max

评析:本题空格所在的if条件要求判断出每一行中的最大数,应该填写条件max<a[row][col]。

评论列表
文章目录