Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Turbo C] Определение принадлежности к классу, графические объекты 
V
    Опции темы
Dr1v3r
Дата 1.12.2004, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 1.12.2004
Где: Russia

Репутация: нет
Всего: нет



нужно написать прогу на турбо си

вопщем нужно спроектировать и реализовать классы графических объектов . Спроектировать и реализовать новый класс , объединяющий объекты , осуществляющий контроль состояния объектов , принадлежащим другим классам , в процессе выполнения программы.

Описание поведения объектов:
создаются несколько экземпляров графических объектов разных классов . Объект контроллер по запросу определяет принадлежность к классу существующих объектов
Добавлено @ 16:49
или если у кого есть что нить подобное выложите исходник плиз
PM MAIL ICQ   Вверх
alien_by
Дата 1.12.2004, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 29.11.2004
Где: Belarus/Gomel

Репутация: 2
Всего: 8



Вообщем не совсем понятно что нужно сделать.
Набросал небольшую иерархию классов, может быть поможет.
Класс GraphFactory - контроллер. Создаёт и идентифицирует инстансы.

Код

class GraphPrimitive
{
friend class GraphFactory;

protected:
int m_x;
int m_y;

GraphPrimitive(){}
GraphPrimitive(int x, int y)
{
 m_x = x;
 m_y = y;
}

virtual int Identify() = 0;
};

class GraphPoint : public GraphPrimitive
{
friend class GraphFactory;
protected:
GraphPoint(int x, int y)
{
 GraphPrimitive::GraphPrimitive(x, y);
}

int Identify()
{
 return 0;
}
};

class GraphCircle : public GraphPrimitive
{
friend class GraphFactory;
protected:
int m_radius;

GraphCircle(int x, int y, int r)  
{
 GraphPrimitive::GraphPrimitive(x, y);
 m_radius = r;
}

int Identify()
{
 return 1;
}
};

class GraphLine : public GraphPrimitive
{
friend class GraphFactory;
protected:
int m_endx, m_endy;

GraphLine() {}
GraphLine(int sx, int sy, int ex, int ey)  
{
 GraphPrimitive::GraphPrimitive(sx, sy);

 m_endx = ex;
 m_endy = ey;
}

int Identify()
{
 return 2;
}
};

class GraphBox : public GraphLine
{
friend class GraphFactory;
protected:
GraphBox(int sx, int sy, int ex, int ey)  
{
 GraphLine::GraphLine(sx, sy, ex, ey);
}

int Identify()
{
 return 3;
}
};

class GraphFactory
{
public:
GraphPrimitive* Point(int px, int py)
{
 return new GraphPoint(px, py);
}
GraphPrimitive* Circle(int cx, int cy, int radius)
{
 return new GraphCircle(cx, cy, radius);
}
GraphPrimitive* Line(int sx, int sy, int ex, int ey)
{
 return new GraphLine(sx, sy, ex, ey);
}
GraphPrimitive* Box(int sx, int sy, int ex, int ey)
{
 return new GraphBox(sx, sy, ex, ey);
}

void Identify(GraphPrimitive* prim)
{
 switch(prim->Identify())
 {
 case 0:
  std::cout << "This primitive is pertains to Point class." << std::endl;
  break;
 case 1:
  std::cout << "This primitive is pertains to Circle class." << std::endl;
  break;
 case 2:
  std::cout << "This primitive is pertains to Line class." << std::endl;
  break;
 case 3:
  std::cout << "This primitive is pertains to Box class." << std::endl;
  break;
 }
}
};

PM MAIL ICQ   Вверх
Dr1v3r
Дата 2.12.2004, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 1.12.2004
Где: Russia

Репутация: нет
Всего: нет



alien_by , спасибо , правда это немного не то .
ладно бум думать дальше smile
PM MAIL ICQ   Вверх
alien_by
Дата 2.12.2004, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 29.11.2004
Где: Belarus/Gomel

Репутация: 2
Всего: 8



Поясни плз, что конкретно тебе нужно.
PM MAIL ICQ   Вверх
bel_nikita
Дата 2.12.2004, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: нет
Всего: 47



Цитата
правда это немного не то .

RTTI тогда smile Но разве в Турбо Си есть RTTI?
Можно еще красиво через шаблоны, но опять же Турбо Си... smile

Это сообщение отредактировал(а) bel_nikita - 2.12.2004, 15:29


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Dr1v3r
Дата 2.12.2004, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 1.12.2004
Где: Russia

Репутация: нет
Всего: нет



alien_by , если более точно , то по словам препода нужно следующее :

например у нас создаются графические объекты ( кружочки квадратики , домики , окружности и т.п.) , мы тыкаем мышкой
в какой нить объект (например в кружочек) и нам говорят , что это : объект кружочек класса окружности

примерно так ... вот , помогите плиз , заранее спасибо
PM MAIL ICQ   Вверх
alien_by
Дата 3.12.2004, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 29.11.2004
Где: Belarus/Gomel

