logo资料库

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

第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
资料共17页,剩余部分请下载后查看
【流程图】
2011 上半年程序员考试真题及答案-下午卷 试题一 下面的流程图可在正文字符串 T(1:L)中计算关键词字符串 K(l:m)出现的次数(用 n 表 示)。其中,L 为字符串 T 的长度,m 为字符串 K 的长度(m
根据题意,正文字符串中的各个字符依次存放在 T(1),T(2),…,T(L)中,关键词字 符串中的各个字符依次存放在 K(1),K(2),,",K(m)*。显然 i 是字符数组 T 的动态下标指 针。 为了与关键词字符串进行比较,题中需要每次从数组 T 中连续取出 m 个元素放在数组 A 中。第 1 次将 T(l:m)存入 A(1:m),第 2 次将 T(2:m+1)存入 A(1:m),…,第 i 次就应将 T(i:m+i-1)存入 A(1:m),最后一次应将 T(L-m+1:L)存入 A(l:m)。因此,流程图的(2)中 应 填 m+i-1,由于 m+i-1 必须小于或等于 L。当 m+i-1>L 时,即当 i>L-m+1 时,就不应该再取子 串了。因此流程图的(1)处应填 L-m+1。 流程图右下方一片描述了字符数组 A(i),A(i+1),…,A(i+m-1)与字符数组 K(1), K(2),…, K(m)的比较过程。题中用 j 表示数组 K 的动态下标指针,j=1,2,……,m。显 然,数组 A 的动态下标指针为 i+j-1(j=1,2,……,m)。两个字符数组都从左到右逐个字 符地进行比较,如果发现有不一致的字符,就结束比较,将 i 增 1 后准备继续从数组 T 中取 新的子串放在 A 中。 如果一直到比较结束,发现两个数组中对应的各个字符都是一致的, 那么,就找到了一处关键词。此时,找到关键词的计数器 n 应增 l(n+1—n)。因此,流程图 的(4)处应填 n+1 字符数组 A 与 K 的比较过程关键是逐个字符 A(j)与 K(j)的比较。由于允许模糊査找, 即 K(j)中的字符 "?" 可以与任何字符匹配。因此,可以写成判断“A(j)=K(j) or K(j)= "?"" 是否为真。只要 K(j)= "?"",比较结果就一定为真。因此,流程图的(5)处应填 A(j)=K(j)。 如果比较结果为真,则还需要执行 j+1→j,准备继续往下比较。因此流程图 的(3)处应填 j+1。
试题二 函数 substring(const char str[], int index, int length)的功能是求出字符串 str 中指定序号 index 开始且长度为 length 的子串,并返回所取出的子串。以字符串“China today” 为例,其第一个字符“C”的序号为 1 (而其在字符数组 str 中的下标为 0),从序 号 5 开始且长度为 3 的子串为“at”。 【问题 1】 函数 substring 中有两处错误,请指出这些错误所在代码的行号,并在不增加和删除代 码行的情况下进行修改,写出修改正确后的完整代码行(有注释时,注释可省略)。
本问题考查字符串运算及常见编程错误的处理。 求子串运算 substring 的原型如下: 根据题目说明,参数 index 为子串的位置序号(从 1 开始),length 为子串的长度。 显 然,在函数 substring 中,首先应判断参数的合理性,即 index 应不小于 1,length 应不小 于 0,同时,从 index 开始可以得到长度为 length 的子串,即 index+length-1 应不大于 最 后一个字符的序号。因此,第 6 行的代码是正确的。 第 7 行申请动态内存块的语句是正确的。第 9 行的代码判断内存申请是否成功,其中, 判断指针 tptr 的表达式 tptr = 0 有错误,即误用了 “==”与“=”,导致无论内存申请操 作是否成功,在此都将 tptr 赋值为空指针,造成内存泄漏。 第 10、11 行代码用于从字符串 str 中复制子串,代码是正确的。第 12 行的代码设置 字 符串的结束标志,为错误代码。由于所获得字符串的长度为 length,其在动态数组 tptr 的 下标从 0 开始,因此,下标 length-1 为最后一个字符的下标,tptr[length-l] = ’\0’会 导致 丢失最后一个字符,因此该语句中 tptr 的下标应为 length。 【问题 2】 请根据说明 2,填充 C 函数 2 中的空缺(1)和(2)。 (1) n!=0 或 n>0 (2) n/10 本问题考查整数运算。
从题中给出的运算过程可知,在所运算的整数不为 0 时,运算过程会继续,因此空 (1)处应填入“11!=0”。除以 10 后要丢掉个位数的处理则由空(2)处进行,即填入“n/10”。 【问题 3】 请说明以 62354879643 作为实参调用函数 reverse 时返回结果出错的原因。 运算结果溢出(或超出范围,或其他含义相近的描述)。 本问题考查溢出问题。由于程序语言提供的基本数据类型都有其表示范围的限制,因此 在运算过程中需要 注意是否发生溢出。通过分析,上面的运算过程并没有问题,而且前三 个数据的处理结果都是正确的,因此最后一个数据出错的原因是其超出整型的表示范围造成 的。
试题三 对于具有 n 个元素的整型数组 a,需要进行的处理是删除 a 中所有值为 0 的数组元素, 并将 a 中所有非 0 元素按照原顺序连续地存储在数组空间的前端。 下面分别用函数 CompactArr_vl 和 CompactArr_v2 来实现上述处理要求,函数的返回值 为非零元素的个数。 函数 CompactArr_vl(int a[], intn)的处理思路是:首先申请一个与数组 a 的大小相 同的动态数组空间,然后顺序扫描数组.a 的每一个元素,将遇到的非 0 元素依次复制到动 态数组空间中,最后再将动态数组中的元素传回数组 a 中。 函数 CompaetArr_v2(int a[], intn)的处理思路是:利用下标 i (初值为 0)顺序扫描 数组 a 的每一个元素,下标 k (初值为 0)表示数组 a 中连续存储的非 0 元素的下标。扫描时, 每遇到一个数组元素,i 就增 1,而遇到非 0 元素并将其前移后 k 才增 1。 【问题 1】 请根据说明中函数 CompactArr_vl 的处理思路填补空缺(1)〜(3),根据 CompactArr_ v2 的处理思路填补空缺(4)。 (1) sizeof(int) (2) temp[k++] 或 *(temp+k++)或等价表示 (3) i
本问题考査 C 程序结构、数组及运算的应用知识。 根据题目中对函数 CompactArr_vl 的处理思路描述,空(1)处应填入 sizeof(int)。 以 下代码将数组 a 中的非 0 元素复制到动态数组 temp 中。 显然,k 应作为 temp 的下标索引变量使用,因此空(2)处应填入 temp[k++],当该 循 环语句结束后,k 的值也就是 a 中非 0 元素的个数。据此,空(3)处应填入 i
试题四 假设一个算术表达式中可以包含以下三种括号:“(”和“)”、“[”和“]”及和 “}”, 并且这三种括号可以按照任意的次序嵌套使用。 下 面 仅 考 虑 表 达 式 中 括 号 的 匹 配 关 系 , 其 他 问 题 暂 时 忽 略 。 例 如 , 表 达 式 [a-(b-5)]*c[{}]中的括号是完全匹配的,而表达式[a-(b-5]))*c 中的括号不是完全匹配 的, 因为“(”与“]”不能匹配,而且多了一个“)”,即缺少一个与“)”相匹配的“(”。 函数 ifMatched (char expr[])的功能是用栈来判断表达式中的括号是否匹配,表达式 以字符串的形式存储在字符数组 expr 中。若表达式中的括号完全匹配,则该函数的返回 值 为 Matched,否则返回值为 Mismatched。 该函数的处理思路如下: (1) 设置一个初始为空的栈,从左至右扫描表达式。 (2) 若遇上左括号,则令其入栈;若遇上右括号,则需要与栈顶的左括号进行匹配。 (3) 若所遇到的右括号能与栈顶的左括号配对,则令栈顶的左括号出栈' 然后继续匹配 过程;否则返回 Mismatched,结束判断过程。 (4) 若表达式扫描结束,同时栈变为空,则说明表达式中的括号能完全匹配,返回 Matched o 函数 ifMatched 中用到了两种用户自定义数据类型 BOOL 和 STACK,其中,BOOL 类型的 定义如下:
分享到:
收藏