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

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

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)32    B)31    C)16     D)15

答案:C

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

在满二叉树中,最后一层的结点个数就是叶子结点的个数,本题中深度为5,故叶子结点数为25-1=24=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+7        B)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)741    B)852    C)963    D)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 3    B)0 12    C)1 0 3    D)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<O)                l (x<O)

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)4962710    C)04312765    D)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)2    C)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<stdio.h>

main()

{

int a,b,d=24l:

a=d/l00%9;

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

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

}

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

答案:B

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

 

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

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

答案:D

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

 

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

#include<stdio.h>

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<a+1:

答案: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,17    B)8,16    C)8,20    D)8.8

答案:A

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

 

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

#include<stdio.h>

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

{  int p;

for(p=0,*k=p;p<t;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)a<b<0    C)0<a<b    D)0>a>b

答案: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;语句,则条件为a<b,要求s=2,需要执行if(a>O)s=s+l;语句,所以应满足条件0<a<b。

 

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

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

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

答案:B

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

 

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

main()

{

int y=10;

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

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

}

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

答案:D

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

 

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

A)%    B)/    C)<    D)!

答案: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)+2        D)*(*(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+6    B)*(p+6)    C)*p+=5    D)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)67    B)69    C)68    D)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)99    D)2

答案:A

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

 

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

#include<string.h>

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<y;x++,y–)

{ 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)2    B)l    C)0    D)不确定

答案: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)9    B)6    C)36    D)18

答案:C

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

 

(42)若有以下定义:

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

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

A)ps+2    B)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)987    B)876    C)8765    D)9876

答案:B

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

 

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

#include<stdio.h>

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/8    B)C=C%8    C)C=C/8    D)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)0    B)1    C)2    D)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<stdio.h>

main()

{

union

{

int k:

chari[2];

}*s,a;

s=&a:

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

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

}

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

答案:A

评析:在主函数定义了一个共用体变量a,及一个指向该变量的指针s。执行s->i[0]=0x39;s->i[1]=0x38;,将分别共用体的第一字节及第二字节存入十六进制数据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<stdio.h>

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”。

 

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

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

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