2011年全国计算机等级考试二级C语言预测试题

更新时间:2023-04-06 13:57:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

2011年全国计算机等级考试二级C语言预测试题

试卷一

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

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

(1)算法的空间复杂度是指________。

A)算法程序的长度B)算法程序中的指令条数

c)算法程序所占的存储空间D)算法执行过程中所需要的存储空间

答案:D

评析:一个算法的空间复杂度,一般是指执行这个算法所需的内存空间。

一个算法所占用的存储空间包括算法程序所占的空间、输入的初始数据所占的存储空间以及算法执行过程中所需要的额外空间。

(2)下列关于栈的叙述中正确的是________。

A)在栈中只能插入数据B)在栈中只能删除数据

C)栈是先进先出的线性表D)栈是先进后出的线性表

答案:D

评析:栈是限定在一端进行插入与删除的线性表。

栈是按照"先进后出"的或"后进先出"的原则组织数据的,因此,栈也被称为"先进后出"表或"后进先出"表。

(3)在深度为5的满二叉树中,叶子结点的个数为________。

A)32B)31C)16D)15

答案:C

评析:所谓满二叉树是指除最后一层外,每层上的所有结点都有两个子结点。也就是说,在满二叉树中,每一层上的结点数都达到最大值,即在满二叉树的第K层上有2K-1个结点,且深度为m的满二叉树有2m个结点。

在满二叉树中,最后一层的结点个数就是叶子结点的个数,本题中深度为5,故叶子结点数为25-1=2 4=16。

(4)对建立良好的程序设计风格,下面描述正确的是________。

A)程序应简单、清晰、可读性好B)符号名的命名要符合语法

c)充分考虑程序的执行效率D)程序的注释可有可无

答案:A

评析:要形成良好的程序设计风格,主要应注重和考虑下述一些因素:符号名的命名应具有一定的实际含义,以便于对程序功能的理解;正确的注释能够帮助读者理解程序;程序编写应优先考虑清晰性,除非对效率有特殊要求,程序编写要做到清晰第一,效率第二。

(5)下面对对象概念描述错误的是________。

A)任何对象都必须有继承性B)对象是属性和方法的封装体

C)对象间的通讯靠消息传递D)操作是对象的动态性属性

答案:A

评析:对象是由数据和容许的操作组成的封装体,与客观实体有直接的对应关系。对象之间通过传递消息互相联系,以模拟现实世界中不同事物彼此之间的联系。

(6)下面不属于软件工程的3个要素的是________。

A)512具B)过程C)方法D)环境

答案:D

评析:软件工程包括3个要素,即方法、工具和过程。

(7)程序流程图(PFD)中的箭头代表的是________。

A)数据流B)控制流C)调用关系D)组成关系

答案:B

评析:程序流程图(PFD)是一种传统的、应用广泛的软件过程设计表示工具,通常也称为程序框图,其箭头代表的是控制流。

(8)在数据管理技术的发展过程中,经历了人工管理阶段、文件系统阶段和数据库系统阶段。其中数据独立性最高的阶段是________。

A)数据库系统B)文件系统c)人工管理D)数据项管理

答案:A

评析:在数据管理技术的发展过程中,经历了人工管理阶段、文件系统阶段和数据库系统阶段。其中数据独立性最高的阶段是数据库系统。

(9)用树形结构来表示实体之间联系的模型称为________。

A)关系模型B)层次模型C)网状模型D)数据模型

答案:B

评析:层次模型是最早发展出来的数据库模型。它的基本结构是树形结构,这种结构方式在现实世界中很普遍,如家族结构、行政组织机构,它们自顶向下、层次分明。

(10)关系数据库管理系统能实现的专门关系运算包括________。

A)排序、索引、统计B)选择、投影、连接

C)关联、更新、排序D)显示、打印、制表

答案:B

评析:关系数据库管理系统能实现的专门关系运算,包括选择运算、投影运算、连接运算。

(11)下列语句中符合C语言语法的赋值语句是________。

A)a--7+b+c--a+7B)a=a+7

C)a=7+b,b++,a+7;D)a=7+b,c=a十7;

答案:D

评析:由于赋值语句是由赋值表达式加分号构成,所以选项A、B均不是合法的赋值语句;选项c中,存在两种运算符:逗号运算符和赋值运算符,其中赋值运算符的优先级高,选项c也不是。

(12)下面程序

main()

{int y=9;

for(;y>O;y--i){

if (y%3==O)

{printf("%d",--y);

continuei

}

}

}

的输出是________。

A)741B)852C)963D)875421

答案:B

评析:"%"是求余运算符,所以if判断语句中实际是指出只有当y可以被3整除时方可以继续;--y 是先进行y的自减运算,再使用y值。所以,最后的打印结果应当为"852"。

(13)下列四个叙述中,错误的是________。

A)C语言中的关键字必须小写

B)c语言中的标识符必须全部由字母组成

C)c语言不提供输入输出语句

D)C语言中的注释行可以出现在程序的任何位置

