问答题[问题2]
识别关联的多重度是面向对象建模过程中的一个重要步骤。根据说明中给出的描述,完成图中的(1)~(6)。
问答题阅读以下说明和数据流图,回答问题1~3问题。
[说明]
干部信息管理系统(CMIS)是用于对干部信息进行管理的特定系统。利用该系统,干部科可以对本单位干部信息进行管理,根据不同命令对信息进行增、删、改、内部调动,打印人事表格,进行统计、检索。干部科输入的系统命令需要合法性检查才能被接受、处理。系统命令可以是检索命令、统计命令、打印命令、维护命令中的任何一种。干部科的输入的干部信息数据包括输入信息、检索项、统计项、打印项、维护项等条目。一个完整的输入信息应包括干部的档号、干部的姓名、干部的性别、干部的年龄、干部的级别、干部的职称、干部的政治面貌等内容。系统进行检索处理时可以根据干部的档号、姓名或年龄进行简单检索,也可以根据“档号+姓名”或者“性别+年龄”进行组合检索。系统进行统计处理时,可以根据干部的性别、年龄或职称进行简单统计,也可以根据“年龄+职称”或“性别+职称”进行综合统计。通过系统授权,用户可以对系统进行维护。当用户需要对系统进行维护时,输入维护命令,得到合法性确认后,可以对系统数据库信息进行修改维护。维护命令包括:增加命令,根据输入信息增加干部信息;修改命令,根据修改项修改干部信息;检索命令,根据检索项检索干部信息。系统可以输出统计信息、人事表格、检索信息以供干部科用户使用。
干部信息管理系统的顶层图如图9-1所示;干部信息管理系统的第0层DFD图如图9-2所示,其中,加工3的细化图如图9-3所示。
问答题[说明]一般的树结构常采用孩子—兄弟表示法表示,即用二叉链表做树的存储结构,链表中节点的两个链域分别指向该节点的第一个孩子节点和下一个兄弟节点。例如,如图1-15(a)所示树的孩子—兄弟表示如图1-15(b)所示。函数LevelTraverse()的功能是对给定树进行层序遍历。例如,对如图1-15所示的树进行层序遍历时,节点的访问次序为DBAEFPC。对树进行层序遍历时使用了队列结构,实现队列基本操作的函数原型如表1-11所示。Bool、Status类型定义如下:树的二叉链表节点定义如下:表1-11实现队列基本操作的函数原型表函数原型说明voidInitQueue(Queue*Q)初始化队列BoolIsEmpty(QueueQ)判断队列是否为空,若是则返回true,否则返回falsevoidEnQueue(Queue*Q,TreeNodep)元素入队列voidDeQueue(Queue*Q,TreeNode*p)元素出队列[C函数程序]
问答题[说明]一般的树型结构常采用孩子-兄弟表示法表示,即用二叉链表作树的存储结构,链表中节点的两个链域分别指向该节点的第一个孩子节点和下一个兄弟节点。例如,下图(a)中所示的树的孩子-兄弟表示如下图(b)中所示。函数LeVelTraVerse()的功能是对给定树进行层序遍历。例如,对图中所示的树进行层序遍历时,节点的访问次序为DBAEFPC。对树进行层序遍历时使用了队列结构,实现队列基本操作的函数原型如下表所示。实现队列基本操作的函数原型函数原型说明voidInitQueue(Queue*Q)初始化队列boolIsEmpty(QueueQ)判断队列是否为空,若是则返回TRUE,否则返回FALSEvoidEnQueue(Queue*Q,TreeNodep)元素入队列voidDeQueue(Oueue*Q,TreeNode*p)元素出队列Bool、Status类型定义如下:typedefenum{FALSE=0,TRUE=1}Bool;typedefenum{OVERFLOW=-2,UNDERFLOW=-1,ERROR=0,OK=1}Status;树的二叉链表节点定义如下:typedefstructNode{chardata;structNode*firstchild,*nextbrother;}Node,*TreeNode;函数LevelTraverse的代码如下:StatUSLevelTraverse(TreeNoderoot){/*层序遍历树,树采用孩子-兄弟表示法,root是树根节点的指针*/QueuetempQ;TreeNodeptr,brotherptr;if(!root)returnERROR;InitQueue(______;brotherptr=root→nextbrother;while(brotherptr){EnQueue(______;}/*end-while*/while______{______;printf("%c\t",ptr→data);if(______)continue;______;brotherptr=ptr→firstchild→nextbrother;while(brotherptr){EnQueue(______;}/*end-while*/}/*end-while*/returnOK;}/*LevelTraverse*/
问答题阅读以下说明和图,回答问题1和问题2,将答案写在答卷的对应栏内。
【说明】
银行客户需要从ATM取100元,他向ATM的读卡机插卡,读卡机读取卡号,然后ATM屏幕初始化,ATM提示输入PIN(密码),客户输入PIN(123456),ATM打开他的账户,密码有效,因此ATM提示选择事务,客户选择取钱,ATM提示输入金额,客户输入100元,
ATM验证账户上有足够的钱,就从账上减去100元,ATM吐出100元,并退出客户的卡。
问答题[问题1]
数据流图8-5缺少了一条数据流,请给出此数据流的起点和终点,并采用说明中的词汇给出此数据流名。
问答题选出正确的关系代数表达式。
问答题{{B}}阅读下列说明及图13-8和图13-9,回答问题,将解答填入对应栏内。{{/B}}
【说明】 某电话公司决定开发一个管理所有客户信息的交互式网络系统。系统功能如下。
(1)浏览客户信息:任何使用Internet的网络用户都可以浏览电话公司所有的客户信息(包括姓名、住址、电话号码等)。
(2)登录:电话公司授予每个客户一个帐号。拥有授权帐号的客户,可以使用系统提供的页面设置个人密码,并使用该帐号和密码向系统注册。
(3)修改个人信息:客户向系统注册后,可以发送电子邮件或者使用系统提供的页面,对个人信息进行修改。(4)删除客户信息:只有公司的管理人员才能删除不再接受公司服务的客户的信息。系统采用面向对象方法进行开发,在开发过程中认定出的类见表13-3。
{{B}}表13-3开发过程中认定的类{{/B}}
编号
类名
描述
1
InternetClient
网络用户
2
CustomerList
客户信息表,记录公司所有客户的信息
3
Customer
客户信息,记录单个客户的信息
4
CompantCustomer
公司客户
5
InternalClient
公司的管理人员
问答题【程序说明】
对于一个公司的雇员来说,无非有3种:普通雇员、管理人员和主管。这些雇员有共同的数据:名字、每小时的工资,也有一些共同的操作:数据成员初始化、读雇员的数据成员及计算雇员的工资。但是,他们也有不同。例如.管理人员除有这些共同的特征外,有可能付固定薪水,主管除有管理人员的共同特征外,还有其他物质奖励等。3种雇员中,管理人员可以看作普通雇员的一种,而主管又可以看作管理人员的一种。我们很容易想到使用类继承来实现这个问题:普通雇员作为基类,管理人员类从普通雇员类中派生,而主管人员类又从管理人员类中派生。
下面的程序1完成上述各个类的定义,并建立了3个雇员(一个普通雇员、一个管理人员和一个主管)的档案,并打印出各自的工资表。将“程序1”中的成员函数定义为内联函数,pay成员函数定义为虚函数,重新完成上述要求。
【程序1】
//普通雇员类
class Employee
{
public:
Employee(char*theName,float thePayRate);
char * getName()const;
float getPayRate()const;
float pay(float hoursWorked)const:
protected:
char*name; //雇员名称
float payRate; //薪水等级
};
Employee::Employee(char * theName,float thePayRate)
{
name=theName;
payRate=thePayRate;
}
char*Employee::getName()const
{
return name;
}
float Employee::getPayRate()const
}
return payRate;
}
float Employee::pay(float hoursWorked)const
{
return hoursWorked * payRate;
}
//管理人员类
Class Manager:public Employee
{
public:
//isSalaried付薪方式:true付薪固定工资,false按小时付薪
Manager(char * theName,float thePayRate,bool isSalaried);
bool getSalaried()const;
float pay(float hoursWorked)const;
protected:
bool Salaried;
};
Manager::Manager(Char*theName,float thePayRate,bool isSalaried)
:Employee(theName,thePayRate)
{
salaried=isSalaried;
}
bool Manager::getSalaried() const
{
return Salaried;
}
float Manager::pay(float hoursWorked)const
{
if(salaried)
return payRate;
/*else*/
return Employee::pay(hoursWorked);
}
//主管人员类
class Supervisor:public Employee
{
public:
Supervisor(Char*theName,float thePayRate,float theBouns):
Employee(theName,thePayRate,{{U}} (1) {{/U}}),bouns(theBouns){}
float getBouns()const{return bouns;}
float pay(float hoursWorked)const
return{{U}} (2) {{/U}}
}
protected:
float bouns;
}
#include" iostream.h"
void main()
{
Employee e("Jack",50.00);
Manager m("Tom",8000.00, true);
Supervior s("Tanya",8000.00,8000.00);
cout<<"Name:" <<e.getName()<<endl;
cout<<"Pay:"<<e.pay(80)<<endl; //设每月工作80小时
tout<<"Nabe:" <<m.getName()<<end,;
cout<<"Pay:" <<m.pay(40)<<endl;
cout<<"Nabe:" <<s.getName()<<endl;
cout<<"Pay:"<<s.pay(40)<<endl; //参数40在这里不起作用
}
【程序2】
#include "employee.h"
//普通雇员类
class Employee
{
public:
//构造函数
Employee(String theName,float thePayRate):
name(theNabe),payRate(thePayRate){}
//取雇员姓名
String getNabe() const{returnname;}
//取雇员薪水等级
float getPayRate()const{return payRate;}
//计算雇员薪水
virtual float pay(float hoursWorked)const {return{{U}} (3) {{/U}};}
protected:
String name; //雇员名称
float payRate; //薪水等级
};
//管理人员类
//继承普通雇员类
class Manager:public Employee
{
public:
//构造函数
//isSalaried标识管理人员类的付薪方式
//true按阶段付薪(固定工资)
//false按小时付薪
Manager(String theName,float thePayRate,bool isSalaned):
Employee(theName,thePayRate),Salaried(isSalarled){}
//取付薪方式
bool getSalarled()const{return salaried;}
//计算薪水
virtual float pay(float{{U}} (4) {{/U}})const;
protected:
bool Salaried;
};
float Manager::pay(float hoursWorked)const
{
if(salaried) //固定付薪方式
return payRate;
else //按小时付薪
return{{U}} (5) {{/U}};}
//主管人员类
class Supervisor:{{U}} (6) {{/U}}
{
public:
//构造函数
Supervisor(String theName,float thePayRate,float theBouns):
Manager(theName,thePayRate,true),bouns(theBouns){}
//取奖金数额
float getBouns()const{return bouns;}
//计算薪水
virtual float pay(float hoursWorked)const
{
retum payRate+bouns;
}
{{U}} (7) {{/U}}
float bouns;
}
#include "employee.h"
#include"jostream.h" void main()
{
{{U}} (8) {{/U}}* ep[3];
ep[0]=new Employee("Jack","50.00");
ep[1]=Flew Manager("Tom","8000.00",true);
ep[2]=new Superwor("Tanya","8000.00","8000.00");
for(int i=0;i<3;i++){
cout<<"Name:"<<{{U}} (9) {{/U}}<<endl;
cout<<"Pay:"<<{{U}} (10) {{/U}}<<endl; //设每月工作80小时
}
}
问答题[问题2]为了记录每种图书或唱碟租借的历史记录,引入类CirculationHistory,类中存储的信息是图1-1中所表示的内容。请采用UML表示法将下列四个类间的关系表示出来。
问答题阅读以下算法说明和问题模型图,根据要求回答问题1、问题2。[说明]某大学城图书馆需要在无线阅览厅的某些位置上放置无线接入点AP(AccessPoin)。假设每个无线AP覆盖范围的半径是6米,因此必须使得每台笔记本电脑上的无线网卡到某个无线AP的直线距离不超过6米。为了简化问题,假设所有无线网卡在同一直线上,并且无线AP沿该直线放置。该问题可以建模为如图1-13所示,其中直线表示无线网卡所在的直线,实心正方形表示无线网卡。现采用贪心策略实现用尽可能少的无线AP覆盖所有的无线网卡。实现贪心算法的流程如图1-14所示。其中,①d[i](1≤i≤N)表示第i张无线网卡到通道A端的距离,N表示无线网卡的总数,无线网卡的编号按照无线网卡到通道A端的距离从小到大进行编号:②s[k]表示第k(k≥1)个无线AP到通道A端的距离。算法结束后k的值为无线AP的总数。
问答题阅读下列说明,回答问题1~问题4。【说明】某超市的销售业务由一个销售业务管理系统进行管理,该系统每完成一次交易都需要提供顾客发票,其格式见表6所示。对于这样一个销售业务管理系统,分别给出了以下两种关系数据库的设计(下划线表示主关键字)设计一:顾客Customer(顾客代码{{U}}Cno{{/U}},姓名name,住址address,联系电话phone)收银员Salesman(收银员代码{{U}}Sno{{/U}},身份证号idno,姓名name,住址address,联系电话phone)商品Merchandise(商品代码{{U}}Mno{{/U}},商品名称Mname,价格price)发票Invoice(发票号码{{U}}Ino{{/U}},交易日期Idate,顾客代码Cno,收银员代码Sno,商品代码{{U}}Mno{{/U}},单价unitpfice,数量amount)设计二:顾客Customer(顾客代码{{U}}Cno{{/U}},姓名name,住址address,联系电话phone)收银员Salesman(收银员代码Sno,身份证号idno,姓名name,住址address,联系电话phone)商品Memhandise(商品代码{{U}}Mno{{/U}},商品名称Mname,价格price)发票Ivoice(发票号码{{U}}Ino{{/U}},交易日期Idate,顾客代码Cno,收银员代码Sno)发票明细Invoicedetail(发票号码{{U}}Ino{{/U}},商品代码{{U}}Mno{{/U}},单价unitprice,数量amount)
问答题【程序5说明】
著名的四色定理指出任何平面区域图均可用四种颜色着色,使相邻区域着不同的颜色。本程序对给定的区域图找出所有可能的不超过四种颜色的着色方案。
程序中用1~4表示四种颜色。要着色的N个区域用0~N-1编号,区域相邻关系用 adj[][]矩阵表示,矩阵的i行j列的元素为1,表示区域i与区域j相邻;矩阵的i行j列的元素为0,表示区域i与区域j不相邻。数组color[]用来存储着色结果,color[i]的值为区域i所着颜色。
【程序5】
#include<stdio.h>
#define N 10
void output(int color[])/*输出一种着色方案*/
{ int i;
for(i=0;i<N;i++)
printf("%4d",color[i]);
printf("/n");
}
int back (int * ip,int color[])/*回溯*/
{ int c=4;
while(c==4){
if(*ip<=0)return 0;
--(*ip);
c= {{U}}(1) {{/U}};
color[*ip]=-1;
}
return c;
}
/*检查区域i,对c种颜色的可用性*/
int colorOk(int i,int c,int [][N],int color[]}
{ int j;
for(j=0;j<i;j++)
if({{U}} (2) {{/U}})
return 0;
return 1;
}
/*为区域i选一种可着的颜色*/
int select (int i,int c,int adj[][N],int color[])
{ int k;
for(k=c;k<=4;k++)
if(colorOK({{U}} (3) {{/U}}))
return k;
return 0;
}
int coloring(int adj[][N])/*寻找各种着色方案*/
{ int color[N],i,c,cnt;
for(i=0;i<N;i++)color[i] =-1;
i=c=0;cnt=0;
while(1){
if((c={{U}} (4) {{/U}})==0){
c=back(&i,color);
if(c==0)return cnt;
}else{{{U}} (5) {{/U}};i++;
if(i==N){
output(color);
++cnt;
c=back(&i,color);
}else c=0;
}
}
}
void main()
{ int adj[N][N]=
{{0,1,0,1,1,1,1,1,1,1},
{1,0,1,1,0,1,1,1,1,0},
{0,1,0,1,0,1,1,0,1,1},
{1,1,1,0,1,1,0,0,1,1},
{1,0,0,1,0,1,0,0,0,0},
{1,1,1,1,1,0,1,0,0,1},
{1,1,1,0,0,1,0,0,1,0},
{1,1,0,0,0,0,0,0,1,1},
{1,1,1,1,0,0,1,1,0,1},
{1,0,1,1,0,1,0,1,1,0}
};
printf("共有%d组解./n",coloring(adj));
}
问答题【说明】本程序实现功能:读入两个整数,第1个数除以第2个数,声明当除数为零时抛出异常类DivideByZeroException。
public class DivideByZeroException{{U}} (1) {{/U}}{
public DivideByZeroException ( ) {
super("Attcmpted to divide by zero");
}
}
import java.io. *;
public class Example {
private static int quotient(int numerator, in)/”}t denominator) throws
DivideByZeroException {
if (denominator==0)
throw{{U}} (2) {{/U}};
return(numerator / denominator);
}
public static void main(String args[]) {
int number1=0, number2=0, result0;
try{
System.out.print1n("Enter the first number:");
number1 = Integer. valueOf(Keyboard.getString()).intValue();
System.out.print1n("Enter the second number:");
number2 = Integer. Va1ueOf(Keyboard.getString()).intValue();
result = quotient(number1,number2);
}
catch (NumberFormatException e) {
System.out.print1n("Invalid integer entered!");
System. exit(-1);
}
catch ({{U}} (3) {{/U}}) {
System.out.print1n(e.to String());
System.exit(-1);
}
Systcm.out.pfint1n(number1 + "/" + number2 + "=" + result);
}
}
其中, Keyboard类的声明为:
import java.io.*;
public class Keyboard{
static BufferedReader inputStream ={{U}} (4) {{/U}}
(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 getString() {
try{
return (inputStream.readLine());
} catch ({{U}} (5) {{/U}})
{ return "0";}
}
}
问答题[说明]在某些系统中,存在非常复杂的对象,可以采用循序渐进的方式,进行组合将小对象组合成复杂的对象。以下实例展示了Builder(生成器)模式。该实例用来建立“文件”,文件内容包括:一个标题、一串字符以及一些有项目符号的项目。Builder类规定组成文件的方法,Director类利用这个方法产生一份具体的文件。图7-1显示了各个类间的关系。[图7-1]以下是C语言实现,能够正确编译通过。[C代码]typedefvoid((1))(char*title);typedefvoid(*fun2)(charitems[][10],intN);typedefchar*(*fun3)();charbuffer[500];structBuilder//构造器fun1makeTitle;(2)makeString;fun2makeItems;fun3getResult;;structDirectorstructBuilderbuilder;;char*construct((3)director)//构造文件charitems[2][10]="早安","午安";director->builder.makeTitle("Greeting");director->builder.makeString("从早上到白天结束");director->builder.makeItems(items,2);director->builder.makeString("到了晚上");strcpy(items[0],"晚安");strcpy(items[1],"好梦");director->builder.makeItems(items,2);returndirector->builder.getResult();voidTXTmakeTitle(char*title)strcat(buffer,"『");Strcat(buffer,title);strcat(buffer,"』/n/n");voidTXTmakeString(char*str)strcat(buffer,"■");Strcat(buffer,str);strcat(buffer,"/n/n");voidTXTmakeItems(charitems[][10],intN)//将items加入文件中for(inti=0,istrcat(buffer,"·");strcat(buffer,(4));strcat(buffer,"/n");strcat(buffer,"/n");char*TXTgetResult()returnbuffer;voidmain()Directordirector;(5)='/0';//清空缓冲区,使目前缓冲区中的内容不影响新生成的文件director.builder.makeTitle=TXTmakeTitle;director.builder.makeString=TXTmakeTitle;director.builder.makeItems=TXTmakeItems;director.builder.getResult=TXTgetResult;char*result=construct(printf("%s/n",result);
问答题{{B}}阅读下列说明和数据流图,回答问题1至问题3。将解答填入对应栏内。{{/B}}【说明】某图书馆管理系统的主要功能是图书管理和信息查询。对于初次借书的读者,系统自动生成读者号,并与读者基本信息(姓名、单位、地址等)一起写入读者文件。系统的图书管理功能分为四个方面:购入新书、读者借书、读者还书以及图书注销。(1)购入新书时需要为该书编制入库单。入库单内容包括图书分类目录号、书名、作者、价格、数量和购书日期,将这些信息写入图书目录文件并修改文件中的库存总量(表示到目前为止,购入此种图书的数量)。(2)读者借书时需填写借书单。借书单内容包括读者号和所借图书分类目录号。系统首先检查该读者号是否有效,若无效,则拒绝借书;若有效,则进一步检查该读者已借图书是否超过最大限制数(假设每位读者能同时借阅的书不超过5本)。若已达到最大限制数,则拒绝借书;否则允许借书,同时将图书分类目录号、读者号和借阅日期等信息写入借书文件中。(3)读者还书时需填写还书单。系统根据读者号和图书分类目录号,从借书文件中读出与该图书相关的借阅记录,标明还书日期,再写回到借书文件中。若图书逾期,则处以相应的罚款。(4)注销图书时,需填写注销单并修改图书目录文件中的库存总量。系统的信息查询功能主要包括读者信息查询和图书信息查询。其中读者信息查询可得到读者的基本信息以及读者借阅图书的情况;图书信息查询可得到图书基本信息和图书的借出情况。图书管理系统的顶层图如图13-5所示;图书管理系统的第0层DFD图如图13-6所示,其中加工2的细化图如图13-7所示。
问答题阅读下列说明、流程图和算法,将应填入(n)处的字句写在答题纸的对应栏内。【说明】下面的流程图1—5用N-S盒图形式描述了数组A中的元素被划分的过程。其划分方法是:以数组中的第一个元素作为基准数,将小于基准数的元素向低下标端移动,而大于基准数的元素向高下标端移动。当划分结束时,基准数定位于A[i],并且数组中下标小于i的元素的值均小于基准数,下标大于i的元素的值均大于基准数。设数组A的下界为low,上界为high,数组中的元素互不相同。例如,对数组(4,2,8,3,6),以4为基准数的划分过程如下:【流程图】【算法说明】将上述划分的思想进一步用于被划分出的数组的两部分,就可以对整个数组实现递增排序。设函数血p(intA[],intlow,inthigh)实现了上述流程图的划分过程并返回基准数在数组A中的下标。递归函数voidsort(intA[],ihtL;intH)的功能是实现数组A中元素的递增排序。【算法】voidsort(intA[],int1,intH)if(L<H)k=p(A,L,R)://p()返回基准数在数组A中的下标sort((4));//小于基准数的元素排序sort((5));//大于基准数的元素排序
问答题阅读下列说明和数据流图,回答问题1至问题3。【说明】某供销系统接受顾客的订货单,当库存中某配件的数量小于订购量或库存量低于一定数量时,向供应商发出采货单;当某配件的库存量大于或等于订购量时,或者收到供应商的送货单时并更新了库存后,向顾客发出提货单。该系统还可随时向总经理提供销售和库存情况表。以下是经分析得到的数据流图及部分数据字典,有些地方有待填充,假定顶层数据流图是正确的。图9-8是顶层数据流图,图9-9所示是第0层数据流图,图9-10是第1层数据流图,其中(A)是加工1的子图,(B)是加工2的子图。【数据字典】(1)数据流条目订货单=配件号+配件名+规格+数量+顾客名+地址提货单=订货单+金额采货单=配件号+配件名+规格+数量+供应商名+地址送货单=配件号+配件名+规格+数量+金额(2)文件说明文件名:配件库存组成:{配件号+配件名+规格+数量+允许的最低库存量}
问答题[说明]某游戏公司现欲开发一款面向儿童的模拟游戏,该游戏主要模拟现实世界中各种鸭子的发声特征、飞行特征和外观特征。游戏需要模拟的鸭子种类及其特征如下表所示。游戏需要模拟的鸭子种类及特征鸭子种类发声特征飞行特征外观特征灰鸭(MallardDuck)发出“嘎嘎”声(Quack)用翅膀飞行(FlyWithWings)灰色羽毛红头鸭(RedHeadDuck)发出“嘎嘎”声(Quack)用翅膀飞行(FlyWithWings)灰色羽毛、头部红色棉花鸭(CottonDuck)不发声(QuackNoWay)不能飞行(FlyNoWay)白色橡皮鸭(RubberDuck)发出橡皮与空气摩擦的声音(Squeak)不能飞行(FlyNoWay)黑白橡皮色为支持将来能够模拟更多种类鸭子的特征,采用策略设计模式(Strategy)设计的类图如下图所示。其中,Duck为抽象类,描述了抽象的鸭子,而类RubberDuck、MallardDuck、CottonDuck和RedHeadDuck分别描述具体的鸭子种类,方法fly()、quack()和display()分别表示不同种类的鸭子部具有飞行特征、发声特征和外观特征;接口FlyBehavior与QuackBehavior分别用于表示抽象的飞行行为与发声行为;类FlyNoWay与FlyWithWings分别描述不能飞行的行为和用翅膀飞行的行为;类Quack、Squeak与QuackNoWay分别描述发出“嘎嘎”声的行为、发出橡皮与空气摩擦声的行为与不发声的行为。请填补以下代码中的空缺。[Java程序]______FlyBehavior{publicvoidfly();};______QuackBehavior{publicvoidquack();};classFlyWithWingsimplementsFlyBehavior{publicvoidfly(){System.out.println("使用翅膀飞行!");}};classFlyNoWayimplementsFlyBehaVior{publicvoidfly(){System.out.println("不能飞行!");}};classQuackimplementsQuackBehaVior{publicvoidquack(){System.out.println("发出"嘎嘎"\声!");}};classSqueakimplementsQuackBehavior{publicvoidquack(){System.out.println("发出空气与橡皮摩擦声!");}};classQuackNoWayimplementsQuackBehavior{publicvoidquack(){System.out.println("不能发声!");}};AbstractclassDuck{protectedFlyBehavior______;protectedQuackBehavior______;publicvoidfly(){______;};publicvoidquack(){______;};public______voiddisplay();};classRubberDuckextendsDuck{publicRubberDuck(){flyBehavior=new______;quackBehavior=new______;}publicvoiddisplay(){/*此处省略显示橡皮鸭的代码*/)};//其他代码省略
问答题 阅读下列说明,回答问题1至问题3。
【说明】
某医院的门诊管理系统实现了为患者提供挂号、处方药品收费的功能。具体的需求及设计如下:
1.医院医师具有编号,姓名,科室,职称,出诊类型和出诊费用,其中出诊类型分为专家门诊和普通门诊,与医师职称无关;各个医师可以具有不同的出诊费用,与职称和出诊类型无关。
2.患者首先在门诊挂号处挂号,选择科室和医师,根据选择的医师缴纳挂号费(医师出诊费)。收银员为患者生成挂号单,如表10-1所示,其中,就诊类型为医师的出诊类型。{{B}} 表10-1 ××医院门诊挂号单{{/B}} 收银员:13011 时间:2007年2月1日
08:58
就诊号
姓名
科室
医师
就诊类型
挂号费
20070205015
叶萌
内科
杨玉明
专家门诊
5元 3.患者在医师处就诊后,凭借挂号单和医师手写处方到门诊药房交费买药。收银员根据就诊号和医师处方中开列的药品信息,查询药品库(如表10-2所示)并生成门诊处方单(如表10-3所示)。{{B}} 表10-2 药品库{{/B}}
药品编码
药品名称
类型
库存
货架编号
单位
规格
单价
12007
牛蒡子
中药
51590
B1401
G
炒
0.0340
11090
百部
中药
36950
B1523
G
片
0.0313{{B}} 表10-3 ××医院门诊处方单{{/B}} 时间:2007年2月1日
10:31
就诊号
20070205015
病人姓名
叶萌
医师姓名
杨玉明
金额总计
0.65
项目总计
2
收银员
21081
药品编码
药品名称
数量
单位
单价
金额(元)
12007
牛蒡子
10
G
0.0340
0.34
11090
百部
10
G
0.0313
0.31 4.由于药品价格会发生变化,因此,门诊管理系统必须记录处方单上药品的单价。 根据需求阶段收集的信息,设计的实体联系图和关系模式(不完整)如下所示: 1.实体联系图 2.关系模式 挂号单(就诊号,病患姓名,医师编号,时间,{{U}}
(5)
{{/U}}) 收银员(编号,姓名,级别) 医师(编号,姓名,科室,职称,出诊类型,出诊费用) 门诊处方({{U}}
(6) {{/U}},收银员,时间) 处方明细(就诊号,{{U}} (7)
{{/U}}) 药品库(药品编码,药品名称,{{U}} (8) {{/U}})