logo资料库

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

第1页 / 共16页
第2页 / 共16页
第3页 / 共16页
第4页 / 共16页
第5页 / 共16页
第6页 / 共16页
第7页 / 共16页
第8页 / 共16页
资料共16页,剩余部分请下载后查看
2009 下半年程序员考试真题及答案-下午卷 试题一 【说明】 求连续函数 f(x)的根(方程 f(x)=o 的解)的最简单方法是二分法。为此,首先需要在 若干点上检查函数值的符号,如果发现 f(a)与 f(b)符号相反(a
(4) b 本题描述了求函数根(0 点)的二分法,题中还详细说明了二分法的原理。 假设 a 和 b 是区间两端点值的变量。流程图中,一开始就将函数两端的值分别送 y1 和 y2,接着判断 yl 与 y2 符号是否相反(同号时该算法不能往下进行)。若相反,则应将 a 与 b 的中点值(a+b)/2 送 x。此时的函数值 f(x),即 f((a+b)/2)应送 y。因此,(1)处应填(a+b)/2, (2)处可填 f(x)或 f((a+b)/2)。 接着需要判断新的函数值是否已经接近 0,因此,(3)处应填丨 y 丨或 abs(y)。 如果这个新函数值已经接近 0,则可以直接输出变量 x 的值(刚取的中点值)作为函数 的近似根;如果该函数值尚未接近 0,则需要将该区间进行二分,即需要判断选用左半区间还 是右半区间,继续进行迭代计算。 如果 y*y1<0,则说明新的函数值与原区间的左端函数值符号相反,因此应取左半区间; 否则应取右半区间。 若取左半区间,则原来的区间左端点 a 没有变化,左端点的函数值 yl 也没有变化,只 要将中点值 x 送右端点变量 b 就可以。因此,(4)处填 b。 若取右半区间,则区间的右端点没有变化,右端点的函数值 y2 也没有变化,这时需要 将中点值 x 送左端点变量 a。因此,(5)处应填 a。由于每次迭代都需要判断 y*y1 的符号, 因此 y1 的改变将影响下次迭代。因此,此时还需要将中点处的函数值 y 送 y1,作为新区间 的左端点函数值。 当新的区间(a,b)长度 ha 很小时,迭代计算就可以结束,输出已经得到的近似根 x 就 可以了。
试题二 【说明 1】 函数 Counter(intn,int w[])的功能是计算整数 n 的二进制表示形式中 1 的个数,同 时用数组 w 记录该二进制数中 1 所在位置的权。 例如,十进制数 22 的二进制表示为 10110。对于该二进制数,1 的个数为 3,在 w[0]中 存入 2 (即 21)、w[1]中存入 4 (即 22)、w[2]中存入 16 (即 24)。 【说明 2】 函数 Sm0Ve(int A[], int n)的功能是将数组中所有的奇数都放到所有偶数之前。其过 程为:设置数组元素下标索引 i (初值为 0)和 j (初值为 n-1),从数组的两端开始检 查元 素的奇偶性。若 A[i]、A[j]都是奇数,则从前往后找出一个偶数,再与 A[j]进行交换; 若 A[i]、A[j]都是偶 It 则从后往前找出一个奇数,再与 A[i]进行交换;若 A[i]是偶数而 A[j] 是奇数,则交换两者,直到将所有的奇数都排在所有偶数之前为止。 【问题 2】
(1)n!=0,或其等价形式 (2)k=k*2,或 k*=2,或 k+=k,或 k=k+k,或其等价形式 (3)i++,或++i,或 i+=1,或 i=i+1,或其等价形式 (4)j--,或--j,或 j-=1,或 j=j-1,或其等价形式 (5)A[i]%2=0&&A[j]%2!=1,或 A[i]%2!=0&&A[j]%2,或!(A[i]%2)&&A[j]%2,或其等价形式 本题考查 c 程序控制结构的应用。 根据题目描述,函数 Counter(int n, int w[])的功能是计算整数 n 的二进制表示形式 中 1 的个数,同时用数组 w 记录该二进制数中 1 所在位置的权。要计算 n 的二进制形式中 1 的个数,基本方法是计算 n 的二进制数时进行计数,题中的函数 Counter 采用的就是此方法。 十进制数转换为二进制数的方法是辗转除以 2 取余数,直到被除数为 0 时为止。 例如,十进制数 26 的二进制形式为 11010,计算步骤为: ①被除数是 26,除数是 2,商为 13,余数为 0; ②被除数是 13,除数是 2,商为 6,余数是 1; ③被除数是 6,除数是 2,商为 3,余数是 0; ④被除数是 3,除数是 2,商为 1,余数是 1; ⑤被除数是 1,除数是 2,商为 0,余数是 1。
计算结束。 从上例可知,二进制数的各位是从低到高依次计算出来的。 因此,函数 Counter 中的空(1)处应填入 n 或 n!=0。显然,代码中用 k 记录二进制数 各位的权值,其初始值为 1,每算出 1 位,其值要改为上一位权值的 2 倍。因此空(2)处应 填入 k=k*2 或 k*=2。 对于函数 Smove(intA[], int n),其功能是将数组中所有的奇数都放到所有偶数之前。 分析题中给出的处理过程,交换动作发生在 A[i]为偶数而 A[j]为奇数时,因此空(5)处应 填入“A[i]%2=0&&A[j]%2!=0”(或其等价表示方式),其他情况下都是修改 i 和(或)j 的 值。下面举一例进行说明,设数组 A 中的元素初始排列为 15,20,23,30,77,62,45,68,34,61. 初始时 i=0, j=n-1=9。A[0]=15, A[9]=61, A[0]是奇数,所以其值保持不动,A[9]也是奇 数,需要将其前移,实质上是要找出前面的一个偶数与其对调,这就需要增加下标 i 的值, 从而向后找偶数。对应的代码是 i++,j 不变,因此空(3)处应填入 i++或等价表示方式。接 下来找到的偶数是 A[1],将其与 A[9]对调,数组中的元素排列情况为 15,61,23,30,77,62,45,68,34,20。之后 i++, j--,对应的数组元素为 A[2] (值为 23,是奇 数)和 A[8](值为 34,是偶数),这种情况下显然不需要进行对调,因此将 i 增 1、j 减 1, 找到 A[3]和 A[7]。由于 A[3](值为 30)和 A[7](值为 68)都是偶数,因此需要从后面找出一 个奇数,将其与 A[3]对调。因此,空(4)处应填入 j--(或等价表示方式)。接下来找到 A[6], 交换 A[3]和 A[6]的值,数组元素的排列情况为 15,61,23,45,77,62,30,68,34,20。 这样,数组中的奇数全部排在偶数之前。
试题三 【说明 1】 函数 test_f1(int m, int n)对整数 m、n 进行某种运算后返回一个整数值。 【C 函数 1】 【问题 1】 (1)请写出发生函数调用 test_f1(9,6)时,函数的返回值; (2)请说明函数 test_f1 的功能。 (1)18 (2)求两个整数的最小公倍数 考生解答含义与最小公倍数相同即可给分。 本题考查 C 语言基本运算和控制结构的应用。 对于传入函数 test_f1 中的参数 m 和 n,运算“k=m>n?m:n”使得 k 取 m 和 n 中的较大 者。此后,“for(;(k%m!=0)||(k%n!=0);k++);”使得 k 最后的取值正好能同时被 m 和 n 整除, 因此,本函数的功能是求 m 和 n 的最小公倍数。9 和 6 的最小公倍数是 18。 【问题 2】 请写出函数 test_f2()的运行结果。 9 4 1 4 本题考查 C 程序中的数据定义和存储应用。 对于定义 char str[]="NewWorld",数组 str 由字符串"NewWorld"初始化后,其大小为 9 (包括串为结束标志字符'\0’),因此 sizeof(str)的值为 9。 对于定义“char*p=str”,ptr 指向“NewWorld”的第一个字符“N”(即数组 str 的起
始地址对应存储单元处存放的字符),ptr 是指针变量,因此 sizeof(p)的值为 4。 对于定义“char i='\0'”, i 是字符变量,其初始值为 ASCII 码值为 0 的字符,因此 sizeof(i) 的值为 1。 对于定义“void *ptr=malloc(50)”,ptr 是指向 50 个字节存储区域的指针,因此 sizeof(ptr)的值为 4。 【问题 3】 函数 test_f3()对返回值的处理有缺陷,请指出该缺陷并说明修改方法。 缺陷:返回了局部数据(或变量,或数组)的指针(或地址)。 . 修改方法:用 malloc 函数申请存储字符串的存储空间,令指针 tstr 指向该存储空间并返回 tstr 的值即可。 本题考查 C 语言数据存储类型的基础知识及常见应用错误和处理知识。 一般将内存划分为代码去、静态数据区、栈区和堆区,其中,栈区和堆区也称为动态数 据区。C 程序中的数据(大多以变量和数组表示)可存储在计算机系统内存区域的不同部分。 全局变量(全局数组、外部变量等)和静态局部变量的存储单元在静态数据区分配,它们的 生存期(即变量与其存储单元之间的绑定关系)较长,在程序运行期间始终存在。而局部变 量(自动变量、局部数组等)的存储单元在栈区分配,它们的生存期较短,随着函数被调用 而分配空间,函数调用结束后释放分配给它们的存储空间,这是由系统控制的。而堆区的存 储空间由程序员根据需要用 malloc 函数申请,不用时用 free 函数释放,归还给系统。 在函数 test_f3 中,数组 tstr 的空间在栈区分配,函数调用结束后该存储空间将由系统自 动回收,随着程序的执行再进行分配,所以用“return tstr”返回该数组的首地址将可能 使得需要用这个存储区中数据的地方出错。
试题四 【说明】 函数 del_substr(S,T)的功能是从头至尾扫描字符串 S,删除其中与字符串 T 相同的所 有子串,其处理过程为:首先从串 S 的第一个字符开始查找子串 T,若找到,则将后面的字 符向前移动将子串 T 覆盖掉,然后继续查找子串 T;否则从串 S 的第二个字符开始查找,依 此类推,重复该过程,直到串 S 的结尾为止。该函数中字符串的存储类型 SString 定义如下:
分享到:
收藏