-
2017
下半年程序员考试真题及答案
-
下午卷
试题一
<
/p>
阅读以下说明和流程图,填补流程图中的空缺,将解答填入答题纸的对应栏内。
【说明】
对于大于
1
的正整数
n
,
(x+1)n
可展开为
下面流程图的作用是计算
(x+1)n
展开后的各项系数
(
i=0,1,....,n<
/p>
)并依次存放在数
组
A[0...n]<
/p>
中。方法是依次计算
k=2
,
3
,
..
,
n
时
(x
+1)k
的展开系数并存入数组
A
,在此
过程中,对任一确定的
k
,利用关系式
,按照
i
递减的顺序逐步计算并
将结果存储在数组
A
中。其中,
为
1
。
例如,
计算
(x+1)3
的过程如下:
p>
和
都为
1
,因此可
直接设置
A[0]
、
A[k]
的值
先计算
(x+1)2 (
即
k=2)
的各项系数,然后计算<
/p>
(x+1)3(
即
k=3)
的各项系数。
K=2
时,
需要计算
已有,因此将
k=3
时,<
/p>
需要计算
再计算
【问题
1
】
【流程图】
(
由
,
和
,并存入
< br>A[0]
,
A[1]
和
A[2]
,其中
A[0]
和
A[1]
的值
即
(A[0])
相加得到
和
,
先计算出
(
由
的值并存入
A[1]
。
)
得到并存入
A[2]
,
(即
A[1]
)和
< br>,
和
得到
)
并存入
A[1]
。
注:循环开始框内应给出循环控制变量的初值和终值,默认递
增值为
1
。
格式为:循环控制变量
=
初值,终值,递增值。
(
1
)
2
,
n
,
1
(
2
)
A[k]
(
3
)
k-1
,
1
,
-1
(
4
)
A[i]+A[i-1]
(
5<
/p>
)
A[i]
(
1
)
(
3<
/p>
)
空为填写循环初值终值和递增值,
题目
中给出的格式为循环控制变量
=
初值,
终值,
递增值。按照题意,实质为求杨辉三角。如下图:
计算方式为从第
2
< br>行计算迭代到计算第
3
行,再根据第
3
行值求取第
4
行,直到计算到第
n
行。所以第一空填
2
,
n
,
1
。
而对于每行的求取,第
1
p>
项结果一直为
1
,最大项一直是
1
,可以直接赋值,所以第二空填
A[k]
。
然后从倒数第二项开始计算,依次往前计算。
所以第三空的填
k-1
,
1<
/p>
,
-1
。因为:
,
,故有
A[i]=A[i]+A[i-1]
< br>。
(注意
A[i]+A[i-1]
保留的
k-1
行的结果)
。
试题二
阅读以下说明和代码,填补代
码中的空缺,将解答填入答题纸的对应栏内。
【说明】
对
n
个元素进行简单选择排序的基本方法是:
第一趟从第
1
个元素开始,
在
n<
/p>
个元素中
选出最小者,
将其交换至第一个
位置,
第二趟从第
2
个元素开始,
p>
在剩下的
n-1
个元素中选
出最小者,
将其交换至第二个位置,
依此类推,第
p>
i
趟从
n-i+1
个元素中选出最小元素,将
其交换至第
i
个位置,通过
n-1
趟选择最终得到非递减排序的有序序列。
【问题
1
】
【代码】
#include
void selectSort(int data[
],int n)
//
对
data
[0]~data[n-1]
中的
n
个
整数按非递减有序的方式进行排列
{
int i,j,k;
int temp;
<
br>) //k
printf(“%d <
br>sizeof(arr)/sizeof(int),
arr 程序设计基本技能及应用。
<
br>j <
br>。 0 <
br> 2020 <
br>。 的输出结果;
<
br>而且执行完一个 <
br>,
<
br>. 最后添加一个
for(i=0;i
for(k=
i,j=i+1;
(
1
)
;
(
2
)
表示
data[i]~data[n-1]<
/p>
中最小元素的下标
if(data[j]
(
3
)
if(k!=i) {
//
将本趟找
出的最小元素与
data[i]
交换
temp=data[i];
(
4
p>
)
;
data[k]=temp;
}
}
}
int main()
{
int
arr[ ]={79,85,93,65,44,70,100,57};
int
i,m;
m=sizeof(arr)/sizeof(int); //
计算数组元素的个数,用
m
表示
(
5
)
; /
/
调用
selectSort
对数组<
/p>
arr
进行非递减排序
for(
(
6
)
;i
按非递减顺序输出所有的数组元素
t”,arr[i]);
printf(“
n”
);
return 0;
}
(
1<
/p>
)
j
或者
j
<=n-1
(
2
)
j++
(
3
)
k=j
(
4
)
dat
a[i]=data[k]
(
5
)<
/p>
selectSort(arr,m)
此处
m
也可以填
8
或者
可以改成
&arr[0]
(
6
)
i=0
本题考查
C
简单选择排序方法是设所排序序列的记录个数为
n
。
i
取
1,2,
…
,n-1,
从所
有
n-i+1
个记录(
Ri,Ri+1
,
…
,Rn
)中找出排序码最小的记录
,与第
i
个记录交换。执行
n-1
p>
趟后就完成了记录序列的排序。
第
1
空应填
j
循环结束
条件,
j
应该运行至序列末尾。填
j<
n
或者
j<=n-1
;
第
2
空填
循环控制语句,
j
每次递增<
/p>
1
,往后移动一个元素与
a[i]
进行比较。
第
3<
/p>
空为自动保存最大元素的下标,
k=j
。
第
4
空为交
换两个元素,
temp
为临时变量,保存
data[i]
的值,使用
data[i]=data[k]
使
data[i]
为后面
n-i+1
个记录(
Ri,Ri+1,
…
,Rn
)中找出排序码最小的记录,再将
temp
赋给
data[k]
第
5
空为调用
selectSort
对数组
arr
进行非递减排序,
selectSort
有两个参数,数组和排
序元素个数,为
select
Sort(arr,m)
。
第
6
空进行元素遍历输出所有的数组元素,从下标为
开始,所以填
i=0
。
试题三
阅读以下代码和问题,回答问
题
1
至问题
3
,将解答填入答题纸的对应栏内。
【代码
1
】
typedef enum {A
,
B
,
C
,
D}
EnumType;
EnumType f(int yr)
{
if(0 == yr%400) {
return A;
}
else
if (!(yr%4)) {
if(0!=yr%100)
return B;
else
}
return D;
}
【代码
2
】
#include
int main()
{
int score;
scanf(
,
&score);
switch (score)
{
case 5:
printf(
case 4: printf(
return C;
case 3: printf(
case 2:
}
case 1:
case 0:
printf(
default:
printf(
return 0;
}
【代码
3
】
#include
int main()
{
int i,j,k;
for(i=0; i<2; i++)
for(j=0; j<3;j++)
for( k=0; k<2;k++) {
if(i!=j&&j!=k)
printf(
}
ruturn 0;
}
【问题
1
】
(4
p>
分
)
对于代码
1
,写出下面的函数调用后
x1
、
p>
x2
、
x3
和
p>
x4
的值。
x1
= f(1997);
x2 = f(2000);
x3
= f(2100);
x4 = f(2020);
x1=3;x2=0;x3=2;x4=1
第一个条件
0==yr%400
,
2000
满足
,返回为
A
;其余都不满足,继续进行判断;
第二个条件
!
yr%4
,
1997
不满足,返回为
D
;其余满足
,继续进行判断;
第三个条件
0<
/p>
!
=yr%100
,
满足,返回为
B
;
2100
不满足,返回为
C
枚举类型中列出的每一个枚举符都对应着一个整数值
,
枚举类型实际上是一个整型符号常量
的集合。当定义枚举类型
时,枚举符都已经被系统隐含地赋予了一个整型值,默认情况下,
第一个元素为
0
,第二个元素为
1
,
依此类推。所以相应的
A=0
,
B=1
,
C=2
,
D
=3
,故返回为:
x1=3;x2=0;x3=2;x4=1<
/p>
。
【问题
2<
/p>
】
(
5
分)
p>
(
1
)写出代码
2
进行时输入为
3
(
2
)写出代码
2
进行时输入为
5
的输出结果。
(
1
)
Average
!
poor
!
Oops
,
Error
(
2
)
Excellent
!
Good
!
控制传递给与开关的值匹配的
case
语句。
switch
语句可以包括任意数目的
case
实例,
但是任何两个
case
p>
语句都不能具有相同的值。
语句体从选定的语句开始执行,
直到
break
将控制传递到
case
体以外。<
/p>
case
后面的常量表达式实际上只起语句标号作用
,
而不起条件
判断作用
,<
/p>
即
只是开始执行处的入口标号
因此
,
一旦与
switch
后面圆括号中表达式的值
匹配
,
就从此标号处开始执行
,
case
后面的语句后
若没遇到
break
语句
p>
,
就
自动进入
<
/p>
下一个
case
继续执行
,
而不在判断是否与之匹配
,
直到遇到
break
语句才停止执行
,
退出
break
语句
因此
,
若想执行一个
case
分之后立即跳出
switch
语句
,
就必须在此分支的
break
语句。
【问题
3
】
(
6
分)
写出
代码
3
运行后的输出结果。
0 1 0
0 2 0
0 2 1
1 0 1
1 2 0
1 2 1
此题考察多重
for
循环再加上一个判定条件,
i
的取值为(
0
,
1
)
,
j
的取值为(<
/p>
0
,
1
,
2
)
,
k
的取值为(
0
,
1
)
,只要按顺序找到
i
!
=j
且
j
!
=k
的组合即可。