C/C++学习笔记4 结构体联合体枚举

时间:2022-09-05 21:30:39

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

 

/* 图形绘制隐形的架构

很多种类型的图元,我要绘制它们。

*/

// 图元的类型

enum SHAPE_TYPE {

SHAPE_TRIANGLE = 0,

SHAPE_RECT = 1,

SHAPE_CIRCLE = 2,

SHAPE_NUM

};

 

struct point {

float x;

float y;

};

 

struct shape {

// int type;

enum SHAPE_TYPE type;

 

union {

struct {

struct point t0;

struct point t1;

struct point t2;

}triangle;

 

struct {

float x;

float y;

float w;

float h;

}rect;

 

struct {

float c_x;

float c_y;

float r;

}circle;

}u;

};

 

void init_circle_shape(struct shape* s, float c_x, float c_y, float r) {

s->type = SHAPE_CIRCLE;

s->u.circle.c_x = c_x;

s->u.circle.c_y = c_y;

s->u.circle.r = r;

}

 

void init_rect_shape(struct shape* s, float x, float y, float w, float h) {

s->type = SHAPE_RECT;

s->u.rect.x = x;

s->u.rect.y = y;

s->u.rect.w = w;

s->u.rect.h = h;

}

 

void draw_shapes(struct shape* shapes, int count) {

int i;

for (i = 0; i < count; i++) {

switch (shapes[i].type) {

case SHAPE_CIRCLE:{

  printf("circle %f, %f, %f\n",

  shapes[i].u.circle.c_x, shapes[i].u.circle.c_y,

  shapes[i].u.circle.r);

}

break;

case SHAPE_TRIANGLE: {

 printf("triangle %f, %f, %f, %f, %f, %f\n",

 shapes[i].u.triangle.t0.x, shapes[i].u.triangle.t0.y,

 shapes[i].u.triangle.t1.x, shapes[i].u.triangle.t1.y,

 shapes[i].u.triangle.t2.x, shapes[i].u.triangle.t2.y);

}

break;

case SHAPE_RECT: {

 printf("rect %f, %f, %f, %f\n",

 shapes[i].u.rect.x, shapes[i].u.rect.y, shapes[i].u.rect.w, shapes[i].u.rect.h);

}

break;

default: {

 printf("Warning Not a valid shape !!!!\n");

}

break;

}

}

}

 

void init_triangle_shape(struct shape* s, float x0, float y0, float x1, float y1, float x2, float y2) {

s->type = SHAPE_TRIANGLE;

s->u.triangle.t0.x = x0;

s->u.triangle.t0.y = y0;

 

s->u.triangle.t1.x = x1;

s->u.triangle.t1.y = y1;

 

s->u.triangle.t2.x = x2;

s->u.triangle.t2.y = y2;

}

 

int main(int argc, char** argv) {

struct shape shapes_set[3];

 

init_triangle_shape(&shapes_set[0], 100, 100, 200, 200, 300, 300);

init_rect_shape(&shapes_set[1], 100, 100, 200, 200);

init_circle_shape(&shapes_set[2], 100, 100, 200);

 

draw_shapes(shapes_set, 3);

 

system("pause");

return 0;

}


上面案例就是使用结构体 。联合体 ,枚举的一个综合案例,可以使用一个结构体 就能做3个功能,



struct person{

       char name[64];

       int age;

       int sex;

};


struct person p;   //这样声明可以通过 p.name,p.age,p.sex来访问和赋值

struct person* p;   //声明指针类型的,可以通过p->name,p->age,p->sex来访问和赋值



枚举:

如果没有指定枚举值 ,默认第一个从0开始 ,下一个是上一个加1

enum WEAPON_TYPE{

      JIN_TYPE,

      MU_TYPE,

      SHUI_TYPE=100,

      HUO_TYPE,

      TU_TYPE,

};


JIN_TYPE = 0

MU_TYPE = 1

SHUI_TYPE=100   //指定了值

HUO_TYPE = 101

TU_TYPE = 102