栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > C++面试题库

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

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

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

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

(1)算法的时间复杂度是指_______。

A)执行算法程序所需要的时间

B)算法程序的长度

C)算法执行过程中所需要的基本运算次数

D)算法程序中的指令条数

答案:C

评析:所谓算法的时间复杂度,是指执行算法所需要的计算工作量。

 

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

A)线性表是线性结构         B)栈与队列是非线性结构

C)线性链表是非线性结构     D)二叉树是线性结构

答案:A

评析:一般将数据结构分为两大类型:线性结构与非线性结构。线性表、栈与队列、线性链表都是线性结构,而二叉树是非线性结构。

 

(3)下面关于完全二叉树的叙述中,错误的是_________。

A)除了最后一层外,每一层上的结点数均达到最大值

B)可能缺少若干个左右叶子结点

C)完全二叉树一般不是满二叉树

D)具有结点的完全二叉树的深度为[log2n]+1

答案:B

评析:满二叉树指除最后一层外每一层上所有结点都有两个子结点的二叉树。完全二叉树指除最后一层外,每一层上的结点数均达到最大值,在最后一层上只缺少右边的若干子结点(叶子结点)的二叉树。

 

(4)结构化程序设计主要强调的是_________。

A)程序的规模             B)程序的易读性

C)程序的执行效率         D)程序的可移植性

答案:B

评析:结构化程序设计主要强调的是结构化程序清晰易读,可理解性好,程序员能够进行逐步求精、程序证明和测试,以保证程序的正确性。

 

(5)在软件生命周期中,能准确地确定软件系统必须做什么和必须具备哪些功能的阶段是________。

A)概要设计  B)详细设计    C)可行性分析  D)需求分析

答案:D

评析:需求分析是对待开发软件提出的需求进行分析并给出详细定义,即准确地确定软件系统的功能。编写软件规格说明书及初步的用户手册,提交评审。

 

(6)数据流图用于抽象描述一个软件的逻辑模型,数据流图由一些特定的图符构成。下列    图符名标识的图符不属于数据流图合法图符的是_________。

A)控制流    B)加工    C)数据存储    D)源和潭

答案:A

评析:数据流图从数据传递和加工的角度,来刻画数据流从输入到输出的移动变换过程。数据流图中的主要图形元素有:加工(转换)、数据流、存储文件(数据源)、源和潭。

 

(7)软件需求分析一般应确定的是用户对软件的__________。

A)功能需求  B)非功能需求  C)性能需求    D)功能需求和非功能需求

答案:D

评析:软件需求分析中需要构造一个完全的系统逻辑模型,理解用户提出的每一功能与性能要求,是用户明确自己的任务。因此,需求分析应确定用户对软件的功能需求和非功能需求。

 

(8)下述关于数据库系统的叙述中正确的是________。

A)数据库系统减少了数据冗余

B)数据库系统避免了一切冗余

C)数据库系统中数据的一致性是指数据类型的一致

D)数据库系统比文件系统能管理更多的数据

答案:A

评析:由数据的共享自身又可极大地减少数据冗余性,不仅减少了不必要的存储空间,更为重要的是可以避免数据的不一致性。所谓数据的一致性是指在系统中同一数据的不同出现应保持相同的值。

 

(9)关系表中的每一横行称为一个________。

A)元组    B)字段    C)属性    D)码

答案:A

评析:在关系数据库中,关系模型采用二维表来表示,简称“表”。二维表是由表框架及表元组组成。在表框架中,按行可以存放数据,每行数据称为元组。

 

(10)数据库设计包括两个方面的设计内容,它们是________。

A)概念设计和逻辑设计      B)模式设计和内模式设计

C)内模式设计和物理设计    D)结构特性设计和行为特性设计

答案:A

评析:数据库设计可分为概念设计与逻辑设计。概念设计的目的是分析数据间内在语义关联,在此基础上建立一个数据的抽象模型。逻辑设计的主要工作是将ER图转换为指定的RDBMS中的关系模型。

 

(11)请读程序:

#include<stdio.h>

main()

{

int a;float b,c;

scanf(“%2d%3P%4f’,&a,&b,&C);

printf(”\na=%d,b=%ec。%f\n”,a,b,C);

}

若运行时从键盘上输入9876543210l,则上面程序的输出结果是________。

A)a=98,b=765,c=432 1

B)a=1 0,b=432,c=8765

C)a=98,b=765.000000,c=432 1.000000

D)a=98,b=765.0,c=432 1.0

