1、中级软件设计师下午试题-90 及答案解析(总分:90.00,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)【说明】(1)流程图描述某大型商店商品销售的数据处理流程。(2)商店设有若干柜台,同一种商品可能在几个柜台上销售,各柜台每天提供一组日销售数据,其格式如下:日期、柜台号、商品代码、销售数量、商品代码、销售数量(3)数据处理系统每日产生一份反映各柜台当日销售金额和商店日销售金额的“日销售金额报告”,必要时还产生一份“商品请购报告”,给出那些低于最低库存量的商品代码、商品名称、最低库存量和实际库存量。处理过程中产生存档的“日销售文件”和临时工作文件“日销售量文件”和“旧销售金
2、额文件”。(4)系统中所用到的数据均来自数据文件。(5)流程图中的商品库存文件的记录已按关键字“商品代码”排序。1.【问题 1】指出商品库存文件的记录中必须包括哪些数据项?分别指出在日销售文件,日销售量文件和日销售金额文件的记录中至少应包括哪些数据项,同时不产生数据冗余?错误清单可能指出哪些错误?(分数:15.00)_二、试题二(总题数:1,分数:15.00)【说明】有如下关系数据库:S(SNO,SN,STATUS,CITY)P(PNO,PN,COLORS,WEIGHT)J(JNO,JN,CITY)SPJ(SNO,PNO,JNO,QTY)其中,S 为供应单位,P 为零件,J 为工程项目,SPJ
3、 为工程订购零件的订单,其语义为:某供应单位供应某种零件给某个工程,请用 SQL完成下列操作。1. 【问题 1】求为工程 J1提供红色零件的供应商代号。(分数:15.00)_三、试题三(总题数:1,分数:15.00)【说明】某教学管理系统的用户是教学管理人员、教师和学生。系统主要提供学生选课管理和学生成绩管理两方面的功能。(1)学生选修课管理主要功能是管理新学期开始时,学生对选修的课程进行选课注册工作。新学期开始后的前两周为学生试听、选课注册时间;允许校内各院系学生跨专业跨年级选修课程;学生可以在校园网的任何一个终端进行选课。新学期选修课程表生成:各学院教学管理人员在新学期开始前,将准备开设的
4、选修课程名称、课程代码、总课时、上课时间、学分、任课教师和上课教室录入系统,供学生选课使用。新学期开学两周后,系统自动将实际选课学生少于 10人的课程停开,并删除该课程;教学管理人员打印学生选课注册名单和开课通知书,送交有关部门和任课教师。学生选课注册:新学期开学前两周为学生试听、选课注册时间,并允许改变或取消注册申请。学生调用待选课程表,系统显示课程名、课程代码、任课教师、上课时间、总课时、上课教室、学分和本课程已选修人数。学生所选几门课程在上课时间上不能冲突;若一门课程实际选课学生已达到 40人时,停止选课。当学生退出系统时,系统提示该学生所选的几门课程、任课教师、上课时间、教室、学分和学
5、分总计。选修课程查询:选修课程表信息查询,用户是教师、学生和教学管理人员。系统显示课程名、课程代码、任课教师、上课时间、总课时、上课教室、学分和本课程已选修人数。查询关键词可为学院名称、专业、授课教师等。学生选课情况查询:教师和教学管理人员可以查看学生的选课情况。查询关键词可以为学生姓名(学号)、课程名称(课程代码)、授课教师等。学生只能查自己所选课程内容,不允许查其他同学选课情况。教师简历查询:用户是学生、教师和教学管理人员。查询关键词可为教师姓名、性别、职称、年龄等单关键词或组合关键词。信息统计与报表生成:各学院教学管理人员对学生选课注册信息进行统计(按课程、专业等),打印汇总报表。把学生
6、选课注册信息传送到财务管理系统,计算学生应交纳的费用。(2)学生成绩管理学生考试成绩录入:各学院教学管理人员将学生考试成绩录入系统。录入学生成绩时,系统自动检查财务系统传来的选课交费信息,核对该学生是否已经交纳本门课程的费用,没有交纳费用者,不给成绩。成绩查询:教师和教学管理人员可查询学生各门课程的成绩。查询关键词可为学生姓名(学号),课程名(课程代码)等。学生只能查自己各门课程的成绩,不允许查其他同学成绩。成绩汇总与报表生成:教学管理人员对学生考试成绩信息进行统计(按学生、课程、专业等),打印汇总报表。向学校教务管理系统发送汇总信息表格等,不反馈信息。现在已建立教学管理最高层用例图,如下:1
7、.【问题 1】完成学生成绩管理子系统用例图。(分数:15.00)_四、试题四(总题数:1,分数:15.00)1.【说明】下面是一个用 C编写的快速排序算法。为了避免最坏情况,取基准记录 pivot时,采用从left、right 和 mid=(left+right)/2中取中间值,并交换到 right位置的办法。数组 a存放待排序的一组记录,数据类型为 T,left 和 right是待排序子区间的最左端点和最右端点。void quicksort (int a, int left, int right) int temp;if (leftright) hat pivot = median3 (a,
8、 left, right); /三者取中子程序int i = left, j = right-1;for(;)while (i j while (i j if(ij)temp = ai; aj = ai; ai = temp;i+; j-;else break;if (ai pivot)temp = ai; ai = aright; aright = temp;quicksort( (1) ); /递归排序左子区间quieksort(a,i+1 ,right); /递归排序右子区间void median3 (int a, int left, int right)int mid= (2) ;in
9、t k = left;if(amid ak)k = mid;if(ahigh ak) k = high; /选最小记录int temp = ak; ak = aleft; aleft = temp; /最小者交换到 leftif(amid aright)temp=amid; amid=aright; aright=temp;消去第二个递归调用 quicksort (a,i+1,right)。 采用循环的办法:void quicksort (int a, int left, int right) int temp; int i,j;(3) int pivot = median3(a, left,
10、 right); /三者取中子程序i = left; j = righi-1;for (; )while (ij while (ij if(i j) temp = ai; aj; = ai; ai=temp;i+; j-;else break;if(aipivot) (4) ;ai=pivot;quicksoft ( (5) ); /递归排序左子区间left = i+1;(分数:15.00)_五、试题五(总题数:1,分数:15.00)2.【说明】本程序将两个从小到大的有序链表合成一个新的从小到大的有序链表。链表的每一项由类Node描述,而链表由类 List描述。类 List的成员函数有以下几个
11、。createList():创建从小到大的有序链表。multiplyList(List L1,List L2):将链表 L1和链表 L2合并。print();打印链表。# include iostream.hclass List;class Node friend class List;public:Node(int data)(1) ; private:int data;Node *next; ;class List public:List( ) list = NULL;void multiplyList(List L1, List L2);void createList( );void p
12、rint( );private:Node *list;void List:createList( )Node *p, *u, *pm;int data;list = NULL;while (1) cout“输入链表的一项: (小于零,结束链表)“end1;cin data;if(data0)break; /小于零,结束输入p = list;while (p != NULL p = p-next;u= (2) :if(p=list)list = u;elsepre-next = u;(3) :void List:multiplyList (List L1, List L2)Node *pL1,
13、*pL2, *pL, *u;list = NULL;pL1 = L1.list;pL2 = L2.1ist;while (pL1 != NULL pL1 = pL1 -next;elseu = new Node (pL2-data);pL2 = pL2-next;if (list=NULL)list= (4) ;elsepL-next = u;pL =u;pL1 = (pL1 != NULL) ? pL1:pL2;while (pL1 != NULL)u = (5) ;pL1 = pL1-next;if (list=NULL)list=pL=u;elsepL-next = u;pL = u;v
14、oid List:print( )Node *p;p = list;while (p != NULL)cout p-data “/t“;p = p-next;cout end1;void main ( )List L1, L2, L;cout “创建第一个链表/n“; L1.createList ( );cout “创建第二个链表/n“; L2.createList ( );L1.print ( ); L2.print ( );L.multiplyList (L1, L2);L.print ( );(分数:15.00)_六、试题六(总题数:1,分数:15.00)3.【说明】本程序实现功能:读入
15、两个整数,第 1个数除以第 2个数,声明当除数为零时抛出异常类DivideByZeroException。public class DivideByZeroException (1) public DivideByZeroException ( ) super(“Attcmpted to divide by zero“);import java.io. *;public class Example private static int quotient(int numerator, in)/”t denominator) throwsDivideByZeroException if (deno
16、minator=0)throw (2) ;return(numerator / denominator);public static void main(String args) int number1=0, number2=0, result0;trySystem.out.print1n(“Enter the first number:“);number1 = Integer. valueOf(Keyboard.getString().intValue();System.out.print1n(“Enter the second number:“);number2 = Integer. Va
17、1ueOf(Keyboard.getString().intValue();result = quotient(number1,number2);catch (NumberFormatException e) System.out.print1n(“Invalid integer entered!“);System. exit(-1);catch ( (3) ) System.out.print1n(e.to String();System.exit(-1);Systcm.out.pfint1n(number1 + “/“ + number2 + “=“ + result);其中, Keybo
18、ard 类的声明为:import java.io.*;public class Keyboardstatic BufferedReader inputStream = (4) (new InputStreamReader(System.in);public static int getInteger() try(return (Intoger.valueOf(inputStream.readLine().trim().intValue();catch (Exception e) e.printStackTrace();return 0;public static String getStrin
19、g() tryreturn (inputStream.readLine();catch ( (5) )return “0“;(分数:15.00)_中级软件设计师下午试题-90 答案解析(总分:90.00,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)【说明】(1)流程图描述某大型商店商品销售的数据处理流程。(2)商店设有若干柜台,同一种商品可能在几个柜台上销售,各柜台每天提供一组日销售数据,其格式如下:日期、柜台号、商品代码、销售数量、商品代码、销售数量(3)数据处理系统每日产生一份反映各柜台当日销售金额和商店日销售金额的“日销售金额报告”,必要时还产生一份“商品请购报告”,
20、给出那些低于最低库存量的商品代码、商品名称、最低库存量和实际库存量。处理过程中产生存档的“日销售文件”和临时工作文件“日销售量文件”和“旧销售金额文件”。(4)系统中所用到的数据均来自数据文件。(5)流程图中的商品库存文件的记录已按关键字“商品代码”排序。1.【问题 1】指出商品库存文件的记录中必须包括哪些数据项?分别指出在日销售文件,日销售量文件和日销售金额文件的记录中至少应包括哪些数据项,同时不产生数据冗余?错误清单可能指出哪些错误?(分数:15.00)_正确答案:(商品代码、商品名称、单价、最低库存数量、实际库存数量。日销售文件:柜台号、商品代码、销售数量。日销售量文件:商品代码、销售数
21、量。日销售金额文件:柜台号、销售金额。非法日期、非法商品代码、销售量为负数、销售量大于实际库存量;)解析:_正确答案:(更新商品库存文件中的实际库存量。当实际库存量小于最低库存量时产生商品请购清单。)解析:_正确答案:(在日销售文件中增加“单价”或“金额”。)解析:解析本题描述的是商品销售的数据处理流程。首先要对说明和流程图进行快速扫读,然后结合问题,在说明和图中找到有关的范围,进行分析。问题 1中的第一个小问题是指出商品库存文件的记录中必须包括哪些数据项,首先,应该马上注意到说明中的第 5项,应该包括“商品代码”。同时,注意第 4项,所用到的数据均来自数据文件,这个条件将会直接影响后面的分析
22、。图中显示,商品库存文件在处理 1、处理 3、处理 6使用到。流程图中很明显地显示出在处理 1产生日销售文件后分为两个分支,即左边的分支处理日销售量和商品请购事务和右边的分支处理销售金额事务。处理 6生成商品请购清单,说明 3中提到商品请购清单给出低于库存量的商品代码、商品名称、最低库存量和实际库存量。其所在分支只在处理 1中使用到除库存文件之外的日销售数据,日销售数据和商品库存文件经过处理 1生成日销售文件,所以,商品库存文件必须还包括;商品名称、最低库存量、实际库存量。处理 1生成的日销售文件还被右边分支使用,它和商品库存文件又被处理 3使用生成日销售金额文件,销售金额:单价 x销售量,销
23、售数量由日销售数据提供,所以,商品单价应该由商品库存清单提供。由此,得出商品库存清单必须包括的数据项。问题 1中的问题在分析时已经得到了一些线索,在进一步分析中得出,在同时要保证不能有数据项冗余的情况下,可以得出日销售金额必须包括柜台号、商品代码、销售数量;日销售量文件必须包括商品代码、销售数量;日销售金额必须包括柜台号、销售金额。问题 1的,错误清单产生于处理 1,这时还没有用到商品库存文件中的商品单价,所以不可能有关于金额的错误。可能有的错误是非法的商品代码、非法日期、销售数量为负、销售数量大于库存数量。处理 6根据日销售量文件和商品库存文件来更新商品库存文件,并在实际库存量小于最低库存量
24、时产生商品请购清单。删除虚框部分,就是在处理 3处不使用商品库存文件,那么商品库存文件提供的数据项就要在日销售文件中提供,所以日销售文件中要提供“单价”,也可以提供“金额”,这样就免去计算处理。二、试题二(总题数:1,分数:15.00)【说明】有如下关系数据库:S(SNO,SN,STATUS,CITY)P(PNO,PN,COLORS,WEIGHT)J(JNO,JN,CITY)SPJ(SNO,PNO,JNO,QTY)其中,S 为供应单位,P 为零件,J 为工程项目,SPJ 为工程订购零件的订单,其语义为:某供应单位供应某种零件给某个工程,请用 SQL完成下列操作。1. 【问题 1】求为工程 J1
25、提供红色零件的供应商代号。(分数:15.00)_正确答案:(SELECT DISTICT SPJ.SNOFROM SPJ,PWHERE P.PNO=SPJ.PNO AND SPJ.JNO=J1AND P.COLOR=红)解析:_正确答案:(SELECT DISTINCT SPJ.PNOFROM S,J,SPJWHERE S.SNO=SPJ.SNO AND J.JNO=SPJ.JNO AND S.CITY=J.CITY;)解析:_正确答案:(SELECT DISTINCT SPJ.JNOFROM ANDJ.JNO=SPJ.JNO AND S,CITYJ.CITY)解析:解析这道题比较简单直接,只
26、是考查考生的基本 SQL语句的掌握和使用。三、试题三(总题数:1,分数:15.00)【说明】某教学管理系统的用户是教学管理人员、教师和学生。系统主要提供学生选课管理和学生成绩管理两方面的功能。(1)学生选修课管理主要功能是管理新学期开始时,学生对选修的课程进行选课注册工作。新学期开始后的前两周为学生试听、选课注册时间;允许校内各院系学生跨专业跨年级选修课程;学生可以在校园网的任何一个终端进行选课。新学期选修课程表生成:各学院教学管理人员在新学期开始前,将准备开设的选修课程名称、课程代码、总课时、上课时间、学分、任课教师和上课教室录入系统,供学生选课使用。新学期开学两周后,系统自动将实际选课学生
27、少于 10人的课程停开,并删除该课程;教学管理人员打印学生选课注册名单和开课通知书,送交有关部门和任课教师。学生选课注册:新学期开学前两周为学生试听、选课注册时间,并允许改变或取消注册申请。学生调用待选课程表,系统显示课程名、课程代码、任课教师、上课时间、总课时、上课教室、学分和本课程已选修人数。学生所选几门课程在上课时间上不能冲突;若一门课程实际选课学生已达到 40人时,停止选课。当学生退出系统时,系统提示该学生所选的几门课程、任课教师、上课时间、教室、学分和学分总计。选修课程查询:选修课程表信息查询,用户是教师、学生和教学管理人员。系统显示课程名、课程代码、任课教师、上课时间、总课时、上课
28、教室、学分和本课程已选修人数。查询关键词可为学院名称、专业、授课教师等。学生选课情况查询:教师和教学管理人员可以查看学生的选课情况。查询关键词可以为学生姓名(学号)、课程名称(课程代码)、授课教师等。学生只能查自己所选课程内容,不允许查其他同学选课情况。教师简历查询:用户是学生、教师和教学管理人员。查询关键词可为教师姓名、性别、职称、年龄等单关键词或组合关键词。信息统计与报表生成:各学院教学管理人员对学生选课注册信息进行统计(按课程、专业等),打印汇总报表。把学生选课注册信息传送到财务管理系统,计算学生应交纳的费用。(2)学生成绩管理学生考试成绩录入:各学院教学管理人员将学生考试成绩录入系统。
29、录入学生成绩时,系统自动检查财务系统传来的选课交费信息,核对该学生是否已经交纳本门课程的费用,没有交纳费用者,不给成绩。成绩查询:教师和教学管理人员可查询学生各门课程的成绩。查询关键词可为学生姓名(学号),课程名(课程代码)等。学生只能查自己各门课程的成绩,不允许查其他同学成绩。成绩汇总与报表生成:教学管理人员对学生考试成绩信息进行统计(按学生、课程、专业等),打印汇总报表。向学校教务管理系统发送汇总信息表格等,不反馈信息。现在已建立教学管理最高层用例图,如下:1.【问题 1】完成学生成绩管理子系统用例图。(分数:15.00)_正确答案:(1教学管理员2教学管理系统3选修课管理4选修课查询5选
30、修课注册6教师7学生)解析:_正确答案:(在用例模型中,用例间的关系主要有 4种,继承关联、扩展关联、包含关联和使用关联。下面分别说明。 继承关联。用例是一种类,类之间的继承和被继承关系在用例之间也存在。继承关联表示两个用例之间有继承关系。例如财务管理系统中的用例“超越权限”和“资金支出”就是继承关联,“资金支出”是父用例,“超越权限”是子用例,“超越权限”用例继承了“资金支出”用例的功能。 扩展关联。扩展关联与继承关联类似,通过向基本用例添加动作来扩展该用例。例如,教学管理系统中原先有一个用例“排课表”,现在增加一个“排新课表”,来扩展“排课表”的功能。 包含关联。它是一种依赖关系,一个基本
31、用例的功能包含另一个用例的功能。例如,几个用例都有共同的功能,那么就可以把这个公共功能提出来,放到一个基本用例中,这样可以避免进行重复描述。 使用关联。也是一种继承关系,一个用例使用另一个用例的功能和行为。)解析:_正确答案:(用例之间使用何种关联,可以如下考虑:(1)一个用例偶尔使用另一个用例的功能描述时,采用继承关联。(2)两个以上用例重复处理同样的功能,可以采用使用关联或包含关联。用例要采用多种控制方式对异常或任选动作进行处理时,采用扩展关联。)解析:解析首先,确定角色。主要角色是学生,其他的还有教师、教学管理员,由于选修课的情况要被各学院作为教学汇总信息上交学校教学管理系统,所以教学管
32、理系统也是这个用例图中的一个角色,直接可以确认角色 2是教学管理系统。角色 7执行了教师建立查询,所以角色 7是学生。学生角色还有两个用例,分别是选修课注册和选修课查询,所以用例 5是选修课注册,用例 4是选修课查询,进而角色 6是教师,角色 1是教学管理员, 用例 3是选修课管理。四、试题四(总题数:1,分数:15.00)1.【说明】下面是一个用 C编写的快速排序算法。为了避免最坏情况,取基准记录 pivot时,采用从left、right 和 mid=(left+right)/2中取中间值,并交换到 right位置的办法。数组 a存放待排序的一组记录,数据类型为 T,left 和 right
33、是待排序子区间的最左端点和最右端点。void quicksort (int a, int left, int right) int temp;if (leftright) hat pivot = median3 (a, left, right); /三者取中子程序int i = left, j = right-1;for(;)while (i j while (i j if(ij)temp = ai; aj = ai; ai = temp;i+; j-;else break;if (ai pivot)temp = ai; ai = aright; aright = temp;quicksort
34、( (1) ); /递归排序左子区间quieksort(a,i+1 ,right); /递归排序右子区间void median3 (int a, int left, int right)int mid= (2) ;int k = left;if(amid ak)k = mid;if(ahigh ak) k = high; /选最小记录int temp = ak; ak = aleft; aleft = temp; /最小者交换到 leftif(amid aright)temp=amid; amid=aright; aright=temp;消去第二个递归调用 quicksort (a,i+1,r
35、ight)。 采用循环的办法:void quicksort (int a, int left, int right) int temp; int i,j;(3) int pivot = median3(a, left, right); /三者取中子程序i = left; j = righi-1;for (; )while (ij while (ij if(i j) temp = ai; aj; = ai; ai=temp;i+; j-;else break;if(aipivot) (4) ;ai=pivot;quicksoft ( (5) ); /递归排序左子区间left = i+1;(分数:
36、15.00)_正确答案:(解析(1)a,left,i-1递归排序左子区间,从 left到 i-1元素,不包括 i元素。(2)(left+right+1)/2三者取中子程序 median3(a,left,right),取基准记录 pivot时,采用从 left、right 和 mid=(left+right)/2中取中间值,并交换到 right位置的办法。(3)while(leftright)循环直到 left和 right相遇。(4)aright)=ai若 aipivot 则让 aright=ai而让 ai=pivot;。(5)a,left, i-1递归排序左子区间,从 left到 i-1元素
37、,不包括 i元素。)解析:五、试题五(总题数:1,分数:15.00)2.【说明】本程序将两个从小到大的有序链表合成一个新的从小到大的有序链表。链表的每一项由类Node描述,而链表由类 List描述。类 List的成员函数有以下几个。createList():创建从小到大的有序链表。multiplyList(List L1,List L2):将链表 L1和链表 L2合并。print();打印链表。# include iostream.hclass List;class Node friend class List;public:Node(int data)(1) ; private:int da
38、ta;Node *next; ;class List public:List( ) list = NULL;void multiplyList(List L1, List L2);void createList( );void print( );private:Node *list;void List:createList( )Node *p, *u, *pm;int data;list = NULL;while (1) cout“输入链表的一项: (小于零,结束链表)“end1;cin data;if(data0)break; /小于零,结束输入p = list;while (p != NU
39、LL p = p-next;u= (2) :if(p=list)list = u;elsepre-next = u;(3) :void List:multiplyList (List L1, List L2)Node *pL1, *pL2, *pL, *u;list = NULL;pL1 = L1.list;pL2 = L2.1ist;while (pL1 != NULL pL1 = pL1 -next;elseu = new Node (pL2-data);pL2 = pL2-next;if (list=NULL)list= (4) ;elsepL-next = u;pL =u;pL1 =
40、(pL1 != NULL) ? pL1:pL2;while (pL1 != NULL)u = (5) ;pL1 = pL1-next;if (list=NULL)list=pL=u;elsepL-next = u;pL = u;void List:print( )Node *p;p = list;while (p != NULL)cout p-data “/t“;p = p-next;cout end1;void main ( )List L1, L2, L;cout “创建第一个链表/n“; L1.createList ( );cout “创建第二个链表/n“; L2.createList
41、( );L1.print ( ); L2.print ( );L.multiplyList (L1, L2);L.print ( );(分数:15.00)_正确答案:(解析(1)this-data=data,next=NULLNode构造函数给成员 data和 next赋初值。(2)new Node(data)动态构造一个 Node对象,赋初值为 data。(3)u-next=p将 p结点作为 u的下一个结点,连在链表中。(4)pL=u若 list为空,也就是新表为空,则让新表头指针 pL指向 u。(5)new Node(pL1-data)若 pL1 !=NULL,则用表中结点的值 pL1-data 作为初值生成一个新的 Node对象。)解析:六、试题六(总题数:1,分数:15.00)3.【说明】本程序实现功能:读入两个整数,第 1个数除以第 2个数,声明当除数为零时抛出异常类DivideByZeroException。public class DivideByZeroException (1) public DivideByZeroException ( ) super(“Attcmpted to divide by zero“);import java.io. *;public class Example pr