《专项考练程序员考试真题及答案(1)(1)(近几年考题)》由会员分享,可在线阅读,更多相关《专项考练程序员考试真题及答案(1)(1)(近几年考题)(16页珍藏版)》请在金锄头文库上搜索。
1、温故而知新,下笔如有神近几下半年程序员考试专题习题训练及答案-下午卷试题一【说明】求连续函数f(x)的根(方程f(x)=o的解)的最简单方法是二分法。为此,首先需要在若干点上检查函数值的符号,如果发现f(a)与f(b)符号相反(ab),则在区间(a, b)中必然存在f(x)的根。因为当x从a变到b时,连续函数的值将从正变到负(或从负变到正),必然要经过0。区间(a,b)就是根的初始范围。取该区间的中点m,如果f(m)=0,则根就是m。如果f(a)与f(m)符号相反,则根一定在区间(a,m)中;如果f(m)与f(b)符号相反,则根一定在区间(m,b)中。因此,根的范围缩小了一半。依此类推,将区间
2、一半一半地分下去,当区间的长度很小(达到根的精度要求,例如0.001)时,或者当区间中点处的函数值几乎接近于0 (即绝对值小于预先规定的微小量,例如0.001)时,近似计算就可以结束了。以下流程图描述了用二分法近似计算区间(a, b)中f(x)的根的过程。【流程图】(1) (a+b)/2(2) f(x),或f(a+b)/2)(3) |y|,或abs(y),其中y 可由f(x)或f(a+b)/2)代替(4) b本题描述了求函数根(0点)的二分法,题中还详细说明了二分法的原理。假设a和b是区间两端点值的变量。流程图中,一开始就将函数两端的值分别送y1和y2,接着判断yl与y2符号是否相反(同号时该
3、算法不能往下进行)。若相反,则应将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*y1n?m:n”使得k取m和n中的较大者。此后,“for(;(k%m!=0)|(k%n!=0);k+);”使得k最后的取值正好能同时
4、被m和n整除,因此,本函数的功能是求m和n的最小公倍数。9和6的最小公倍数是18。【问题2】请写出函数test_f2()的运行结果。9 41 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码值
5、为0的字符,因此sizeof(i)的值为1。对于定义“void *ptr=malloc(50)”,ptr是指向50个字节存储区域的指针,因此sizeof(ptr)的值为4。【问题3】函数test_f3()对返回值的处理有缺陷,请指出该缺陷并说明修改方法。缺陷:返回了局部数据(或变量,或数组)的指针(或地址)。 .修改方法:用malloc函数申请存储字符串的存储空间,令指针tstr指向该存储空间并返回tstr的值即可。本题考查C语言数据存储类型的基础知识及常见应用错误和处理知识。一般将内存划分为代码去、静态数据区、栈区和堆区,其中,栈区和堆区也称为动态数据区。C程序中的数据(大多以变量和数组表示
6、)可存储在计算机系统内存区域的不同部分。全局变量(全局数组、外部变量等)和静态局部变量的存储单元在静态数据区分配,它们的生存期(即变量与其存储单元之间的绑定关系)较长,在程序运行期间始终存在。而局部变量(自动变量、局部数组等)的存储单元在栈区分配,它们的生存期较短,随着函数被调用而分配空间,函数调用结束后释放分配给它们的存储空间,这是由系统控制的。而堆区的存储空间由程序员根据需要用malloc函数申请,不用时用free函数释放,归还给系统。在函数test_f3中,数组tstr的空间在栈区分配,函数调用结束后该存储空间将由系统自动回收,随着程序的执行再进行分配,所以用“return tstr”返
7、回该数组的首地址将可能使得需要用这个存储区中数据的地方出错。试题四【说明】函数del_substr(S,T)的功能是从头至尾扫描字符串S,删除其中与字符串T相同的所有子串,其处理过程为:首先从串S的第一个字符开始查找子串T,若找到,则将后面的字符向前移动将子串T覆盖掉,然后继续查找子串T;否则从串S的第二个字符开始查找,依此类推,重复该过程,直到串S的结尾为止。该函数中字符串的存储类型SString定义如下: (1)i-j+1,或其等价形式(2)j=T.length,或 j=T.length,或其等价形式(3)i-j,或i-T.length(4)k-T.length,或k-j,或其等价形式(5
8、)S-length -T.length,或S-length-j本题考查c程序设计基本能力,包括指针、结构体类型的应用。根据题目部分的描述,首先要在字符串S中查找与T相同的子串,基本方法是逐个字符进行比对,其代码如下所示:显然,当S-chi与T.chj不相等时,i值需回退至本趟开始位置后再后移一个位置,从而为开始下一趟查找做准备。由于相同的字符个数为j个,因此i需回退至位置i-j+1,即空(1)处填入i-j+1。由于在串S中查找与1相同的子串是以“1length&jT.length”作为条件的,因此查找结束时,该条件必然为假。若在S中找到与T相同的子串,则“j chpS-chp+T.length-1中,则需要将S-chp+T.length移至S-chp,S-chp