答案:B

评析:c语言规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线。

(14)下面程序

main()

{

int a=-l,b=4,k;

k=(a++<=0)&&(!(b一一<=O));

printf("%d%d%d\n",k,a,b);

}

的输出是________。

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

答案:C

评析:a++是先使用a值再将a的值加1,b--是先使用b的值再将b的值减1,所以题中的逻辑运算表达式的值应当为真,即为1,而经过运算后,a和b的值已经分别变成0和3了。

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

A)预处理是指完成宏替换和文件包含中指定文件的调用

B)预处理也是C语句

C)C源程序中,凡是行首以挣标识的控制行都是预处理指令

D)预处理就是完成c编译程序对c源程序的第一遍扫描,为编译的词法分析和语法分析作准备

答案:C

评析:预处理功能主要有以下三种:宏定义、文件包含和条件编译,所以A不正确。预处理不是c语句,所以B不正确。预处理命令是由ANSI c统一规定的,编译程序不能识别它们,D也不正确。

(16)下面的程序片段

y=-l;

If(x!=0)

If(x>0) y=1;else y=0;

所表示的数学函数关系是_________.

-1(x

A)y=0 (x=0)B)y=-1(x=0)

1 (x>0)0 (x>0)

0 (x<0)-1 (x<0)

C)y=-1(x=O)D)y=l (x=O)

1 (x>O)0 (x>O)

答案:C

评析:本题的考查点是根据程序写出数学函数关系。

题中的两个判断语句实际上指出了y取值的条件,即是当x大于零时y取l;当x小于零时y取0;当x等于零时y值不变,为-1。

(17)下面的程序

main()

{int x=3,y=O,z=O;

if(x=y+z)printf("* * * *");

else printf("####");

}

_________。

A)有语法错误不能通过编译

B)输出* * * *。

c)可以通过编译,但是不能通过连接,因而不能运行

D)输出####

答案:D

评析:本题的考查点是运算符在表达式中的处理原则。

本题中把y+z的值赋给x,由于y和z都等于0,所以x的值也为0,表达式值为false,输出撑撑撑撑。if语句中if后面的表达式一般为逻辑或关系表达式,但也可以是任意的数值类型。

(18)在c语言中,合法的长整型常数是________。

A)OL B)4962710C)04312765D)0xa34b7fe

答案:A

评析:在一个整常量后面加一个字母l或L,则认为是long int型常量。

(19)下面函数

int funl(char*x)

{ char*y=x;

while(*y++);

return(y-x-1);

}

的功能是__________。

A)求字符串的长度B)比较两个字符串的大小

C)将字符串x复制到字符串y D)将字符串x连接到字符串y后面

答案:A

评折:本题的考查点是while()循环语句。

本题首先要注意的是对*y++的运算,由于++和*为同一优先级别,且结合方向为自右向左,因此它相当于*(y++)。由于++在y的右侧,是"后加",因此先对y的原值进行*运算,然后使y的值改变。

(20)设int i=2j=l,k=3,则表达式i&&(i+j)&k︱i+j的值是________。

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

答案:C

评析:本题表达式中优先级顺序从高到低为括号、+、&、︱、&&。

(21)已知字母A的ASCII码为十进制的65,下面程序

main()

{char chl,ch2;

chl='A'+'5'-'3':

ch2='A'+'6'-'3':

printf("%d,%Cn",chl,ch2);

}

的输出_________。

A)67,D B)B,C C)C,D D)不确定的值

答案:A

评析:由于字符"5"和"3"的ASCII码相差为2,所以ch1过运算后的值应为65+2=67;同理,ch2经过运算后的值应为65+3=68,即是字符"D"。

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

#include

main()

{

int a,b,d=24l:

a=d/l00%9;

b=(-1)&&(-1);

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

}

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

答案:B

评析:第一个表达式中,运算的方向是从左至右,所以a的值为2;第二个表达式中,等式右边是一个逻辑表达式,由于结果为真,所以表达式的值为l,即b为1。

(23)下列选项中非法的表达式是________。

A)0<=x<100B)I=j==0C)(char)(65+3)D)x-t-l=x+l

答案:D

评析:值表达式的左侧不能为常量或表达式,所以D是非法的表达式。

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

#include

main()

{

print刖%~n",NULL);

}

A)不确定的(因变量无定义)B)0

C)-l D)l

答案:B

评析:NULL在c编译器中是一个值为0的常量,它的定义在头文件"stdio.h"中,本题的程序在一开始就包含了这个头文件',所以,在打印的时候,将打印出0。

(25)在下面的语句中,赋值语句错误的是________。

A)a=(b=(c=2,d=3));B)i++:

C)a--a/b=2;D)a=a

答案:C

评析:c语言中的赋值号"="是一个运算符;②赋值语句是由赋值表达式加上一个分号构成。赋值表达式的左侧不能为常量或表达式。

(26)以下程序的输出结果是________。

main()

{int k=4,m=1,p;

p=func(k,m);printf("%d,",p);

p=func(k,m);printf("%d\n",p);

}