答案:C

评析:scanf()把用户从键盘录入的数字的第1、2位存入整型变量a;把第3、4、5位存入单精度实型变量b,把第6、7、8、9位存入单精度实型变量c,用户录入的第10位被scanf()遗弃。这时变量a、b、c的值分别为:98、765.000000、4321.000000。

 

(12)一个良好的算法由下面的基本结构组成,但不包括__________。

A)顺序结构  B)选择结构    C)循环结构    D)跳转结构

答案:D

评析:1966年,Bohra和Jacopini提出了以下三种基本结构,用这三种基本结构作为表示一个良好算法的基本单元:1、顺序结构;2、选择结构;3、循环结构。

 

(13)请选出以下程序的输出结果________。

#include<stdio.h>

sub(x,y,z)

int x,y,*z:

{*z=y-x;}

main(){

int a,b,c;

sub(10,5,&a);sub(7,a,&b);sub(a,b,&C);

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

}

A)5,2,3    B)-5,-12,-7    C)-5,-12,-17    D)5,-2,-7

答案:B

评析:sub()函数的作用是将形参y和x的差赋给了z指向的那个内存地址,所以在sub(10,5,&a/I,10和5属于值传递,a是属于地址传递,也就是a与z指向了同一个存储单元,在执行函数后,a的值随*z变化,所以此次函数被调用后,a的值为y-x=-5,同理可知,在sub(7,a,&b)后,b的值发生变化,其值为-5-7=-12,在sub(a,b,&C)后,c的值发生变化,其值为-12-(-5)=-7。

 

(14)下面程序在屏幕上的输出是________。

main()

{

printf(”ab\b\b c”);

}

A)ab\b\b c    B)a c    C)abc    D)ab c

答案:B

评析:c语言中允许使用一种特殊形式的字符常量,、就是以一个“\”开头的字符序列,这样的字符称为“转义字符”。常用的转义字符有:\n,换行;\t,水平制表;\b,退格;\r,回车。

 

(15)若x是整型变量,pb是基类型为整型的指针变量,则正确的赋值表达式是_______。

A)pb=&x;    B)pb=x;    C)*pb=&x;    D)*pb=*x

答案:A

评析:选项A将变量x的地址赋给指针变量pb,使pb指向x‘选项B是将x的值当作地址赋给指针pb,Db指向一个地址等于x值的内存单元;选项c将x的地址赋给指针pb指向的地址等于x的内存单元。

 

(16)设整型数i=5,则printf(“%d”,i+++++i);的输出为________。

A)10    B)1l    C)12    D)语法错误

答案:D

评析:c语言中有基本的算术运算符(+、-、*、/)还包括自增自减运算符(++、–),在c语言解析表达式时,它总是进行贪婪咀嚼,这样,该表达式就被解析为i++ ++ +i,显然该表达式不合c语言语法。

 

(17)若要用下面的程序片段使指针变量p指向一个存储整型变量的动态存储单元

int      *p;

p=___________malloc(sizeof(im));

则应填入__________。

A)int    B)int     C)(*int)    D)(int*)

答案:D

评析:不论p是指向什么类型的指针变量,都可以通过强制类型转换的方法使之类型一致,强制类型转换的格式为(数据类型+)。

 

(18)下面程序输出的结果是__________。

main()

{

int i=5,J=9,x;

x=(I==j?i:(j=7));

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

}

A)5,7    B)5,5    C)语法错误    D)7,5

答案:A

评析:条件表达式的一般形式为:表达式I?表达式2:表达式3;先求解表达式1,若为真则求解表达式2;若表达式l的值为假,则求解表达式3。本题中先判断i==j,不等,执行j=7;然后执行x=7。故本题为A。

 

(19)若执行下面程序时从键盘上输入5,

main()

{

int x:

scanf(”%d”,&x);

if(x++>5)printf(”%d\n”,x);

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

}

则输出是________。

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

答案:B

评析:根据c语言的语法,x++是在使用x之后,再将x的值加1,在if语句中,x的值为5,条件不成立,执行else后面的语句,因为x的值已经加1,为6,所以打印结果为6。

 

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

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

则值为3的表达式是_________。

A)p+=2,*(p++)      B)p+=2,*++p

C)p+=3,*p++        D)p+=2,++*p

答案:A

评析:引用一个数组元素,可以用:(1)下标法,如a[i]形式;(2)指针法,如*(a+i)或*(p+i)。数组的下标从0开始,值为3的数组元素是a[2]。B、c的内容为a[3],D将a[2]前自加,结果为4。

 

