07.12.2019, 07:18 [+3 UTC]
в нашей команде: 4 039 чел. | участники онлайн: 4 (рекорд: 21)

:: РЕГИСТРАЦИЯ

задать вопрос

все разделы

правила

новости

участники

доска почёта

форум

блоги

поиск

статистика

наш журнал

наши встречи

наша галерея

отзывы о нас

поддержка

руководство

Версия системы:
7.78 (18.11.2019)
JS-v.1.34 | CSS-v.3.35

Общие новости:
28.04.2019, 09:13

Форум:
29.11.2019, 17:59

Последний вопрос:
07.12.2019, 03:46
Всего: 151182

Последний ответ:
07.12.2019, 07:08
Всего: 259537

Последняя рассылка:
06.12.2019, 16:15

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
06.03.2017, 09:09 »
orlovanatol
Огромное спасибо за помощь! [вопрос № 190652, ответ № 274730]
10.09.2010, 19:06 »
Anjali
Спасибо! Именно то, что нужно! [вопрос № 179898, ответ № 263027]

РАЗДЕЛ • С / С++

Создание программ на языках C и C++.

[администратор рассылки: Андрей Кузнецов aka Dr_Andrew (Старший модератор)]

Лучшие эксперты в этом разделе

Коцюрбенко Алексей Владимирович
Статус: Модератор
Рейтинг: 1459
Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 701
Gluck
Статус: 9-й класс
Рейтинг: 449

Перейти к консультации №:
 

Консультация онлайн # 185298
Раздел: • С / С++
Автор вопроса: Maverick (Посетитель)
Отправлена: 26.01.2012, 00:09
Поступило ответов: 1

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

Состояние: Консультация закрыта

Ответ # 269774 от Алексей К.

Здравствуйте, 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б]


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

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 185298
Алексей К.

# 1

= общий = | 26.01.2012, 00:16

а если vs 2008 использовать?:)

могу сделать аналогично, как в вопросе 185162.

-----
Последнее редактирование 26.01.2012, 14:15 [неизвестный]

Андрей Кузнецов aka Dr_Andrew
Старший модератор

ID: 17042

# 2

= общий = | 27.01.2012, 08:01 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Вы можете разработать проект в Visual C++ 2008, а затем опуубликовать ту часть кода, которая отвечает за реализацию логики работы программы, в форме ответа, воспользовавшись тегом "вставить тег КОД" (кнопка с буквой "а" в красных фигурных скобках) и COPY - PASTE. В этом случае проблема несоответствия версий студий отпадает сама собой.
Так отвечать, как Вы делали в вопросе 185162 (приложили готовый проект, не написав ничего значимого в форме ответа), у нас как раз-таки не рекомендуется - ответ должен содержать решение. Ссылка на файл - это дополнение к ответу, а не сам ответ.
На тот случай, если решите отвечать, продляю срок действия вопроса.

-----
Последнее редактирование 27.01.2012, 08:02 Андрей Кузнецов aka Dr_Andrew (Старший модератор)

=====
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014

Алексей К.

# 3

= общий = | 27.01.2012, 08:44
Андрей Кузнецов aka Dr_Andrew:


при ответе лучше копировать все необходимые коды пофайлово в ответ? и прикладывать на всякий случай файлы к ответу?

=====
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014

Андрей Кузнецов aka Dr_Andrew
Старший модератор

ID: 17042

# 4

= общий = | 27.01.2012, 08:55 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

Те файлы, которые дают представление о логике работы программы - да. Пример, как можно это оформить, см., например, здесь.

-----
Последнее редактирование 27.01.2012, 08:55 Андрей Кузнецов aka Dr_Andrew (Старший модератор)

=====
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014

Алексей К.

# 5

= общий = | 27.01.2012, 17:03

В данной вопросе надо выводить значения и формулы только для первой производной соответствующих функций?

=====
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014

Андрей Кузнецов aka Dr_Andrew
Старший модератор

ID: 17042

# 6

= общий = | 28.01.2012, 07:17 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
Maverick:

Насколько я понимаю, вопрос выше адресован Вам.

=====
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014

Maverick
Посетитель

ID: 276566

# 7

= общий = | 28.01.2012, 19:12 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер

здравствуйте! да только для первой производной

 

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

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.15097 сек.

© 2001-2019, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.78 от 18.11.2019
Версия JS: 1.34 | Версия CSS: 3.35