2015下半年程序员考题试卷及解答-下午卷
试题一(共15分)
阅读以下说明和流程图,填补流程图中的空缺,将解答填入答题纸的对应栏内。
【说明】
    下面流程图的功能是:在给定的一个整数序列中查最长的连续递增子序列。设序列存放在数组A[1:n](n≥2)中,要求寻最长递增子序列A[K : K+L-1](即A[K]<A[K+1] <…<A[K+L-1])。流程图中,用Kj和Lj分别表示动态子序列的起始下标和长度,最后输出最长递增子序列的起始下标K和长度L。
    例如,对于序列A={1,2,4,4,5,6,8,9,4,5,8},将输出 K=4,L=5。
【流程图】
注:循环开始框内应给出循环控制变量的初值和终值,默认递增值为1,格式为:循环控制变量=初值,终值
【解答】
(1) n-1
(2) Lj+1→Lj
(3) Lj>L
(4) Kj
(5) i+1
【解析】
    本题考查程序员在设计算法,理解并绘制程序流程图方面的能力。
    本题的目标是:在给定的一个整数序列中查最长的连续递增子序列。查的方法 是:对序列中的数,从头开始逐个与后面邻接的数进行比较。若发现后面的数大于前面的数,则就是连续递增的情况;若发现后面的数并不大,则以前查看的数中,要么没有连续递增的情况,要么连续递增的情况已经结束,需要再开始新的查。
    为了记录多次可能出现的连续递增情况,需要动态记录各次出现的递增子序列的起始位置(数组下标Kj)和长度(Lj)。为了求出最大长度的递增子序列,就需要设置变量L和K,保存迄今为止最大的Lj及其相应的Kj。正如打擂台一样,初始时设置擂主 L=1,以后当Lj>L时,就将Lj放到L中,作为新的擂主。擂台上始终是迄今为止的连续递增序列的最大长度。而Kj则随Lj→L而保存到K中。
    由于流程图中最关键的步骤是比较A[i]与A[i+1],因此对i的循环应从1到n-1,而 不是1到n。最后一次比较应是“A[n-1]<A[n]?”。因此(1)处应填n-1。
    当A[i]<A[i+1]成立时,这是递增的情况。此时应将动态连续递增序列的长度增1,因此(2)处应填写Lj+1→Lj。
    当A[i]<A[i+1]不成立时,表示以前可能存在的连续递增已经结束。此时的动态长度 Lj应与擂台上的长度L进行比较。即(3)处应填Lj>L。
    当则Lj将做新的擂主(Lj→L),同时执行Kj→K。所以(4)处应填Kj。
    当Lj > L不成立时,L不变,接着要从新的下标i+1处开始再重新查连续递增子序列。因
此(5)处应填i+1。长度Lj也要回到初始状态1。
    循环结束时,可能还存在最后一个动态连续子序列(从下标Kj那里开始有长度Lj 的子序列)没有得到处理。因此还需要再打一次擂台,看是否超过了以前的擂主长度, 一旦超过,还应将其作为擂主,作为查的结果。
试题二(共15分)
阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
【说明】
    下面的代码运行时,从键盘输入一个四位数(各位数字互不相同,可以有0),取出组成该四位数的每一位数,重组成由这四个数字构成的最大四位数max4和最小四位数 min4 (有0时为三位数),计算max4与min4的差值,得到一个新的四位数。若该数不等于6174,则重复以上过程,直到得到6174为止。
    例如,输入1234,则首先由4321-1234,得到3087;然后由8730-378,得到8352;最后由8532-2358,得到6174。
【C代码】
sort of in order
【解答】
(1) j<4    或等价形式
(2) t=j
(3) a[0]* 1000+a[1]* 100+a[2]* 10+a[3]    或等价形式
(4) a[3]* 1000+a[2]* 100+a[1]* 10+a[0]    或等价形式
(5) n/1000    或等价形式
(6) n%10
【解析】
    本题考查C程序设计基本技能及应用。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。