(21)设a、b和c都是int型变量,且a=3、b=4、c=5,则下面的表达式中,值为0的表

达式是___________。

A)’a’&&’b’    B)a<=b    C)a‖+c&&b-c    D)!((a<b)&&!c‖1)

答案:D

评析z选项A:‘a’&&‘b’是字符a与b的相与,不为0;选项B:a<=b,由题中变量赋值可知,结果为1。选项c:a‖+c&&b-c,结果为1;选项D:!((a<b)&&!c‖1),运算结果为O。

 

(22)以下程序运行后,输出结果是_________。

main()

{

char*d[]。{“ab”,”cde”};

printf(”%x”,d[1]);

}

A)cde               B)字符c的ASCII码值

C)字符c的地址      D)出错

答案:C

评析:指针数组中的每一个元素都相当于一个指针变量。一维指针数组的定义形式为:类型名+数组名[数组长度],在本题main函数中定义指针数组d,它有两个元素,其初值分别是“ab”、“cde”的首地址。dB]的值为”cde”的首地址。%x是指以十六进制数形式输出整数。

 

(23)设有如下程序

#include<stdio.h>

main()

{

int**k,*j,i=100;

j=&i;  k=&j;

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

}

上述程序的输出结果是________。

A)运行错误     B)100    C)i的地址    D)j的地址

答案:B

评析:j=&i,j的值就是i的地址,*j=100,将j的地址赋给k,这时*k=j,那么,**k=*j,而1=100,所以**k=100,最后的打印结果应当为100。

 

(24)设有以下语句,其中不是对a数组元素的正确引用的是:_______(其中O≤i<10)

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

A)a[p-a]    B)。(&a[i])    C)p[I]    D)*(*(a+i))

答案:D

评析:观察程序可知,a实际上就是数组a的首地址,所以“+(a+i)”表示的就是数组a中的第i个元素的值,进而,我们可以知道+(t(a+i))必然不是对a数组元素的正确引用。

 

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

main()

{

int a[2][3]={1,3,5,7,9,1 1},*s[2],**pp,*p;

s[0]=a[0],s[1]=a[1];

pp=s;

p=(int*)malloc(sizeof(int));

**pp=s[1][1];

p=*PP;

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

}

A)l    B)7    C)9    D)1l

答案:C

评析:s是一个含有两个元素的指针数组,pp是一个指向指针变量的指针,s[O]是指向二维数组a行下标为0的元素的首地址,即a[0儿0]的地址,s[1]为a[1][0]的地址。pp的值为s[O]的地址。**pp=s[1][l]后,a[0][0]的值将被赋值为all][l]的值,执行p=*pp;后,p中将是s[0]的值,最后的输出语句将输出地址s[0]所指向的数据,即a[0][O]。

 

(26)有以下程序:

#include<stdio.h>

main(){

char c[6];

int I=0:

for(;i<6;c[-]=getchar(),i++);

for(I=0;i<6;i++)putchar(c[i]);

primf(”\n”);

}

如果从键盘上输入:

ab<回车>

c<回车>

def<回车>

则输出结果为_________.

A)a    B)a    C)ab    D)abcdef

b      b      c

c      c      d

d      d

e

f

答案:C

评析:1.getchar():此函数的作用是从终端(或系统隐含指定的输入设备)输入一个字符。

2.putchar():此函数的作用是向终端输出一个字符,也可以输出控制字符。

本题在输入字符时,ab和c后面的回车符分别赋给了c[2]和e[4],所以,正确答案为c。

 

(27)在调用函数时,如果实参是简单变量,它与对应形参之间的数据传递方式是_______。

A)地址传递              B)单向值传递

C)由实参传递给形参,再由形参传递给实参

D)传递方式由用户指定

答案:B

评析:c语言规定,实参变量对形参变量的数据传递是“单向值传递”,只由实参传给形参。在内存中,实参单元与形参单元是不同的单元。调用结束后,实参单元仍保留并维持原值。

 

(28)下面程序

#include<stdio.h>

#include<string.h>

main()

{  char*p1=”abc”,*p2=”ABC”,str[50]=”xyz”;

strcpy(str+2,strcat(p1,p2));

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

}

的输出是_________。

A)xyzabcABC        B)zabcABC

C)yzabcABC         D)xyabcABC

答案:D

评析:strcat(pl,p2)将字符串abcABC放到了*pl所指向的存储单元中;strcpy在本题将abcABC复制到str+2所指向的存储单元中,即覆盖原str数组中的字符z及其后的所有字符,故str的值为”xyabcABC”。

 

(29)下面程序

int aa[3][3]:{{2},{4},{6}};

main()

{   int i,*p:&aa[0][0];

for(I=0;i<2;i++){

if(i==0)aa[I][i+l]=*p+1;

else++p;

printf(”%d’.,。p);

}

}

的输出是__________。

A)23    B)26    C)33    D)36

答案:A

评析:观察题目,可以发现,*p=&aa[01[o]语句实际是将数组aa的首地址赋给了指针变量p,将i的值带入for循环中,i=0时,aa[0][1]=3,+p=2;*p输出的是指针所指向的数组值,此时p所指向的是aa[O][O],输出2,而i=l时执行了++p操作使指针向后移动指向了aa[O儿1],所以在输出*p时应为3。

 

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

#include<stdio.h>

#include<s~ing.h>

fun(char*w,int n)

{

char t,*s1,*s2;

s1=w;s2=w+n-l:

while(s1<s2)

{

t=*s1++:

*sl=*s2–;

*s2=t;

}

}

main()

{

char*p;

p=”1234567″;

fun(p,strlen(p));

puts(p);

}

A)1234567    B)7654321    C)1711717    D)717717l

答案:C

评析:在子函数fun中,sl为字符串w的起始地址,s2为字符串的结束地址(字符‘\O’除外),当执行循环结束循环,w=“1711717”。

 

 

(31)下面程序

main()

{  int x=100,a=10,b=20,okl=5,ok2=0;

if(a<b)

if(b!=15)

if(10k1)  x=l;

else i“oL2)x。10;

X=-1;

Printf(%d\n”,x);

}

的输出是________。

A)-1    B)0    C)1    D)不确定的值

答案:A

评析:第一个判断值为真,过渡到下一个判断,第二个判断为真,过渡到第三个判断……如此循环,在打印输出语句的前一行,程序给变量x赋了值,为.1,所以,无论前期如何变化,最后的x值依然为-1。

 

(32)下面程序

main()

{

int x=32:

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

}

的输出是________。

A)100    B)160    C)120    D)64

答案:D

评析:<<是c语言中规定的左移运算符,例如,a=a<<2,这个语句即是将a的二进制数左移两位,左移一位相当于该数乘于2,左移两位相当于该数乘以2的2次方。所以,x<<1=32.2=64。

 

(33)设有以下定义和语句,输出的结果是(用small模式编译,指针变量占2个字节)_________。

 

struct date

{

long *cat;

struct date *next;

double dog;

}too;

printf(”%d”,sizeof(too));

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

答案:D

评析:sizeof函数计算已知类型所占的字节数。结构体变量所占内存长度是各成员占的内存长度之和。指针变量占2个字节,所以cat和*next各占2个字节;double型占8个字节,故too共占12个字节。

 

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

#include<stdio.h>

#define FUDGE(y)       2.84+y

#define PR(a)printf    (”%d”,(int)(a))

#define PRINT l(a)     PR(a);putchar(’\n’)

main()

{  intx=2;

PRINTl(FUDGE(5)*x);

}

A)ll    B)12    C)13    D)15

答案:B

评析:在程序中如果有带实参的宏,则按#define命令行中指定的字符串从左到右进行置换,如果串中包含宏中的形参,则将程序语句中相应的实参代替形参。将实参带入已经定义的宏中,可以得出答案灯“12”。

 

(35)以下程序段给数组所有的元素输入数据,请选择正确答案填入:

#include<stdio.h>

main()

{

int a[10],i=O;

while(i<l0)scanf(”%d”,________);

:

:

}

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

答案:A

评析:a就是数组a的首地址,而a+x是数组中第x个元素的地址,。所以在四个选项中,选项B和c只能输入一个数据,选项D不能给a[O]输入数据,只有A可以完成给数组所有的元素输入数据的任务。

 

(36)以下对枚举类型名的定义中正确的是________。

A)enum a={one,two,three};            B)enum a{one=9,two=-1,three};

C)enum a={“one”,”two”,”three”};  D)enum a{“one”,”two”,”three”};

答案:B

评析:声明枚举类型用enum开头。例如:enum weekday(sun,mon,tue,wed,thu,fri,sat);

说明:1、在c编译中,对枚举元素按常量处理,同时可以改变他们的值。2、枚举值可以用来做判断比较。3、一个整数不能直接赋给一个枚举变量。

 

(37)字符(char)型数据在微机内存中的存储形式是________.

A)反码           B)补码

C)EBCDIC码      D)ASCII码

答案:D

评析:将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的ASCII码值放到存储单元中。

 

(38)下面程序的输出是________。

typedef union

{  long x[2];

int y[4];

char z[8];

}MYTYPE;

MYTYPE them;

main()

{  printf(”%d\n”,sizeof(them));}

A)32    B)16    C)8    D)24

答案:C

评析:sizeof(x)是一个标准c函数,它的返回值是x型的数据结构占用的内存字节数。题目中定义了一个共用体,共用体变量在内存中所占的长度等于最长的成员的长度。

 

(39)有以下程序,程序运行后的输出结果是_________。

Int f(intb[][4])

{  int I,J,s=O;

for(j=00<4;j++)

{

I=j;

if(I>2)i=3-j;

s+=b[i][j];

}

return s:

}

main()

{

int a[4][4]={{1,2,3,4},{O,2,4,6},{3,6,9,12},{3,2,1,0}};

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

}

A)22    B)ll    C)18    D)16

答案:D

评析:本题通过函数调用对数组a[0][0]、a[1][l]、a[2112]、a[0][3]进行求和,然后用return语句返回s的值。

 

(40)不能把字符串:Hello!赋给数组b的语句是_________。

A)charb[10]={‘H’,’e’,’1’,’l’,’0’,’!’};

B)char b[10]={‘h’,’e’,’1’,’l’’O’,’!’};

C)charb[10];strcpy(b,”Hello!”);

D)char b[10]=”Hello!”;

答案:B

评析:在c语言中,大写字母和小写字母被认为是两个不同的字符,因此,“hello!”和“Hello!”是两个不同的字符串。

 

(41)下面程序的输出是_________。

main()

{  int x=3,y=6,a=0;

while(x++!=(y-=1))

{  a+=1;

if(y<x)break;

}

primf(”x=%d,y=%d,a=%d\n”,x,y,a);

}

A)x=4,y=4,a=1    B)X=5,y=5,a=1

C)x=5,y=4,a=3    D)x=5,y=4,a=l

答案:D

评析:注意的是x++中x值的引用时,这里应当是先引用,后自加,具体执行过程如下:

第一次while循环:条件为真,执行a=a+l=l;此时,x的值已为4,判断y<x不成立,继续执行循环;

第二次while循环:条件为假,此时x的值已为5,退出while循环,执行printf。

 

(42)若有程序:

fun(int a,int b)

{

static int c=O:

c+:a+b:

return C;

}

main()

{

int x=5,y=3,z=7,r;

r=fun((y,x+y),z);

r=fun(x,y);

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

}

上面程序的输出结果是__________。

A)23    B)15      C)19    D)18

答案:A

评析:stoic声明的外部变量只限于被本文件引用,而不能被其他文件引用。用static来声明一个变量的作用有:①对局部变量用static声明,则为该变量分配的空间在整个程序执行期间始终存在;②全部变量用static声明,则该变量的作用域只限于本文件模块(即被声明的文件中)。调用第一个fun,其两个实参的值为(3,5+3)与7即8与7,在函数fun执行结束返回15。第二次调用fun时,由于stat~为静态类型,其值保留,执行fun(5,3)后,其返回值为23,故选A。

 

(43)下面程序的输出是________。

main()

{char*s=”12134211”;

int vl=0,v2=0,v3=0,v4=0,k;

for(k=0;s[k];k++)

switch(s[k])

{   default:v4++;

case’l’:vl++;

case’3’:v3++;

case’2’:v2++;

}

printf(”v1=%d,v2=%d,v3=%d,v4=%d\n”,v1,v2,v3,v4);

}

A)vl=4,v2=2,v3=l,v4=l    B)vl=4,v2=9,v3=3,v4=l

C)vl=5,v2=8,v3=6,v4=l    D)vl=8,v2=8,v3=8,v4=8

答案:C

评析:当switch后面括弧内的表达式的值与某一个case后面的常量的表达式的值相等时,就执行此caSe后面的语句,若所有的case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句。

 

(44)下面程序的输出是_________。

main()

{ int k=11;

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

}

A)k=l1,k=12,k=l1      B)k=ll,k=13,k=13

C)k=l1,k=013,k=0xb    D)k=l1,k=13,k=B

答案:D

