logo资料库

2011下半年程序员考试真题及答案-下午卷.doc

第1页 / 共21页
第2页 / 共21页
第3页 / 共21页
第4页 / 共21页
第5页 / 共21页
第6页 / 共21页
第7页 / 共21页
第8页 / 共21页
资料共21页,剩余部分请下载后查看
【流程图】
【C程序代码】
【C代码】
(1).用k计数,每次都从0开始,当计数到m-1时结束本次计数;
(3).通过删除结点表示出圈处理;
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],
分享到:
收藏