Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик
Статус: Академик
Рейтинг: 9423
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Академик
Рейтинг: 3853
∙ повысить рейтинг »
CradleA
Статус: Бакалавр
Рейтинг: 2606
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1722
Дата выхода:09.02.2012, 20:30
Администратор рассылки:Киселёва Алёна aka Verena (Профессор)
Подписчиков / экспертов:213 / 130
Вопросов / ответов:1 / 1

Консультация # 185369: Уважаемые эксперты! Пожалуйста, ответьте на вопрос:Помогите написать программу. ОС Windows XP, builder 6. Код прокомментировать. Условие: Разработать и реализовать класс "список" элементы которого содержат указатель на экземпляр класса "треугольник" или "прямоугольник". Для класса "список" предусмотреть...


Консультация # 185369:

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

Дата отправки: 06.02.2012, 20:06
Вопрос задал: Maverick (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Алексей К. (1-й класс):

Здравствуйте, Maverick!
Для фигур треугольник и прямоугольник создадим базовый класс фигура (Figure)
Заголовочный файл

Код (PHP):
#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_;
	}
};


Ресурсный файл:
Код (PHP):
#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);
}


Производные от этого класса.
Треугольник (Triangle)
Заголовочный файл
Код (PHP):
#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);
};


Ресурсный файл
Код (PHP):
#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);
}


И класс прямоугольник(четырёхугольник )(Quadrangle)
Заголовочный файл:
Код (PHP):
#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);
};


Ресурсный файл:
Код (PHP):
#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;
}


В списке имеется ссылка на базовый класс фигура. При задании нового элемента пользователь определяет, каким будет элемент: или треугольником или прямоугольником
Заголовочный файл:
Код (PHP):
#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);
};


Ресурсный файл списка:
Код (PHP):
#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;
	}
}


пример функции main. Ниже показано, что сначала мы инициализируем список элементом типа класс, потом добавляем элемент типа прямоугольник и выводим получившийся список на экран консольного приложения.
Код (PHP):
#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;
}


Если надо прикладываю проект в VS2010скачать файл Geometry.zip [4.23 Mб]

Консультировал: Алексей К. (1-й класс)
Дата отправки: 07.02.2012, 18:30
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное