欢迎广大考生登录大学公共计算机资源共享网站!
   
计算机二级考试试题
 

等级考试二级 C 语言 模拟题及答案 7

一、选择题 ((1) ~ (10) 每小题 2 分, (11) ~ (50) 每小题 1 分,共 60 分 )
     下列各题 A) 、 B) 、 C) 、 D) 四个选项中,只有一个选项是正确的,请将正确选项涂写  在答题卡相应位置上,答在试卷上不得分。

(1) 算法一般都可以用 ________ 控制结构组合而成。
A) 循环、分支、递归   B) 顺序、循环、嵌套
C) 循环、递归、选择   D) 顺序、选择、循环
   答案: D
   评析:算法的控制结构给出了算法的基本框架,不仅决定了算法中各操作的执行顺序,也直接反映了算法的设计是否符合结构化原则。一个算法一般都可以用顺序、选择、循环三种基本控制结构组合而成。

(2) 数据的存储结构是指 ________ 。
A) 数据所占的存储空间量
B) 数据的逻辑结构在计算机中的表示
C) 数据在计算机中的顺序存储方式
D) 存储在外存中的数据
   答案: B
   评析:数据的逻辑结构在计算机存储空间中的存放形式称为数据的存储结构。

(3) 设有下列二叉树:

   对此二叉树中序遍历的结果为 ________ 。
A)ABCDEF B)DBEAFC C)ABDECF D)DEBFCA
   答案: B
   评析:中序遍历是指首先遍历左子树,然后访问根结点,最后遍历右子树;并且在遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树的一种二叉树遍历算法。

(4) 在面向对象方法中,一个对象请求另一对象为其服务的方式是通过发送 ________ 。
A) 调用语句   B) 命令   C) 口令   D) 消息
   答案: D
   评析:面向对象的世界是通过对象与对象间彼此的相互合作来推动的,对象间的这种相互合作需要一个机制协助进行,这样的机制称为消息。消息是一个实例与另一个实例之间传递的信息,它请求对象执行某一处理或回答某一要求的信息,它统一了数据流和控制流。

(5) 检查软件产品是否符合需求定义的过程称为 ________ 。
A) 确认测试   B) 集成测试   C) 验证测试   D) 验收测试
   答案: A
   评析:确认测试的任务是验证软件的功能和性能及其他特性是否满足了需求规格说明中的确定的各种需求,以及软件配置是否完全、正确。

(6) 下列工具中为需求分析常用工具的是 ________ 。
A)PAD B)PFD C)N-S D)DFD
   答案: D
   评析:常见的需求分析方法有:结构化分析方法和面向对象的分析方法。结构化分析的常用工具有:数据流图 (DFD) 、数据字典 (DD) 、判定树和判定表等。

(7) 下面不属于软件设计原则的是 ________ 。
A) 抽象   B) 模块化   C) 自底向上   D) 信息隐蔽
   答案: C
   评析:在软件设计过程中,必须遵循软件工程的基本原则:这些原则包括抽象、信息隐蔽、模块化、局部化、确定性、一致性、完备性和可靠性。

(8) 索引属于 _________ 。
A) 模式   B) 内模式   C) 外模式   D) 概念模式
   答案: B
   评析:内模式 (Internal Schema) 又称物理模式 (Physical Schema) ,它给出了数据库物理存储结构与物理存取方法,如数据存储的文件结构、索引、集簇及 hash 等存取方式与存取路径。

(9) 在关系数据库中,用来表示实体之间联系的是 _________ 。
A) 树结构   B) 网结构   C) 线性表   D) 二维表
   答案: D
   评析:在关系数据库中,用二维表来表示实体之间联系。

(10) 将 E-R 图转换到关系模式时,实体与联系都可以表示成 _________ 。
A) 属性   B) 关系   C) 键   D) 域
   答案: B
   评析:关系是由若干个不同的元组所组成,因此关系可视为元组的集合,将 E-R 图转换到关系模式时,实体与联系都可以表示成关系。

(11) 有如下程序
main()
{
char ch[2][5]={"6937","8254"} , *p[2] ;
int I,j , s=0 ;
for(I=O ; i<2 ; i++)p[i]=ch[I] ;
for(I=O ; i<2 ; i++)
for(j=0 ; p[i][j]>' \ 0' ; j+=2)
s=10*s+(p[i][j] . '0') ;
printf(" % d \ n" , s) ;
}
   该程序的输出结果是 _________ 。