func(int a,int b)

{static int m:O,i=2;

i+=m+l;m=i+a+b;

return(m);

}

A)8,17B)8,16C)8,20D)8.8

答案:A

评析:k和m的值带入函数func中,第一次调用完func()后,其中m和i的值要保留,并在第二次调用时使用,这是因为两者都是局部静态变量。所以最后的结果是8和17。

(27)以下程序调用findmax函数求数组中值最大的元素在数组中的下标,请选择填空:

#include

findmax(int*s,int t,int*k)

{int p;

for(p=0,*k=p;p

if(s[p]>s[*k])___________;

}

main()

{int a[10],i,k;

for(i=0;i<10;i++)scanf("%d",&a[I]);

findmax(a,lO,&k);

printf("%d,%d\n",k,a[k]);

}

A)k=p B)*k=p-s C)k=p-s D)*k=p

答案:D

评析:k是一个指针,它的值是一个地址,要通过它为主函数的变量改变数据,必须使用*p,这样就可以把一个下标数赋给p指针指向的那个内存单元,所以横线处应填入*k=p。

(28)在执行以下程序时,为了使输出结果为t=4,给a和b输入的值应该满足的条件是_________。

main()

{

int s,t,a,b;

scanf("%d%d",&a,&b);

s=l;t=I;

if(a>O)s=s+1;

if(a>b)t=s+t;

else if(a==b)t=5;

else t=20s:

printf("t=%d\n",t);

}

A)a>b B)ab

答案:C

评析:要使输出结果为t=4,必须要执行else t=2*s;和if(a>b)t=s+t;语句。如果执行if(a>b)t=s+t;语句,则条件为a>b,要求s=3,在该语句前面的语句中没有条件可以满足s=3;如果执行else t=2*s;语句,则条件为aO)s=s+l;语句,所以应满足条件0

(29)以下函数调用语句中含有_________个实参。

func((expl,exp2),(exp3,exp4,exp5));

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

答案:B

评析:实参可以是常量、变量或表达式,(expl,exp2)是逗号表达式,它的值是exp2的值;(exp3,exp4, exp5)是逗号表达式,它的值是exp5的值。所以该函数调用语句含有的实参个数是2,即:(expl,exp2)和(e xp3,exp4,exp5)。

(30)执行以下程序后,输出的结果是__________。

main()

{

int y=10;

do{y--;}while(--y);

printf("%d\n",y--);

}

A)一l B)l C)8D)0

答案:D

评析:do-while语句的特点是先执行循环体,然后判断循环条件是否成立,当循环条件的值为0时循环结束。当y=O时循环结束,printf("%d\n",y--);语句是先输出y再自减,所以输出结果为0。

(31)在C语言中,要求运算数必须是整型的运算符是__________。

A)%B)/C)

答案:A

评析:题目的四个选项中,(B)(c)(D)都不要求运算数必须为整数,参与模运算(%)的运算数必须是整型数据。

(32)c语言提供的合法的数据类型关键字是__________。

A)DoubIe B)noat C)integer D)Char

答案:B

评析:选项A和D中第一个字母大写,不正确;

选项c是PASCAL中的整型关键字,不是c语言中的关键字。

(33)设有以下定义:

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

int(*ptr)[3]=a,*p=a[0];

则下列能够正确表示数组元素a[1][2]的表达式是___________。

A)*((*ptr+1)[2])B)*(*(p+5))

C)(*ptr+1)+2D)*(*(a+1)+2)

答案:D

评析:+(p+5)所指向的数组元素是a[1][2],所以B不对;ptr所指向的是一个含有三个元素的一维数组,所以A和C是错误的。

(34)若有以下说明:

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

则值为6的表达式是__________。

A)*p+6B)*(p+6)C)*p+=5D)p+5

答案:C

评析:选项A,*p+6,其值等于1+6=7;选项B,*(p+6),其值等于a[6]=7;选项c,*p+=5,其值等于*p=*p+5=l+5=6;选项D,p+5是个地址值。

(35)下列程序的输出结果是__________。

fun()

{

static int x=5:

if(x++>5)printtf("%dft,x);

else printf("%d.',)汁+);

}

mainO

{

fun();fun();

}

A)67B)69C)68D)78

答案:C

评析:模块的代码开始运行后,使用static语句声明的变量会一直保持其值,直至该模块复位或重新启动。在第1次调用fun函数时,x的初值为5,if语句的条件不成立,执行else printf("%d"x++);语句,输出6,执行后x的值变为7,由于x是静态局部变量,在函数调用结束后,它并不释放,仍保留x=7。在第2次调用fun函数时,if语句的条件成立,执行print掣%∽x);语句,输出8。

(36)下面程序的输出是__________。

main()

{

int m=Oxa,n=2;

m+=n:

printf(""%x\n"",m);

}

A)C B)c C)99D)2

答案:A

