• 软件设计师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!

  • 相关阅读:
    crt中文乱码
    idea使用git版本控制忽略部分文件
    Springboot配置redis连接池参数
    redis通过lua脚本实现分布式锁
    jodaTime的使用
    jmap的使用
    代理服务器没有响应解决方案
    C/C/C++中暂停调试的三种方法C++中暂停调试的三种方法
    C/C/C++中暂停调试的三种方法C++中暂停调试的三种方法
    四种常见的post请求中的参数形式
  • 原文地址:https://www.cnblogs.com/djcsch2001/p/2094965.html
Copyright © 2020-2023  润新知