图5-13(或图5-14)中Mod(S,11)表示S除以11得到的余数。以下[C程序]实现不使用求余计算符号“%”,求取
图5-13(或图5-14)中Mod(S,11)表示S除以11得到的余数。以下[C程序]实现不使用求余计算符号“%”,求取被除数p和除数q之间的余数。
[C程序]
图5-13(或图5-14)中Mod(S,11)表示S除以11得到的余数。以下[C程序]实现不使用求余计算符号“%”,求取被除数p和除数q之间的余数。
[C程序]
第2题
阅读下列说明和Java代码,将应填入(n)处的字句写在对应栏内。
【说明】
已知某企业欲开发一家用电器遥控系统,即用户使用一个遥控器即可控制某些家用电器的开与关。遥控器如下图(a)所示。该遥控器共有4今按钮,编号分别是0至3,按钮0和2能够遥控打开电器1和电器2,按钮1和3则能遥控关闭电器1和电器2。由于遥控系统需要支持形式多样的电器,因此,该系统的设计要求具有较高的扩展性。现假设需要控制客厅电视和卧室电灯,对该遥控系统进行设计所得类图如下图(b)所示。
图(b)中,类RomoteController的方法onPrcssButton(int button)表示当遥控器按键按下时调用的方法,参数为按键的编号;command接口中on和off方法分别用于控制电器的开与关;Light中turnLight(int degree)方法用于调整电灯灯光的强弱,参数 degree值为0时表示关灯,值为100时表示开灯并且将灯光亮度调整到最大;TV中 sctChannel(int channel)方法表示设置电视播放的频道,参数channel值为0时表示关闭电视,为1时表示开机并将频道切换为第1频道。
【Java代码】
class Light{ //电灯类
public void trunLight(int degree){//调整灯光亮度,0表示关灯,100表示亮度最大}
};
class TV{//电视机类
public void setChannel(int channel){//0表示关机,1表示开机并切换到1频道}
};
interface Command{//抽象命令类
void on();
void off();
};
class RemoteController{ //遥控器类
protected Command []commands=new Command[4];
//遥控器有4个按钮,按照编号分别对应4个Command对象
public void onPressButton(int button){
//按钮被按下时执行命令对象中的命令
if(button % 2 == 0)commands[button]. on();
else commands[button]. off();
}
public void setCommand(int button, Command command){
(1)=command;//设置每个按钮对应的命令对象
}
};
class LightCommand implements Command{ //电灯命令类
protected Light light; //指向要控制的电灯对象
public void on(){light. trunLight(100););
public void off(){light.(2););
public LightCommand(Light light){this. light= light;);
};
class TVCommand implements Command{//电视机命令类
protected Tv tv; //指向要控制的电视机对象
public void on(){tv.(3);};
public void off(){tv. setChanne1(0);};
public TVCommand(TV tv){this. tv= tv;};
};
public class rs {
public static void main(String [] args){
Light light= new Light(); TV tv=new TV();//创建电灯和电视对象
LightCommand lightCommand= new LightCommand(light);
TVCommand tvCommand=new TVCommand(tv);
RemoteController remoteController=new RemoteController();
//设置按钮和命令对象
remoteController. setCommand(0,(4));
... //此处省略设置按钮1、按钮2和按钮3的命令对象代码
}
}
本题中,应用命令模式能够有效让类(5)和类(6)、类(7)之间的耦合性降至最小。
第3题
阅读以下说明以及Java程序。
【说明】
传输门是传输系统中的重要装置。传输门具有Open(打开)、Closed(关闭)、Opening (正在打开)、StayOpen(保持打开)和Closing(正在关闭)五种状态。触发状态的转换事件有click、complete和timeout三种。事件与其相应的状态转换如下图所示。
下面的Java代码1与Java代码2分别用两种不同的设计思路对传输门进行状态模拟,请填补代码中的空缺。
【Java代码1】
public class Door {
public static final int CLOSED = 1; public static final int PENING = 2;
public static final int PEN = 3; public static final int CLOSING = 4;
public static final int STAYOPEN = 5; private int state = CLOSED;
//定义状态变量,用不同的整数表示不同状态
private void setState(int state){ this.state = state;}
//设置传输门当前状态
public void getState() {
//此处代码省略,本方法输出状态字符串,
//例如,当前状态为CLOSED时,输出字符串为"CLOSED"
}
public void click() { //发生click事件时进行状态转换
if ((1);) setState(OPENING);
else if ((2);) setState{CLOSING);
else if ((3);) setState(STAYOPEN);
}
//发生timeout事件时进行状态转换
public void timeout() { if (state == OPEN) setState(CLOSING);}
public void complete() {//发生complete事件时进行状态转换
if (state == OPENING) setState(OPEN);
else if (state == CLOSING) setState(CLOSED);
}
public static void main(String [] args){
Door aDoor = new Door();
aDoor.getState();aDoor.click();aDoor.getState();aDoor.complete();
aDoor.getState();aDoor.click();aDoor.getState();aDoor.click();
aDoor.getState();return;
}
}
【Java代码2】
public class Door {
public final DoorState CLOSED = new DoorClosed(this);
public final DoorState PENING = new DoorOpening(this);
public final DoorState PEN = new DoorOpen(this);
public final DoorState CLOSING = new DoorClosing(this);
public final DoorState STAYOPEN = new DoorStayOpen(this);
private DoorState state = CLOSED;
//设置传输门当前状态
public void setState(DoorState state) { this.state=state;}
public void getState(){ //根据当前状态输出对应的状态字符串
System.out.println(state.getClass().getName());
}
public void click(){(4);}//发生click事件时进行状态转换
public void timeout(){(5);}//发生timeout事件时进行状态转换
public void complete(){(6);)//发生complete事件时进行状态转换
public static void main(String[]args){
Door aDoor = new Door();
aDoor.getState();aDoor.click();aDoor.getState();aDoor.complete();
aDoor.getState();aDoor.timeout();aDoor.getState();return;
}
}
public abstract class DoorState { //定义所有状态类的基类
protected Door door ;
public DoorState(Door doer) { this.door = door;}
public void click() {}
public void complete() {}
第4题
阅读以下说明和Java 码,将应填入(n)处的字名写在的对应栏内。
[说明] 编写一个学生类Student,要求:
(1) 学生类Student 属性有:
id: long 型,代表学号
name: String类对象,代表姓名
age: int 型,代表年龄
sex: boolen 型,代表性别(其中:true 表示男,false 表示女)
phone: String 类对象,代表联系电话
(2) 学生类Student 的方法有:
Student (long i,String n,int a,boolean s,String p)
:有参构造函数,形参表中的参数分别初始化学号、姓名、
年龄、性别和联系电话。
int getAge ():获取年龄作为方法的返回值。
boolean getSex ():获取性别作为方法的返回值。
String getPhone ():获取联系电话作为方法的返回值。
public String to String ():以姓名:性别:学号:联系电话的形式作为方法的返
import java. applet. Applet;
import java. awt.* ;
public class Student extends Applet {
long id;
String name, phone;
int age;
boolean sex;
Student(long i, String n, int a, boolean s, String p)
{
id=i;
name = n;
age = a;
sex= s;
phone = p;
{
public void paint( Graphics g)
{
Student x= new Student (5000," xiaoliu" , 89, true, " 8989898" );
(1);
(2)
g. drawstring( x. getPhone( ), 140,140);
}
int getAge( )
{ return age; }
boolean getsex ( )
{ return sex; }
String getPhone( )
{ return phone; }
String ToString( )
{
(3)
}
}
第5题
阅读下列算法说明和算法,将应填入(n)的字句写在对应的栏内。
[说明]
下列最短路径算法的具体流程如下:首先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择不使森林中产生回路的边加入到森林中去,直至该森林变成一棵树为止,这棵树便是连通网的最小生成树。该算法的基本思想是:为使生成树上总的权值之和达到最小,则应使每一条边上的权值尽可能地小,自然应从权值最小的边选起,直至选出 n-1条互不构成回路的权值最小边为止。
[算法]
/*对图定义一种新的表示方法,以一维数组存放图中所有边,并在构建图的存储结构时将它构造为一个“有序表”。以顺序表MSTree返回生成树上各条边。*/
typedef struct{
VertexType vex1;
VertexType vex2;
VRType weight;
} EdgeType;
typedef ElemType EdgeType;
typedef struct { //有向网的定义
VertexType vexs [MAX_VERTEX_N U M ]; //顶点信息
EdgeType edge[ MAX_EDGE_NUM]; //边的信息
int vexnum, arcnum; //图中顶点的数目和边的数目
I ELGraph;
void MiniSpanTree_Kruskal( ELGraph G,SqList& MSTree) {
//G, edge 中依权值从小到大存放有向网中各边
//生成树的边存放在顺序表MSTree中
MFSetF;
InitSet( F, G. vexnum ); //将森林F初始化为N棵树的集合
InitList (MSTree, G. vexnum); //初始化生成树为空树
i=0;k=1;
while(k<(1)){
e = G. edge[i]; //取第i条权值最小的边
/*函数fix_mfset返回边的顶点所在树的树的根代号,如果边的两个顶点所在树的树根相同,则说明它们已落在同一棵树上。 */
ri = fix_mfset(F, LocateVex(e. vex1) );
r2=(2); //返回两个顶点所在树的树根
if(r1 (3) r2) { //选定生成树上第k条边
if(Listlnsert(MSTree,k,e){(4); //插入生成树
mix_mfset( E, r1,r2); //将两棵树归并为一棵树
}
(5); //继续考察下一条权值最小边
}
DestroySet (F); }
}
第7题
阅读下列说明,回答问题1至问题4。
[说明]
甲公司的经营销售业务目前是手工处理的,随着业务量的增长,准备采用关系数据库对销售信息进行管理。经销业务的手工处理主要涉及三种表:订单表、客户表和产品表(见表 2,表3和表4)。
为了用计算机管理销售信息,甲公司提出应达到以下要求:产品的单价发生变化时,应及时修改产品表中的单价数据。客户购货计价采用订货时的单价?订货后,即使单价发生变化,计算用的单价也不变。
在设计数据库时,经销部的王先生建立了如图4所示的数据模型。其中,方框表示实体,单向箭头表示1对多的联系,双向箭头表示多对多的联系。
由于上述模型对建立关系数据库是不合适的,因此王先生又修改了数据模型,并设计了如下几个关系(带下划线的数据项是关键项,最后一个关系中没有指出关键项):
Customer (CustomerNo, CustomerName, Address, Phone)
Product (productNo, ProductName, UnitPdce)
Order (Orderno, CustomerNo, Date)
OrderDetail (OrderNo, ProductNo, Quantity)
请按[说明]中的要求画出修改后的数据模型。
第9题
阅读下列说明和C++代码,将应填入(n)处的字句写在对应栏内。
【说明】
已知某企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开会讨论决定。
采用责任链设计模式(Chain of Responsibility)对上述过程进行设计后得到的类图如图6-1所示。
【C++代码】
include <string>
include <iostream>
using namespace std;
class PurchaseRequest {
public:
double Amount; /*一个采购的金额*/
int Number; /*采购单编号*/
string Purpose; /*采购目的*/
};
class Approver { /*审批者类*/
public:
Approver() { successor = NULL; }
virtual void ProcessRequest(PurchaseRequest aRequest){
if (successor != NULL){ successor-> (1) ; }
}
void SetSuccessor(Approver *aSuccesssor) { successor = aSuccesssor; } private:
(2) successor; };
class Congress : public Approver {
public:
void ProcessRequest(PurchaseRequest aRequest) {
if(aRequest.Amount >= 500000){ /*决定是否审批的代码少略*/ }
else (3) ProcessRequest(aRequest);
}
class Director : public Approver {
public:
void ProcessRequest(PurchaseRequest aRequest){ /*此处代码省略*/
}
};
class President : public Approver {
public:
void ProcessRequest(PurchaseRequest aRequest) /*此处代码省略*/ }
};
class VicePresident : public Approver {
public:
void ProcessRequest(PurchaseRequest aRequest) /*此处代码省略*/ }
};
void main(){
Congress Meeting; VicePresident Sam; Director Larry ; President
Tammy;
Meeting. SetSuccessor(NULL); Sam. SetSuccessor( (4) );
Tammy. SetSuccessor( (5) ); Larry. SetSuccessor( (6) );
PurchaseRequest aRequest; /*构造一采购审批请求*/
cin >> aRequest.Amount; /*输入采购请求的金额*/
(7) .ProcessRequest(aRequest); /*开始审批*/
return ;
}
为了保护您的账号安全,请在“上学吧”公众号进行验证,点击“官网服务”-“账号验证”后输入验证码“”完成验证,验证成功后方可继续查看答案!