评析:格式控制符x表示数据按十六进制形式输出(不输出前导符0x)。本题在执行语句m十一n:后,m的值变为字母c,又因为在输出a-f时,如果格式控制符用x,则以大写字母输出;如果用x,则以小写字母输出,故本题答案为A。

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

#include

main()

{char*a="abcdefghi";int k;

fun(a);puts(a);

}

fun(char*s)

{intx,y;char c;

for(x=O,y=strlen(s)-l;x

{ C=S[y];s[y]=s[x];s[x]=c;}

}

A)ihgfedcba B)abcde电hi C)abcdedcba D)ihgfefghi

答案:A

评析:观察子函数fun()可知,它是实现一个数组首末元素位置互相依次交换。联系主函数,可以看出,是对字符串中的元素依次进行首末位置的对调。

(38)设有如下函数定义,则输出结果为_________。

Char*fun(char*str)

{

char*p=str;

while(*p)

{if(*p>'d')continue;

p++;

}

return p;

}

main()

{

printF%s\n",fun("welcome!"));

}

A)welcome B)come!C)w D)程序进入死循环

答案:D

评析:continue语句的作用是用于结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。由于'w'>'d'执行continue语句,结束本次循环(即跳过p++;语句),还是继续比较'w'>'d',程序进入死循环。

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

main()

{union{char i[2];

int k:

}r;

r.i[0]=2;r.i[1]=0;

printf("%d\n",r.k);

}

A)2B)l C)0D)不确定

答案:A

评析:根据共用体的定义可知:共用体r的成员k和成员i[2]是共用同一段内存空间,所以,当程序给r.i[0]赋值后,实际上,共用体成员k的值也确定了,为2。所以打印输出的结果应当为2。

(40)设p1和p2是指向同一个int型一维数组的指针变量,k为int型变量,则下列不能正确执行的语句是_________。

A)l(=*pl+*p2;B)p2=k;C)pl=p2;D)k=*pl*(*p2);

答案:B

评析:指针变量中只存放地址(指针),不要将一个整型量(或任何其他非地址类型的数据)赋给一个指针变量,所以B是不正确的。

(41)以下程序的输出结果是__________。

#define f(x)X*X

main()

{int a=6,b=2,c;

c=f(a)/f(b);

printf("%d\n",c);

}

A)9B)6C)36D)18

答案:C

评析:观察程序段可知,对带参数的宏的展开只是将语句中的宏名后面括号内的实参字符串代替#defi ne命令行中的形参。本题中c=f(a)/f(b)用#define f(x)X*X代替得c=f(6)/f(2),即c=6*6/2*2,结果为3 6。

(42)若有以下定义:

char s[20]="programming",*ps=s;

则不能代表字符。的表达式是__________。

A)ps+2B)s[2]C)ps[2]D)ps+=2,*ps

答案:A

评析:ps+2就是s[21的地址,即存放字符。的地址、所以A是错误的。

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

main()

{int i;

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

{if(i%2){printf("∥);continue;}

printf("引');

}

printf("\n");

}

A)#*#*#B)#####C)*****D)*#*#*

答案:A

评析:i从1到5循环5次,i为1时,满足条件,打印输出"#":i为2时,条件为假,打印输出"*"。也就是说,当i为奇数时,条件为真,程序打印输出"#",否则,输出"*"。

(44)有如下程序

main()

{

int n=9:

while(n>6)

{

n--;

printf("%d|.,n);

}

}

该程序的输出结果是__________。

A)987B)876C)8765D)9876

答案:B

评析:符合n>6的n只有7,8,9;所以循环次数为3。选项c、D可以排除。又因n在输出之前要执行n--,所以输出结果只能是876。

(45)下列程序是将一个十进制正整数转化为一个八进制数,在程序的空白处应填入的语句是________ __。

#include

main()

{

int I=9,a,b[10]={0};

scanf("%d",&a);

sub(a,b);

for(;i>=O;i--)printf("%d",b[I]);

}

sub(int c,int d[])

{int e,i=O;

while(c!=0)

{e=c%8;

d[i]=e;

__________;

i++:

}

return;

}

A)c=e/8B)C=C%8C)C=C/8D)c=e%8

答案:C

评析:本题主要考查了进制转换的除余取整法。本算法中,是先对数c除8取余作为转换后的8进制数的第l位,然后对c整除以8的商作同样的操作,直到商为0为止,因此本题应选c。

(46)执行下面的程序段

int x=35;

char z='A';

int B:

B=((x&15)&&(z<'a'));

后,B的值为____________。

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

答案:B

评析:从整个表达式来看是个逻辑表达式,而与运算符"&&"的右边的子表达式中由于z的值为"A",而A的ASCII码的值小于a的ASCII码值,所以这个子表达式的值为真,即l;在与运算符"&&"的左边的子表达式是个基于位运算的子表达式,将<的值与15做位与运算,表达式值不为零,所以两个子表达式的与值应当为1。

(47)要为读/写操作打开一个字符文件,其正确的打开方式为__________。

A)wr B)r+C)rb+D)rw

答案:B

