2011 下半年程序员考试真题及答案-下午卷
试题一
【说明】
以下流程图用于检查数组 A[1:n]中的@素是否为自然数 1〜n 的一个排列(含有 1〜n 各
数)。若是,则输出 OK,否则输出所缺的自然数及其个数 m。
为检查 A[1:n]中是否含有 k,只要判断 P(k)=(A(l)-k)*(A(2)-k)*...*(A(n)-k)是否等于 0
即可。
【流程图】
阅读说明和流程图,填补流程图中的空缺(1)〜(5)。
(1) 0
(2) 1
(3) P*(A(i)-k)
(4) P=0
(5) m+1
本题考查算法设计和描述的基本能力。
从流程图看出,首先需要对 m 赋初值,然后对 k=l,2,...,n 循环,检查数组 A 中是否含
k。为此,在该循环中,需要嵌套内循环来计算 P(k)。然后判断计算结果 P 的值是否等于 0,
来决定数组 A 中是否含 k,并采取相应的动作。
为了对 i 循环计算累乘的 P(k),需要先在 P 中送初值 1。因此(2)处应填 1,并在(3 )处填
写 P*(A(i)-k)进行累乘。
内循环结束后,(4)处应判断 P=0 是否成立。P=0 表示数组 A 中含 k,否则表示数组 A 中缺 k。
因此,(4)处应填写 P=0。
如果数组 A 中缺 k,则缺数计数 m 应增 1。因此,(5)处应填 m+1,而 m 的初值应送 0,从而(1)
处应填 0。
k 循环结束后,应根据 m 的值决定输出结果。m=0 表示数组 A 中包含全部自然数 1 至 n,即
数组 A 的元素就是 1〜n 的一个排列;m 不等于 0 表示数组 A 中短缺其中 m 个自然数。 .
本题的算法可应用于判断标准数独的答案是否正确。例如,9 阶(9*9)标准数独解答所得的
结果应在每行、每列、每个 3*3 宫内都包含 1〜9,并不重复,即都是 1〜9 的一个排列。靠
人工检查稍有麻烦,尤其是 16 阶标准数独解答结果的人工检查更令人烦恼,这个算法则提
供了一种处理思路。
试题二
【说明】
下面是一个待修改的 C 程序,其应该完成的功能是:对于输入的一个整数 mim,计算其
位数 k,然后将其各位数字按逆序转换为字符串保存并输出。若 mim 为负整数,则输出字符
串应有前缀“-”。例如,将该程序修改正确后,运行时若输入“14251”,则输出 “15241”;
若输入 “-6319870”,则输出 “-0789136”。
下面给出的 C 程序代码中有五处错误,请指出错误代码所在的行号并给出修改正确后的
完整代码行。
【C 程序代码】
阅读说明和 C 程序代码,解答问题。
本题考査 C 程序员査找错误和排除错误的基本能力。
程序中的错误主要分为语法错误和语义错误两类。
语法错误是指语言结构上的错误,例如,是否引用了未定义的变量,表达式中缺少操作
数等等。语义错误是指语言结构含义不正确或程序的运算逻辑有错误,这类错误可能在编译
阶段发现(静态语义),也可能推迟到运行阶段才暴露。例如,表达式中运算符 号不能处理
所引用的运算对象,无穷循环等。
考生需要非常熟悉 C 语言的基本语法,从而通过走查源代码来发现语法错误。查找语义
错误则需要充分理解程序的逻辑,也就是整个程序的结构和每条语句所起的作用。
前 2 行为预处理命令行,对于最常使用的 include 命令,考生应该非常熟悉,以便检查程序
中对常用函数的调用是否正确。本程序中前两行无错误。
显然,接下来的四行分别为 main 函数的首部,函数体的开始符号“{”、变量定义语句
和空白行,这里也没有错误。
第 7 行为格式化输入函数 scanf 的调用语句,这是比较容易出错的地方,常见的错误是
格式控制串与输入表列中的变量不匹配,或者是丢失变量前的取地址运算符号“&”,该行的
错误即在这里。
第 8 行至第 12 行用于计算所输入整数的位数并用 k 来计算(记录),这几行代码应作为
一个整体来理解。程序中首先将 num 的值备份至 t,并对 k 赋值,然后通过循环对 t 进行辗
转除以 10 的运算,使 t 每次都丢掉其个位数,即 t 的位数逐渐减少(t 每减少 1 位,k 就增
加 1),直到 t 的值为 0 时为止,此时 k 的值即为 mim 的位数。第 9 行的循环条件错误导致
了无穷循环(t 等于 0 时也继续循环),由于 t 的初值也可能是负数,因此应将其中的“t>=0”
改为“t!=0”。
第 14 行没有错误。
第 15 行的错误很明显,也很常见,即将“=”误用为“==”,从而改变其所在语句的语
义,其中的“pstr=0”则将 pstr 的值重置为 0,使 pstr 所记录的字符串存储空间首地址信
息丢失,此后针对 pstr[]的运算都会出错。
第 17 行至第 21 行用于处理 num 为负数时输出字符串应包含前缀"-"的要求,这几行没
有错误。
第 22 行至第 25 行用于从 mum 得到其逆置的数字字符串,其错误在第 23 行,属于逻辑
错误。num%10 的运算结果为 mim 的个位数字,而 pstr[]中要存储的是数字字符(即 ASCII
值),因此应将 num%10 的运算结果加上字符‘0’(或字符‘0,的 ASCII 码值 48)。
第 26 行用于设置字符串结束标志,需要注意的是串结束标志的位置。由于 mim 可能为负数,
因此将字符串结束标志字符设置在 k 下标处可能出错,保险的做法是继续用 i 作为下标,使
得’\0'正好跟在最后一个数字字符的后面。
第 27 行至第 30 行没有错误。
试题三
【说明】
某市在进行市长选举,该市共分为 M 个选区(1
阅读说明和 C 代码,填补 C 代码中的空缺(1)〜(5)
(1) j++,或++j,或其等价表示
(2)0
(3)MAXP2 = MAXP1
(4) totalP += data[M][j],或 totalP += totalP + data[M][j],或其等价表不
(5)(double)MAXPl/totalP,或(float)MAXPl/totalP,或其等价表示
其中,将(double)或(float)写在 totalP 之前亦可
本题考查 c 程序设计基本能力。
题目中涉及的知识点主要有数组、文件、循环和类型转换,分析程序时首先要明确各个
变量(或数组元素)所起的作用,并以语句组分析各段代码的功能,从而完成空缺处的代码
填充。
根据题目描述,首先将文件中的数据读入数组 data。显然,i 和 j 分别起行号、列号的
作用。行号 i 应在一行的数据都读入后增加 1,而列号 j 则每读入一个数据就要增加 1,因
此空(1)处应填写“j++”或其等价形式的语句。
将数据读入数组 data 后,以题中的数据为例,data 数组的内容可表示如下:
由于 data[M][i]存放 i 号竞选者的得票总数,data[][0]存放的是选区编号,因此
data[M][0]不用。
以上表为例,需要将 data[0][1]、data[1][1] data[M—1][1]加起来存人 data[M][1],