问答题【程序说明】
对于一个公司的雇员来说,无非有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}})
问答题[函数5-2]
bool Isgrowing(BTreeNode* root, ElernKeyType akey)
{ BTreeNode *t, *f;
if( !SearchBtree( {{U}}(4) {{/U}}) ) {
t=f;
while ({{U}} (5) {{/U}}) {
t=t -> parent;
}
if( !t )
return TRUE;
}
return FALSE;
}
问答题阅读以下说明和图,回答问题1至问题3。【说明】某房屋租赁公司欲建立一个房屋租赁服务系统,统一管理房主和租赁者的信息,从而快速地提供租赁服务。该系统具有以下功能:1.登记房主信息。对于每名房主,系统需登记其姓名、住址和联系电话,并将这些信息写入房主信息文件。2.登记房屋信息。所有在系统中登记的房屋都有一个唯一的识别号(对于新增加的房屋,系统会自动为其分配一个识别号)。除此之外,还需登记该房屋的地址、房型(如平房、带阳台的楼房、独立式住宅等)、最多能够容纳的房客数、租金及房屋状态(待租赁、已出租)。这些信息都保存在房屋信息文件中。一名房主可以在系统中登记多个待租赁的房屋。3.登记租赁者信息。所有想通过该系统租赁房屋的租赁者,必须首先在系统中登记个人信息,包括:姓名、住址、电话号码、出生年月和性别。这些信息都保存在租赁者信息文件中。4.租赁房屋。已经登记在系统中的租赁者,可以得到一份系统提供的待租赁房屋列表。一旦租赁者从中找到合适的房屋,就可以提出看房请求。系统会安排租赁者与房主见面。对于每次看房,系统会生成一条看房记录并将其写入看房记录文件中。5.收取手续费。房主登记完房屋后,系统会生成一份费用单,房主根据费用单交纳相应的费用。6.变更房屋状态。当租赁者与房主达成租房或退房协议后,房主向系统提交变更房屋状态的请求。系统将根据房主的请求,修改房屋信息文件。数据流图10-1和图10-2分别给出了该系统的顶层数据流图和0层数据流图。
问答题【说明】某游戏公司现欲开发一款面向儿童的模拟游戏,该游戏主要模拟现实世界中各种鸭子的发声特征、飞行特征和外观特征。游戏需要模拟的鸭子种类及其特征如表10-6所示:{{B}}表10-6{{/B}}为支持将来能够模拟更多种类鸭子的特征,采用策略设计模式(Strategy)设计的类图如图10-11所示:其中,Duck为抽象类,描述了抽象的鸭子,而类RubberDuck、MallardDuck、CottonDuck和RedHeadDuck分别描述具体的鸭子种类,方法fly()、quack()和display()分别表示不同种类的鸭子都具有飞行特征、发声特征和外观特征;类FlyBehavior与QuackBehavior为抽象类,分别用于表示抽象的飞行行为与发声行为:类FlyNoWay与FlyWithWings分别描述不能飞行的行为和用翅膀飞行的行为;类Quack、Squeak与QuackNoWay分别描述发出“嘎嘎”声的行为、发出橡皮与空气摩擦声的行为与不发声的行为。请填补以下代码中的空缺。【C++代码】#include<iostream>usingnamespace{{U}}(1){{/U}};classFlyBehavior{public:{{U}}(2){{/U}}fly()=0;};classQuackBehavior{public:{{U}}(3){{/U}}quack()=0;};classFlyWithWings:publicFlyBehavior{public:voidfly(){cout<<“使用翅膀飞行!”<<endl;}};classFlyNoWay:publicFlyBehavior{public:voidfly(){cout<<“不能飞行!”<<endl;}};classQuack:publicQuackBehavior{public:voidquack(){cout<<“发出/‘嘎嘎/’声!”<<endl;}};classSqueak:publicQuackBehavior{public:voidquack(){cout<<“发出空气与橡皮摩擦声!”<<endl;}};classQuackNoWay:publicQuackBehavior{public:voidquack(){cout<<“不能发声!”<<endl;}};classDuck{protected:FlyBehavior*{{U}}(4){{/U}};QuackBehavior*{{U}}(5){{/U}};public:voidfly(){{{U}}(6){{/U}};}voidquack(){{{U}}(7){{/U}};);virtualvoiddisplay()=0;};classRubberDuck:publicDuck{public:RubberDuck(){flyBehavior=new{{U}}(8){{/U}};quackBehavior=new{{U}}(9){{/U}};}~RubberDuck(){if(!flyBehavior)deleteflyBehavior;if(!quackBehavior)deletequackBehavior;}voiddisplay(){/*此处省略显示橡皮鸭的代码*/}};//其他代码省略
问答题[说明]某宾馆拟开发一个宾馆客房预订子系统,主要是针对客房的预订和入住等情况进行管理。[需求分析结果](1)员工信息主要包括员工号、姓名、出生年月、性别、部门、岗位、住址、联系电话和密码等信息。岗位有管理和服务两种。岗位为“管理”的员工可以更改(添加、删除和修改)员工表中本部门员工的岗位和密码,要求将每一次更改前的信息保留;岗位为“服务”的员工只能修改员工表中本人的密码,且负责多个客房的清理等工作。(2)部门信息主要包括部门号、部门名称、部门负责人、电话等信息。一个员工只能属于一个部门,一个部门只有一位负责人。(3)客房信息包括客房号、类型、价格、状态等信息。其中,类型是指单人间、三人间、普通标准间、豪华标准间等;状态是指空闲、入住和维修。(4)客户信息包括身份证号、姓名、性别、单位和联系电话。(5)客房预订情况包括客房号、预订日期、预订入住日期、预订入住天数、身份证号等信息。一条预订信息必须且仅对应一位客户,但一位客户可以有多条预订信息。[概念模型设计]根据需求阶段收集的信息,设计的实体联系图(不完整)如下图所示。[逻辑结构设计]逻辑结构设计阶段设计的部分关系模式(不完整)如下。员工(______,姓名,出生年月,性别,岗位,住址,联系电话,密码)权限(岗位,操作权限)部门(部门号,部门名称,部门负责人,电话)客房(______,类型,价格,状态,入住日期,入住时间,员工号)客户(______,姓名,性别,单位,联系电话)更改权限(员工号,______,密码,更改日期,更改时间,管理员号)预订情况(______,预订日期,预订入住日期,预订入住天数)
问答题例如:设散列函数为Hash(Key)=Keymod7,记录的关键字序列为15,14,21,87,97,293,35,24,149,19,63,16,103,77,5,153,145,356,51,68,705,453,建立的散列文件内容如图4-1所示。[图4-1]为简化起见,散列文件的存储单位以内存单元表示。函数InsertToHashTable(intNewElemKey)的功能是:将元素NewEIemKey插入散列桶中,若插入成功则返回0,否则返回-1。采用的散列函数为Hash(NewElemKey)=NewElemKey%P,其中P为设定的基桶数目。函数中使用的预定义符号如下:#defineNULLKEY-1/*散列桶的空闲单元标识*/#defineP7/*散列文件中基桶的数目*/#defineITEMS3/*基桶和溢出桶的容量*/typedefstructBucketNode{/*基桶和溢出桶的类型定义*/intKcyData[ITEMS];structBucketNode*Link;}BUCKET;BUCKETBucket[P];/*基桶空间定义*/[函数]intlnsertToHashTable(intNewElemKey){/*将元素NewElemKey插入散列桶中,若插入成功则返回0,否则返回-1*//*设插入第一个元素前基桶的所有KeyData[]、Link域已分别初始化为NULLKEY、NULL*/intIndex;/*基桶编号*/inti,k;BUCKET*s,*front,*t;{{U}}(1){{/U}};for(i=0;i<ITEMS;i++)/*在基桶查找空闲单元,若找到则将元素存入*/if(Bucket[Index].KeyData[i]=NULLKEY){Bucket[Index].KeyData[i]=NewElemKey;break;}if({{U}}(2){{/U}})return0;/*若基桶已满,则在溢出桶中查找空闲单元,若找不到则申请新的溢出桶*/{{U}}(3){{/U}};t=Bucket[Index].Link;if(t!=NULL){/*有溢出桶*/while(t!=NULL){for(k=0;k<ITEMS;k++)if(t->KeyData[k]=NULLKEY){/*在溢出桶链表中找到空闲单元*/t->KeyData[k]=NewElemKey;break;}/*if*/front=t;if({{U}}(4){{/U}})t=t->Link;elsebreak;}/*while*/}/*if*/if({{U}}(5){{/U}}){/*申请新溢出桶并将元素存入*/s=(BUCKET*)malloe(sizeof(BUCKET));if(!s)return-1;s->Link=NULL;for(k=0;k<ITEMS;k++)s->KeyData[k]=NULLKEY;s->KeyData[0]=NewElemKey;{{U}}(6){{/U}};}/*if*/return0;}/*InsertToHashTable*/
问答题【问题1】
对文法G进行改写,然后对每个非终结符写出不带回溯的递归于程序。
问答题[说明]某汽车维修站拟开发一套小型汽车维修管理系统,对车辆的维修情况进行管理。(1)对于新客户及车辆,汽车维修管理系统首先登记客户信息,包括客户编号、客户名称、客户性质(个人、单位)、折扣率、联系人、联系电话等信息;还要记录客户的车辆信息,包括车牌号、车型、颜色等信息。一个客户至少有一台车。客户及车辆信息如表1所示。(2)记录维修车辆的故障信息,包括维修类型(普通、加急)、作业分类(大、中、小修)、结算方式(自付、三包、索赔)等信息。维修厂的员工分为维修员和业务员。车辆维修首先委托给业务员。业务员对车辆进行检查和故障分析后,与客户磋商,确定故障现象,生成维修委托书,如下表2所示。表1 客户及车辆信息客户编号GS0051客户名称××公司客户性质单位折扣率95%联系人杨浩东联系电话82638779车牌号**0765车型帕萨特颜色白色车辆类别微型车表2 维修委托书No.20070702003 登记日期:2007-07-02车牌号**0765客户编号GS0051维修类型普通作业分类中修结算方式自付进厂时间2007070211:09业务员张小江业务员编号012预计完工时间故障描述车头损坏,水箱漏水(3)维修车间根据维修委托书和车辆的故障现象,在已有的维修项目中选择并确定一个或多个具体维修项目,安排相关的维修工及工时,生成维修派工单。维修派工单如下表所示。维修派工单No.200700702003维修项目编号维修项目工时维修员编号维修员工种012维修车头5.00012机修012维修车头2.00023漆工015水箱焊接补漏1.00006焊工017更换车灯1.00012机修(4)客户车辆在车间修理完毕后,根据维修项目单价和维修派工单中的工时计算车辆此次维修的总费用,并记录在委托书中。[概念结构设计]根据需求阶段收集的信息,设计的实体联系图(不完整)如下图所示。图中的业务员和维修工是员工的子实体。[逻辑结构设计]逻辑结构设计阶段设计的关系模式(不完整)如下。客户(______,折扣率,联系人,联系电话)车辆(车牌号,客户编号,车型,颜色,车辆类别)委托书(______,维修类型,作业分类,结算方式,进厂时间,预计完工时间,登记日期,故障描述,总费用)维修项目(维修项目编号,维修项目,单价)派工单(______,工时)员工(______,工种,员工类型,级别)
问答题
阅读下列说明和图,回答问题1至问题3,将解答填入对应栏内。 [说明]
某汽车数字仪表系统将完成下述功能: (1)通过模一数转换,实现传感器和微处理器的接口。
(2)在发光二极管面板上显示数据。 (3)指示速度(mph)、行驶里程、油耗(mpg)等。
(4)指示加速或减速。
以下是经分析得到的数据流图,有些地方有待填充,假定顶层数据流图是正确的。图1-1是顶层数据流图,图1-2是第0层数据流图,图1-3是第1层数据流图,其中A是加工1的细化图,B是加工2的细化图。图中,△sps表示转速sps的瞬时变化值,若△sps>0则汽车加速,△sps<0则减速,△sps=0则匀速。假定题中提供的顶层图是正确的,请回答下列问题。
[图1-1]
[图1-2] [图1-3]