问答题阅读下列说明和图,回答问题1至问题3。【说明】公司IT部门决定开发一个计算机管理系统以记录期刊的传阅情况。期刊在公司内部传阅,员工可以要求加入传阅队列。图书室登记公司收到的期刊,交给名单中的第一名员工。员工应在3个工作日内完成阅读,员工阅读完毕后通知系统,系统提醒下一位阅读者取书,下一个员工必须确认已收到期刊。当传阅名单中“下一位”员工出差在外时将无法进行传阅,此时将期刊传给再下一位,而将该员工做标记,再次传递此书时优先考虑该员工。最后一位员工阅读完毕后,将期刊交还图书室以便共用。系统能在员工忘记传递期刊时发出提醒信息。系统详细记录期刊传阅情况,当员工阅读完后通知系统,系统记录该员工的员工号及日期,并在备注栏注明是传出;同样,当员工收到期刊后给系统收书确认,系统记录该员工的员工号及日期,并在备注栏注明是收到。公司的员工都有一个唯一的员工号。公司订阅了多种期刊,为每一本期刊(有唯一期刊流水号)产生一份传阅名单,并详细记录传阅情况。员工的出差情况存储在系统主机中。该系统采用面向对象方法开发,系统中的类及类之间的关系用UML类图表示,图9-4是该系统的类图的一部分,图9-5描述了成功传递期刊的序列图。
问答题[说明]某学校的教学系统描述如下:学生信息包括:学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、入学年份(Syear)、主修专业(Smajor),其中学号是入学时唯一编定的。教师信息包括:教工号(Tno)、姓名(Tname)、性别(Tsex)、年龄(Tage)、职称(Title),其中教工号是唯一编定的。课程信息包括:课程号(Cno)、课程名称(Cname)、学时(Cpeiiod)、学分(Ccredit),其中课程号是唯一编定的。每个专业每个年级只有一个班级,这样班级就可用入学年份标识。每位教师只教授特定的一门的课程,每门课程可以有多个教师教授,各位老师的上课地点及上课时间有所不同。注意:一门课程至少有一位教师教授,否则这门课程就视为不存在。每位学生可以同时选修多门不同的课程,一门课程至少要有10位学生选修,否则就取消这门课程的开设。注意:选修课程时要指定任课教师,不能重复选修同一门课程。课程结束后,任课教师给选修该课程的学生一个成绩(Grade)。注意:教师不能给没有选修他所教授课程的学生成绩,即使选修了其他教师教授的同一门课也不行。图2-1是经分析得到的E-R图。[图2-1]
问答题[说明] 为网球比赛的选手安排比赛日程。设有n(n=2m)位选手参加网球循环赛,循环赛共进行n-1天,每位选手要与其他n-1位选手赛一场,且每位选于每天赛一场,不轮空。 设n位选手被顺序编号为1, 2, …, n,比赛的日程表是一个n行n-1列的表,第i行j列的内容是第i号选手第j天的比赛对手。用分治法设计日程表,就是从其中一半选手(2m-1位)的比赛日程导出全体2m选手的比赛日程。从众所周知的只有两位选手的比赛日程出发,反复这个过程,直至为n位选手安排好比赛日程为止。 如两位选手比赛日程表如下所示: 1 1 2 2 1 如四位选手比赛日程表如下所示: 1 2 3 1 2 3 4 2 1 4 3 3 4 1 2 4 3 2 1 函数中使用的预定义符号如下: #define M 64 int a[M+1][M]; [函数] void main() int twom1, twom, i, j, m, k; printf("指定n(=2的k次幂)位选手, 请输入k: /n"); scanf("*d", /*预设两位选手的比赛日程*/ a[l] [1] = 2; a[2] [1] = 1; m = 1; twoml = 1; while(______) m++; twoml += twoml; twom = twoml * 2;/*为2^m位选手安排比赛日程*/ /*填日程表的左下角*/ for(i = twoml + i; ______; i++) for(j = i; j <= twoml - i; j++) a[i] [j] = a[i - twoml] [j] + twoml; /*填日程表的右上角*/ a[1] [twoml] = ______;/*填日程表右上角的第1列*/ for(i = 2; i <= twoml; i++) a[i] [twoml] = a[i - 1] [twoml] + i; /*填日程表右上角的其他列,参照前一列填当前列+/ for(j = twoml + 1; j < twom; j++) for(i = i; i < twoml; i++) a[i] [j] = ______; a[twoml] [j] = a[l] [j - 1]; /*填日程表的右下角*/ for(j = twoml; j < twom; j++) for(i = i; i <= twoml; i++) a[______] [j] = i; /*输出日程表*/ for(i = i; i <= twom; i++) for(j = i; j < twom; j++) printf("%4d", a[i] [j]); printf("/n"); printf("/n");
问答题[说明]已知某唱片播放器不仅可以播放唱片,而且可以连接计算机并把计算机中的歌曲刻录到唱片上(同步歌曲)。连接计算机的过程中还可自动完成充电。关于唱片,还有以下描述信息。(1)每首歌曲的描述信息包括歌曲的名字、谱写这首歌曲的艺术家及演奏这首歌曲的艺术家。只有两首歌曲的这3部分信息完全相同时,才认为它们是同一首歌曲。艺术家可能是一名歌手或一支由2名或2名以上的歌手所组成的乐队。一名歌手可以不属于任何乐队,也可以属于一个或多个乐队。(2)每张唱片由多条音轨构成。一条音轨中只包含一首歌曲或为空,一首歌曲可分布在多条音轨上;同一首歌曲在一张唱片中最多只能出现一次。(3)每条音轨都有一个开始位置和持续时间。每张唱片上的音轨次序是非常重要的,因此对于任意一条音轨,播放器需要准确地知道它的下一条音轨和上一条音轨是什么(如果存在的话)。根据上述描述,采用面向对象方法对其进行分析与设计,得到了如下表所示的类列表、如图1所示的初始类图以及如图2所示的描述播放器行为的UML状态图。类列表类名说明Artist艺术家Song歌曲Band乐队Musician歌手Track音轨Album唱片
问答题【说明】某单位正在使用一套C/S模式的应用软件系统,现在需要升级为B/S应用模式,但需要保持业务的连续性。开发人员提出用WebService作为中间层的接口进行开发。【问题1】请用120字以内文字,从业务的继承性、升级成本(时间、工作量)和扩展性三个方面简要说明开发人员所提方案的优点。【问题2】WebService的三个基本技术是WSDL、SOAP、UDDI,它们都是以XML为基础定义的。请用120字以内文字,简要说明WSDL、SOAP和UDDI的作用。【问题3】服务注册中心、服务提供者和服务请求者之间的交互和操作构成了WebService的体系结构,如图13-21所示。请用180字以内文字,说明这三者的主要功能及其交互过程。
问答题[说明]某高等院校的教学管理具有选课管理和成绩管理两大功能。选课管理主要完成以下工作:(1)录入与生成新学期课程表;(2)学生选课注册;(3)查询,学生、教师、教学管理员可以查询课程表,获得课程信息、学生选课信息和学生、教师信息;(4)选课注册信息的统计与报表生成。成绩管理主要的功能为:(1)成绩录入:教学管理员录入学生考试成绩;(2)成绩查询:教师、教学管理员可以查询学生考试成绩。。学生只允许查询自己的考试成绩,不允许查询他人的成绩;(3)成绩统计与报表生成:教学管理员进行成绩统计,打印统计报表。把学生选课注册信息传送给财务系统,以便计算学生应交纳的费用。根据需要,系统设计的用例有“选课管理”、“成绩管理”、“查询课程信息”、“选课注册”、“管理开设课程”等用例。其中部分用例说明如下:“查询课程信息”:学生、教师或教学管理员启动查询课程信息时,该用例开始运行。根据输入的查询要求(查询主题或关键字),显示有关的课程信息;“选课注册”。当学生登录进行选课注册时,该用例开始运行,它提供了选择课程、注册、修改注册、删除注册等功能。学生登录需要用户标识(ID)和口令;“管理开设课程”。当教学管理员登录系统进行产生选课信息操作时,该用例开始运行。它首先检查用户标识(ID)和口令,然后从数据库中取出学生的选课注册数据,按照要求进行分类统计,生成选课注册报表。活动者“学生”与用例“选课注册”的交互关系如下:当“学生”登录系统进入选课注册活动时,首先要输入用户标识(ID)和口令,经系统的“注册表单”接口对象验证,如果正确无误,则“学生”可以进行查询活动或选课活动,否则拒绝进入。若“学生”发出“查询”请求,系统的“选课注册表单”接口对象响应信息给“学生”,及发送增加或删除学生选课数据的消息。“开设课程”对象响应该消息,找出数据库中的相关数据,增加或删除学生的姓名和所选的课程名,或做相应的修改,并把增加或删除学生课操作成功或失败的信息反馈给“选课注册表单”接口对象,“选课注册表单”接口对象再反馈给“学生”。如果“学生”按下“确认”键,则选课操作得到确认,发出提交请求。“选课注册表单”接口对象响应该请求,并发出“存储”消息。“开设课程”对象响应“存储”消息,进行数据库存储操作,选课数据存入数据库。若“学生”结束选课,发出“退出”系统请求,“注册表单”接口对象响应请求,关闭系统。图10-7为系统的顶层UML用例图。图10-8为选课注册顺序图。
问答题[说明]用创建Thread类的子类的方法实现多线程,判断一个数是否是素数。如果是,打印“是素数”,如果不是,则打印“不是素数”,如果没有参数输入,显示“请输入一个命令行参数”。[Java程序]
问答题某宾馆拟开发一个宾馆客房预订子系统,主要是针对客房的预订和入住等情况进行管理。[需求分析结果](1)员工信息主要包括员工号、姓名、出生年月、性别、部门、岗位、住址、联系电话和密码等信息。岗位有管理和服务两种。岗位为“管理”的员工可以更改(添加、删除和修改员工表中的本部门员工的岗位和密码,要求将每一次更改前的信息保留;岗位为“服务”的员工只能修改员工表中本人的密码,且负责多个客房的清理等工作。(2)部门信息主要包括部门号、部门名称、部门负责人、电话等信息;一个员工只能属于一个部门,一个部门只有一位负责人。(3)客房信息包括客房号、类型、价格、状态等信息。其中类型是指单人间、三人间、普通标准间、豪华标准间等;状态是指空闲、入住和维修。{{U}}1{{/U}}客户信息包括身份证号、姓名、性别、单位和联系电话。{{U}}2{{/U}}客房预订情况包括客房号、预订日期、预订入住日期、预订入住天数、身份证号等信息。一条预订信息必须且仅对应一位客户,但一位客户可以有多条预订信息。[概念模型设计]根据需求阶段收集的信息,设计的实体联系图(不完整)如图所示。[逻辑结构设计]逻辑结构设计阶段设计的部分关系模式(不完整)如下。员工({{U}}{{U}}1{{/U}}{{/U}},姓名,出生年月,性别,岗位,住址,联系电话,密码)权限(岗位,操作权限)部门(部门号,部门名称,部门负责人,电话)客房({{U}}{{U}}2{{/U}}{{/U}},类型,价格,状态,入住日期,入住时间,员工号)客户({{U}}{{U}}3{{/U}}{{/U}},姓名,性别,单位,联系电话)更改权限(员工号,{{U}}{{U}}4{{/U}}{{/U}},密码,更改日期,更改时间,管理员号)预订情况({{U}}{{U}}5{{/U}}{{/U}},预订日期,预订入往日期,预订入住天数)
问答题已知某类库开发商提供了一套类库,类库中定义了Application类和Document类,它们之间的关系如图所示。其中,Application类表示应用程序自身,而Document类则表示应用程序打开的文档。Application类负责打开一个已有的以外部形式存储的文档,如一个文件,一旦从该文件中读出信息后,它就由一个Document对象表示了。当开发一个具体的应用程序时,开发者需要分别创建自己的Application和Document子类。例如,图中的类MyApplication和类MyDocument,并分别实现Application和Document类中的某些方法。已知Application类中的openDocument方法采用了模板方法(TemplateMethod)设计模式,该方法定义了打开文档的每一个主要步骤如下:{{U}}{{/U}}首先检查文档是否能够被打开,若不能打开,则给出出错信息并返回。{{U}}{{/U}}创建文档对象。{{U}}{{/U}}通过文档对象打开文档。{{U}}{{/U}}通过文档对象读取文档信息。{{U}}{{/U}}将文档对象加入到Application的文档对象集合中。[Java代码]abstractclassDocument{publicvoidsave(){/*存储文档数据,此处代码省略*/}publicvoidopen(StringdocName){/*打开文档,此处代码省略*/publicvoidclose(){/*关闭文档,此处代码省略*/}publicabstractvoidread(StringdocName);};abstractclassAppplication{privateVector<{{U}}{{U}}{{/U}}{{/U}}>docs;/*文档对象集合*/publicbooleancanOpenDocument(StringdocName){/*判断是否可以打开指定文档,返回真值时表示可以打开,返回假值表示不可打开,此处代码省略*/}publicvoidaddDocument(DocumentaDocument){/*将文档对象添加到文档对象集合中*/docs.add({{U}}{{U}}{{/U}}{{/U}});}publicabstractDocumentdoCreateDocument();/*创建一个文档对象*/publicvoidopenDocument(StringdocName){/*打开文档*/if({{U}}{{U}}{{/U}}{{/U}}){System.out.println("文档无法打开!");return;}{{U}}{{U}}{{/U}}{{/U}}adoc={{U}}{{U}}{{/U}}{{/U}};{{U}}{{U}}{{/U}}{{/U}};{{U}}{{U}}{{/U}}{{/U}};{{U}}{{U}}{{/U}}{{/U}};}};
问答题[说明]以下VisualBasic代码实现了对位图(BMP)进行旋转显示。以下程序共实现了对BMP位图图形进行180°旋转、90°旋转(顺时针)、90°旋转(逆时针)、水平翻转、垂直翻转共5项处理。显示界面如图12-8所示。仔细阅读[代码7-1]至[代码7-3],完成(n)代码,并写在对应栏内。[代码7-1]BeginVB.FormForm1AutoRedraw=-1'TrueCaption="图像的施转"//...窗体描述(略)BeginVB.CommandButtonCommand7Caption="退出"//...窗体描述(略)EndBeginVB.CommandButtonCommand6Caption="复位"//...窗体描述(略)EndBeginVB.CommandButtonCommand5Caption="垂直翻转"//...窗体描述(略)EndBeginVB.CommandButtonCommand4Caption="水平翻转"//...窗体描述(略)EndBeginVB.CommandButtonCommand3Caption="90°(逆时针)"//...窗本描述(略)EndBeginVB.CommandButtonCommand2Caption="90°(顺时针)"//...窗体描述(略)EndBeginVB.PictureBoxPicture2//...窗体描述(略)EndBeginVB.CommandButtonCommand1Caption="180°"//...窗体描述(略)EndBeginVB.PictureBoxPicture1//...窗体描述(略)EndEnd[代码7-2]PrivateDeclareFunctionBitBltLib"gdi32"(ByValhDestDCAsLong,ByValxAsLong,ByValyAsLong,ByValnWidthAsLong,ByValnHeightAsLong,ByValhSrcDCAsLong,ByValxSrcAsLong,ByValySrcAsLong,ByValdwRopAsLong)AsLongConstsrcopy=&HCC0020DimhAsIntegerDimwAsIntegerPrivateSubForm_Load()Picture2.Picture=LoadPicture(App.Path&"/a01.bmp")'导入图片'h=Picture1.Heightw=Picture1.WidthEndSub[代码7-3]PrivateSubCommandl_Click()旋转180°Picture2.Picture=LoadPicture("")Forj=0TohStep1Fori=0TowStep1(1)NextiNextjEndSubPrivateSubCommand2_Click()'顺时针施转90°'Picture2.Picture=LoadPicture("")Fori-hTo0Step-1Forj-0TowStep1(2)NextjNextiEndSubPrivateSubCommand3_Click()'逆时针旋转90°'Picture2.Picture=LoadPicture("")Forj=wTo0Step-1Fori=0TohStep1(3)NextiNextjEndSubPrivateSubCommand4Click()'水平翻转Picture2.Picture=LoadPicture("")Fori=wTo0Step-1Forj=0TohStep1(4)NextjNextiEndSubPrivateSubCommand5_Click()'垂直翻转Picture2.Picmre=LoadPicmre("")Forj=0TohStep1Fori=0TowStepI(5)NextiNextjEndSubPrivateSubCommand6_Click()'复位Picture2.Picture=LoadPicmre("")Fori=0TowStep1Forj=0TohStep1(6)NextjNextiEndSub
问答题【说明】图书管理系统详细记录图书库存情况、读者信息及读者借阅记录(包括借书日期和还书日期)。新书入库时要为该书编制图书卡片,包括分类目录号、图书流水号(要保证每本书都有唯一的流水号,即使同类图书也是如此)、书名、作者、内容摘要、价格和购书日期。同一个书名由于版次、作者等不同有可能存在多“种”图书,其间用“分类目录号”区分。系统为每一位合法读者编制一个唯一的借书证号,读者需要提供姓名、单位。一个读者最多可以同时借阅5本图书。借阅图书时,新添借阅记录,并将对应的“归还标记”字段置为“false”,表示“尚未归还”;归还图书时,将相应的“归还标记”字段置为“true”,表示“已经归还”。一本书可能供多位读者借阅,同一本书读者可以重复借阅。如图9-17所示为该系统的E-R图。
问答题阅读下列说明和图,回答问题1至问题3。[说明]某大型旅店为了便于管理,欲开发一个客房管理系统。希望实现客房预定、入住登记、帐务结算、退房,以及将服务项目记入客人帐单。旅客包括散客和团体,散客预定或入住时需要提供姓名、性别、身份证和联系电话,团体则提供团体名称、负责人的姓名、性别、身份证和联系电话,以及团体人数。对于散客,还要提供换房。旅店还提供了很多服务项目,比如早餐。对每一个入住客人,服务列表记录了住宿期间的各项服务,包括服务类型、日期、数量等。当然,客人也可以不要任何服务。旅店的客房有一个唯一的房间号,分为不同的类别,不同的房间床位数和价格不同。为了有效的管理,需要记录每天的客房状态。客房的状态有:空闲、占用、已预定和维修。·客人入住后,客房处于占用状态;·客人退房后,客房处于空闲状态;·客人预定后,客房处于已预定状态;·预定客人入住后,客房处于占用状态;·预定客人取消预定后客房处于空闲状态;·需要维修时客房处于维修状态;·维修完成后客房处于空闲状态。该系统采用面向对象方法开发,系统中的类以及类之间的关系用UML类图表示,图3-1是该系统的类图的一部分,图3-2描述了客房状态的转变情况。[图3-1][图3-2]1.请用图3-1的属性和方法的名称给出客人类的属性和方法。(注意:团体类中的负责人姓名等与散客的对应属性含义相同,不必区分)
问答题[说明]下面的流程图(如图所示)用N-S盒图形式描述了数组A中的元素被划分的过程。其划分方法是:以数组中的第一个元素作为基准数,将小于基准数的元素向低下标端移动,而大于基准数的元素向高下标端移动。当划分结束时,基准数定位于A[i],并且数组中下标小于i的元素的值均小于基准数,下标大于i的元素的值均大于基准数。设数组A的下界为low,上界为high,数组中的元素互不相同。例如,对数组(4,2,8,3,6),以4为基准数的划分过程如下:[流程图][算法说明]将上述划分的思想进一步用于被划分出的数组的两部分,就可以对整个数组实现递增排序。设函数intp(intA[],intlow,inthieh)实现了上述流程图的划分过程并返回基准数在数组A中的下标。递归函数voidsort(intA[],intL,intH)的功能是实现数组A中元素的递增排序。[算法]voidsort(intA[],intL,intH)if(L<H)k=p(A,L,R);//p()返回基准数在数组A中的下标sort((4));//小于基准敷的元素排序sort((5));//大于基准数的元素排序
问答题
问答题阅读以下说明和数据流图,回答问题1~3问题。[说明]学生信息管理系统旨在用微型计算机对全校的学生事务进行管理,其内容包括新生管理、成绩管理、重修管理、毕业资格审定以及随机查询和打印报表等。教务人员在进入系统时,系统通过注册登录来提供用户的访问权限,系统会检查用户的合法性,如不合法,系统拒绝用户进入,如是合法用户,则根据命令要求类型处理。本系统主要有新生管理、成绩管理、重修处理、资格审定四大功能,分别进行不同的管理。新生管理首先按照各专业录入新生信息,录入时若录入的信息不完整,则给出提示信息,要求用户录入完整信息;若新生库中已经存在该生信息了,则给出提示信息,保证不重复录入新生信息。在录入阶段,会显示新生库中的记录,可以进行浏览、删除、修改等操作,以便用户录入正确无误的新生信息。录入完毕后,打印编好学号和分好班次的新生名单并将新生记录写入学生信息库。成绩管理使用一般方法和特殊方法对学生成绩进行管理。分别按照这两种方法进行成绩的录入和计算。成绩处理完毕后,合并到学生成绩库,可以对学生成绩总库进行浏览、修改、删除、插入、查找等操作,同时提供成绩查询功能,可按照学号、姓名、课程号、课程名称、专业班级查询学生成绩,最后打印各种形式的学生成绩单。重修处理首先对学生重修总体情况进行浏览,可以查询未交费学生重修情况、某个学生重修情况等,打印各种形式的重修单和重修证。另外进行重修交费登记,输入某个重修学生学号,则显示该生相关信息(姓名、专业等)、重修课程信息、重修总学分、应交金额等,交费登记后,写入重修表和交费表。资格审定主要对毕业生的毕业资格进行审定,计算毕业生的已修学分,审定后填写资格库,显示审定结果,打印毕业生资格表和毕业证书等。学生信息管理系统顶层图如图10-1所示;学生信息管理系统的第0层DFD图如图10-2所示,其中,加工3的细化图如图10-3所示,加工4的细化图如图10-4所示。[数据流图10-1][数据流图10-2][数据流图10-3][数据流图10-4]
问答题【说明】Point是平面坐标系上的点类,Line是从Point派生出来的直线类。 #include <iostream.h> class Point public: Point (int x, int y) ; Point (Point ~Point(); void set (double x, double y) ; void print(); private:double X,Y; ; Point::Point (int x, int y) //Point 构造函数 X=x; Y=y; Point::Point ( (1) ) //Point 拷贝构造函数 X=p.X; Y=p.Y; void Point::set (double x, double y) X=x; Y=y; void Point::print() cout<<' ('<<X<<","<<Y<<") "<<endl; Point::~Point() cout<<"Point 的析构函数被调用! "<<endl; class Line: public Point public: Line (int x, int y, int k) ; Line (Line ~Line(); void set (double x, double y, double k) void print(); private:double K; ; (2) //Line 构造函数实现 K=k; (3) //Line 拷贝构造函数实现 K=s.K; void Line::set (double x, double y, double k) (4) ; K=k; void Line::print() cout<<" 直线经过点"; (5) ; cout<<"斜率为: k="<<K<<endl; Line: :~Line() cout<<"Line 析构函数被调用! "<<endl; void main() Line 11 (1,1,2) ; 11 .print(); Linel2 (11) ; 12.set (3,2,1) ; 12.print();
问答题问题:5.1 请填写(1)(2)(3)(4)(5)
问答题[说明]公司IT部门决定开发一个计算机管理系统以记录期刊的传阅情况。期刊在公司内部传阅,员工可以要求加入传阅队列。图书室登记公司收到的期刊,交给名单中的第一名员工。员工应在三个工作日内完成阅读,员工阅读完毕后通知系统,系统提醒下一位阅读者取书,下一个员工必须确认已收到期刊。当传阅名单中“下一位”员工出差在外时将无法进行传阅,此时将期刊传给再下一位,而将该员工作标记,再次传递此书时优先考虑该员工。最后一位员工阅读完毕后,将期刊交还图书室以便共用。系统能在员工忘记传递期刊时发出提醒信息。系统详细记录期刊传阅情况,当员工阅读完后通知系统,系统记录该员工员工号及日期,并在备注栏注明是传出;同样,当员工收到期刊后给系统确认,系统记录该员工员工号及日期,并在备注栏注明是收到。公司的员工都有一个唯一的员工号。公司订阅了多种期刊,为每一本期刊(有唯一期刊流水号)产生一份传阅名单,并详细记录传阅情况。员工的出差情况存储在系统主机中。该系统采用面向对象方法开发,系统中的类以及类之间的关系用UML类图表示,图1-1是该系统的类图的一部分,图1-2描述了成功传递期刊的序列图。[图1-1][图1-2]
问答题【说明】 本程序在3×3方格中填入1~N(N≥10)内的某9个互不相同的整数,使所有相邻两个方格内的两个整数之和为质数。试求出满足这个要求的所有填法。3×3方格中的每个方格按行按列(先行后列)序号排列为:0,1,2,3,4,5,6,7,8。 程序采用试探法,即从序号为0的方格开始,为当前方格寻找一个合理的可填整数,并在当前位置正确填入后,为下一方格寻找可填入的合理整数。如不能为当前方格找到一个合理的可填整数,就要回退到前一方格,调整前一方格的填入整数;直至序号为8的方格也填入合理的整数后,就找到了一个解,将该解输出。再调整序号为8的方格所填整数,继续去找下一个解。为了检查当前方格的填入整数的合理性,程序引入二维数组check Matrix,存放需要进行合理性检查的相邻方格的序号。 # include <stdio. h> # define N 12 int b[N+1]; int pos; int a[9];/* 用于存储诸方格所填入的整数*/ int AllNum=0;/* 统计有多少种填法*/ int checkMatrix[][3]= -1,0,-1,1,-1, 0,-1,1,3,-1,2,4,-1, 3,-1,4,6,-1,5,7,-1; void write(int a[]) int i, j; for(i=0; i<3; i++) for(j=0; j<3; j++) printf("%3d", a[3*i+j]); printf("/n"); int isPrime(int m) int i; if(m==2)return 1; if(m==1 ‖ m%2==0)return 0; for(i=3; i*i<m;) if(m%i==0)return 0; i+=2; return 1; int selectNum(int start) int j; for(j=start; j<=N; j++) if(b[j])return j; return 0; int check()/*检查填入pos位置的整数是否合理*/ int i,j; for(i=0; (j= (1) )>=0; i++) if(!isPrime(a[pos]+a[j])) (2) ; (3) ; extend ()/* 为下一方格找一个尚未使用过的整数*/ a[ (4) ]=selectNum(1); b[a[pos]]=0; void change ()/*为当前方格找下一个尚未使用过的整数(找不到回溯)*/ int j; while(pos >=0 if(pos<0)return; b[a[pos]]=1; a[pos]=j; b[j]=0; int find () int ok=1; pos=0; a[pos]=1; b[a[pos]]=0; do if(ok) if(pos==8) write(a); change(); AllNum++;/* 统计有多少种填法*/ else extend(); else change(); ok=check(); while(pos>=0); void main() int i; for(i=1; i<=N; i++) b[i]=1; find(); prinrf("共有%d种不同填法!/n", AllNum);
问答题【问题 4】(3 分)
根据问题描述,写出客户、委托书和派工单这三个关系的主键。