A)69825 B)63825 C)6385 D)693825
   答案: C
   评析:本题 "ch[2][5]={"6937","8254"}" 用于 2 行 5 列的二维数组初始化, ch[O][0]-ch[O][4] 的值分别为: 6 , 9 , 3 , 7 ,\ 0 ; ch[1][0]-ch[1][4] 的值分别为: 8 , 2 , 5 , 4 ,\ 0 ;第一个 for 循环用于将数组指针分别指向二给数组的第一行和第二行;第二个 for 嵌套循环用于取出 p[O][0] , p[O][2] , p[1][0] , p[1][2] 四个存储单元的数组成一个四位数进行输出。

(12) 以下叙述不正确的是 _________ 。
A) 分号是 C 语言的必要组成部分
B)C 程序的注释可以写在句的后面
C) 函数是 C 程序的基本单位
D) 主函数的名字不一定用 main 表示
   答案: D
   评析: c 语言的程序是由主函数 main() 开始运行,由主函数来调用其他函数,所以 D 是错误的。

(13) 若变量已正确定义并赋值,下面符合 c 语言的表达式是 _________ 。
A)a : _b+1 B)a=b=c+2 C)int 18 . 5 % 3 D)a=a+7=c+b
   答案: B
   评析:选项 A 和 c 一望而知其错:对于表达式 a=a+7=c+b( 答案 D) ,是先执行赋值表达式 a+7=c+b ,再把这个表达式的值赋给 a ,显然,表达式 a+7=c+b 非法,因为赋值表达式的左侧不能为常量或表达式。

(14)C 语言运算对象必须是整型的运算符是 _________ 。
A) % = B) /   C)= D)< :
   答案: A
   评析:在 C 语言中,模运算 ( 即取余运算% ) 的运算对象必须是整型数据 ( 常量、变量或表达式 ) 。

(15) 下面一组中都是 C 语言关键字的是 _________ 。
A)double Int for B)main while goto
C)volatile break static D)malloc sizeof new
   答案: C
   评析: c 语言中的关键字有 32 个关键字 ( 参见 c 语言教程 ) ,本题中只有 C 符合题意。

(16) 若已定义 x 和 y 为 double 类型,则表达式 x=1,y=x+3 / 2 的值是 _________ 。
A)l B)2 C)2 . 0 D)2 . 5
   答案: C
   评析:这是一个逗号表达式,它的值应为表达式 y=x+3 / 2 的值,而前一个表达式已给 x 赋值 l ,在没有进行类型转换的 t 留下, 3 / 2 的值为 1 ,所以 x+3 / 2 的值应为 2 . 0 。

(17) 执行语句: for( 、 i=1 ; i++<4 ; ) ;后变量 i 的值是 _________ 。
A)3 B)4 C)5 D) 不定
   答案: C
   评析: for 语句的一般形式为: for( 表达式 1 ;表达式 2 ;表达式 3) 语句,循环结束的条件是 i++<4 ,所以当 i++_4 时,循环结束,此时变量 i 的值为 5 。

(18) 若变量 a 、 i 已正确定义,且 i 已正确赋值,合法的语句是 _________ 。
A)a==l B)++i ;   C)a=a++=5 ;   D)a=int(i) ;
   答案: B
   评析:选项 D 显然是错的,而选项 A 没有分号结束,不是 c 语句; a++=5 违反了赋值表达式左侧必须为一个变量 ( 不能是常量或表达式 ) 的规定.

(19) 有如下程序
main()
{ int y=3 , x=3 , z=l ;
printf(" % d % d\n" , (++x , y++) , z+2) ;
}
   运行该程序的输出结果是 ________ 。
A)3 4 B)4 2 C)4 3 D)3 3
   答案: D
   评析:逗号表达式 (++X , y++) 的值应该是 y++ 的值,由于 y++ 是先引用后自增,所以 y++ 的值是 3 。

(20) 运行以下程序后,如果从键盘上输入 65 14< 回车 > ,则输出结果为 ________ 。
main()
{
int m , n ;
printf("Enter m , n : ") ;
scanf(" % d % dt ., &m , &n) ;
while(mI-n)
{
while(m>n)re-=n,
while(n>m)n-=m ;
}
printf("m= % d \ n" , m) ;
}
A)m=3 B)m=2 C)m=l D)m=O
   答案: C
   评析:分析程序可知,该程序实现的功能是对数 m,n 求其最大公约数。在本题中 m 与 n 的值分别为 65 与 14 ,其最大公约数为 1 ,故其输出结果为 m=l 。

(21) 能正确表示逻辑关系: ""a≥10 或 a≤0"" 的 C 语言表达式是 ________ 。
A)a>=10 or a<=O B)a>=0 I a<=10
C)a>=10&&a<=0 D)a>=10 ll a<=10
   答案: D
   评析: c 语言中的 " 或 " 关系用 "‖" 表示,其它相关逻辑运算符 " 与 " 用 "&&" 表示;运算符 " 非 " 用 "!" 来表示。

(22) 已经定义 ch 为字符型变量,以下赋值表达式中错误的是 ________ 。
A)ch=' \ ' B)ch=62+3 C)ch=NULL D)ch=' \ xaa'
   答案: A
   评析:反斜杠字符 " \ " 赋给字符,应该写成 ch='\\' ,所以 A 是错误的。

(23) 有如下程序
main()
{ int x=l , a=0 , b=0 ;
switch(x){
case 0 : b++ :
case 1 : a++ :
case 2 : a++ ; b++ ;
}
printf("a= % d , b 。% d \ n" , a , b) ;
)
   该程序的输出结果是 __________ 。
A)a : 2 , b=1 B)a=l , b=1 C)a=l , b : O D)a=2 , b=2
   答案: A
   评析 : 在这个 switch 语句中,因为 x 的值为 1 ,所以执行 case 1 :后面的 a++ ,这样 a=1 。但又由于其下没有 break 语句,所以其后面的语句 "a++ ; b++" 也将被执行,这样一来, a=2 , b=1 。

(24) 有如下程序
main()
{ float x=2 . 0,y ;
if(x<O . O)y=0 . 0 ;
else if(x<lO . O)y=1 . O / x ;
else y=1 . O ;
printf( % f \ n" , y) ;
}
   该程序输出结果是 _________ 。
A)0 . 000000 B)0 . 250000 C)0 . 500000 D)1 . 000000
   答案: C
   评析:本题考查的是 if .. else 语句的使用。 x=2 . 0 ,符合第二个 IF 语句的条件 x<lO . O ,所以执行 y=1 . 0 / x 语句,即 y=1 . 0 / 2 . 0=0 . 500000 。

(25) 有以下函数定义:
void fun(int n,double x){……}
   若以下选项中的变量都已正确定义并赋值,则对函数 fun 正确调用语句是 _______ 。
A)fun(int y,double m) ;   B)k=fun(10,12 . 5) ;
C)fun(x,n) ;        D)void fun(n , x) ;
   答案: C
   评析:函数调用的一般形式为:函数名 ( 实参表列 ) ;,实参与形参的个数应相等,类型应一致,在调用函数时,不要指定其返回类型,对于返回类型为 void 的函数,不能作为赋值表达式的组成部分,所以选 C 。

(26) 有如下程序
main()
{ int i,sum ;
for(i=l ; i<=3 ; sum++) sum+=i ;
printf(" % d \ n",sum) ;
}
   该程序的执行结果是 _________ 。
A)6 B)3 C) 死循环    D)O
   答案: C
   评析:在循环过程中, i 的值一直没有被改变,所以这是一个死循环。

(27) 下列函数定义中,会出现编译错误的是 _________ 。
A)max(int x,int y,int*z) B)int max(im x,y)
{ *z=x>y?x : y ; } { int z ;
z=x>y?x : y ;
return z ; }
C)max(intx,inty) D)intmax(intx,inty)
{int z ;               {return x>y?x : y ; }
z=x>y?x : y ;
return(z) ; }
   答案: B
   评析:在 c 语言中,不可以在函数的参数声明列表中用一个类型名指定多个参数。故选项 B 是错误的。
   其正确的表示方式应为
int max(int x,int y){……}
   或
int max(x , y)
int x , y ;
{……}

(28) 有如下程序
main()
{ int x=3 ;
do
{ printf(" % d" , x--) ; }
while(!x) ;
}
   该程序的执行结果是 ________ 。
A)321 B)3 C) 不输出任何内容   D) 陷入死循环
   答案: B
   评析:本题 x 赋初值为 3 ,当执行 printf("%d",x--) ;时,由于 X-- 的作用是先运算 x ,再将 x 的值减 l ,所以, printf 输出的 x 值为 3 ,等输出后, x 的值减 1 变为 2 ,继续执行,判断条件 !x 为假,循环只被执行一次。

(29) 设有声明语句 :char a=' \ 72' ;则变量 a__________
A) 包含 1 个字符   B) 包含 2 个字符
C) 包含 3 个字符   D) 声明不合法
   答案: A
   评析:转义字符常量 '\xx' 可以把 ' \ ' 后面的数字转换为对应的 ASCII 字符。

(30) 有以下程序段:
main()
{
int a=5,*b,**c
c==&b ; b=&a ;
}
   程序在执行了 c= & b ; b=&a ;语句后,表达式 ttc 的值是 __________ 。
A) 变量 a 的地址   B) 变量 b 中的地址
C) 变量 a 中的值   D) 变量 b 的地址
   答案: C
   评析:指针变量是用来存放地址的。 & :取地址运算符。 + :指针运算符。 **c 为指针变量 *c 所指向的存储单元, *c 为指针指针变量 c 所指向的存储单元,而 c=&b 表示 c 为变量 b 的地址, b=&a 表示 b 为变量 a 的地址。表达式一 c 的值就是变量 a 中的值。

(31) 有如下函数调用语句
func(recl,rec2+rec3,(rec4,rec5)) ;
   该函数调用语句中,含有的实参个数是 ________ 。
A)3 B)4 C)5 D) 有语法错误
   答案: A
   评析: (rec4,rec5) 是逗号表达式,它的值是 rec5 的值。所以该函数调用语句含有的实参个数是 3 。

(32) 有如下程序
main()
{
char s[115]={ . tabc" , "de" , "fgh"} ;
printf(" % e",s[2][6]) ;
}
   其输出为 __________ 。
A) 不确定   B) 编译错误   C)g D) 输出 null 字符
   答案: A
   评析:由于 s[2116] 表示字符串已超出了数组 s 的表示范围,在 c 中不会对数组越界进行检查,当数组越界时,会得到一个不确定的值。

(33) 有如下程序
int rune(ira a , int b)
{ remm(a+b) ; }
main()
{ int x=2,y=5,z=8,r ;
r=func(func(x , y) , z) ;
primf(" % d\n" , r) ;
}
   该程序的输出结果是 ________ 。
A)12 B)13 C)14 D)15
   答案: D
   评析:调用函数 func(x,y) ,返回 x+y ,即 7 ;再调用函数 func(7,z) ,返回 7+z ,即 15 。

(34) 有如下程序段
int *p,a=10,b=l ;
p=&a ;  a=*p+b ;
   执行该程序段后, a 的值为 _________ 。
A)12 B)11 C)10 D) 编译出错
   答案: B
   评析:执行 p=&a ;后, p 指向整数 a , *p 即 p 的目标变量,也就是 a ;所以 a=*p+b 等价于 a=a+b ,可知 a 的值最终为 11 。

(35) 有以下程序:
int*f(int*x,int*y)
{ if(*x<*y)return x ;
else returny ;
}
main()
{
int a=7 , b=8 , *p , *q , *r ;
p=&a ; q=&b;
r=f(p , q) ;
printf(" % d ,% d ,% d \ n" , *p , *q , *r) ;
}
   程序运行后输出结果是 _________ 。
A)7,8,8 B)7,8,7 C)8,7,7 D)8,7,8
   答案: B
   评析: f 函数的功能是返回地址为 x,y 的两个数中值较的数的地址,本题输出结果是 7,8,7 。

(36) 有如下程序
long fib(im n)
{ if(n>2) return(fib(n-1)+fib(n-2)) ;
else return(2) ;
)
main()
{ printf( % ld \ n",fib(3)) ; }
   该程序的输出结果是 _________ 。
A)2 B)4 C)6 D)8
   答案: B
   评析:函数舶内部有两个递归调用,当 n=3 时, fib(n-1) 返回 2 , fib(n-2) 也返回 2 ,所以 fib(n-I)+fib(n-21 的值为 4 。

(37) 下面程序的输出结果是 _________ 。
main()
{
char str[10] , c='a' ;
inti=0 :
for( ; i<5 ; i++)
str[I]=c++ ;
printf(" % s" , str) ;
}
A)abcde B)a C) 不确定   D)bcdef
   答案: C
   评析:字符串少一个结束标志,所以输出的结果不确定。

(38) 在 c 语言中,函数中变量的隐含存储类别是 __________ 。
A)auto B)static C)extern D) 无存储类别
   答案: A
   评析:函数中变量的存储类别包括 auto , static , extern ,其中 auto 为隐含存储类别, static 为静态存储类别, register 是寄存器存储类别。 A
   评析:函数中变量的存储类别包括 auto , static , extern ,其中 auto 为隐含存储类别, static 为静态存储类别, register 是寄存器存储类别。

(39) 有如下程序
#define n 2
#define m N+I
#define NUM 2*m+l
main()
{ int i ;
for(i=1 ; i<=NUM ; i++)printtf(" % d \ n" , i) ;
}
   该程序中的 for 循环执行的次数是 _________ 。
A)5 B)6 C)7 D)8
   答案: B
   评析:在 c 语言中,宏定义在编译时将被直接替换,所以 NUM 最后会被替换成 2*N+l+l ,即 2*2+1+1 ,值为 6 。因此, for 循环执行的次数为 6 。

(40) 假设在 turboc2 . 0 采用 small 模式编译如下程序
main()
{
char a[4] : {'a' , 'b'} ;
char % ="abc . t :
printf(" % d, % d",sizeof(a) , sizeof(b)) ;
}
   其输出结果为 _________ 。
A)4,2 B)4,4 C)4,3 D)2,2
   答案: A
   评析:用 small 模式编译,指针变量占 2 个字节。 sizeof(array) :数组名 array 代表数组本身, sizeof 函数测出的是整个数组的大小。 a 数组的大小为 4 , b 指针变量的大小为 2 。

(41) 有以下函数
char *fun(char *p)
{ retum p ;  }
   该函数的返回值是 _________ 。
A) 无确切的值         B) 形参 p 中存放的地址值
C) 一个临时存储单元的地址   D) 形参 p 自身的地址值
   答案: B
   评析: p 本身就是一个字符型指针变量,返回 p 也就是返回变量 p 中存放的地址值。

(42) 有如下程序段:
#include<stdio . h>
#define Max(a , b)a>b?a : b
main()
{
int a=5 , b=6 , c=4 , d ;
d=c+Max(a , b) ;
printf(" % d" , d) ;
}
   其输出结果为 __________ 。
A)10 B)5 C)6 D) 编译错误
   答案: B
   评析:在 c 语言中,宏定义是直接替换的,所以在 c+a>b?a : b 这个条件表达式中, c+a>b 为真,所以用 a 的值作为整个表达式的值,而 a 的值为 5 ,所以整个表达式的值为 5 。

(43) 有如下程序段
int a=14,b=l 5,x ;
char c='A' :
x=(a&&b) &&(c<'B') ;
   执行该程序段后, x 的值为 ________ 。
A)true B)false C)0 D)l
   答案: D
   评析: a&&b 的值为 true , c<'B' 的值也为 true ,所以 (a&&b)&&(c<'B') 的值为 true 。但 x 是 int 型变量,所以 ( 披 &b)&&(c<'B') 的值最后要从 bool 型转换为 int 型赋给 x 。这样 x 的值应为 l 。

(44) 下述关于 C 语言文件的操作的结论中,正确的是 ________ 。
A) 对文件操作必须先关闭文件
B) 对文件操作必须先打开文件
C) 对文件操作顺序无要求
D) 对文件操作前必须先测文件是否存在,然后再打开文件。
   答案: B
   评析:在 c 中对文件操作必须先打开文件,待文件操作完毕后要关闭文件。对文件以读的方式进行打开操作时,同时会执行文件的检查文件是否存在,不存在将会返回空的文件指针,如果对文件以写的方式打开时,文件不存在,将会自动创建文件,.因此在 C 中打开文件前不必对其检查文件是否存在,故答案为 B 。

(45) 下列关键字中,不属于 C 语言变量存储类别的是 ________ 。
A)register B)auto C)extem D)public
   答案: D
   评析:变量的存储类别具体包含四种:自动的 (auto) ,静态的 (statiC) ,寄存器的 (register) ,外部的 (extern) 。

(46) 有如下说明
im a[10]={l , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10} , *p=a ;
   则数值为 9 的表达式是 ________ 。
A) 木 p+9 B) 半 (p+8) C) 牛 p+=9 D)p+8
   答案: B
   评析: p 是指针, p+8 是地址值, D 是错的; *p 是 p 的目标变量,即 a[0] ,值为 1 ,所以 +p+9 的值是 lO ,而 *p+=9 值是重新给 a[O] 赋了值 (1+9) ;所以 A 和 C 也是错的。 p+8 是地址值,指向 a[8] ,那么 *(p+8) 。的值就是 a[81 的值,即 9 。

(47) 若有以下定义: int t[3][2] ;能正确表示 t 数组元素地址的表达式是 ________ 。
A)&t[3][2] B]t[3] C]t[1] D]*t[2]
   答案: C
   评析: A 和 B 两个表达式都已越界了; *t[2] 是目标变量,即一个整数,而不是地址值。

(48) 下面程序运行后的输出结果是 ________ 。
struct abc
{
int a , b , c ;
}
main()
{
struct abc s[2]={{1 , 2 , 3} , {4 , 5 , 6}} ;
int t=-s[0] . a+s[1] . b ;
printf(" % d \ n",t) ;
}
A)5 B)6 C)7 D)8
   答案: B
   评析:在 main 函数中定义了一个 struct abc 类型的数组,同时分别利用 {1 , 2 , 3} 及 {4 , 5 , 6} 对数组中两个元素进行初始化。在该结构体,依次对其中的 a,b,c 三个变量进行初始化。故 s[O] . a=l , s[1] . b=5 ,所以本题输出为 6 。

(49) 有如下程序
main()
{
int a[31131 。 {{1 , 2} , {3 , 4} , {5 , 6}} , i,j,s=0 ;
for(i=l ; i<3 ; i++)
for(j=0 ; j<=i ; j++)
s+=a[I][j] ;
printf(" % d \ n",s) ;
}
   该程序的输出结果是 ________ 。
A)18 B)19 C)20 D)2l
   答案: A
   评析:题中的外循环只执行了 2 次:
   第 1 次: a[1][0]=3 , a[1][1]=4 ,所以 s=7 ;
   第 2 次: a[2][O]=5 , a[2][1]=6 , a[2][2]=0 ,所以 s=7+5+6+0=18 。

(50) 若己建立如下图所示的单向链表结构:

   在该链表结构中,指针 p 、 s 分别指向图中所示结点,则不能将 s 所指的结点插入到链表末尾仍构成单向链表的语句组是 __________ 。
A)p=p->next ; s->next : p ; p->next=s ;
B)p=p->next ; s->next : p->next ; p->next=s ;
C)s->next : NULL ; p=p->next ; p->next : s ;
D)p=(*p) . next ; (*s) . next=(*p) . next ; (*p) . next=s ;
   答案: A
   评析:在答案 A 中: p=p->next ; s->next=p ; p->next=s ; s 的确已插到了链表的末尾,但它的 next 却并没有为 NULL ,而是指向了它的直接前趋 p ,这样它就不是一个单向链表 ( 单向链表最后一个结点的 next 指针一定是一个 NULL) 。

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

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

(1) 在运算过程中,能够使空表与非空表的运算统一的结构是 【 1 】 。
   答案:【 1 】循环链表
   评析:在链表的运算过程中,采用链接方式即循环链表的结构把空表与非空表的运算统一起来。循环链表具有两个特点:
① 在循环链表中增加了一个表头结点,其数据域为任意或根据需要来设置,指针域指向线性表的第一个元素的结点。循环链表的头指针指向表头结点。
② 循环链表中最后一个结点的指针不是空,而是指向表头结点。

(2) 软件工程研究的内容主要包括: 【 2 】 技术和软件工程管理。
   答案:【 2 】软件开发
   评析:基于软件工程的目标,软件工程的理论和技术性研究的内容主要包括:软件开发技术和软件工程管理。
   软件开发技术包括:软件开发方法学、开发过程、开发工具和软件工程环境,其主体内容是软件开发方法学。
   软件工程管理包括:软件管理学、软件工程经济学、软件心理学等内容。

(3) 与结构化需求分析方法相对应的是 【 3 】 方法。
   答案:【 3 】结构化设计
   评析:与结构化需求分析方法相对应的是结构化设计方法。结构化设计就是采用最佳的可能方法设计系统的各个组成部分以及各个成分之间的内部联系的技术。也就是说,结构化设计是这样一个过程,它决定用哪些方法把哪些部分联系起来,才能解决好某个具体且有清楚定义的问题。

(4) 关系模型的完整性规则是对关系的某种约束条件,包括实体完整性、 【 4 】 和自定义完整性。
   答案:【 4 】参照完整性
   评析:关系模型允许定义三类数据约束,它们是实体完整性、参照完整性以及用户定义的完整性约束,其中前两种完整性约束由关系数据库系统自动支持。
   实体完整性约束要求关系的主键中属性值不能为空,这是数据库完整性的最基本要求,因为主键是惟一决定元组的,如为空则其惟一性就成为不可能的了。
   参照完整性约束是关系之间相关联的基本约束,它不允许关系引用不存在的元组:即在关系中的外键要么是所关联关系中实际存在的元组,要么是空值。
   自定义完整性是针对具体数据环境与应用环境由用户具体设置的约束,它反映了具体应用中数据的语义要求。

(5) 数据模型按不同的应用层次分为三种类型,它们是 【 5 】  数据模型、逻辑数据模型和物理数据模型。
   答案:【 5 】概念
   评析:数据模型按不同的应用层次分为三种类型,它们是概念数据模型、逻辑数据模型和物理数据模型。
   概念数据模型简称概念模型,是一种面向客观世界、面向用户的模型;它与具体的数据库管理系统无关。

(6) 表示 "" 整数 x 的绝对值大于 5"" 时值为 "" 真 "" 的 C 语言表达式是 【 6 】  。
   答案:【 6 】 x>5‖x<-5 或 k<-5‖x>5
   评析:要使整数 x 的绝对值大于 5 ,则 x 大于 5 或 x 小于 -5 ,用 c 语言表示即为: x>5‖x<-5 或者 x<-5‖x>5 。
   故本题答案为: x>5‖x<-5 或者 x<-5‖x>5 。

(7) 以下程序的输出结果是 【 7 】 。
main()
{ unsigned short a=65536 ; int b ;
printf(" % d \ n" , b=a) ;
}
   答案:【 7 】 0
   评析:对于一个 unsigned short 来说,它能取的最大值是 65535 。这里给 a 赋值 65536 ,已经超出了它的取值范围,这样它的高位将被截掉,只把低位赋给它 ( 全零 ) 。所以 a 的值实际为 0 。

(8) 若有定义: ira a=lO,b=9,c=8 ;,接着顺序执行下列语句,变量 b 中的值是 【 8 】 。
c=(a-=(b-5)) ;
c=(a % 11)+(b=3) ;
   答案:【 8 】 3
   评析:这里: b-5=4 , a . =4 之后 a 的值为 6 ,并把它赋给 c 。此时 b 的值并未被改变。在第 2 个表达式中,也只有赋值表达式 b=3 改变了 b 的值。所以两行语句执行完毕, b 的值应该为 3 。

(9) 以下程序运行后的输出结果是 【 9 】 。
main()
{
int p=30 ;
primf(" % d \ n",(p / 3>O?p / 10 : p % 3)) ;
}
   答案:【 9 】 3
   评析:条件表达式的一般形式为:表达式 17 表达式 2 :表达式 3 条件运算符的执行顺序:先求解表达式 1 ,若为非 0( 真 ) 则求解表达式 2 ,此时表达式 2 的值就作为整个条件表达式的值;若表达式 l 的值为 0( 假 )- ,则求解表达式 3 ,表达式 3 的值就是整个条件表达式的值。 30 / 3=10>0 ,所以执行 p / lO ,结果为 3 。

(10) 函数 pi 的功能是根据以下近似公式求 n 值:
(∏*∏) / 6=1+1 / (2*2)+1 / (3*3)+…+1(n*n)
   现在请你在下面的函数中填空,完成求 n 的功能。
#include"math . H"
{ double s=0 . 0 ; long i ;
for(i=1 ; i<=n ; i++)s=s+  【 10 】  ;
retum(sqrt(6*s)) ;
}
   答案:【 10 】 1 . O / (i*i1 或 (double)l / (i*i)
   评析:表达式 1+1 / (2*2)+l / (3*3)+…+1(n*n) 可写为: 1 / (1*1)+1 / (2*2)+1 / (3*3)+…+1(n*n)
n
   即: ∑l÷(i×i)
i-l
   对应的 c 语言的表达式: s=s+1 . O / (i*i) 。注:必须要写成 1 . 0 的形式,否则 1 / (i*i) 返回值为其值截尾取整,即恒为 O 。

(11) 函数 pi 的功能是根据以下公式近似求得的:
pi*pi / 6=1+1 / (2*2)+1 / (3*3)+…+1 / (n*n)
   请在下面的函数中填空,完成求 pi 的功能。
#include<math . h>
double pi(10ng n1
{ double s=O . O,long i ;
for(i=1 ; i<=n ; I++)s=s+  【 11 】  ;
return(sqrt(6*s)) ;
}
   答案:【 11 】 1 . 0 / i / i 或 1 . O / (i*i)
   评析:由题面中提供的计算 pi 的公式可知:在第 i 项其值为 1 / (i*i) ,考虑到运算结果为浮点数,故必须要将 l 转化为浮点数或采用 1 . O / (i*i) 的形式。故本题应填 1 . O / (i*i) 或其等效形式。

(12) 若输入字符串: abcde /,则以下 while 循环体将执行 【 12 】  次。
while((ch=getchar())=='e')printf("*") ;
   答案:【 12 】 0
   评析:函数 getchar() 是从键盘得到用户输入的一个字符。用户输入的第 1 个字符是 a ,不管后面输入的是什么 ch 的值都是 'a' ,因此条件 (ch=getchar())=='e' 为假,这个循环不会被执行。

(13) 以下函数用来求出两整数之和,并通过形参将结果传回,请填空。
voidfunc(intx,inty,  【 13 】  z]
{ *z-x+y ; } ,
   答案:【 13 】 int*
   评析:从题中代码可知: z 应该是一个整型指针,因此应填: int*

(14) 若有以下定义,则不移动指针 p ,且通过指针 p 引用值为 98 的数组元素的表达式是  【 14 】  。
int w[10]={23,54,10,33,47,98,72,80,61} , *p=w ;
   答案:【 14 】 p[5] 或 *(p+5)
   评析: 98 是数组 w 的第 5 个元素 ( 最开始的为第 O 个 ) ,而通过 *p=w 已经将 p 指向了数组 w ,要想不移动指针 p 而引用 98 ,可以有以下两种写法: p[5] 、 *(p+5) 。

(15) 设在主函数中有以下定义和函数调用语句,且 fun 函数为 void 类型;请写出 fun 函  数的首部 【 15 】  。要求形参名为 b 。
main()
{ double s[10][22] ;
int n :
……
fun(s) ;
……
}
   答案:【 15 】 void fun(double b[1011221]
   评析:本题答案: void fun(double b[10][22])

(16) 有以下程序:
int f(int n)
{ if(n==1)return 1 ;
else return f(n-1)+1 ; }
main()
{ int i j=0 ;
for(i=1 ; i<3 ; i++)j+=f(i) ;
printf(" % d \ n"'j) ;
}
   程序运行后的输出结果是 【 16 】 。
   答案:【 16 】 3
   评析: i=l 时, f(1)=1 J=j+f(1)=0+1=1 ; i=2 时, f(2)=f(1)+l=1+1=2 j=j+f(2)=l+3=3 ;此时循环结束,程序运行后的输出结果是 3 。

(17) 以下程序的输出结果是 【 17 】 。
void fun()
{ static int a : 0 ;
a+=2 ; printf(" % d" , a) ;
}
main()
{ int cc ;
for(CC=1 ; cc<4 ; cc++)fun() ;
printf(" \ n") ;
}
   答案:【 17 】 246
   评析:循环 for(cc=l ; cc<4 ; cc++) 被执行了 3 次。在函数 fun 中,由于 a 是 static 型变量,所以函数第 1 次调用后, a=2 ;第 2 次调用后, a=4 ;第 3 次调用后, a=6 。

(18) 实现程序可将磁盘中的一个文件复制到另一个文件中,两个文件的文件名在可执行命令的命令行中 ( 相当于 copy 命令 ) ,假定文件在当前目录下。请补全程序。
#include<stdio . h>
void main(int argc,char 。 argv[])
{ FILE *f1 , *f2 ;
if(argc<  【 18 】  )
{ printf("parameter error!\n") ; exit(0) ; }
fl=fopen(argv[1],"r") ;
f2=fopen(argv[2],"w") ;
while(  【 19 】  )fputc(fgetc(f1) , f2) ;
fclose(f1) ;
fclose(f2) ;
}
   答案:【 18 】 3
   【 19 】 !feof(f1)
   评析:在 c 语言中,宏定义是直接替换的,所以在对表达式 MAX(a+b,c+d)*10 进行或替换后,表达式变为: (a+b)>(c+d)?(a+b) : (c+d)*10
   在这个条件表达式中, (a+b)>(c+d) 为真,所以用 (a+b) 的值作为整个表达式的值 ( 否则用 (c+d)*10 的值作为整个表达式的值 ) ,而 (a+b) 的值为 7 。所以整个表达式的值为 7 。

(19) 以下程序的输出结果是 【 20 】 。
#define MAX(x,y)(x)>(y)?(x) : (y)
main()
f int a=5,b=2,c=3 , d=3 , t ;
t=MAX(a+b,c+d)*10 ;
printf(" % d \ n" , t) ;
)

 
   
版权所有:西北师范大学数学与信息科学学院