评析:在C语言格式字符的输出中,“%d”是以带符号的十进制形式输出整数;“%0”是以8进制无符号形式输出整数(不输出前导符O);“O/ox”是以16进制无符号形式输出整数(不输出前导符0x)。

 

(45)下面程序段中c的二进制值是__________。

char a=3,b=6,c;

c=a^b<<1:

A)00001011     B)00001111    C)00011110    D)00011100

答案:B

评析:c语言提供六种位运算符,按优先级由高到低的顺序分别为:取反(~)、左移((<)和右移(>>)、按位与(&)、按位异或(八)、按位或(I)。所以表达式c=aAb<<l先运算b<<l得二进制值为00001 100,再运算aA00001 100,最后得二进制值00001ll1。B

评析:c语言提供六种位运算符,按优先级由高到低的顺序分别为:取反(~)、左移((<)和右移(>>)、按位与(&)、按位异或(八)、按位或(I)。所以表达式c=aAb<<l先运算b<<l得二进制值为00001 100,再运算aA00001 100,最后得二进制值00001ll1。

 

(46)以下叙述中正确的是__________。

A)C语言比其他语言高级

B)C语言可以不用编译就能被计算机识别执行

C)C语言以接近英语国家的自然语言和数学语言作为语言的表达形式

D)C语言出现的最晚,具有其他语言的一切优点

答案:C

评析:计算机语言分为低级语言、汇编语言和高级语言,c语言属于高级语言,但并不是说c语言比其他语言高级,所以选项A错误;除了低级语言外,其他各种语言都必须编译成能被计算机识别的二进制数才能执行,选项B错误;C语言出现从1972年到1973年间,并不是出现最晚的语言,所以选项D也是错误的。

 

(47)下列可用于C语言用户标识符的一组是__________。

A)void define WORD      B)a3_b3 _123 Car

C)For -abc IFCase       D)2aDO sizeof

答案:B

评析:c语言规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线,所以排除c和D。c语言还规定标识符不能为c语言的关键字,从而选项A(void是关键字)是错误的。

 

(48)fgetc函数的作用是从指定文件读入一个字符,该文件的打开方式必须是________。

A)只读    B)追加    C)读或读写    D)以上均正确

答案:D

评析:fgetc函数是指从指定的文件读入一个字符,该文件必须是以读或读写方式打开的。电etc”函数的调用形式为:ch=fgetc(fp);。

 

(49)请选出正确的程序段_________。

A)int*p                              B)int*s,k;

Scanf(“”%d””,p);   *s=100;

……                                  ……

C)int*s,k;                         D)int*s,k;

Char *p,c;                          char *p,e;

s=&k:                                s=&k

p=&c;                                p=&c;

*p=’a’;                            s=p;

……                                  *s=l;

……

答案:C

评析:本题的A和B犯了一个同样的错误,即指针变量p定义后并没有指向具体的变量,因此不能进行赋值操作。另外,在选项D中,s是int指针变量,p是char型指针变量,所指向的内存单元所占用的字节数是不同的,因而不能将字符指针变量p的值赋给整型指针变量s。

 

(50)若有下面的说明和定义,则sizeof(struct aa)的值是__________。

struct aa

{

int rl;double r2;float r3:

union uu{char u1[5];long u2[2]}ua;

}mya;

A)30    B)29    C)24    D)22

答案:D

评析:结构体变量所占内存长度是各成员占的内存长度之和,每个成员分别占有自己的内存单元;共用体变量所占的内存长度等于最长的成员的长度。结构体变量aa中,成员r1占2个字节,r2占8个字节,r3古4个字节,共用体ua占8个字节,所以共占用2+8+4+8=22个字节。

 

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

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

(1)在先左后右的原则下,根据访问根结点的次序,二叉树的遍历可以分为三种:前序遍    历、  【1】  遍历和后序遍历。

答案:【1】中序

评析:在先左后右的原则下,根据访问根结点的次序,二叉树的遍历可以分为三种:前序遍历、中序遍历和后序遍历。

前序遍历是指在访问根结点、遍历左子树与遍历右子树这三者中,首先访问根结点,然后遍历左子树,最后遍历右子树;并且遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。

中序遍历指在访问根结点、遍历左子树与遍历右子树这三者中,首先遍历左子树,然后访问根结点,最后遍历右子树;并且遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。

后序遍历指在访问根结点、遍历左子树与遍历右子树这三者中,首先遍历右子树,然后访问根结点,最后遍历左子树;并且遍历左、右子树时,仍然先遍历右子树,然后访问根结点,最后遍历左子树。

 

