问答题阅读下列说明以及图10-7和图10-8,回答问题1、问题2和问题3。[说明]某高等院校的教学管理具有选课管理和成绩管理两大功能。选课管理主要完成以下工作:(1)录入与生成新学期课程表;(2)学生选课注册;(3)查询,学生、教师、教学管理员可以查询课程表,获得课程信息、学生选课信息和学生、教师信息;(4)选课注册信息的统计与报表生成。成绩管理主要的功能为:(1)成绩录入:教学管理员录入学生考试成绩;(2)成绩查询:教师、教学管理员可以查询学生考试成绩。。学生只允许查询自己的考试成绩,不允许查询他人的成绩;(3)成绩统计与报表生成:教学管理员进行成绩统计,打印统计报表。把学生选课注册信息传送给财务系统,以便计算学生应交纳的费用。根据需要,系统设计的用例有“选课管理”、“成绩管理”、“查询课程信息”、“选课注册”、“管理开设课程”等用例。其中部分用例说明如下:“查询课程信息”:学生、教师或教学管理员启动查询课程信息时,该用例开始运行。根据输入的查询要求(查询主题或关键字),显示有关的课程信息;“选课注册”。当学生登录进行选课注册时,该用例开始运行,它提供了选择课程、注册、修改注册、删除注册等功能。学生登录需要用户标识(ID)和口令;“管理开设课程”。当教学管理员登录系统进行产生选课信息操作时,该用例开始运行。它首先检查用户标识(ID)和口令,然后从数据库中取出学生的选课注册数据,按照要求进行分类统计,生成选课注册报表。活动者“学生”与用例“选课注册”的交互关系如下:当“学生”登录系统进入选课注册活动时,首先要输入用户标识(ID)和口令,经系统的“注册表单”接口对象验证,如果正确无误,则“学生”可以进行查询活动或选课活动,否则拒绝进入。若“学生”发出“查询”请求,系统的“选课注册表单”接口对象响应信息给“学生”,及发送增加或删除学生选课数据的消息。“开设课程”对象响应该消息,找出数据库中的相关数据,增加或删除学生的姓名和所选的课程名,或做相应的修改,并把增加或删除学生课操作成功或失败的信息反馈给“选课注册表单”接口对象,“选课注册表单”接口对象再反馈给“学生”。如果“学生”按下“确认”键,则选课操作得到确认,发出提交请求。“选课注册表单”接口对象响应该请求,并发出“存储”消息。“开设课程”对象响应“存储”消息,进行数据库存储操作,选课数据存入数据库。若“学生”结束选课,发出“退出”系统请求,“注册表单”接口对象响应请求,关闭系统。图10-7为系统的顶层UML用例图。图10-8为选课注册顺序图。
问答题[说明]某汽车停车场欲建立一个信息系统,已经调查到的需求如下。1.在停车场的入口和出口分别安装一个自动栏杆、一台停车卡打印机、一台读卡器和一个车辆通过传感器等,其示意图见如图3-21所示。2.当汽车到达入口时,驾驶员按下停车卡打印机的按钮获取停车卡。当驾驶员拿走停车卡后,系统命令栏杆自动抬起;汽车通过入口后,入口处的传感器通知系统发出命令,栏杆自动放下。3.在停车场内分布着若干个付款机器。驾驶员将在入口处获取的停车卡插入付款机器,并缴纳停车费。付清停车费之后,将获得一张出场卡,用于离开停车场。4.当汽车到达出口时,驾驶员将出场卡插入出口处的读卡器。如果这张卡是有效的,系统命令栏杆自动抬起;汽车通过出口后,出口传感器通知系统发出命令,栏杆自动放下。若这张卡是无效的,系统不发出栏杆抬起命令而发出告警信号。5.系统自动记录停车场内空闲的停车位的数量。若停车场当前没有车位,系统将在入口处显示“车位已满”信息。这时,停车卡打印机将不再出卡,只允许场内汽车出场。根据上述描述,采用面向对象方法对其进行分析与设计,得到如表3-11所示的类/用例/状态列表,如图3-22所示的用例图,如图3-23所示的初始类图以及如图3-24所示的描述入口自动栏杆行为的UML状态图。表3-11类/用例/状态列表用例名说明类名说明状态名说明Carentry汽车进入停车场CentralComputer停车场信息系统Idle空闲状态,汽车可以进入停车场Carexit汽车离开停车场PaymentMachine付款机器Disable没有车位ReportStatistics记录停车场的相关信息CarPark停车场,保存车位信息AwaitEntry等待汽车进入Barrier自动护栏AwaitTicketTake等待打印停车卡Carentrywhenfull没有车位时,汽车请求进入停车场EntryBarrier入口的护栏AwaitEnable等待停车场内有空闲车位ExitBarrier出口的护栏1.[问题1]根据说明中的描述,使用表3-11给出的用例名称,给出图3-22中U1、U2和U3所对应的用例。
问答题【说明】有时我们希望给某个对象而不是整个类添加一些功能。例如,一个图形用户界面工具箱允许你对任意一个用户界面组件添加一些特性,例如边框,或是一些行为,例如窗口滚动。使用继承机制是添加功能的一种有效途径,从其他类继承过来的边框特性可以被多个子类的实例所使用。但这种方法不够灵活,因为边框的选择是静态的,用户不能控制对组件加边框的方式和时机。一种较为灵活的方式是将组件嵌入另一个对象中,由这个对象添加边框。我们称这个嵌入的对象为装饰。这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。它将客户请求转发给该组件,并且可能在转发前后执行一些额外的动作(例如画二个边框)。透明性使得你可以递归地嵌套多个装饰,从而可以添加任意多的功能。装饰对象结构模式的意图就是动态地给一个对象添加一些额外的职责。就增加功能来说,该模式相比生成子类更为灵活。其示意类图如图13-22所示。程序代码13-5是该模式的一个示例,说明了如何实现用户接口装饰,函数的实现全部省略。程序中定义了VisualComponent的一个子类Decorator,我们将生成Decorator的子类以获取不同的装饰。VisualComponent类是一个描述可视对象的抽象类,它描述了绘制和事件处理的接口。Decorator的子类定义了特殊的装饰功能,BorderDecorator子类给可视组件添加一个边框,ScrollDecorator给可视组件添加滚动功能。【程序代码13-5】(1);classWindowpublic:roidSetContents(VisualComponent*contents);;//VisualComponent类是一个描述可视对象的抽象类classVisllalComponentpublic:VisualComponent();(2)voidDraw();VirtualvoidResize();;classDecorator:publicVisualComponentpublic:Decorator()//…;Decorator(VisualComponent*vcom)//…;virtualvoldDraw();virtualvoldResize();private:/*Decorator装饰由VisualComponent的指针实现,其在Decorator的构造函数中初始化*/VisualComponent(3);;voldDecorator::Draw()(4);//缺省实现voidDecorator::Resize()component->Resize();//缺省实现//BorderDecorator子类为它所包含的组件添加一个边框classBorderDecorator:publicDecoratorpublic:BorderDecorator(VisualComponent*vcom,intborderWidth)//…;VirtualVoidDraw();private:voidDrawBorder(int);private:intborderWidth;;voidBorderDecorator::Draw()Decorator::Draw();DrawBorder(_width);VoidBorderDecorator::DrawBorder(intWidth)//…)VoidWindow::SetConterlts(VlsualComponent*contents)//…//SerollDecorat给可视组件添加滚动功能classScroliDecoratOr:publicDecoratorpublic:ScrollDecorator(VlsualComponent*vcom)//…;//…);classTextView:publicVisualComponent//…;voidmain(void)//创建一个正文视图以及放入这个正文视图的窗口Window*window=newWindow;TcxtView*textView=newTextView;//TextView是一个VisualComponent,它可以放入窗口中window->SetContents(textView);//得到一个有边界的和可以滚动的TextView,边界宽为1window->SetContents((5));
问答题[说明] 冒泡排序算法的基本思想是:对于无序序列(假设扫描方向为从前向后,进行升序排列),两两比较相邻数据,若反序则交换,直到没有反序为止。一般情况下,整个冒泡排序需要进行众(1≤k≤n)趟冒泡操作,冒泡排序的结束条件是在某一趟排序过程中没有进行数据交换。若数据初态为正序时,只需1趟扫描,而数据初态为反序时,需进行n-1趟扫描。在冒泡排序中,一趟扫描有可能无数据交换,也有可能有一次或多次数据交换,在传统的冒泡排序算法及近年的一些改进的算法中[2,3],只记录一趟扫描有无数据交换的信息,对数据交换发生的位置信息则不予处理。为了充分利用这一信息,可以在一趟全局扫描中,对每一反序数据对进行局部冒泡排序处理,称之为局部冒泡排序。 局部冒泡排序的基本思想是:对于N个待排序数据组成的序列,在一趟从前向后扫描待排数据序列时,两两比较相邻数据,若反序则对后一个数据作一趟前向的局部冒泡排序,即用冒泡的排序方法把反序对的后一个数据向前排到适合的位置。扫描第—对数据对,若反序,对第2个数据向前冒泡,使前两个数据成为,有序序列;扫描第二对数据对,若反序,对第3个数据向前冒泡,使得前3个数据变成有序序列;……;扫描第i对数据对时,其前i个数据已成有序序列,若第i对数据对反序,则对第i+1个数据向前冒泡,使前i+1个数据成有序序列;……;依次类推,直至处理完第n-1对数据对。当扫描完第n-1对数据对后,N个待排序数据已成了有序序列,此时排序算法结束。该算法只对待排序列作局部的冒泡处理,局部冒泡算法的 名称由此得来。 以下为C语言设计的实现局部冒泡排序策略的算法,根据说明及算法代码回答问题1和问题2。 [变量说明] #define N=100 //排序的数据量 typedef struct //排序结点 int key; info datatype; ...... node; node SortData[N]; //待排序的数据组 node类型为待排序的记录(或称结点)。数组SortData[]为待排序记录的全体称为一个文件。key是作为排序依据的字段,称为排序码。datatype是与具体问题有关的数据类型。下面是用C语言实现的排序函数,参数R[]为待排序数组,n是待排序数组的维数,Finish为完成标志。 [算法代码] void Part-BubbleSort (node R[], int n) int=0 ; //定义向前局部冒泡排序的循环变量 //暂时结点,存放交换数据 node tempnode; for (int i=0;i<n-1;i++) ; if (R[i].key>R[i+1].key) (1) while ( (2) ) tempnode=R[j] ; (3) R[j-1]=tempnode ; Finish=false ; (4) // end while // end if // end for // end function1.问题1 阅读下列函数说明和C代码,将应填入 (n) 处的字句写在的对应栏内。
问答题[说明] 某学校建立了一个网上作业提交与管理系统,基本功能描述如下。 (1)账号和密码。任课老师用账号和密码登录系统后,提交所有选修学生的名单。系统自动为每个选修学生创建登录系统的账号和密码。 (2)作业提交。选修学生使用账号和密码登录系统后,可以向系统申请所选课程的作业。系统首先检查学生的当前状态,如果该选修学生还没有做过作业,则从数据库服务器申请一份作业。若申请成功,则显示需要完成的作业。学生需在线完成作业,单击[提交]按钮上交作业。 (3)在线批阅。系统自动在线批改作业,显示作业成绩,并将该成绩记录在作业成绩统计文件中。
问答题【说明】 C++语言本身不提供对数组下标越界的判断。为了解决这一问题,在程序6中定义了相应的类模板,使得对厂任意类型的二维数组,可以在访问数组元素的同时,对行下标和列下标进行越界判断,并给出相应的提示信息。 #include<iostream.h> template <class T> class Array; template <class T> class ArrayBody friend (1) T* tpBody; int iRows, iColumns, iCurrentRow; ArrayBody (int iRsz, int iCsz) tpBody = (2) iRows = iRsz; iColumns =iCsz; iCurrentRow =-1; public: T row_error=column_error=false; try if (iCurrentRow < 0 || iCurrentRow >=iRows) row_error=true; if (j < 0 || j >=iColumns) column_error=true; if ( row_error==true || column_error == true) (3) catch (char) if (row_error==true) cerr << "行下标越界[" << iCurrentRow << "] "; if (column_error== true ) cerr << "列下标越界[" <<j << "]"; cout << "/n"; return tpBody[iCurrentRow * iColumns +j]; ; ~ArrayBody ( ) delete[] tpBody; ; template <class T> class Array ArrayBody<T> tBody; public: ArrayBody<T> Array (int iRsz, int iCsz) : (5) ; void main() Array<int>a1(10,20); Array<double>a2(3,5); int b1; double b2; b1=a1[-5][10]; //有越界提示:行下标越界[-5] b1=a1[10][15]; //有越界提示:行下标越界[10] b1=a1[1][4]; //没有越界提示 b2=a2[2][6]; //有越界提示:列下标越界[6] b2=s2[10][20]; //有越界提示:行下标越界[10]列下标越界[20] b2=a2[1][4]; //没有越界提示
问答题[说明]现欲构造一文件/目录树,采用组合(Composite)设计模式来设计,得到的类图如下图所示。[C++程序]#include<list>#include<iostream>#include<string>usingnamespacestd;elassAbstractFile{protected:stringname;//文件或目录名称public:voidprintName(){cout<<name;)//打印文件或目录名称virtualvoidaddChild(AbstractFile*file)=0;//给一个目录增加子目录或文件virtualvoidremoveChild(AbstractFile*file)=0;//删除一个目录的子目录或//文件virtuallist<AbstractFile*>*getChildren()=0;//获得一个目录的子目录或文件};classfile:publicAbstractFile{public:File(stringname){______=name;}voidaddChild(AbstractFile*file){return;}voidremoveChild(AbstractFile*file){return;}______getChildren(){return______;}};classFolder:publicAbstractFile{private:list<AbstractFile*>childList://存储子目录或文件public:Folder(stringname){______=name;}voidaddChild(AbstractFile*file){childList.pushback(file);}voidremoveChild(AbstractFile*file){childList.remove(file);}list<AbstractFile*>*getChildren(){return______;}};voidmain(){//构造一个树形的文件/目录结构AbstractFile*rootFolder=newFolder("C:\\");AbstractFile*compositeFolder=newFolder("composite");AbstractFile*windowsFolder=newFolder("windows");AbstractFile*file=newFile("TestCompositejava");rootFolder→addChild(compositeFolder);rootFolder→addChild(windowsFolder);compositeFolder→addChild(file);}
问答题
【说明】
设有下列关于图书借阅系统的E—R图。图中矩形表示实体,圆表示属性,双圆表示关键字属性,菱形表示实体间的联系。假定已通过下列SQL语言建立了基本表:
CREATE TABLE Readers (Rao
CHAR(6) PRIMARY KEY, Rname CHAR(20) NOT
NULL, Raddress CHAR(200),
Rphone CHAR(15)); CREATE TABLE
Books (Brio CHAR(6) PRIMARY
KEY, Rname CHAR(50) NOT NULL);
CREATE TABLE Administrators
(Ano CHAR(6) PRIMARY KEY, Aname
CHAR(20) NOT NULL); CREATE TABLE Borrows
(Rno CHAR(6) NOT NULL,
Bno CHAR(15) NOT NULL, Ano CHAR(6)
NOT NULL, Bdate DATE,
Rdate DATE, PRIMARY
KEY(Rno,Bno,Ano), FOREGIN KEY(Rno)
REFERENCE Readers(Rno), FOREGIN KEY(Bno)
REFERENCE Book(Bno) FOREGIN KEY(Ano)
REFERENCE Administrators(Ano)); CREATE TABLE
Readers (Rao CHAR(6) PRIMARY
KEY, Rname CHAR(20) NOT NULL,
Raddress CHAR(200),
Rphone CHAR(15)); CREATE TABLE Books
(Brio CHAR(6) PRIMARY KEY,
Rname CHAR(50) NOT NULL); CREATE
TABLE Administrators (Ano CHAR(6)
PRIMARY KEY, Aname CHAR(20) NOT
NULL); CREATE TABLE Borrows
(Rno CHAR(6) NOT NULL,
Bno CHAR(15) NOT NULL, Ano CHAR(6) NOT
NULL, Bdate DATE,
Rdate DATE, PRIMARY
KEY(Rno,Bno,Ano), FOREGIN KEY(Rno)
REFERENCE Readers(Rno), FOREGIN KEY(Bno)
REFERENCE Book(Bno) FOREGIN KEY(Ano)
REFERENCE Administrators(Ano));
为了答题的方便,图中的实体和属性同时给出了中英文两种名字,回答问题时只需写出英文名即可。
【系统E-R图】
问答题【说明】某高校要设计一个教学管理数据库系统。通过调查,设计者了解到学生每学期按照事先安排的课程计划开始学习。每门课程由一名教师讲授;一个教师可以讲授多门课程;每名学生可以选修多门课程;学期结束后通过考试,教师登记每门课程、每名学生的成绩,并得到确认后存档。数据库工程师风清扬设计了如图13-20所示的E-R图。【问题1】把该E-R图中的实体和联系转化为相应的关系模式,并指出其主码、候选码以及外码(若无外码也须指出)。【问题2】现要查询出所有的没有学生选修的课程的全部信息,请写出相应的SQL语句。注意,要查询出符合条件的课程的全部信息。【问题3】现要查询出所有选修了教师号为'001'的老师所授课程的学生的学号与姓名,请写出相应的SQL语句。
问答题[说明]
以下C语言程序实现了生成从里到外是连续的自然数排列的回旋矩阵,矩阵形式如下:
7 6 5 16
8 1 4 15
9 2 3 14
10 11 12 13
程序的变量说明如下:
x1:矩阵上边界;
x2:矩阵下边界;
y1:矩阵左边界;
y2:矩阵右边界;
s:数组元素升降标记,s等于1为升,s等于-1为降;
a[]:存放矩阵元素的数组。
仔细阅读C语言程序源码,将{{U}} (n) {{/U}}处的语句补充完整。(注:每处仅一个语句)
[C程序]
#include<stdio.h>
void main ( )
{
const int N=20;
int i=0,j=0,a[N][N],n;
int m,x1,x2,y1,y2,s;
while (1)
{
Printf ("/ninput matrix row N( N>=2): ");
scanf ("%d",
printf ("/n");
if (n>=2)
break;
}
m=n*n;
x1=0; y1=0; x2=n; y2=n;
if(n%2==0)
{j=n-1; y2=n-1; s=1;}
else
{i=n-1; y1=1; s=-1; }
while (1)
{
if (s==1)
{
for (i; i<x2; i++) a[i][j]=m--;
i--;
j--;
{{U}} (1) {{/U}}
for (j;j>=y1;j--) a[i][j]=m--;
j++;
i--;
y1++;
{{U}} (2) {{/U}}
}
else
{
for (i;i>=x1;i--)
a[i][j]=m--;
i++;
j++;
{{U}}(3) {{/U}}
for (j;j<y2;j++)
{{U}}(4) {{/U}}
{{U}}(5) {{/U}}
i++;
{{U}}(6) {{/U}}
S=i;
}
if (m<1) break;
}
for (i=O;i<n; i++)
{
for (j=O;j<n;j++)
printf ("%6d",a[i][j]);
printf ("/n");
}
printf ("/n");
}
问答题【说明】A公司决定开发一套公共交通自动售票系统,系统要求如下所述。(1)乘客能按以下3步操作购票:选定目的地,投入钱币,获得一张票。(2)并且仅当乘客选定目的地后,系统才接收投钱;每次投入的钱只购买一张票。(3)只要投入的钱不少于所需的票价,且票库中有所要求的票,则应尽快出票。(4)如需找钱,则在出票的同时应退还多余的钱。(5)如果乘客投入的钱不够票价,或者票库中没有所需要的票时,系统将全额退钱,并允许乘客另选目的地,继续购票。(6)出票前乘客可以单击“取消”按钮取消购票,系统将全额退出该乘客投入的钱,并允许乘客另选目的地,继续购票。(7)出票结束(包括退还多余的钱)后,系统应保存销售记录,并等待乘客购票。该系统还要求快速响应和操作同步,所以它应是一个实时系统。为此,A公司在该系统的数据流程图中附加了过程控制部分,形成转换图。在该图中,控制流(事件流)用虚线表示,数据流用实线表示。图中的数据流并没有画全,需要考生填补。对售票全过程进行的控制可以用系统内部各个状态之间的迁移来描述,从而形成状态迁移图。在状态迁移图中,用双线框表示状态,用有向边表示状态的迁移。引起状态迁移的事件以及由该事件引起的动作,在有向边旁用“”形式注明。该公司还制定了一个过程启动表,用以表明状态迁移图中的4个动作与转换图中的4个过程之间的“启动”关系,即说明哪个动作将启动哪个过程。用1表示启动,用0表示不启动。启动的过程将根据获得的输入数据产生输出数据,未唐动的过程则不会产生输出数据,该表中没有列出的过程,其执行与否与事件无关。【问题1】转换图中缺少哪3条数据流?请指明每条数据流的名称、起点和终点。【问题2】在状态迁移图中,a、b、c分别表示什么事件?请用转换图中给出的事件名解答。【问题3】在过程启动表中,d、e处应填什么?请分别用4位二进制码表示。
问答题请补充函数fun(),该函数的功能是:只保留字符串中的大写字母,删除其他字符,结果仍保存在原来的字符串中,由全局变量m对删除后字符串的长度进行保存。
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。
试题程序:
#include<stdio.h>
#include<conio.h>
int m;
void fun(char*s)
{
int i=0,j=0;
char *p=s;
while(*(p+i))
{
if(*(p+i)>='A'&&*(p+i)<='Z')
{
{{U}}(1) {{/U}};
}
{{U}}(2) {{/U}};
}
s[j]='/0';
{{U}}(3) {{/U}};
}
main()
{
char str[80];
clrscr();
printf("/nEnter a string:");
gets(str);
printf("/n/nThe string is:/%s/n",str);
fun(str);
printf("/n/nThe string of changing is: /%s/n",str);
printf("/n/nThe length of changed strtng is:/%d/n",m);
}
问答题[问题3]现需了解十大最畅销(借出次数最多)图书或唱碟。为此,引入TenPopulate类以存储所有十大畅销图书或CD的名称及其被借出的次数。下列顺序图描述了某类图书或唱碟被借出后成为十大畅销图书或唱碟时对象间的消息交互。系统在一次运行过程中,应有{{U}}(1){{/U}}个TenPopulate实例对象最合适,一个TenPopulate类实例对象最多需要和{{U}}(2){{/U}}个Items_on_loan实例对象交互。
问答题【说明】 ①定义类Table的私有数据成员x和y,分别用于表示九九表中的两个乘数(x*y),它们都是int型的数据。 ②完成类Table的成员函数print()的定义,该函数以“x*y=z”的格式打印出九九表中的一个乘法算式,请使用格式化输出函数printf实现。 ③完成类Table9的成员函数print()的定义,该函数调用基类Table的print()函数,将九九表输出到屏幕。 ④补充主函数,在屏幕上输出九九表,以便测试所定义的类的正确性。 源程序文件test8_3.cpp清单如下: #include <iostream, h > #include < stdio, h > class Table (1) int z; public: void print (int x,int y,int z); ; void Table::print (int x,int y,int z) (2) Class Table9:public Table public: void print(); ; void Table9::print() (3) int x,y,z; for(i=1;i<10;i++) for(j=1;j<i+1;j++) x=i; y=j; z=i*j; Table::print(y,x,z); printf("/n"); main() //* *4* * return 0;
问答题阅读下列说明和图,回答问题1至问题2,[说明]移动电话是传统固定式电话的延伸,通过无线电网络可以与千里之外的朋友沟通而不受电话线的束缚。现在的移动电话功能更全面,除了作为电话使用外,还可以发送短信,可以管理电话簿,可以下载铃声、图案。手机由键盘、显示屏以及移动通信设备组成,移动通信设备负责发送和接收信号,与基站进行连线。打电话的流程如下:(1)用户拨电话号码,每按下一个数字键显示屏上显示相应数字;(2)按OK键进行连线,显示屏上显示“连线中…”,请求连接基站,基站通过移动电话网络连接到对方手机,若有误则返回相关信息;(3)接通后,显示屏显示“连线成功”;(4)打电话结束后,按Cancel送出断线信号,通知移动电话基站断线,基站切断连接,显示屏显示“断线成功”。该系统采用面向对象方法开发,系统中的类以及类之间的关系用UML类图表示,图3-1是该系统的用例图,图3-2是该系统的类图,图3-3描述了打电话(包括断开)的序列图。[图3-1][图3-2][图3-3]
问答题【算法说明】下面是一段插入排序的程序,将R[k+1]插入到R[1...k]的适当位置。R[0]=R[k+1];j=k;while(R[j]>R[0])R[j+1]=R[j];j--;R[j+1]=R[0];【流程图】【测试用例设计】(while循环次数为0、1、2次)表4-1测试用例表循环次数输入数据预期结果覆盖路径jR[i-2]R[i-1]R[i]R[i+1]R[0]jR[i-2]R[i-1]R[i]R[i+1]约束路径0i--122i--12(4)i--111i--11=①③1i-1322i-1-123(7)①②③i-2322i-1-(8)2(9)>=①②③2i13422i-21234>>(5)i23422i-22234>>=(6)1.【问题1】指出算法的流程图中(1)~(3)处的内容。
问答题试题五(共15分) 阅读下列说明和C函数代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 对二叉树进行遍历是二叉树的一个基本运算。遍历是指按某种策略访问二叉树的每个结点,且每个结点仅访问一次的过程。函数InOrder()借助栈实现二叉树的非递归中序遍历运算。 设二叉树采用二叉链表存储,结点类型定义如下: typedefstructBtNode{ ElemTypedata;/*结点的数据域,ElemType的具体定义省略*/ structBtNode*lchild,*rchild;/*结点的左、右孩子指针域*/ }BtNode,*BTree; 在函数InOrder()中,用栈暂存二叉树中各个结点的指针,并将栈表示为不含头结点 的单向链表(简称链栈),其结点类型定义如下: typedefstructStNode{/*链栈的结点类型*/ BTreeelem;/*栈中的元素是指向二叉链表结点的指针*/ structStNode*link; }StNode; 假设从栈顶到栈底的元素为en、en-1、…、e1,则不含头结点的链栈示意图如图5-1所示。【C函数】intInOrder(BTreeroot)/*实现二叉树的非递归中序遍历*/{BTreeptr;/*ptr用于指向二叉树中的结点*/StNode*q;/*q暂存链栈中新创建或待删除的结点指针*/StNode*stacktop=NULL;/*初始化空栈的栈顶指针stacktop*/ptr=root;/*ptr指向二叉树的根结点*/while(________||stacktop!=NULL){while(ptr!=NULL){q=(StNode*)malloc(sizeof(StNode));if(q==NULL)return-1;q->elem=ptr;________;stacktop=q;/*stacktop指向新的栈顶*/ptr=________;/*进入左子树*/}q=stacktop;________;/*栈顶元素出栈*/visit(q);/*visit是访问结点的函数,其具体定义省略*/ptr=________;/*进入右子树*/free(q);/*释放原栈顶元素的结点空间*/}return0;}/*InOrder*/
问答题【说明】本程序从正文文件text.in中读入一篇英文短文,统计该短文中不同单词及出现次数,并按词典编辑顺序将单词及出现次数输出到正文文件word.out中。 程序用一棵有序二叉树存储这些单词及其出现的次数,边读入边建立,然后中序遍历该二叉树,将遍历经过的二叉树上的结点的内容输出。 #include <stdio.h> #include <malloc.h> #include <ctype.h> #include <string.h> #define INF "text.in" #define OUTF "wotd.out" typedef struct treenode char *word; int count; struct treenode *left,*right; BNODE int getword (FILE *fpt,char *word) char c; c=fgetc (fpt); if ( c=EOF) return 0; while(!(tolower(c)>='a' void binary_tree(BNODE **t,char *word) BNODE *ptr,*p;int compres; P=NULL; (1) ; while (ptr) /*寻找插入位置*/ compres=strcmp (word, (2) );/*保存当前比较结果*/ if (!compres) (3) ;return; else (4) ; ptr=compres>0? ptr->right:ptr->left; ptr= (BNODE*) malloc (sizeof (BNODE)) ; ptr->left = ptr->right = NULL; ptr->word= (char*) malloc (strlen (word) +1) ; strcpy (ptr->word, word); ptr->count - 1; if (p==NULL) (5) ; else if (compres > 0) p->right = ptr; else p->left = ptr; void midorder (FILE **fpt, BNODE *t) if (t==NULL) return; midorder (fpt, t->left); fprintf (fpt, "%s %d/n", t->word, t->count) midorder (fpt, t->right); void main() FILE *fpt; char word[40]; BNODE *root=NULL; if ((fpt=fopen (INF,"r")) ==NULL) printf ("Can't open file %s/n", INF ) return; while (getword (fpt, word) ==1 ) binary_tree ( fclose (fpt); fpt = fopen (OUTF, "w"); if (fpt==NULL) printf ("Can't open file %s/n", OUTF) return; midorder (fpt, root); fclose(fpt);
问答题阅读下列说明和图,回答问题1至问题3。【说明】某学校的教学系统描述如下。学生信息包括:学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、入学年份(Syear)、主修专业(Smajor),其中学号是入学时唯一编定的。教师信息包括:教工号(Tno)、姓名(Tname)、性别(Tsex)、年龄(Tage)、职称(Ttitle),其中教工号是唯一编定的。课程信息包括:课程号(Cno)、课程名称(Cname)、学时(Cperiod)、学分(Ccredit),其中课程号是唯一编定的。每个专业每个年级只有一个班级,这样班级就可用入学年份标识。每位教师只教授特定的一门的课程,每门课程可以有多个教师教授,各位老师的上课地点及上课时间有所不同。注意:一门课程至少有一位教师教授,否则这门课程就视为不存在。每位学生可以同时选修多门不同的课程,一门课程至少要有10位学生选修,否则就取消这门课程的开设。注意:选修课程时要指定任课教师,不能重复选修同一门课程。课程结束后,任课教师给选修该课程的学生一个成绩(Grade)。注意:教师不能给没有选修他所教授课程的学生成绩,即使选修了其他教师教授的同一门课也不行。如图9-11所示是经分析得到的E-R图。
问答题【说明】已知某企业欲开发一家用电器遥控系统,即用户使用一个遥控器即可控制某些家用电器的开与关。遥控器如下图(a)所示。该遥控器共有4今按钮,编号分别是0至3,按钮0和2能够遥控打开电器1和电器2,按钮1和3则能遥控关闭电器1和电器2。由于遥控系统需要支持形式多样的电器,因此,该系统的设计要求具有较高的扩展性。现假设需要控制客厅电视和卧室电灯,对该遥控系统进行设计所得类图如下图(b)所示。图(b)中,类RomoteController的方法onPrcssButton(intbutton)表示当遥控器按键按下时调用的方法,参数为按键的编号;command接口中on和off方法分别用于控制电器的开与关;Light中turnLight(intdegree)方法用于调整电灯灯光的强弱,参数degree值为0时表示关灯,值为100时表示开灯并且将灯光亮度调整到最大;TV中sctChannel(intchannel)方法表示设置电视播放的频道,参数channel值为0时表示关闭电视,为1时表示开机并将频道切换为第1频道。【Java代码】classLight{//电灯类publicvoidtrunLight(intdegree){//调整灯光亮度,0表示关灯,100表示亮度最大}};classTV{//电视机类publicvoidsetChannel(intchannel){//0表示关机,1表示开机并切换到1频道}};interfaceCommand{//抽象命令类voidon();voidoff();};classRemoteController{//遥控器类protectedCommand[]commands=newCommand[4];//遥控器有4个按钮,按照编号分别对应4个Command对象publicvoidonPressButton(intbutton){//按钮被按下时执行命令对象中的命令if(button%2==0)commands[button].on();elsecommands[button].off();}publicvoidsetCommand(intbutton,Commandcommand){{{U}}(1){{/U}}=command;//设置每个按钮对应的命令对象}};classLightCommandimplementsCommand{//电灯命令类protectedLightlight;//指向要控制的电灯对象publicvoidon(){light.trunLight(100););publicvoidoff(){light.{{U}}(2){{/U}};);publicLightCommand(Lightlight){this.light=light;);};classTVCommandimplementsCommand{//电视机命令类protectedTvtv;//指向要控制的电视机对象publicvoidon(){tv.{{U}}(3){{/U}};};publicvoidoff(){tv.setChanne1(0);};publicTVCommand(TVtv){this.tv=tv;};};publicclassrs{publicstaticvoidmain(String[]args){Lightlight=newLight();TVtv=newTV();//创建电灯和电视对象LightCommandlightCommand=newLightCommand(light);TVCommandtvCommand=newTVCommand(tv);RemoteControllerremoteController=newRemoteController();//设置按钮和命令对象remoteController.setCommand(0,{{U}}(4){{/U}});...//此处省略设置按钮1、按钮2和按钮3的命令对象代码}}本题中,应用命令模式能够有效让类{{U}}(5){{/U}}和类{{U}}(6){{/U}}、类{{U}}(7){{/U}}之间的耦合性降至最小。
