Консультация № 185369
06.02.2012, 20:06
112.27 руб.
0 7 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:Помогите написать программу. ОС Windows XP, builder 6. Код прокомментировать. Условие:
Разработать и реализовать класс "список" элементы которого содержат указатель на экземпляр класса "треугольник" или "прямоугольник".
Для класса "список" предусмотреть необходимые конструкторы, деструктор и методы, в том числе добавление нового элемента в конец списка и вывод списка (с помощью перегруженного оператора <<).
Классы "треугольник" и "прямоугольник" задаются длинами своих сторон. Все данные представляются как вещественные двойной точности.
Для классов "треугольник" и "прямоугольник" реализовать необходимые конструкторы, деструкторы и методы, в том числе виртуальные функции вычисления периметра фигуры, создания копии и вывода в поток (с помощью перегруженного оператора <<).
Написать программу, иллюстрирующую работу разработанной иерархии классов. Разрешается где это определено, использовать STL и математическую библиотеку. Разработанная иерархия классов не должна обладать избыточностью.
В базовом классе должен использоваться виртуальный деструктор.
Решение задачи нужно срочно!!!!!

Обсуждение

Неизвестный
06.02.2012, 20:46
общий
точно надо builder 6?
Сможете код перетащить из соответствующих файлов и скомпилировать в проект?
Могу сделать в VS 2008 или VS2010. Но для консольного приложения должна быть небольшая разница между различными средами разработки.
давно
Посетитель
276566
297
06.02.2012, 23:20
общий
можете сделать под vs 2008 значения не имеет
Неизвестный
07.02.2012, 10:37
общий
07.02.2012, 11:22
А что надо выводить в потом в классах треугольник и прямоугольник?
давно
Посетитель
276566
297
07.02.2012, 14:00
общий
здравствуйте! скорей всего надо вывести значение периметра и возможно длины сторон.
Неизвестный
07.02.2012, 18:30
общий
это ответ
Здравствуйте, Maverick!
Для фигур треугольник и прямоугольник создадим базовый класс фигура (Figure)
Заголовочный файл
[code lang=php h=100]#pragma once
#include <string>
#include <iostream>
#include <sstream>
class Figure
{
public:
Figure(double a = 0,double b = 0,double c = 0,double d = 0);
virtual ~Figure(void);
protected:
// первая сторона
double _A;
// вторая сторона
double _B;
// третья сторона
double _C;
// четвертая сторона
double _D;
public:
// периметр треугольника
virtual double Perimetr();
// формулы в текстовом виде
virtual std::string Formula(void);
// копирование
virtual Figure* Clone(void);

//перегруженный оператор вывода
friend std::ostream& operator <<(std::ostream& cout_, Figure* figure)
{
cout_ << figure->Formula();
return cout_;
}
};[/code]

Ресурсный файл:
[code lang=php h=100]#include "StdAfx.h"
#include "Figure.h"


Figure::Figure(double a,double b,double c,double d)
: _A(a)
, _B(b)
, _C(c)
,_D(d)
{
}


Figure::~Figure(void)
{
}


// периметр треугольника
double Figure::Perimetr()
{
return _A+_B+_C;
}


// формулы в текстовом виде
std::string Figure::Formula(void)
{
return std::string();
}


// копирование
Figure* Figure::Clone(void)
{
return new Figure(*this);
}[/code]

Производные от этого класса.
Треугольник (Triangle)
Заголовочный файл
[code lang=php h=100]#pragma once
#include "figure.h"
class Triangle :
public Figure
{
public:
Triangle(double a = 0,double b = 0,double c = 0);
~Triangle(void);
// периметр треугольника
double Perimetr(void);
// Формула фигуры в текстовом виде
std::string Formula(void);

//перегруженный оператор вывода
friend std::ostream& operator <<(std::ostream& cout_, Triangle* triangle)
{
cout_ << triangle->Formula();
return cout_;
}
// копирование
Triangle* Clone(void);
};[/code]

Ресурсный файл
[code lang=php h=100]#include "StdAfx.h"
#include "Triandle.h"


Triangle::Triangle(double a,double b,double c)
{
_A = a;
_B = b;
_C = c;
}


Triangle::~Triangle(void)
{
}


// периметр треугольника
double Triangle::Perimetr(void)
{
return _A+_B+_C;
}


// Формула фигуры в текстовом виде
std::string Triangle::Formula(void)
{
std::ostringstream ost;
ost << "A(" <<_A<< ")+B(" <<_B<< ")+C("<< _C<< ")="
<< Perimetr()<< std::endl;

std::string buf( ost.str() );
return buf;
}


// копирование
Triangle* Triangle::Clone(void)
{
return new Triangle(*this);
}
[/code]