(2)结构化程序设计方法的主要原则可以概括为自顶向下、逐步求精、  【2】  和限制使用goto语句。

答案:【2】模块化

评析:结构化程序设计方法的主要原则可以概括为自项向下、逐步求精、模块化和限制使用goto语句。

自顶向下:程序设计时,应先考虑总体,后考虑细节;先考虑全局目标,后考虑局部目标。不要一开始就过多追求众多的细节,先从最上层总目标开始设计,逐步使问题具体化。

逐步求精:对复杂问题,应设计一些子目标作过度,逐步细化。

模块化:一个复杂问题,肯定是由若干稍简单的问题构成。模块化是把程序要解决的总目标分解为分目标,再进一步分解为具体的小目标,把每个小目标称为一个模块。

限制使用goto语句。

 

(3)软件测试是保证软件质量的重要手段,而软件测试的主要和重要的测试方法是通过测    试数据和  【3】   的设计来实现。

答案:【3】测试实例

评析:进行软件测试时,应精心设计测试实例和选择测试数据,以对系统进行全面测试。

 

(4)数据库系统的三级模式分别为  【4】  模式、内部级模式与外部级模式。

答案:【4】概念 或 概念级

评析:数据库系统在其内部具有三级模式及二级映射,三级模式分别是概念级模式、内部级模式和外部级模式。

概念模式是数据库系统中全局数据逻辑结构的描述,是全体用户(应用)公共数据视图。

内模式又称物理模式,它给出了数据库物理存储结构与物理存取方法,如数据存储的文件结构、索引、集簇及hash等存取方式与存取路径,内模式的物理性主要体现在操作系统及文件级上,.它还未深入到设备级上(如磁盘及磁盘操作)。

外模式也称子模式或用户模式,它是用户的数据视图,也就是用户所见到的数据模式,它由概念模式推导面出。

 

(5)数据字典是各类数据描述的集合,它通常包括5个部分,即数据项、数据结构、数据流、  【5】  和处理过程。

答案:【5】数据存储

评析:数据字典是各类数据描述的集合,它通常包括5个部分,即数据项,是数据的最小单位;数据结构,是若干数据项有意义的集合;数据流,可以是数据项,也可以是数据结构,表示某一处理过程的输入或输出;数据存储,处理过程中存取的数据,常常是手工凭证、手工文档或计算机文件;处理过程。

 

(6)下面程序的输出是  【6】  。

main()

{int arr[10],i,k=O:

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

arr[i]=i;

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

k+=arr[I]+i;

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

答案:【6】12

评析:本题通过第一个for循环将数组arr[O]-arr[9]分别赋值为0-9,通过第二个for循环的三次循环累加,求出结果为12,具体分析如下:

i=l:k=0+arr[1]+l即k=2:

i=2:k=2+arr[2]+2即k=6:

i=3:k=6+arr[3]+3即k=12;

 

(7)若a=10,b=20,则表达式!(a<b)的值是  【7】  。

答案:【7】0

评析:已知a=10,b=20,所以逻辑表达式a<b的值为true,即为1,在这个表达式前面有一个逻辑运算符!,表示反操作,所以整个语句的值应当为false,即为0。

 

(8)有以下程序:

int fa(int x){return x*x;}

int fb(int x){return x*x*x;}

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

{return f2(X)-n(x);}

main()

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

程序运行后,输出结果是  【8】  。

答案:【8】4

评析:在主函数中调用函数f,函数f有三个参数,形参f1与f2分别是两个指向函数的指针。在f中执行r2(x)-f1(x),实际上是执行了fb(2).fa(2),故执行i=(fa,fb,2)后i的值为2^3-2^2=4。

 

(9)下面程序的输出是  【9】  。

main()

{enum em{eml=3,em2=1,em3};

char*aa[]={“AA”,”BB”,”CC”,”DD”};

primf(”%s%s%s\n”,aa[eml],aa[em2],aa[em3]);

}

答案:【9】DDBBCC

评析:c语言对枚举的定义规定:在枚举中声明的各个枚举元素,如果没有明确指出某个枚举元素的值,它的上一个元素存在并有明确值的情况下,这个枚举元素的值为其上一个元素的值+1。

在本题中,没有明确说明枚举元素em3的值,则em3=em2+l=1+l=2,进而可知,在printf()打印函数中,要打印的数组元素是aa[3]、aa[1]、aa[2],因此最后的打印结果应当为“DDBBCC”。

 

(10)若想通过以下输入语句使a=5.0,b=4,c=3,则输入数据的形式应该是  【10】  。

int b,c;float a;

scanf(”%£%d,c=%d”,&a,&b,&C)

答案:【10】5.0,4,c=3

评析:scanf(格式控制,地址表列),如果在“格式控制”字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符。所以此题中输入数据的形式是5.0;4,c=3。

 

(11)下列程序的输出结果是  【11】  。

int t(int x,int y,int cp,int dp)

{   cp=x*x+y*y;

dp=x*x-y*y;

}

main()

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

t(a,b,c,d);

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

}