评析:在c中可以通过fopen函数来打开一个文件,在该函数的第二个参数中指定其打开方式。要以读写方式打开文件可以用"r++"、"w+"、"a+"来表示,要打开二进制文件,可以在打开方式中加上字母b,对于字符文件不要加b。

(48)下列程序的输出结果是_________。

#include

main()

{

union

{

int k:

chari[2];

}*s,a;

s=&a:

s->i[0]=Ox39;s->I[l]=0x38;

printf("%x\n",s->k);

}

A)3839B)3938C)380039D)390038

答案:A

评析:在主函数定义了一个共用体变量a,及一个指向该变量的指针s。执行s->i[0]=0x39;s->i[1]=0 x38;,将分别共用体的第一字节及第二字节存入十六进制数据0x39及0x38,由于在共用体中,变量共同占用存储空间,在输出s->k.时,实际上就是输出开始写入的数据,而对于PC机,在存放int型数据时,低位在前,高位在后,故本题输出为3839。

(49)若有以下定义:int t[3][2];能正确表示t数组元素地址的表达式是_______。

A)&t[3][2]B)t[3]C)t[1]D)*t[2]

答案:C

评析:选项A和B两个表达式都越界了;选项D中,*t[2]是目标变量,即一个整型值,而不是地址值。

(50)以下对结构体类型变量的定义中,不正确的是___________。

A)typedef struct aa

{

int n:

float m:

}aa;

aatdl;

B)#define aa struct aa

aa{

int n:

float m:

}tdl;

C)struct

{

int n:

float m:

}aa;

structaatdl;

D)struct

{

int n:

float m:

}tdl;

答案:C

评析:在题的考查点是结构体类型变量的定义。

在选项c中,aa是一个结构体变量,而不是结构体名,所以struct aatdl;是非法的。

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

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

(1)设一棵完全二叉树共有500个结点,则在该二叉树中有【1】个叶子结点。

答案:【l】250

评析:所谓完全二叉树是指除最后一层外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点。

具有n个结点的完全二叉树,其父结点数为int(n/2),而叶子结点数等于总结点数减去父结点数。本题n=500,故父结点数等于int(500/2)=250,叶子结点数等于500-250=250。

(2)在最坏情况下,冒泡排序的时间复杂度为【2】。

