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

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


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

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

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

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

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

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

Консультация # 185298: Здравствуйте! Прошу помощи в следующем вопросе: Помогите написать программу. ОС windows xp, vs 2005, builder c++ 6. Код прокомментировать. Разработать и реализовать класс "вектор" элементы которого содержат указатель на описатель некоторой математической функции. Память под элементы вектора выделяется статически. Для класса вектор ...


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

Здравствуйте! Прошу помощи в следующем вопросе: Помогите написать программу. ОС windows xp, vs 2005, builder c++ 6. Код прокомментировать.
Разработать и реализовать класс "вектор" элементы которого содержат указатель на описатель некоторой математической функции. Память под элементы вектора выделяется статически.
Для класса вектор предусмотреть необходимые конструкторы, деструктор и методы, в том числе обеспечивающие работу с элементами вектора( с помощью перегруженного оператора []) и вывод вектора в поток ( с помощью перегруженного оператора <<).
Математические функции определяются в терминах математических выражений и задаются своими коэффициентами( вещественные двойной точности). Определены следующие математические выражения.
линейное выражение(<lexp>)-имеет вид В*х;
степенное выражение(<pexp>)-имеет вид А/х;
Должны поддерживаться следующие классы математических функций:
линейная функция-имеет вид <lexp>+C
с тепенная функция-имеет вид <pexp>+C
составная функция-имеет вид <lexp>+<pexp>+C
Здесь А,В,С-коэффициенты функций
Для каждой функции реализовать необходимые конструкторы, деструктор и методы, в том числе виртуальные методы создания копий объекта, вычисления значения первой производной функции в заданной точке и вывода в поток в виде соответствующей математической формулы(с помощью перегруженного оператора <<).
При разработке использовать контейнерный класс.
Написать программу, иллюстрирующую работу разработанной иерархии классов. Разрешается где это определено, использовать STL и математическую библиотеку. Разработанная иерархия классов не должна обладать избыточностью.

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


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

Здравствуйте, Maverick!
В этой программе создадим два класса: Класс линейных функций(LineFunc) и класс степенных функций(PowerFunc).

LineFunc
Заголовочный файл

Код (PHP):
#pragma once
#include <iostream>
#include <string>
#include <sstream>
#include <math.h>

using namespace std;
//Класс линейной функции
class LineFunc 
{
public:
	LineFunc(double b = 0,double c = 0);
	~LineFunc(void);
	// Получение значения производной в точке
	double Dericate(double inX);
	// Вывод в текстовом виде формулы первой производной
	string DericateFormula(void);
	// Копия объекта
	LineFunc* Clone(void);

	//Прегруженный оператор вывода
	friend ostream& operator<<(ostream& cout_, LineFunc& lineFunc)
	{
		cout_ << lineFunc.DericateFormula ()<< endl;
		return cout_;
	}
private:
	// Коэффициент В
	double B;
	// коэффициент С
	double С;
};


Ресурсный файл

Код (PHP):
#include "StdAfx.h"
#include "LineFunc.h"


LineFunc::LineFunc(double b,double c)
: B(b)
, С(c)
{
}


LineFunc::~LineFunc(void)
{
}


// Получение значения производной в точке
double LineFunc::Dericate(double inX)
{
	return B*pow(inX,0);
}


// Вывод в текстовом виде формулы первой производной
string LineFunc::DericateFormula(void)
{
	ostringstream ost;
	ost << B <<"*x^0";
	string buf( ost.str() );
	return buf;
}


// Копия объекта
LineFunc* LineFunc::Clone(void)
{
	return new LineFunc(*this);
}



PowerFunc

Заголовочный файл

Код (PHP):
#pragma once
#include <iostream>
#include <string>
#include <sstream>
#include <math.h>

using namespace std;
//Класс степенной функции
class PowerFunc 
{
public:
	PowerFunc(double a = 0,double c=0);
	~PowerFunc(void);
	// Получение значения производной в этой точке
	double Dericate(double inX);
	// Вывод формулы производной в текстовом виде
	string DerivateFormula(void);
	// Копирование обекта
	PowerFunc* Clone(void);

	//Прегруженный оператор вывода
	friend ostream& operator<<(ostream& cout_, PowerFunc& powerFunc)
	{
		cout_ << powerFunc.DerivateFormula ()<< endl;
		return cout_;
	}

private:
	// Коэффициент А
	double A;
	// Коэффициент С
	double C;
};




ресурсный файл

Код (PHP):
#include "StdAfx.h"
#include "PowerFunc.h"


PowerFunc::PowerFunc(double a,double c)
	: A(a)
	, C(c)
{
}


PowerFunc::~PowerFunc(void)
{
}


// Получение значения производной в этой точке
double PowerFunc::Dericate(double inX)
{
	return A/pow(inX,2);
}


// Вывод формулы производной в текстовом виде
string PowerFunc::DerivateFormula(void)
{
	ostringstream ost;
	ost << A <<"/(x^2)";
	string buf( ost.str() );
	return buf;
}


