填空题

[说明]
现要编写一个画矩形的程序,目前有两个画图程序:DP1和DP2,DP1用函数draw_a_line(x1, y1, x2, y2)画一条直线,DP2则用drawline(x1, x2, y1, y2)画一条直线。当实例化矩形时,确定使用DP1还是DP2。为了适应变化,包括“不同类型的形状”和“不同类型的画图程序”,将抽象部分与实现部分分离,使它们可以独立地变化。这里,“抽象部分”对应“形状”,“实现部分”对应“画图”,与一般的接口(抽象方法)与具体实现不同。这种应用称为Bridge(桥接)模式。图显示了各个类间的关系。
这样,系统始终只处理3个对象:Shape对象、Drawing对象、DP1或DP2对象。以下是C++语言实现,能够正确编译通过。
[C++代码]
class DP1
public:
static void draw_a_line(double x1, double y1,double x2, double y2)
//省略具体实现


;
class DP2
public:
static void drawline(double x1, double x2, double y1, double y2)
//省略具体实现

;
class Drawing
public:
______ void drawLine(double x1,double y1,double x2,double y2)=0
;
class ViDrawing : public Drawing
public:
void drawLine(double x1, double y1, double x2, double y2)
DP1∷draw_a_line(x1, y1, x2, y2);

;
class V2Drawing : public Drawing
public:
void drawLine(double x1, double y1, double x2, double y2)
______;

;
class Shape
private:
______ _dp;
public:
Shape(Drawing *dp);
virtual void draw() = 0;
void drawLine(double x1, double y1, double x2, double y2);
;
Shape∷Shape(Drawing *dp)

_dp : dp;

void Shape∷drawLine(double x1, double y1, double x2, double y2)
//画一条直线
______;

class Rectangle : public Shape
private:
double _x1, _y1, _x2, _y2;
public:
Rectangle(Drawing *dp, double x1, double y1,
double x2, double y2);
void draw();
;
Rectangle∷Rectangle(Drawing *dp, double x1, double y1, double x2, double y2)
: ______

_x1 = x1; _y1 = y1; _x2 = x2; _y2 = y2

void Rectangle∷draw()

//省略具体实现

【参考答案】

virtual
DPB∷drawline(xA,xB,yA,yB)
Drawing
_dp->draw......

(↓↓↓ 点击下方‘点击查看答案’看完整答案 ↓↓↓)
热门 试题

填空题
[说明] 所谓货郎担问题,是指给定一个无向图,并已知各边的权,在这样的图中,要找一个闭合回路,使回路经过图中的每一个点,而且回路各边的权之和最小。 应用贪婪法求解该问题,程序先计算由各点构成的所有边的长度(作为边的权值),按长度大小对各边进行排序后,按贪婪准则从排序后的各边中选择组成回路的边,贪婪准则使得边的选择按各边长度从小到大选择。 函数中使用的预定义符号如下: #define M 100 typedef struct 为两端点p1、p2之间的距离, p1、p2所组成边的长度* float x; int p1, p2; tdr; typedef struct *p1、p2为和端点相联系的两个端点, n为端点的度* int n, p1, p2; tr; typedef struct *给出两点坐标* float x, y; tpd; typedef int t1[M]; int n = 10; [函数] float distance(tpd a, tpd b); *计算端点a、b之间的距离* void sortArr(tdr a[M], int m); *将已经计算好的距离关系表按距离大小从小到大排序形成排序表, m为边的条数* int isCircuit(tr r[M], int i, int j); *判断边(i, J)选入端点关系表r[M]后,是否形成回路, 若形成回路返回0* void selected(tr r[M], int i, int j); *边(i,J)选入端点关系表r* void course(tr r[M], t1 1 [W]); *从端点关系表r中得出回路轨迹表* void exchange(tdr a[M], int m, int b); *调整表排序表, b表示是否可调, 即是否有长度相同的边存在* void travling(tpd pd[M], int n, float dist, t1 locus[M]) *dist记录总路程* tdr dr[M]; *距离关系表* tr r[M]; *端点关系表* int i, j, k, h, m; *h表示选入端点关系表中的边数* int b; *标识是否有长度相等的边* k = 0; *计算距离关系表中各边的长度* for(i = 1; i < n; i++) for(j = i + 1; j <= n; j++) k++; dr[k].x = ______; dr[k].p1 = i; dr[k].p2 = j; m = k; sortArr (dr, m); *按距离大小从小到大排序形成排序表* do b = i; dist = 0; k = h = 0; do k++; i = dr[k].p1; j = dr[k].p2; if((r[i].n <= 1) && (r[j].n <= 1)) *度数不能大于2* if(______) *若边(i, j )加入r后形成回路,则不能加入* ______; h++; dist += dr[k].x; else if(______) selected(r, i, j); *最后一边选入r成回路,完成输出结果* h++; dist += dr[k].x; while((k != n) && (h != n)); if((h == n)) *最后一边选入构成回路, 完成输出结果* course(r, locus); else *找不到解, 调整dr, 交换表中边长相同的边在表中的顺序, 并将b置0* ______; while(!b);