答案:【2】n(n-1)/2或O(n(n-1)/21

评析:冒泡排序法是一种最简单的交换类排序方法,它是通过相邻数据元素的交换逐步将线性表变成有序。

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

(3)面向对象的程序设计方法中涉及的对象是系统中用来描述客观事物的一个【3】。

答案:【3】实体

评析:面向对象的程序设计方法中涉及的对象是系统中用来描述客观事物的一个实体,是构成系统的一个基本单位,它由一组表示其静态特征的属性和它可执行的一组操作组成。

(4)软件的需隶分析阶段的工作,可以概括为四个方面:【4】、需求分析、编写需求规格说明书和需求评审。

答案:【4】需求获取

评析:软件的需求分析阶段的工作,可以概括为四个方面:需求获取、需求分析、编写需求规格说明书和需求评审。需求获取的目的是确定对目标系统的各方面需求。涉及到的主要任务是建立获取用户需求的方法框架,并支持和监控需求获取的过程。

(5)【5】是数据库应用的核心。

答案:【5】数据库设计

评析:数据库设计是数据库应用的核心。在数据库应用系统中的一个核心问题就是设计一个能满足用户要求,性能良好的数据库,这就是数据库设计。

(6)若由以下定义,则不移动指针p,且通过指针p引用值为98的数组元素的表达式是【6】。

int w[10]:{23,54,10,33,47,98,72,80,61},*p=w;

答案:【6】*(p+5)或p[5]

评析:本题的考查点是通过指针引用数组元素。

98是数组w的第5个元素(最开始的为第0个),而通过+p=w已经将p指向了数组w,要想不移动指针p而引用98,可以有以下两种方法:p[5]、*(p+5)。

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

#define MAX(x,y)(x)>(y)?(x):(y)

main()

{

int a=5,b=2,c=3,d=3,t;

t=MAX(a+b,c+d)*lO;

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

}

答案:【7】7

评析:宏替换后,表达式t=MAX(a+b,c+d)*10即变为:t=(a+b)>(c+d)?(a+b):(c+d)*10;

由于(a+b)>(c+d)为真,所以t=(a+b),即为7。

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

main()

{

unsigned short a=65536;

int b:

primf("%d\n",b=a);

}

答案:【8】0

评析:对于一个unsigned short来说,它能取的最大值是65535。这里给a赋值.65536,已经超出了它的取值范围,这样它的高位将被截掉,只把低位赋给它(全零)。所以a的值实际为0。

(9)若已经定义im a=25,b:14,c=19;,以下三目运算符(?:)所构成的语句的执行结果是【9】。

a++<=2&&b--<=2&&c++?printf("***

a=%d,b=%d,c=%d\n",a,b,c):printf("a=%d,b=%d,c=%d\n",a,b,c);

答案:【9】a=26,b=14,c=19

评析:这种条件表达式的一般形式为:表达式17表达式2:表达式3,三目运算符的执行顺序:先求解表达式1,若非0则求解表达式2,此时表达式2的值就作为整个表达式的值,若表达式1的值为0,则求解表达式3,此时表达式3的值就作为整个表达式的值。c语言在做一系列表达式相与时,从左到右分别计算各表达式的值,一旦遇到一个表达式为false,则剩余的表达式都不再进行运算。该题中,a++(=2的值为false,则b--<=2和c++就都不再运算。

(10)下面的if语句与y=(x>=10)?3*x-11:(x<1)?x:2'x.1;的功能相同,请补充完整。

If(【10】)

if(【11】)y=2*x-1;

else y=x;

else y=3*x-11:

答案:【10】x<10

【11】x>=1

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

条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值;若表达式1的值为O(假),则求解表达式3,表达式3的值就是整个条件表达式的值。y。(x>。10)?3。x-1 1:(x>=1)?x:2*x-1;的功能是先求(x>=1)?x:2*x-1:的值,所的的结果再与前面的语句构成条件表达式进行求值。所以【10】应该填x<10,【11】应该填x>=1。

(11)以下程序中用户由键盘输入一个文件名,然后输入一串字符(用拌结束输入)存放到此

文件中,形成文本文件,并将字符的个数写到文件的尾部。请填空。

#include

main()

{FILE*fp;

char ch,fname[32];im count=0;

printf("Input the filename:");

scanf("%s",fname);

if((币=fopen(【12】,"w+"))==NULL)

{print印Can't open file:%s\n",fname};exit(0);}

printf("Enter data:in");

while((ch=getchar())!_1≠)')

{fputc(ch,fp);count++;}

fprintf(【13】,"\n%d\n",count);

fclose(fp);

}

答案:【12】fname

【13】fp

评析:fopen()函数实现打开文件的功能,通常的调用方式为:FILE*fp;fp=fopen(文件名,使用文件方式),因此,第一个横线处要求填写要打开文件的名字fname。fprintf()函数的一般调用方式为:fprintf (文件指针,格式字符串,输出表列),所以第二个横线处应填写fb。

(12)函数void fun(noat*sn,int n)的功能是:根据以下公式计算s,计算结果通过形参指针sn传回;n通过形参传入,n的值大于等于0。请补全程序。

S=I-1/3+1/5-1/7+...+1/(2n+1)

void fun(float*sn,int n)

{float s=O.O,w,f=-1.0;

int i=0:

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

{ f=【14】*f;

w=f/(2*i+1);

S+=W:

}

【15】=s;

}

答案:【14】-1或-1.0

【15】*sn

评析:由于在对s求和时,相邻两项的符号刚好相反,而在函数fun中没有对数据进行取反的操作,故第一空的目的是对数据进行取反,以保证序列中相邻两项的符号不同。故第一个应填-1或-1.0。在执行完循环体后,要将求和结果通过指针参数的形式传递给调用fun的函数,故第二空应填*sn。

(13)下面的函数strcat(strl,str2)实现将字符串str2拼接到字符串strl后面的功能。请填空使之完整。

Char*strcat(strl,str2)

char*strl.*str2;

{char*t=strl;

while(【16】)strl++;

while(【17】);

return(t);}

答案:【16】*strl或*str1!='\0'或*str1!=0或*strl!=NULL

【17】*strl++=*str2++或*strl++=*str2,*str2++

评析:函数strcat(strl,str2)实现将字符串str2连接到字符串strl后面,所以首先要找到字符串strl的串尾,根据c语言的语法规定,一个串的串尾一定是一个隐含字符"\0",而在程序中,对字符串中字符的访问是通过两/卜指针变量来完成的,因此要找到字符串strl的串尾,要判断*strl是否为"\0",要找到字符串str2的串尾,要判断*str2是否为"\0",程序中必须可以使字符串中字符逐一顺序体现,所以在题中我们应填写"*str1"和"*strl++=*str2++"。

(14)以下函数fun用于求两个整数a和b的最大公约数。

fun(a'b)

int a'b;

{int I,J,m,n;

if(a>b)

{m=a;a=b;【18】;}

i=a.j=b;

while((n=【19】)!=O)

{j=i;i=【20】;}

retum(i);

}

答案:【18】b=m

【19】j%i

【20】n

评析:函数中的变量i和j分别存放两个形参的最小数和最大数,在语句i=a和i=b执行之前,要将a 和b分别变为最小数和最大数,当a>b时,程序使用中间变量将两者交换,所以题中第一个空中应当填写"b=m";为求两个整数的最大公约数,程序的where循环条件必须为j整除i成立,所以题_中第二个空中应当填写"j%i";程序要通过i的值返回最大公约数,因此在循环中要将每次整除的公约数赋给i,以保证最后返回的是两个整数的最大公约数,所以第三个空中应当填写"n"。

试卷二

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

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

(1)在下列选项中,_________不是一个算法一般应该具有的基本特征。

A)确定性B)可行性C)无穷性D)拥有足够的情报

答案:C

评析:一个算法,一般应具有以下几个基本特征。①可行性②确定性③有穷性④拥有足够的情报

(2)希尔排序法属于_________类型的排序法。

A)交换类排序法B)插入类排序法

C)选择类排序法D)建堆排序法

答案:B

评析:希尔排序法的基本思想是:将整个无序序列分割成若干小的子序列分别进行插入排序。所以希尔排序法属于插入类排序,但它对简单插入排序做了很大的改进。

(3)下列关于队列的叙述中正确的是_________。

A)在队列中只能插入数据B)在队列中只能删除数据

C)队列是先进先出的线性表D)队列是先进后出的线性表

答案:C

评析:队列是指允许在一端进行插入、而在另一端进行删除的线性表。它又称为"先进先出"或"后进后出"的线性表,体现了"先来先服务"的原则。

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

A)N+I B)N C)(N+I)/2D)N/2

答案:B

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

(5)信息隐蔽的概念与下述_________概念直接相关。

A)软件结构定义B)模块独立性

C)模块类型划分D)模拟耦合度

答案:B

评析:信息隐蔽是指在一个模块内包含的信息(过程或数据),对于不需要这些信息的其他模块来说是不能访问的。模块独立性是指每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。衡量软件的模块独立性的度量标准是耦合性和内聚性。一个模块的内聚性越强,则该模块的模块独立性越强。而内聚性是信息隐蔽和局部化概念的自然扩长。

(6)面向对象的设计方法与传统的面向过程的方法有本质不同,它的基本原理是_________。

A)模拟现实世界中不同事物之间的联系

B)强调模拟现实世界中的算法而不强调概念

C)使用现实世界的概念抽象地思考问题从而自然地解决问题

D)鼓励开发者在软件开发的绝大部分中都用实际领域的概念去思考

答案:C

评析:面向对象的设计方法基本原理:使用现实世界的概念抽象地思考问题从而自然地解决问题。强调模拟现实世界中的概念而不强调算法,鼓励开发者在软件开发的绝大部分中都用应用领域的概念去思考。

(7)在结构化方法中,软件功能分解属于软件开发中的_________阶段。

A)详细设计B)需求分析C)总体设计D)编程调试

答案:C

评析:总体设计过程通常由两个主要阶段组成:系统设计,确定系统的具体实现方案;结构设计,确定软件结构。为确定软件结构,首先需要从实现角度把复杂的功能进一步分解。

(8)软件调试的目的是_________。

A)发现错误B)改正错误

C)改善软件的性能D)挖掘软件的潜能

答案:B

评析:由程序调试的概念可知:程序调试活动由两部分组成,其一是根据错误的迹象确定程序中错误的确切性质、原因和位置。其二,对程序进行修改,排除这个错误。所以程序调试的目的就是诊断和改正程序中的错误。

(9)按条件f对关系R进行选择,其关系代数表达式为_________。

RooR

A)RooR B)f C)6f(R)D)兀f(R)

答案:C

评析:选择运算是一个一元运算,关系R通过选择运算(并由该运算给出所选择的逻辑条件)后仍为一个关系。这个关系是由R中那些满足逻辑条件的元组所组成。如果关系的逻辑条件为C则R满足f的选择运算可以写成:6f(R)。

(10)数据库的物理设计是为一个给定的逻辑结构选取一个适合应用环境的_______的过程,包括确定数据库在物理设备上的存储结构和存取方法。

A)逻辑结构B)物理结构C)概念结构D)层次结构

答案:B

评析:根据数据库物理设计的概念可知:为一个给定的逻辑数据模型选取一个最合适应用要求的物理结构的过程,就是数据库的物理设计。数据库的物理结构就是指数据库在物理设备上的存储结构与存取方法。

(11)下列叙述中正确的是_______。

A)C语言编译时不检查语法

B)C语言的子程序有过程和函数两种

C)C语言的函数可以嵌套定义

D)C语言中,根据函数能否被其它源文件调用,被区分为内部函数和外部函数

答案:D

评析:选项A的错误在于编译过程中是检查语法的,若发现源程序有语法错误,则系统会提示出错信息;选项B的错误在于c语言中,子程序的作用是由函数来完成的,无过程的概念;选项c的错误在于函数不可以嵌套定义,但可以嵌套调用。

(12)有以下程序:

main()

{

int a:

char c=10;

float f=100.0;double x;

a=f/=c*=(x=6.5);

printf("%d%d%3.1f%3.1f\n",a,c,f,x);

}

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

A)1 65 1 6.5B)1 65 1.5 6.5C)l 65 1.0 6.5D)2 65 1.5 6.5

答案:B