// Копирование обекта
PowerFunc* PowerFunc::Clone(void)
{
	return new PowerFunc(*this);
}


Объекты этих двух классов используются в классе составной функции(SostFunc).

SostFunc

Заголовочный файл
Код (PHP):
#pragma once
#include "LineFunc.h"
#include "PowerFunc.h"
//Класс составной функции
class SostFunc
{
public:
	SostFunc(double a = 0,double b = 0,double c=0);

	~SostFunc(void);
private:
	// Указатель на линейную функцию
	LineFunc lineFunc;
	// указатель на степенную функцию
	PowerFunc powerFunc;
	 //коэффициент А
	double A;
	// Коэффициент В
	double B;
public:
	// Вычисление производной в точке
	double Dericate(double inX);
	// Вывод формулы в текстовом виде
	string DericateFormula(void);
	// Копия объекта
	SostFunc* Clone(void);

	//Прегруженный оператор вывода
	friend ostream& operator<<(ostream& cout_, SostFunc& sostFunc)
	{
		cout_ << sostFunc.DericateFormula ()<< endl;
		return cout_;
	}
private:
	// коэффициент С
	double C;
};


Ресурсный файл

Код (PHP):
#include "StdAfx.h"
#include "SostFunc.h"


SostFunc::SostFunc(double a,double b,double c)
	: A(a)
	, B(b)
	, C(c)
{
	LineFunc _lineFunc(B,C);

	lineFunc = _lineFunc;

	PowerFunc _powerFunc(A,C);

	powerFunc = _powerFunc;
}



SostFunc::~SostFunc(void)
{
}


// Вычисление производной в точке
double SostFunc::Dericate(double inX)
{
	return lineFunc.Dericate(inX)+powerFunc.Dericate(inX);
}


// Вывод формулы в текстовом виде
string SostFunc::DericateFormula(void)
{
	return lineFunc.DericateFormula()+"+"+powerFunc.DerivateFormula()+"\n";
}


// Копия объекта
SostFunc* SostFunc::Clone(void)
{
	return new SostFunc(*this);
}

В свою очередь объект составной функции используем в классе "вектора"(Myvector).
Каждый элементом Myvector является объект класса SostFunc

Myvector

Заголовочный файл

Код (PHP):
#pragma once
#include "SostFunc.h"
#include <vector>

using namespace std;
//Класс вектора
class Myvector
{
private:
	//Используем vector для хранения данных составной функции
	vector<SostFunc> inVector;
public:
	Myvector(double a=0,double b=0,double c=0);
	~Myvector(void);
	// Перегрузка оператора []
	SostFunc& operator[](int number);

	//Прегруженный оператор вывода
	friend ostream& operator<<(ostream& cout_, Myvector& Myvector)
	{
		cout_ << Myvector.DericateFormula ()<< endl;
		return cout_;
	}


	// Добавление элемента вектора
	void Add(double a, double b, double c);
private:
	// Строка для вывода
	string DericateFormula(void);
};


Ресурсный файл

Код (PHP):
#include "StdAfx.h"
#include "Myvector.h"


Myvector::Myvector(double a,double b,double c)
{
	Add(a,b,c);
}


Myvector::~Myvector(void)
{
}


// Перегрузка оператора []
SostFunc& Myvector::operator[](int number)
{
	return inVector.at(number);
}

// Добавление элемента вектора
void Myvector::Add(double a, double b, double c)
{
	SostFunc sf(a,b,c);

	inVector.push_back(sf);
	
}

// Строка для вывода
string Myvector::DericateFormula(void)
{
	ostringstream ost;

	for (int i = 0;i < inVector.size();i++)
	{
		SostFunc sf = inVector[i];
		ost<<i<<": "<< sf.DericateFormula();

	}

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

В классе Myvector использован контейнерный класс <vector>
Соответственно, можно выводить формулы любого класса функций, можно вывести весь класс "вектор".
Можно добавлять элементы вектора.
Можно получать данные из элементов вектора, соответствующим перегруженным оператором [].
Как пример функция main может быть такой:
Код (PHP):
int _tmain(int argc, _TCHAR* argv[])
{
	//объект класса myvector
	Myvector myvector(1,2,5);
	//Добавляем элемент вектора
	myvector.Add(2,1,3);

	//Объект класса SostFunc
	SostFunc sf(4,2,3);

	//Выводим все элементы вектора на экран
	cout<< myvector << endl;

	//Приравнием первому элементу вектора объект класса SostFunc
	//Должны поменяться коэффициенты у функций вывода
	myvector[0] = sf;

	//Выведем вектор на экран
	cout<< myvector<< endl;

	string a;

	//Чтобы консольное окно сразу не свернулось
	cin>>a;

	return 0;
}


Так же прикладываю проект в VS 2008.
скачать файл Vector.zip [1.63 Mб]

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

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


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

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

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



В избранное