急!急!有关C++画图、多态和链表的问题

题目如下,由于本人刚学习C++,加上C语言链表学得不好,请各位高手多多指教,帮我做一下行吗?我下面还有几道和这差不多的题目,希望能通过这道题领悟到以前没学好的东西。在下在此谢了。

归纳绘制各类图形所需要的共同属性和操作接口,可以定义一个只为不同图形绘制类提供绘制属性和绘制操作的接口规则,以及为将不同图形绘制类对象连接成一个链表提供连接属性和插入链表操作的接口规则,而不实现任何具体图形绘制操作和对象插入操作的抽象类Figure如下:

enum TYPE {LINE, CIRCLE, ELLIPSE, ARC, RECTANGLE, TRIANGLE, POLYGON};

class FigureLink;                           // 超前声明

       class Figure

       {

              friend class FigureLink;   // FigureLink是连接不同图形绘制类对象的链表类

       protected:

              TYPE type;                        // 图形类别:直线 = LINE, 圆 = CIRCLE, 椭圆 =

// ELLIPSE, 弧 = ARC, 矩形 = RECTANGLE, 三角

// 形 = TRIANGLE, 正多边形 = POLYGON

int cx, cy;                           // 绘制图形的中心位置坐标

int linestyle;                      // 画线样式

              int linewidth;                           // 画线宽度

int linecolor;                            // 画线颜色

int fillpattern;                   // 封闭图形的填充样式

int fillcolor;                       // 封闭图形的填充颜色

static Figure* ptr;                    // 指向将要插入链表的图形绘制对象

Figure* next;                    // 指向链表中下一个图形绘制对象   

       public:

              Figure(int x, int y, TYPE tp, int style = SOLID_LINE, int lnwidth = NORM_WIDTH,

int lncolor = WHITE, int pattern = EMPTY_FILL, fcolor = BLACK)

{

       cx = x;                              

       cy = y;   

       type = tp;                          

       linestyle = style;                     

fillpattern = pattern;              

fillcolor = fcolor;                     

       linewidth = lnwidth;        

       linecolor = lncolor;         

}

virtual ~Figure() {}

              virtual void Draw() = 0;      // 图形绘制操作的接口规则

              vitural void Insert() = 0;    // 图形绘制类对象插入链表操作的接口规则

              void show();                      // 在图形方式下按指定格式显示图形的各项属性(中

// 心位置坐标属性除外)。

       };

注意,构造函数中为各项绘图属性的缺省值是绘图系统已经预先定义的符号常量,这些符号常量的种类和含义可以参见提示中响应的相应常量表。

要求:

       1. 从Figure定义以下图形绘制类:Line直线、Circle圆、Ellipse椭圆、Arc弧、Rectangle矩形、Triangle三角形、Poligon正多边形。

       2. 每种图形绘制类除了从基类继承共同属性外,还分别具有描述自身形状和尺寸的属性,每种图形绘制类的新增属性如下:

Line类

  int length;                  // 直线长度

  int angle                            // 直线与水平方向的夹角 (以度单位)

Circle类

  int radius;                  // 圆半径

Ellipse类

  int horizAxis                     // 椭圆水平轴

  int vertAxis                // 椭圆垂直轴

Arc类

  int radius;                  // 弧线半径

  int stAngle                 // 弧线的起点角(以度单位)



  int endAngle                     // 弧线的止点角(以度单位)

Rectangle类

  int length;                  // 矩形的长度

  int width;                    // 矩形的宽度

Triangle类

  int side1;                    // 三角形的一条边长

  int side2;                    // 三角形的另一条边长

  int angle                            // 两边的夹角(以度单位)

Polygon类

  int pointNum;             // 正多边形的顶点个数

  int sideLength;          // 正多边形的(顶点之间)边长

       3. 上述各个派生类的属性(包括所有图形类的共同属性在内)的设置可以通过两个途径实现:

          ① 通过构造函数设置为你确定的特定值。

       ② 为每个派生类重载函数调用运算符operator(),通过该运算符函数的参数列表为相应图形的各个属性指定设置值。注意,在为各个图形的形态属性赋值前,应检测所设置属性值在屏幕绘制范围内的合法性。

       4. 要求每种图形的接口函数Draw()将该图形绘制在一个矩形边框的中央,并在边框的左上角显示该图形的类型名称和属性(文字显示操作由成员函数Show完成)。例如调用一个圆的Draw(),显示结果如下:


未命名1.jpg




          注意,上图示中顶部的文字串是程序的主菜单,它不是Draw()的显示内容。

5. 各类图形派生类的接口函数Insert()所实现的功能是动态复制一个所操作的图形对象,用于插入链表。例如Circle::Insert()的实现代码可以按如下定义:

       void Circle::Insert()

       {

              ptr = new Circle(cx, cy, linestyle, linewidth, linecolor, fillpattern, fillcolor);

       }

6. 各类图形派生类的成员函数Show是在调用基类的Show的基础上增加显示图形种类的文字信息。

7. 定义一个可以存放各种图形对象的链表类FigureLink。要求该类应该具有如下属性和操作:

属性:

① 链表头指针属性head:该属性应该是Figure类型的指针。

操作:

① 构造操作:创建一个空链表,即设置head = 0。

② 析构操作:删除链表中的所有图形对象。

③ 判空操作Empty:判断链表中是否存放了图形对象,如果链表中存放了图形对象,则返回true;否则返回false。该操作函数的原型如下:

    bool Empty();

① 插入操作Insert:该操作用于向链表中插入一个图形绘制对象,被插入的对象的地址通过参数传递。该操作函数的原型如下:

void Insert(Figure* figureNode);

          ② 检索操作Search:该操作用于在链表中检索一个指定类型的图形对象,如果被检索的图形对象存在,则返回该图形对象的地址,否则返回0。被检索图形的类型值通过参数传递。该操作函数的原型如下:

Figure* Search(TYPE type);

8. 编制一个主函数完成如下工作:

① 创建一个存放图形对象的链表(FigureLink对象);

② 创建各个图形类对象插入到链表中;

③ 编写一个菜单选择结构,并通过该菜单选择结构选择测试链表中各种图形的绘制功能,直至选择Exit菜单项退出菜单选择结构,结束程序执行。

[ 本帖最后由 lianfeng0421 于 2007-6-12 00:12 编辑 ]

未命名1.rar
(2007-06-12 00:10:23, Size: 5.14 KB, Downloads: 0)


我也来说两句 查看全部回复

最新回复