答案:【ll】5 6

评析:本题中a,b,c,d是实参,x,多,cp,dp是形参。c语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。因此,程序的输出结果是5 6。

 

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

char b[]=”ABCD”;

main()

{

char b[30];

strcpy(&b[0],”GH”);

strcpy(&b[1],”GH”);

strcpy(&b[2],”GH”);

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

}

答案:【12】GGGH

评析:由于在函数main中定义了数组变量b,其将屏蔽全局变量b。对于一维数组变量,其值为一常数,等于数组首元素地址。strcpy(&b[0],“GH”),是将字符串。“GH”复制到数组b中从首元数开始的空间中,此是b中的字符串为“GH”;strcpy(&b[1],“GH”),是将字符串。“GH”复制到数组b中从第二个元素开始的空间中,此是b中的字符串为“GH”。执行第三次strcpy函数后,b中的字符串为”GGGH”。

 

(13)有以下定义和语句,则sizeof(a)的值是  【13】  ,而sizeof(a.share)的值是  【14】  。

struct date

{  int day;

int mouth;

int year;

union{int sharel;

float share2;

}share;

}a;

答案:【13】10

【14】4

评析:结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。int占2个字节,float占4个字节,共用体变量所占的内存长度等于最长的成员的长度。所以,sizeof(a.share)的值是4,sizeof(a)的值是2+2+2+4=10。

 

(14)下述函数用于统计一行字符中的单词个数,单词之间用空格分隔。

Word_num(str)

char str[];

{int i,num=O,word=O;

for(i=0;str[i]!=  【15】  ;i++)

if(  【16】  ==’’)word=0;

else if(word==0)

{

word=l;

  【17】  ;

}

return(num);

}

答案:【15】‘\0’或0或NULL

【16】str[I]

【17】num++或num=num+l或num+=1

评析:观察题目要求,可以知道以下几点:

①for循环的结束条件应当是:str[i]已是字符串的最后一个字符;

②strⅢ代表字符串str中的第i+1个字符;

③整型变量num的值是要记录的单词的个数。

c语言中规定字符串的最后一个字符是一个隐含的字符串结束符“\0”,所以在题中第一个空中应填写“\0”;题中第二个空应填写“str[i]”,以判断当前位置的字符是否为空格;题中第三个空中应当填写“num++”,通过变量num的加l累加得到字符串中的单词个数。

 

(15)有一个已排好序的数组,今输入一个数,要求按原来的顺序规律将它插入到数组中。算法是:假设排序顺序是从小到大,对输入的数,检查它在数组中哪个数之后,然后将比这个数大的数顺序后移一个位置,在空出的位置上将该数插入。请在程序中的空白处填上一条语句或一个表达式。

#defineN 100

main()

{  float a[N+1],x;

inti,p;

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

scanf(”%f”,&a[I]);

scanf(”%f”,&x);

for(I=0,p=N;i<N;i++)

if(x<a[I])

{  【18】  ;

break;}

for(i=N-1;  【19】  ;I–)

a[I+1]=a[I];

a[p]_x;

for(i=0;  【20】  ;i++)

{ primf(”%8.2f”,a[i]);

if(i%5==O)

printf(”\n”);

}

}

答案:【18】p=i;

【19】i>=p

【20】i<=N

评析:本题主要考查了插入排序。由于程序中的数组在开始已经按从小到的大顺序排好。在插入时,首先要查到第一个大于待插入数的数组下标,即当待插入元素小于数组中当前元素时,记下数组的当前下标p,并结束循环。故第一空目的是为了记下数组下标,应填p=i;插入排序的第二部是将大于待插入元素的所有元素都向后移动一位,故在循环时,要从最后一个元素到第p个元素都要后移一位,因此第二空应埴i>=p。最后一个循环是将N+1个元素都输出,故最后一空应为i<=N。(注:本题有多种答案,以上仅提供一种)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/265435.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号