评析:本题求解步骤如下:先进行"c*=(x=6.5)"的运算,由于x=6.5,表达式相当于c=c*6.5=10*6.5 =65.再进行"f/=65"的运算,相当于f=-f/65=100.0/65,由于f为单精度实型变量,因此f的值约为1.5 38462.然后进行"a=f"的运算,由于a为整型变量,因此a=1.最后将各个变量的值按照printf中的格式要求输出到屏幕,注意变量f,x按照"%3.1f"格式输出,,即只输出一位小数。

(13)以下变量x、y、z均为double类型且已正确赋值,不能正确表示数学式子x/(y*z)的C语言表达式是_______。

A)x/y*z B)x*(1/(y*z))C)x/y*1/z D)x/y/z

答案:A

评析:按照自左向右的运算逻辑,选项A是先做x/y,然后再乘以x,显然与题意不符。

(14)若a为int类型,且其值为3,则执行完表达式a+=a-=a*a后,a的值是_______。

A)-3B)9C)-12D)6

答案:C

评析:c语言中对赋值运算的运算顺序是自右向左。本题中,计算a*a之后,a的值依然为3,表达式a*a的值为9;a-=9,a=3-9=-6;a+=-6,a=-6+-6=-12。

(15)以下程序段中与语句k=a>b?(b>c?1:0):0;功能等价的是_______。

A)if((a>b)&&(b>C))k=l;else k=0;

B)if((a>b)‖(b>C))k=l;else k=O;

C)if(a<=b)k=0;else if(b<=C)k=1;

D)if(a>b)k=1,else if(b>C)k=l;else k=0;

答案:A

评析:"a>b?(b>c?1:0):0"的求解顺序是:先判断a>b是否为真,如果为真,则执行b>c?1:0:如果b>c为真,则(b>c?l:0)的值为1,从而整个表达式返回1,否则整个表达式返回0;如果a<=b,则表达式返回0。因此功能等价的语句应为if((a>b)&&(b>C))k=l;else k=0;。

(16)设x、y、t均为int型变量,则执行语句:x=y=3;t=++x‖++y;后,y的值为_______。

A)不定值B)4C)3D)1

答案:C

评析:e语言中在做逻辑或运算时,自左向右判断各个参加或运算的表达式,一旦运算到某式的值为非零时,表明整个表达式一定为真,余下的语句则不再进行运算。本题中,++x的值为真,则++y并没有进行运算,所以y值不变。

(17)假设a和b为int型变量,则执行以下语句后,b的值为_______。

a=l:b=10:

do

{b-=a:a++:

}while(b一<0):

A)9B)-2C)-l D)8

答案:D

评析:本题程序第一轮循环后b的值为9,在进行循环条件测试时,先取b的现值9与O比较,然后再将b减l。由于9<0不成立,因此循环结束,这时b的值已变成8,本题正确答案为D。

(18)若执行以下程序时从键盘上输入9,则输出结果是_________。

main()

{

int n:

scanf("%d:",&n);

if(n++<10)printf("%d\n",n);

else printf("%d\n",n--);

}

A)ll B)lO C)9D)8

答案:B

评析:n++是在语句结束后再加l,因此,if语句中相当于判断的是9<10,当然是执行if语句后面的l orintf语句,而这时,因为if语句被执行,n的值也被加1,所以在打印时,n值为10,而n--是在printf 语句执行完毕后再减1的。

(19)有以下程序段

int k=O:

while(k=l)k++;

while循环执行的次数是_________。

A)无限次B)有语法错,不能执行

C)一次也不执行D)执行1次

答案:A

评析:c语言里关系表达式的等于应该是"=="。一个等于号表示赋值,即这里面重复的把1赋给k,自然表达式k=l的值总为1,while后面的表达式恒为真,当然会进入死循环。

(20)有以下程序:

void sum(int*a)

{a[O]=a[1];}

main()

{

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

for(i=1;i>O;i--)sum(&aa[i]);

printf("%d\n",aa[0]);

)

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

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

答案:D

评析:c语言规定,实参变量对形参变量的数据传递是"值传递",只由实参传给形参,而不能由形参传回来给实参。函数调用结束后,形参单元被释放,实参单元仍保留并维持原值。本题要求输出aa[0]的值,结果应为1。

(21)以下程序执行后sum的值是_________。

main()

{

int I,sum;

for(i=1;i<6;i++)sum+=i;

printf("%d\n",sum);

}

A)15B)14C)不确定D)0

答案:C

评析:变量sum在使用时未赋初值,所以无法确定sum最终的值。

(22)有以下程序:

main()

{

int x[8]={8,7,6,5,0,0},*s;

s=x+3:

printf("%d\n",s[2]);

}

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

A)随机值B)0C)5D)6

答案:B

评析:本题定义了数组x[8]和指针变量s,由c语言规定,指针加1的含义是使指针指向数组的下一个元素,而不是指针值简单的加l,因此通过s=x+3;使s指向数组元素x[3]。由于指向数据的指针变量可以带下标表示,如s[i]与*(s+i)等价。因此题目要求输出s[2]的值,即+(s+2)的值,也就是x[51的值,为0。

本文来源:https://www.bwwdw.com/article/mf2l.html

Top