软件设计师2007年11月下午试题5(C语言 面向对象)

【说明】

      在一个简化的绘图程序中,支持的图形种类有点(point)和圆(circle),在设计过程中采用面向对象思想,认为所有的点和圆都是一种图形(shape),并定义了类型shape_tpoint_tcircle_t分别表示基本图形、点和圆,并且点和圆具有基本图形的所有特征。

[C代码] 

typedef enum { point,circle } shape_type;   /* 程序中的两种图形:点和圆 */

    typedef struct {            /* 基本的图形类型 */

    shape_type  type; /* 图形种类标识:点或者圆 */

    void (*destroy)(); /* 销毁图形操作的函数指针 */

    void (*draw)();  /* 绘制图形操作的函数指针 */

} shape_t;  

 

typedef struct { shape_t common;  int x;  int y; } point_t;  /* 定义点类型,xy为点坐标 */

void destroyPoint(point_t* this) { free(this); printf("Point destoryed!\n"); }  /* 销毁点对象 */

void drawPoint(point_t* this) { printf("P(%d,%d)", this->x, this->y); }  /* 绘制点对象 */

shape_t* createPoint(va_list* ap) {  /* 创建点对象,并设置其属性 */

    point_t*  p_point;

    if( (p_point = (point_t*)malloc(sizeof(point_t))) == NULL ) return NULL;

    p_point->common.type = point;    p_point->common.destroy = destroyPoint;

    p_point->common.draw = drawPoint;

    p_point->x = va_arg(*ap, int);       /* 设置点的横坐标 */

    p_point->y = va_arg(*ap, int);       /* 设置点的纵坐标 */

    return (shape_t*)p_point;           /* 返回点对象指针 */

 

typedef struct { /* 定义圆类型 */

    shape_t  common; 

    point_t  *center;  /* 圆心点 */ 

    int   radius;     /* 圆半径 */

} circle_t;

 

void destroyCircle(circle_t* this){  

    free(this->center);  free(this);  printf("Circle destoryed!\n"); 

}

void drawCircle(circle_t* this) {

     printf("C("); 

     this->center->common.draw( this->center );       /* 绘制圆心 */

     printf(",%d)", this->radius);

}

 

shape_t* createCircle(va_list* ap) {   /* 创建一个圆,并设置其属性 */

    circle_t*  p_circle; 

    if( (p_circle = (circle_t*)malloc(sizeof(circle_t))) == NULL ) return NULL;

    p_circle->common.type = circle;    p_circle->common.destroy = destroyCircle;

    p_circle->common.draw = drawCircle;

    p_circle->center= createPoint(ap);       /* 设置圆心 */

    p_circle->radius = va_arg(*ap, int);   /* 设置圆半径 */

    return  p_circle;

shape_t* createShape(shape_type st, ...) {  /* 创建某一种具体的图形 */

    va_list   ap;                     /* 可变参数列表 */

    shape_t*  p_shape = NULL;

    va_start(ap, st); 

    if( st == point ) p_shape = createPoint( &ap);   /* 创建点对象 */

    if( st == circle ) p_shape = createCircle(&ap);   /* 创建圆对象 */

    va_end(ap); 

    return p_shape;

 

int main( ) {

    int i;              /* 循环控制变量,用于循环计数 */

    shape_t* shapes[2];  /* 图形指针数组,存储图形的地址 */

    shapes[0] = createShape( point, 2, 3);       /* 横坐标为2,纵坐标为3 */

    shapes[1] = createShape( circle, 20, 40, 10);  /* 圆心坐标(20,40),半径为10 */

    for(i=0; i<2; i++) { shapes[i]->draw(shapes[i]);  printf("\n");  } /* 绘制数组中图形 */

    for( i = 1; i >= 0; i-- )  shapes[i]->destroy(shapes[i]);     /* 销毁数组中图形 */

    return 0;

}

 

[运行结果]

P(2,3)

C(P(20,40),10) 

Circle destoryed!

Point destoryed!

原文地址:https://www.cnblogs.com/djcsch2001/p/2094965.html