И класс прямоугольник(четырёхугольник )(Quadrangle)
Заголовочный файл:
[code lang=php h=100]
#pragma once
#include "figure.h"
class Quadrangle :
public Figure
{
public:
Quadrangle(double a = 0,double b = 0,double c = 0,double d = 0);
~Quadrangle(void);

public:
// периметр четырёхугольника
double Perimetr(void);
// копия
Quadrangle* Copy(void);

friend std::ostream& operator <<(std::ostream& cout_, Quadrangle* quadrangle)
{
cout_ << quadrangle->Formula();
return cout_;
}
// формула в текстовом виде
std::string Formula(void);
};[/code]

Ресурсный файл:
[code lang=php h=100]#include "StdAfx.h"
#include "Quadrangle.h"


Quadrangle::Quadrangle(double a,double b,double c,double d)
{
_A = a,
_B = b;
_C = c;
_D = d;
}


Quadrangle::~Quadrangle(void)
{
}


// периметр четырёхугольника
double Quadrangle::Perimetr(void)
{
return _A+_B+_C+_D;
}


// копия
Quadrangle* Quadrangle::Copy(void)
{
return new Quadrangle(*this);
}


// формула в текстовом виде
std::string Quadrangle::Formula(void)
{
std::ostringstream ost;
ost << "A(" <<_A<< ")+B(" <<_B<< ")+C("<< _C<< ")+D("
<< _D<< ")="<< Perimetr()<< std::endl;

std::string buf( ost.str() );
return buf;
}
[/code]

В списке имеется ссылка на базовый класс фигура. При задании нового элемента пользователь определяет, каким будет элемент: или треугольником или прямоугольником
Заголовочный файл:
[code lang=php h=100]
#pragma once
//#include "Figure.h"
#include "Quadrangle.h"
#include "Triandle.h"
class MyList
{
public:
//Структура, элемент листа.
struct MainStr
{
//указатель на фигуру
Figure* figure;

//Предыдущий елемент
struct MainStr* prev;
//Следующий елемент
struct MainStr* next;
};
//Текущий элемент
struct MainStr* curr;
//Первый элемент
struct MainStr* first;
//Последний элемент
struct MainStr* last;

MyList(Figure* figure = NULL);
virtual ~MyList(void);

//Перегруженна операция вывода
friend std::ostream& operator <<(std::ostream& cout_, MyList* myList)
{
for (myList->curr= myList->first;;myList->curr = myList->curr->next )
{
cout_ << myList->curr->figure->Formula()
<<std::endl
<<"-------------------------------------"
<<std::endl;

if (myList->curr ==myList->last)
{
break;
}
}
return cout_;
}
// добавление элемента списка к концу списка
void NewElem(Figure* figure);
// Очистка листа от данных
void Clear(void);
};
[/code]

Ресурсный файл списка:
[code lang=php h=100]
#include "StdAfx.h"
#include "MyList.h"


MyList::MyList(Figure* figure)
{
first = NULL;

Triangle* tri = new Triangle(1,2,3);

NewElem(tri);
}


MyList::~MyList(void)
{
}


// добавление элемента списка к концу списка
void MyList::NewElem(Figure* _figure)
{
if(first==NULL)
{
first=new struct MainStr;

curr=first;
last=first;

curr->prev=first;
curr->next=last;

curr->figure = _figure;
}
else
{
last=new struct MainStr;
curr->next=last;
curr->next->prev=curr;
curr->next->next=last;
curr=last;

curr->figure = _figure;
}
}


// Очистка листа от данных
void MyList::Clear(void)
{
if (first!=NULL)
{
for(curr=first;curr!=last;)
{
delete curr->figure;

curr=curr->next;
delete first;
first=curr;
}
first=NULL;
}
}
[/code]

пример функции main. Ниже показано, что сначала мы инициализируем список элементом типа класс, потом добавляем элемент типа прямоугольник и выводим получившийся список на экран консольного приложения.
[code lang=php h=100]
#include "stdafx.h"
#include "MyList.h"



int _tmain(int argc, _TCHAR* argv[])
{
MyList* myList;

Triangle* triangle = new Triangle(1,2,3);

Quadrangle* quadrangle = new Quadrangle(5,6,7,8);

//При вызове конструктора создаётся первый элемент
//с указанными коэффициентами для функций
myList = new MyList(triangle);

//Добавление элемента копированием текущего
myList->NewElem(quadrangle);

//Вывод получившегося значения
std::cout << myList;

std::string a;

//чтобы экран не свернулся
std::cin>>a;

delete myList;
return 0;
}[/code]

Если надо прикладываю проект в VS2010скачать файл Geometry.zip [4.23 Mб]
давно
Посетитель
276566
297
07.02.2012, 23:38
общий
по условию перегруженный оператор вывода должен быть виртуальным для потомков базового класса.
Неизвестный
08.02.2012, 06:32
общий
08.02.2012, 06:33
перегруженный оператор << не является методом класса, он является методом класса в библиотеке STL. Мы не можем её сделать перегруженной. Для того, чтобы для каждого класса выводилась своя формула, используем метод Formula(). Он и является виртуальным для базового класса.
Форма ответа