Форум кафедры Техники и Электрофизики Высоких Напряжений

Онлайн-сообщество ТВНщиков
Гостям форума:

Добро пожаловать на форум по технике высоких напряжений!
Для получения доступа ко всем разделам необходимо зарегистрироваться


Текущее время: 21 май 2018, 21:46

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Домашнее задание №3 - решение
СообщениеДобавлено: 26 окт 2017, 03:36 
Не в сети
Site Admin

Зарегистрирован: 03 сен 2008, 16:09
Сообщения: 4242
Откуда: Д-3
#include <stdio.h>
#include <malloc.h>

double calcAreaShape1(struct Shape* this);
double calcAreaShape2(struct Shape* this);
double calcAreaCircle1(struct Circle* this);
double calcAreaCircle2(struct Circle* this);

struct shape_vtbl
{
     double(*pCalcArea1)(struct Shape*);
     double(*pCalcArea2)(struct Shape*);
};

struct circle_vtbl
{
     double(*pCalcArea1)(struct Circle*);
     double(*pCalcArea2)(struct Circle*);
};

static struct shape_vtbl the_shape_vtbl = {calcAreaShape1, calcAreaShape2};
static struct circle_vtbl the_circle_vtbl = {calcAreaCircle1, calcAreaCircle2};

struct Shape
{
     struct shape_vtbl* vptr;
     double x0, y0;
};

struct Circle
{
     struct Shape Base;
     double r0;
};

void ShapeConstructor(struct Shape* this, double x, double y)
{
     this->vptr = &the_shape_vtbl;
     this->x0 = x;
     this->y0 = y;
}

void CircleConstructor(struct Circle* this, double x, double y, double r)
{
     ShapeConstructor(&(this->Base), x, y);
     this->Base.vptr = &the_circle_vtbl;
     this->r0 = r;
}

double calcAreaShape1(struct Shape* this) { return 0.; }
double calcAreaShape2(struct Shape* this) { return 1.; }
double calcAreaCircle1(struct Circle* this) { return 3.1415*this->r0*this->r0; }
double calcAreaCircle2(struct Circle* this) { return 2*3.1415*this->r0*this->r0; }

int main()
{
     struct Shape** pShapes = malloc(100 * sizeof(struct Shape*));
     pShapes[0] = malloc(sizeof(struct Shape));
     pShapes[1] = malloc(sizeof(struct Circle));

     ShapeConstructor(pShapes[0], 0, 0);
     CircleConstructor(pShapes[1], 1, 1, 2);

     for (int i = 0; i<2; i++)
     {
          printf("%g\n", pShapes[1]->vptr->pCalcArea2(pShapes[i]));
          free(pShapes[i]);
     }
     free(pShapes);
     return 0;
}


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB