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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задание о наследовании 
V
    Опции темы
Recev
Дата 19.3.2011, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Вот что я набросал:
Код

//line.h
#include <conio.h>
#define line_h
#ifndef line_h1

class line
{
public:
int x,y;
int a1, a2, b1, b2;
public:
void getLine();
void showLine();
};

#endif


Код

//line.cpp
#include <conio.h>
#include <iostream.h>
#include "line.h"

void line::getLine()
{
cout << "Inp. x and y coordinates A(x, y): x ->";
cin >> x; cout << " y->"; cin >> y;
a1 = x; b1 = y;
cout << "\nInp. x and y coordinates B(x, y): x ->";
cin >> x; cout << " y->"; cin >> y;
a2 = x; b2 = y;
}

void line::showLine()
{
cout << "\nLine with coordinates: A(" << a1 << ";" << b1 << ") B(" << a2 << ";" << b2 << ") has been created.";
}


Код

//driverLine.cpp
#include <conio.h>
#include <iostream.h>
#include "line.cpp"

void main()
{
line l1;
l1.getLine();
l1.showLine();
getch();
}

Здесь вроде все нормально но начались проблемы со следующим производным классом: прямоугольник

Код

//rect.h
#include <conio.h>
#include "line.h"
#define rect_h
#ifndef rect_h1

class rect : public line
{
int a3, b3, a4, b4;
public:
void getRect();
void showRect();
void squareRect();
};

#endif


Код

//rect.cpp
#include <conio.h>
#include <iostream.h>
#include "rect.h"

void rect::getRect()
{
cout << "Coordinates A and B was taked from line : A(" << a1 << ";" <<  b1 << ") B("<< a2 << ";" <<  b2 << ")"<< endl;
cout << "Inp. x and y coordinates C(x, y): x->";
cin >> x; cout <<" y->"; cin >> y;
a3 = x; b3 = y;
cout << "Inp. x and y coordinates D(x, y): x->";
cin >> x; cout <<" y->"; cin >> y;
a4 = x; b4 = y;
}

void rect::showRect()
{
cout << "Rectangle with coordinates: A(" << a1 << ";" << b1 << ") B(" << a2 << ";" << b2
<< ") C(" << a3 << ";" << b3 << ") D(" << a4 << ";" << b4 << ") has been created.";
}


Код

//driverRect.cpp
#include <conio.h>
#include <iostream.h>
#include "rect.cpp"

void main()
{
rect r;
r.getLine();
r.getRect();
r.showRect();
getch();
}


Помогите пожалуйста.

Это сообщение отредактировал(а) Recev - 19.3.2011, 14:53
PM MAIL   Вверх
mes
Дата 19.3.2011, 15:38 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



Цитата(Recev @  19.3.2011,  13:51 Найти цитируемый пост)
Создать иерархию классов : линия - прямоугольник -  пирамида.

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



--------------------
PM MAIL WWW   Вверх
Recev
Дата 19.3.2011, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я попросил помочь исправить код. Линия - часть прямоугольника, прямоугольник - часть правильной пирамиды.
Если такая тема обсуждалась, дайте ссылку.  

Это сообщение отредактировал(а) Recev - 19.3.2011, 19:00
PM MAIL   Вверх
mes
Дата 19.3.2011, 20:08 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



Цитата(Recev @  19.3.2011,  17:58 Найти цитируемый пост)
Линия - часть прямоугольника, прямоугольник - часть правильной пирамиды.

вот именно - часть... и таких частей несколько..  а у Вас стоит :
Цитата

Код

class rect : public line {..


что означает: "прямоугольник это линия, которая .. "

Цитата(Recev @  19.3.2011,  17:58 Найти цитируемый пост)
Я попросил помочь исправить код

ну так и помогаю.. подсказываю что выбрали не удачную модель, не позволяющую полноценно решить задачу..

Цитата(Recev @  19.3.2011,  17:58 Найти цитируемый пост)
Если такая тема обсуждалась, дайте ссылку.  

предлагаете поискать за Вас ?


--------------------
PM MAIL WWW   Вверх
Recev
Дата 19.3.2011, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хорошо, какую модель предложите Вы?

Я искал, но ничего так и не нашел. Если Вам не тяжело - поищите.

Это сообщение отредактировал(а) Recev - 19.3.2011, 20:54
PM MAIL   Вверх
mes
Дата 19.3.2011, 21:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



Цитата(Recev @  19.3.2011,  19:19 Найти цитируемый пост)
Хорошо, какую модель предложите Вы?

сформулируйте задачу как можно более точно, чтоб стало понятно какая из моделей Вам больше подходит..

Добавлено через 3 минуты и 15 секунд
Цитата(Recev @  19.3.2011,  19:19 Найти цитируемый пост)
 Если Вам не тяжело - поищите.

погуглите на тему The Liskov Substitution Principle, там вроде на примере квадрата и прямоугольника разобран этот вопрос.. 



--------------------
PM MAIL WWW   Вверх
Recev
Дата 28.3.2011, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Написал я какой-то бред но после того как пристроил туда последний класс - программа перестала работать =( не знаю почему.
Помогите исправить, все файлы во вложении.

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  1.rar 4,00 Kb
PM MAIL   Вверх
Recev
Дата 28.3.2011, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



При написании пользовался книгой Дейтела "Как программировать на C++". страница 557

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  1.rar 4,00 Kb
PM MAIL   Вверх
mes
Дата 28.3.2011, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

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



Цитата(Recev @  28.3.2011,  16:18 Найти цитируемый пост)
программа перестала работать =( 
ну так какую ошибку выдает компилятор то?

проект не такой большой чтоб его выкладывать архивом..
гораздо удобнее было выложить на онлайн-компиляторе, например, codepad.org или liveworkspace.org.. а еще лучше если бы выделили сомнительные моменты, и выложили бы только их..

Добавлено через 3 минуты и 1 секунду
к разговору о наследовании..
зачем rect`у метод setLine ?

Цитата

rect (float X1 = 0, float X2 = 0, float X3 = 0, float X4 = 0, float Y1 = 0, float Y2 = 0, float Y3 = 0, float Y4 = 0);

для rect`a достаточно двух точек (4 флоата) например верхний левый и  нижний правый.. 



--------------------
PM MAIL WWW   Вверх
baldina
Дата 28.3.2011, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



Цитата(Recev @  28.3.2011,  17:20 Найти цитируемый пост)
При написании пользовался книгой Дейтела "Как программировать на C++". страница 557 

надо остальные страницы осилить, иначе ничего не выйдет

Цитата(Recev @  19.3.2011,  14:51 Найти цитируемый пост)
Создать иерархию классов : линия - прямоугольник -  пирамида

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

таким образом, линия, прямоугольник и пирамида не связаны отношениями наследования. но они могут являться частью одной иерархии, например:
Код

class shape { // фигура
 private:
  point origin; // точка привязки
 public:
  shape (const point& o) : origin(o) {}
  virtual void draw() const = 0; // нарисовать
  point getOrigin () const { return origin; }
};

class linear : public shape { // линейная фигура
  public:
    linear (const point& start) : shape(start) {}
    virtual double length () const = 0; // длина линии ("объем" одномерной фигуры)
  ...
};
  
class line : public linear { // линия (отрезок)
    point theEnd;
  public:
    line (const point& start, const point& end) : linear (start), theEnd(end) {}
    double length () const { return sqrt(pow(theEnd.x-getOrigin().x, 2))+pow(theEnd.y-getOrigin().y,2)); }
    point get_end() const { return theEnd; }
};

class surface : public shape { // поверхность
  public:
    ...
    double square () const = 0; // площадь поверхности
    ...
};

class rect : public surface {
    point theCorner;
    ...
    rect (const point& origin, const point& corner) : surface (origin), corner (theCorner) {}
    double square () const { return abs((theCorner.x-getOrigin().x)*(theCorner.y-getOrigin().y)); }
    ...
};

а вот для рисования, скажем, прямоугольника, вполне уместно пользоваться рисованием линий, что-то вроде:
Код

void rect::draw () const {
  point p1(getOrigin()), p2 (getCorner ());
  line (p1, point (p1.x, p2.y)).draw ();
  line (point (p1.x, p2.y), p2).draw ();
  line (p2, point (p2.x, p1.y)).draw ();
  line (point (p2.x, p1.y), p1).draw ();
};

PM MAIL   Вверх
Recev
Дата 28.3.2011, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Компилятор ошибок не выдает, винда выдает ошибку типа "программа не правильно работает, искать решение в интернете?"
Ошибка вылетает тогда, когда программа доходит до того места где идет работа с piramidPtr.

Задание по-другому делать нельзя, только так как я (точнее так препод сказал).
PM MAIL   Вверх
baldina
Дата 28.3.2011, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



эта ошибка - обращение по неверному адресу памяти
Код

piramidPtr = (piramid *) rectPtr;

зачем вот тут мы указателю на пирамиду присваиваем адрес прямоугольника? ужос
а ку препода таки спроси про иерархию наследования и принцип "является"
PM MAIL   Вверх
Recev
Дата 28.3.2011, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Затем чтобы сделать прямоугольник основанием пирамиды.
PM MAIL   Вверх
Recev
Дата 28.3.2011, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Немного изменил программу по вашему совету (линия - диагональ), но с piramidPtr так ничего и не получается.

Код

//rect.h

#ifndef RECT_H
#define RECT_H
#include <iostream.h>
#include <iomanip.h>
#include "line.h"

class rect : public line
{
friend ostream &operator<< (ostream &, const rect &);
protected:
float x3, x4, y3, y4;
public:
rect (float X1 = 0, float X3 = 0, float Y1 = 0, float Y3 = 0);
void setRect(float, float, float, float);
int area () const;
};

#endif

Код

//rect.cpp

#include <iostream.h>
#include "rect.h"

rect::rect (float X1, float Y1,float X3, float Y3)
: line ( X1, Y1, X3, Y3)
{
x3 = X3;
y3 = Y3;
x1 = X1;
y1 = Y1;
x2 = X1;
y2 = Y3;
x4 = X3;
y4 = Y1;
}

int rect::area() const
{
int A;
A = abs(((y2 - y1) + (x2 - x1)) * ((x3 - x2) + (y3 - y2)));
return A;
}

void rect::setRect(float a3, float b3, float a4, float b4)
{
x3 = a3;
x4 = a4;
y3 = b3;
y4 = b4;
}

ostream &operator<< (ostream &output, const rect &r)
{
output << "A[" << r.x1 << "," << r.y1 << "] B[" << r.x2 << "," << r.y2 << "] C["
/*<< setiosflags(ios::showpoint) << setprecision(1) */<< r.x3 << "," << r.y3 << "] D["
<< r.x4 << "," << r.y4 << "]";
return output;
}

Код

//piramida.h

#ifndef PIRAMID_H
#define PIRAMID_H
#include "rect.h"
#include <iostream.h>
#include <iomanip.h>

class piramid : public rect
{
friend ostream &operator<< (ostream &, const piramid &);
protected:
float x5, y5, h;
public:
piramid (float X1 = 0, float X3 = 0, float X5 = 0, float Y1 = 0, float Y3 = 0, float Y5 = 0);
void setVersh (float, float);
void setHght(float);
float vol (rect);
};

#endif

Код

//piramida.cpp

#include "piramida.h"
#include "rect.h"
#include <iostream.h>
#include <iomanip.h>

void piramid::setVersh (float a, float b)
{
x5 = a;
y5 = b;
}

void piramid::setHght(float H)
{
h = H;
}

float piramid::vol (rect r1)
{
float v;
v = (1/3 * r1.area() * h);
return v;
}

piramid::piramid (float X1, float Y1, float X3, float Y3, float X5, float Y5)
: rect ( X1, Y1,X3, Y3)
{
x5 = X5;
y5 = Y5;
x2 = X1;
y2 = Y3;
x4 = X3;
y4 = Y1;
}

ostream &operator<< (ostream &output, const piramid &p)
{
output << "A[" << setiosflags(ios::showpoint) << setprecision(1)  << p.x1 << " ; "
<< p.y1 << "] B[" << p.x2 << " ; " << p.y2 << "] C["
<< p.x3 << " ; " << p.y3 << "] D[" << p.x4 << " ; " << p.y4 << "] Vershyna[" << p.x5 << " ; " << p.y5 << "]";
return output;
}

Код

//Drv.cpp

#include <conio.h>
#include <iostream.h>
#include <iomanip.h>
#include "line.cpp"
#include "rect.cpp"
#include "piramida.cpp"

void main()
{
line *linePtr, l(1, 1, 5, 4);
rect *rectPtr, r(1, 1, 5, 4);
piramid *piramidPtr, p(1, 1, 5, 4, 3, 2);
cout << "Line l : \n" << l << endl << endl << "Rect r : \n" << r << endl
<< "Area = " << r.area()<< " od2" << endl;
linePtr = &l;
rectPtr = (rect *) linePtr;
rectPtr->setRect(5, 4, 5, 1);
cout << endl << "Rect (rectPtr): " << endl << setiosflags(ios::showpoint) << setprecision(2) << *rectPtr << endl;
p.setHght(4);
cout << endl <<"\nPiramid p : \n" << p << endl;
piramidPtr = &p;
piramidPtr = (piramid *) rectPtr;
piramidPtr->setVersh(3, 2);
piramidPtr->setHght(4);
cout << endl <<"\nPiramid piramidPtr : " << *piramidPtr << endl <<"Press any key to exit...";
getch();
}

PM MAIL   Вверх
миг
Дата 28.3.2011, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Recev @  19.3.2011,  18:58 Найти цитируемый пост)
Линия - часть прямоугольника, прямоугольник - часть правильной пирамиды.

а линия это часть точки? но у вас класс "линий" не стал наследовать класс "точек")).. вам легче было создать координаты точек в классе "линия", т.к. наследуются свойства класса, а не количество объектов(точек) этого класса..
--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


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

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


 




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


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

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