Репутация: 2
Всего: 8



[s]Вот что я могу тебе подсказать (извини, всю прогу написать немогу, нет времени, да и турбо с под рукой нет).

Как под ДОС работать с мышью.
Код

#include <dos.h>

// Инициализирует мышь, возвращает число кнопок
// _AX, _BX - стандартные переменные отражающие регистры процессора
int mouseInit()
{
  int result = 0;

  _AX = 0x0000;
  geninterrupt(0x33);
  if ( _AX == 0xFFFF )
     result = _BX;

  return result;
}

// Показывает/скрывает курсор мыши
// Если 0 - скрывает, иначе показывает
void mouseShowPointer(int show)
{
   if ( !show )
     _AX = 0x0002;
   else
     _AX = 0x0001;

   geninterrupt(0x33);
}

// Опрашивает состояние мыши
// переменная btn будет содержать закодированное значение нажатых кнопок
// btn&1 - левая кнопка, btn&2 - правая кнопка, btn&4 - центральная кнопка.
void mouseQuery(int *x, int* y, int* btn)
{
   _AX = 0x0003;
   geninterrupt(0x33);

   *btn = _BX;
   *x = _CX;
   *y = _DX;
}


Этих функций должно хватить.
Если интересуешься мышью, то поищи в нете описание фсех функций 33h препывания.

Теперь что касается графических обьектов.

Все классы которые я выкладывал подойдут и для этой задачи.
Их надо немножко модифицировать.
В класс GraphPrimitive нужно добавить два виртуальных метода.
Например
Код

....
protected:
  // будет определять находится ли указатель с координатами x, y над данным обьектом.
  virtual int IsPointInThis(int x, int y);

  // будет собственно рисовать фигуру.
  virtual void Draw();


А в наследниках определи эти методы и задай алгоритмы.
Т.е. например для круга
Код

  ...
  int  IsPointInThis(int x, int y)
  {
      if ( x >= m_radius - m_x && x <= m_radius + m_x &&
          y >= m_radius - m_y && y <= m_radius + m_y )
          return 1;
      else
          return 0;
  }

  void Draw()
  {
       setcolor(5);
       circle(m_x, m_y, m_radius);
  }


Функции рисования всех примитивов имиются в библиотеке bgi, поставляемой со всеми средами фирмы Борланд. О ней почитай в хелпе. Там всё просто.
Аналогичным образом определяешь эти функции для остальных фигур.

И последнее.
Я так понимаю, если изначально разговор вёлся о создании классов, то твоя версия поддерживает ООП, исходя из этого предпологаю, что она также поддерживает и stl.

Млдифицируем класс контроллер.
Код

...
private:
  // вектор обьектов GraphPrimitive*
  std::vector<GraphPrimitive*> m_primitives;

public:
  // модифицируем функции типа Line, Circle, Box, так, чтобы при создании они добавляли
  // созданный элемент в вектор, например
 GraphPrimitive* Circle(int cx, int cy, int radius)
 {
    GraphPrimitive* prim = new GraphCircle(cx, cy, radius);
    m_primitives.push_back(prim);
    return prim;
 }

  // Описываем метод draw, который рисует все обьекты
  void Draw()
  {
     for(std::vector<GraphPrimitive*>::iterator it = m_primitives.begin();
           it != m_primitives.end(); it++)
         *it->Draw();
  }

  // Изменяем метод Identify
  int Identify(int x, int y)
  {
     GraphPrimitive* prim;

     for(std::vector<GraphPrimitive*>::iterator it = m_primitives.begin();
           it != m_primitives.end(); it++)
         if ( *it->IsPointInThis(x, y) )
         {
             prim = *it;
             break;
         }

      // Здесь можно либо возвращать идентификатор фигуры, а потом его где-нибудь
      // анализировать, либо сразу анализоровать и выводить на экран в красивом виде
      // например в самой нижней строке экрана.

      // Я, просто возвращаю идентификатор
      return prim->Identify();
  }
  // Как ты видишь, эта функция вернёт первый попавшийся обьект, удовлетворяющий
  // позиции курсора, если обьекты не пересекаются то это нормально, однако если они        
  // пересекаются, то будет возвращён только один из них.
  // Можешь разобраться как сделать, чтобы  возвращались все обьекты пересекающиеся
  // под курсором.

  // И последнее, не забудь описать деструктор
  ~GraphFactory::GraphFactory()
  {
     for(std::vector<GraphPrimitive*>::iterator it = m_primitives.begin();
           it != m_primitives.end(); it++)
        delete *it;

     m_primitives.clear();
  }


Ну вот вроде-бы и всё..
Тебе остаётся только разобраться как работает графическая подсистема (bgi), описать недостающие методы, ну и разработать некий интерфейс. Дерзай. smile
PM MAIL ICQ   Вверх
Dr1v3r
Дата 5.12.2004, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 1.12.2004
Где: Russia

Репутация: нет
Всего: нет



alien_by , спасибо , очень помог
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0513 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.