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

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

【说明】

      在一个简化的绘图程序中,支持的图形种类有点(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!

相关文章
|
6月前
|
C语言 iOS开发 MacOS
Objective-C是一种面向对象的编程语言,它扩展了C语言,添加了面向对象编程的特性
【5月更文挑战第9天】Objective-C是苹果公司的面向对象编程语言,用于iOS和macOS应用开发。它扩展了C语言,包含类定义(接口和实现)、对象创建、消息传递、属性、协议、块和类别等语法特性。例如,类通过`@interface`和`@implementation`定义,对象用`alloc`和`init`创建,方法通过消息传递调用。属性简化变量声明,协议定义可选方法集合,块支持代码块作为参数,类别用于扩展已有类。错误处理常使用NSError对象。要深入了解,建议查阅相关教程和文档。
59 0
|
存储 编译器 C语言
C语言进阶——指针进阶试题讲解(万字长文详解)
C语言进阶——指针进阶试题讲解(万字长文详解
55074 7
C语言进阶——指针进阶试题讲解(万字长文详解)
|
存储 C语言 C++
C语言面向对象
C语言面向对象
89 1
C语言面向对象
|
存储 编译器 C语言
C语言进阶——指针进阶试题讲解(万字长文详解)
指针,一块存储其他内存块地址的空间,不仅能监管别人的地址信息,还拥有属于自己的地址。在取地址操作符(&)与解引用操作符(*)的“双重折磨”下,很多人对指针望而生畏,常常会掉进不规范使用指针而引发错误的大坑中。本文旨在通过众多例子来带大家理解指针(主要包含sizeof、strlen和多道指针笔试题),本文篇幅可能较长,请系好安全带,跟我走!
69 0
C语言进阶——指针进阶试题讲解(万字长文详解)
|
存储 C语言 C++
C语言面向对象
C语言面向对象
70 0
|
存储 程序员 开发工具
面向对象的程序设计C++课堂复盘总结 C语言复习+C++基础语法
Stay Hungry,Stay Foolish. 任何人都能写出机器能看懂的代码,但只有优秀的程序员才能写出人能看懂的代码。 有两种写程序的方式:一种是把代码写得非常复杂,以至于 “看不出明显的错误”;另一种是把代码写得非常简单,以至于 “明显看不出错误”。 “把正确的代码改快速”,要比 “把快速的代码改正确”,容易得太多。 C++ 庞大、复杂是无法改变的事实,所以我们要把这三条格言铭记在心,对它保持一颗 “敬畏” 的心,在学习语言特性的同时,千万不要滥用特性,谦虚谨慎,戒骄戒躁。 -------CSDN Albert Edison
299 0
|
存储 算法 编译器
认知篇----C语言中面向对象的核心思想
认知篇----C语言中面向对象的核心思想
159 0
认知篇----C语言中面向对象的核心思想
|
存储 C语言
软件评测师2020年考试上午C语言试题解析
软件评测师2020年考试上午C语言试题解析
140 0
|
程序员 编译器 C语言
[软考考点解析]软件设计师--C语言存储空间
1. 题目 C程序中全局变量存储空间在____分配。 A 代码区 B 静态数据区 C 栈区 D 堆区
138 0
|
存储 文件存储 C语言
软件设计师2005年11月试题4(C语言 散列文件存储)
散列文件的存储单位称为桶(BUCKET) 。假如一个桶能存放m个记录,当桶中已有m个同义词(散列函数值相同)的记录时,存放第m+1 个同义词会发生"溢出"。此时需要将第m+1 个同义词存放到另一个称为"溢出桶"的桶中。
717 0