程序员试题历年考试情况分析.docx
《程序员试题历年考试情况分析.docx》由会员分享,可在线阅读,更多相关《程序员试题历年考试情况分析.docx(18页珍藏版)》请在冰豆网上搜索。
程序员试题历年考试情况分析
第1章程序员试题历年考试情况分析
1.1上午题历年试题及考点分析
程序员考试科目1——计算机软硬件基础知识,也就是程序员上午题,是以选择题的方式进行考试的,其知识点包括计算机科学基础、计算机硬件基础知识、计算机软件基础知识、软件开发和维护、计算机安全知识、标准化基础知识、专业英语等方面。
在上午题的知识点中,主要以记忆为主,要比较全面地进行复习,在复习的时候不必太深究。
相对于下午题来说,上午题是比较简单的。
表1.1是从2000年到2006年上半年所有上午试题的知识点分布。
表1.1上午试题知识点分布
2000年
2001年
2002年
2003年
2004年
(上)
2004年
(下)
2005年
(上)
2005年
(下)
2006年
(上)
数据结构
10
10
6
8
8
8
7
9
9
信息技术基础
0
0
4
9
6
5
6
4
5
操作系统
5
5
5
5
5
5
6
5
5
程序设计语言
5
5
8
5
5
6
6
7
6
软件工程
5
5
9
6
4
6
7
4
6
面向对象
0
9
3
3
3
3
0
1
0
数据库原理
10
10
7
5
5
6
7
5
6
多媒体
5
5
3
3
3
3
4
3
3
计算机硬件基础
20
20
15
15
16
15
13
16
15
网络原理
5
5
5
5
5
5
4
6
6
其他
0
0
0
0
5
3
5
6
4
专业英语
10
10
10
10
10
10
10
10
10
合计
75
84
75
74
75
75
75
76
75
从表1.1中可以看出,知识点的考点分布没有太大的变化,基本上覆盖了大学本科计算机专业的所有专业课程。
近三四次的考试中,还出现了一些日常操作中的题目,如Windows的操作及Office系列软件的操作,当然,这些对考生来说不是什么难题,因为大家整天都在使用。
在复习的时候不宜过早地复习上午试题,因为容易忘记,编者建议在考试前半个月开始复习上午题,多看书,多看练习,特别是一些练习题后面的解答,都是复习和记忆的重点。
还有就是要把近两三年的试题都要看一遍、做一遍,这样比较容易把握以后的出题方向。
1.2下午题历年试题及考点分析
程序员考试科目2——程序设计,也就是我们常说的下午题,是以笔试填空的方式进行考试,1996年以前是考C语言和CASL汇编语言,1996年到1998年考C语言和FORTRAN语言,1999年到2004年都只考C语言,2004年出了新考纲后就扩充到必选C,可选C++、Java、VB中的一种语言,并且一年考试两次,让考生有更多的机会参加这个考试。
1999年以后,程序员考纲上所涉及的面比较广,但实际上所考的内容主要是C语言基础上的数据结构,在2004年新考纲之前,虽然有提及C++和面向对象的设计方法,但实际上考试的内容全部是C语言,新考纲出来之后,试题的题型结构有所改变,可以选做部分试题,加入了面向对象的程序设计,使用的语言也从单一的C语言扩充到C++、Java、VB,让考生有更多的选择机会,但同时也增加了一定的难度,使得考生必须在掌握C语言之外还要掌握一门面向对象的程序设计语言。
当然,这也是程序设计语言的一个必然的发展方向。
下面从2000年到2006年上半年所有试题所涉及的考点进行列表分析。
1.2.12000年至2006年试题
2000年下午试题一共有4道题,25个空,所涉及的算法、知识点及数据存储结构如表1.2所示。
表1.22000年下午试题考点分析
题号
算法
知识点
存储结构
一
链表合并
线性表
指针
判断数组元素递增
数组、递归
数组
二
长整数格式化
整数
数组
求组合
整数
数组
三
中缀表达式转后缀
栈
指针
表达式计算
栈
数组
四
贪心算法
数组
数组
2001年下午试题一共5道题,25个空,所涉及的算法、知识点及数据存储结构如表1.3所示。
2002年下午试题一共5道题,25个空,所涉及的算法、知识点及数据存储结构如表1.4所示。
2003年下午试题一共5道题,25个空,所涉及的算法、知识点及数据存储结构如表1.5所示。
表1.32001年下午试题考点分析
题号
算法
知识点
存储结构
一
字符串比较
字符串
指针
计算鞍点
矩阵
数组
二
链表逆置
线性表
指针
三
文件的合并与恢复
文件操作
文件
四
双向循环链表操作
线性表
指针
五
整数的分解
数组、递归
数组
表1.42002年下午试题考点分析
题号
算法
知识点
存储结构
一
显示器编程
多媒体、移位及逻辑运算
数组
二
字符串连接
字符串
指针
求数组中最大元素下标
数组
数组
三
直接插入排序
排序
数组
数组逆置
数组、递归
数组
四
素数筛选
素数
数组
五
二叉排序树结点插入
二叉排序树、查找、递归
指针
表1.52003年下午试题考点分析
题号
算法
知识点
存储结构
一
查找
折半查找、流程图
数组
二
查找
字符串
指针
查找
五叉排序树、非递归
指针
三
排序
线性表、链表操作
指针
四
元素移动
数组
数组
五
栈和队列的操作
栈和队列
指针
2004年上半年下午试题一共9道题,可以选做其中的25个空(或问题),所涉及的算法、知识点及数据存储结构如表1.6所示。
表1.62004年上半年下午试题考点分析
题号
算法
知识点
存储结构
一
快速排序
快速排序、N-S图、递归
数组
任选一题
二
判断回文
字符串
指针
字符串处理
字符串
数组
三
VB基础
VB基础知识
任选一题
四
进制转换
数组、栈操作
数组
五
VB组件应用
下拉列表框、文本框
续表
题号
算法
知识点
存储结构
任选一题
六
链表操作
线性表
指针
七
VB窗口操作
时间组件
任选一题
八
所得税计算
数组
数组
九
VB个人税计算
选择结构程序设计
2004年下半年下午试题一共8道题,可以选做其中的25个空(或问题),所涉及的算法、知识点及数据存储结构如表1.7所示。
表1.72004年下半年下午试题考点分析
题号
算法
知识点
存储结构
一
二进制求补
流程图
数组
二
排序
交换排序及其效率
数组
三
元素移动
指针运算、链表操作
链表
任选一题
四
统计竞赛结果
结构体、选择排序
结构体、数组
五
VB(程序内容和第四题C语言一样)
常用控件、基本函数
任选一题
六
C++基础
继承、抽象类、动态绑定
七
VB数据库应用
文本框、命令按钮、数据控件
八
Java基础
继承、抽象类、动态绑定
2005年上半年下午试题一共8道题,可以选做其中的25个空(或问题),所涉及的算法、知识点及数据存储结构如表1.8所示。
表1.82005年上半年下午试题考点分析
题号
算法
知识点
存储结构
一
奇偶校验
异或运算、流程图
二
最大公约数
最大公约数
字符串处理
字符串
指针
三
二叉树结点的查找与删除
二叉树
二叉树
任选一题
四
子方阵查找
二维数组
数组
五
VB基础组件
列表框的常用属性
任选一题
六
Java应用程序
JavaApplet类
七
VB基础组件
VB内部组件DriveListBox、DirListBox、FileListBox
八
C++基础
枚举类型
2005年下半年下午试题一共8道题,可以选做其中的25个空(或问题),所涉及的算法、知识点及数据存储结构如表1.9所示。
2006年上半年下午试题一共8道题,可以选做其中的25个空(或问题),所涉及的算法、知识点及数据存储结构如表1.10所示。
表1.92005年下半年下午试题考点分析
题号
算法
知识点
存储结构
一
字符串处理
字符串处理、流程图
数组
二
线性表查找
线性表
数组
三
二分法查找
线性表、二分查找
数组
任选一题
四
VB基础
标签、文本框、命令按钮
五
二叉排序树
创建二叉排序树
树
任选一题
六
C++基础
类的定义、查错
七
VB基础
时钟组件及图形编程
八
Java类基础
Stock类和JavaMain类
表1.102006年上半年下午试题考点分析
题号
算法
知识点
存储结构
一
矩阵转置
矩阵、流程图
矩阵
二
普通数据处理
循环
三
栈操作
栈的操作
栈
任选一题
四
数据处理
结构体数组处理
结构体数组
五
VB基本控件
基本控件
任选一题
六
C++基础
类的定义、查错
七
VB基础
时钟组件及图形编程
八
Java类基础
类、查错
1.2.2命题方向的变化及分析
对上面的列表进行分析,我们可以看出一些程序员考试命题方向的变化,现从几方面列举如下。
1.语言的选择
从1996年以前的C语言和CASL汇编语言,到C语言和FORTRAN语言,再到只考C语言,以及到现在的在C语言和C++、Java、VB中进行选择,可见软考始终紧跟着社会的需要,也紧跟着编程语言的发展方向,唯有发展与改变才能让软考充满活力。
这也许是软考越来越受到社会认同的一个重要原因!
下面我们再来看一个表,分析一下所考语言在选择上有什么变化,如表1.11所示。
从表1.11中可以得到一个信息:
C语言始终是考试的最为突出的重点。
例如,在2004年上半年改了考纲后的第一次考试中,最多可以选择20个VB空,而只选5个C语言的空,但在接下来的下半年考试中,这个情况就马上改了,最多只可选10个VB空,最少要做15个C语言空,而且一直延用至今。
在考纲所增加的几种语言当中,VisualBasic是可
表1.11程序语言题量变化表(单位:
空)
时间
C
VB
C++
Java
最多可选C语言数量
最多可选
VB数量
最多可选
Java数量
最多可选
C++数量
2000年
25
0
0
0
25
0
0
0
2001年
25
0
0
0
25
0
0
0
2002年
25
0
0
0
25
0
0
0
2003年
25
0
0
0
25
0
0
0
2004年上半年
25
20
0
0
25
20
0
0
2004年下半年
20
10
5
5
20
10
5
5
2005年上半年
20
10
5
5
20
10
5
5
2005年下半年
20
10
5
5
20
10
5
5
2006年上半年
20
10
5
5
20
10
5
5
供选题较多的一种,它是Microsoft公司开发的基于BASIC的可视化程序设计语言,它在其编程系统中采用了面向对象、事件驱动的编程机制,用一种巧妙的方法把Windows编程的复杂性封装起来,提供了一种所见即所得的可视化程序设计方法,为广大的计算机专业学习人员、编程爱好者的程序编写带来了极大的方便。
所以,本书在最后一章为考生讲解VisualBasic程序设计,希望可以为读者冲刺程序员考试提供一定的帮助。
2.知识点的选择
从2000年到2006年试题所考查的知识点上来看,C语言及数据结构的主要考查的知识点没有太大的变化,线性表、链表、字符串、二叉树、排序和查找等几大主要知识点在不断的轮着出现。
所以,本书将对这些主要知识点在解题中的运用进行重点讲解和分析,但关于这些知识点本身的基本概念则只是略提,读者可通过查阅数据结构的相关教材去复习那些基础知识。
3.题型的选择
从软考的题型来看,2002年以前的考试基本上是以传统题型为主,多数考经典算法,只对各种常用算法熟练掌握即可通过。
但从2002年以后,题型逐渐开始变化。
如2002年的下午第一题就不再以传统的方式出题,而是以算法分析的方式,或是说程序文档化的方式进行考查,要求能够读懂对问题的分析。
这是一个很大的突破,要求应试者不只是会做一些传统的题目,还要学会分析一个问题,从而得出解决问题的算法。
到2003年的下午第一题,在2002年的基础上,题型进一步改成以伪代码的形式。
到2004年上半年新考纲后,下午第一题变为用N-S图形式描述算法的题型,由于流程图、N-S图都是用来描述算法的非常科学而且经典的方法,所以从2004年上半年出现这种题型后,一直到2006年上半年的考试,每次的下午题第一题都是这种题型,相信以后这种题型还会继续出现。
其他一些题目的题型上也有一定的变化,以前传统的各种较为经典的算法出现得越来越少,取而代之的是各种比较新的应用型的题目,或者是把各种经典的算法集中到一起出一些比较综合性质的题目。
特别是一些处理比较现实问题的题目,通常都是以比较大篇幅的题目出现。
这类型的题目所用到的算法不会难,主要是要求考生比较快就可以理解题目的意思,从而把握出题者的思路,快速地做出解答。
当然,只要我们把基础的算法都较为熟练地掌握后,题型上的变化并不会给我们解题带来多大的影响。
1.3个人经验及应试建议
1.3.1作者辅导经验
C语言是下午题的难点,如果C语言学得比较好,在上午题的基础知识上下一些功夫,再学一种面向对象的编程,如VB、C++或Java,我个人觉得VB比较简单。
本科大二、大三的学生用一到两个月的课余时间来作准备,一般来说通过率是比较高的。
专科生相对来说时间要长一点,认真的话,半年也差不多了。
当然,这不是绝对的,我遇到过复习两个星期就通过的学生,因为他的C语言和数据结构学得很好。
笔者有过多年的程序员辅导经验,发现在程序员的应试准备过程中,最大难度的还是C语言及数据结构,如果用两个月的时间来准备,那么要用一个半月的时间来复习C语言和数据结构,另外在考试前的半个月,认真地复习上午试题的基础部分。
以这种时间安排方式,相对来说,比较容易通过程序员考试。
除本书外,个人建议参考资料两本:
一本是清华大学出版社出版的《程序员教程》,此教程比较详细地讲解了上午题的内容。
另一本是清华大学出版社出版的《C语言程序设计(第二版)》,谭浩强著,此书对C语言的讲解可谓是经典之作。
学习C语言的时候,要多进行练习,这个是基础,把基础打好后,再进入到数据结构的学习。
学习数据结构的最好办法是认真地看算法,仔细分析算法的运行过程,体会各种数据结构的定义、用途及其基本操作。
对各种不同的数据结构的常规算法要非常熟练,如树、链表、栈等结构的基本操作是要熟记下来的。
1.3.2应试建议
程序员解题速度是练出来的,熟能生巧,只有通过大量的习题的调试或解答才能够达到比较快的速度和以不变应万变的程度。
不要认为大量练习只是简单的题海战术,在任何学习过程中,只有经过大量的练习,才能达到从量变到质变的过程。
学习从来都是没有捷径可寻的。
特别要锻炼的是读别人程序的能力,能够从程序中比较快速地读出程序编写者的意图也就成功了一半。
一个比较好的建议就是,在看本书提供的一些算法的时候,先不要看提示,只看代码,练习从代码就可以看出整个题目的意思。
刚开始会比较难,但习惯一段时间后,对将来做程序员的试题有很大的帮助。
本书的最大特点是编排了大量的练习题,特别是程序题。
可以这样说,只要把本书所列的程序做熟并理解,下午题的C语言部分就不用担心了。
从最近两年的试题变化来看,C语言试题呈现出偏重基础题,偏重于应用,而难度不会太大。
做完题之后要检查,如果变量多的话,列一个变量表,模拟检查运行情况,看变量的变化,用这种方法可以比较准确地查出程序是否出错。
1.3.3解题方法
我们在做下午题的时候,可以大概依照如下的思路来做解答。
1.理解题意
主要是根据问题的描述来确定问题的已知条件,并了解算法(程序)要达到的目的。
通俗地讲,就是要知道问题的输入和输出。
2.确定算法
每个题目在前面都有描述,通过对描述的分析,要确定题目应该属于哪一类数据结构以及相应的算法。
有些题目可能不属于任何数据结构,则它可能与某类算法有关;但也有一些算法纯粹是数学方法。
题目前面描述是非常重要的,对试题的解答起着重要的指导作用。
在描述中同时要理解算法过程。
在分析算法时,可以以某个具体实例来试验。
在有些时候,即使看不懂整道程序题,还是可以根据提示看懂其中的部分代码段,也可以完成一定的空格的填写。
3.理解程序
分析程序结构,如果有很多子函数,首先弄清楚各函数之间的关系和各函数的作用;如果程序较长,则应该根据算法过程,把每个程序段与算法的每个过程对应起来,确定相应的程序段功能。
在程序中,已经定义了某些变量,则在理解程序时,首先必须理解这些变量的含义。
4.根据C语言的语法填空
示例:
2004年上半年程序员下午试题试题六。
函数DelAInsB(LinkedListLa,LinkedListLb,intkey1,intkey2,intlen)的功能是,将线性表A中关键码为keyl的结点开始的len个结点,按原顺序移至线性表B中关键码为key2的结点之前,若移动成功,则返回0;否则返回–1。
线性表的存储结构为带头结点的单链表,La为表A的头指针,Lb为表B的头指针。
单链表结点的类型定义为:
typedefstructnode
{
intkey;
structnode*next;
}*LinkedList;
[函数]
(1)intDelllnsB(LinkedLiStLa,LinkedListLb,intkeyl,intkey2,intlen)
(2){LinkedListp,q,s,prep,pres;
(3)intk,
(4)if(!
La->next||!
Lb->next||len<=0)return–1;
(5)p=La->next;prep=La;
(6)while(p&&p->key!
=keyl)/*查找表A中键值为key1的结点*/
(7){prep=p;p=p->next;
(8)}
(9)if(!
p)return–1;/*表A中不存在键值为key1的结点*/
(10)q=p;k=1;
(11)while(q&&
(1))/*在表A中找出待删除的len个结点*/
(12){
(2);k++;
(13)}
(14)if(!
q)return–1;/*表A中不存在要被删除的len个结点*/
(15)s=Lb->next;(3);
(16)while(s&&s->key!
=key2)/*查找表B中键值为key2的结点*/
(17){pres=s;s=s->next;
(18)}
(19)if(!
s)return–1;/*表B中不存在键值为key2的结点*/
(20)(4)=q->next;/*将表A中的len个结点删除*/
(21)q->next=(5);
(22)pres->next=p;/*将len个结点移至表B*/
(23)return0;
(24)}
解:
(1)理解题目。
已知条件为两个链表La和Lb,最后得到的结果也是两个链表,只不过是La中的部分结点移动到Lb中,因此,本问题主要是解决是怎么移动的。
(2)算法。
在题目中没有给出结点移动的算法,我们先可以结合实例自己设计一个算法,然后看是不是与程序中的算法一致。
如果不是,则再找算法。
在自己设计算法的时候,最好的办法是先看一看题目给出的算法提示,在给出的代码中,总是有一些蛛丝马迹可以让我们找到突破口的,这些地方一般都会给出题目所用算法的暗示。
如图1.1所示,如果我们找到实线的指针,它们分别指向La中的key1结点(p指针)、key1的前一个结点(q指针)、Aj(从key1结点开始的第len个结点,r指针)和Lb中的key2的前一个结点(s指针),则根据链表操作,用图中的虚线指针连接,我们就可以把La中从key1结点开始的len个结点全部移动到Lb链表中。
因此算法大致如下所示。
①找到p和q指针。
图1.1链表结点移动
②找到r指针。
③找到s指针。
④r->next=s->next(把Aj结点连接到K2结点之前)。
⑤s->next=q(把K1结点连接到原来Lb中K2结点的前一个结点的后面)。
注意:
经过④、⑤两步操作,即实现了移动操作。
⑥要注意的是现在La链表已经断开,也必须重新连接上。
但是注意一下程序,就会发现里面有很多判断,主要是看判断是否可以移动。
我们考虑后(也可以看程序)发现,在以下几种情况下,操作不能进行。
①La或Lb是空链表。
②len表示个数的值,因此不能不大于0。
③La中不存在key1的结点。
④La中从key1结点开始的结点个数小于len个。
⑤Lb中不存在key2的结点。
(3)现在是看程序结构是不是和我们自己考虑的算法符合。
程序段(5)~(8):
其中有p指针在向后移动,一直到key1为止,因此,它们的功能就是找到指向key1结点的指针;同时,另有一个指针prep一直在p的后面,因此它就是指向key1的前一个结点的指针。
程序段(10)~(13):
其中有一个k变量,每次循环后增加1,因此它是一个计数器。
通过计数len次,就可以找到从key1结点开始的第len个结点。
这时,应该有一个指针(q)同时移动,使得这个指针就是指向第len个结点的指针。
程序段(15)~(18):
其中有s指针在向后移动,一直到key2为止,因此,它们的功能就是找到指向key2的前一个结点的指针。
程序段(20)~(22):
就是移动La中的结点到Lb,并把La中断开的链表连接。
从上述的分析发现,程序结构是和我们自己考虑的算法一致的。
(4)考虑细节,并填空。
①我们的目的是找指向第len个结点的指针,找到后循环应该结束,因此,要填k有同学可能会考虑填k<=len,这时,大家可以用一个实例试一下。
譬如len=3,你会发现,指针其实只要移动两次就可以了。
因此,k<=len是错的。
②q指针应该同时移动,故应填:
q=q->next。
③这一段程序的功能是找到指向key2的前一个结点的指针。
其中s指针是指向key2结点的,而pres指针跟在s后面。
但是pres指针缺少初值,因此,这儿应该给pre