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

Обсуждение

Неизвестный
26.01.2012, 00:16
общий
26.01.2012, 14:15
а если vs 2008 использовать?:)

могу сделать аналогично, как в вопросе 185162.
давно
Старший Модератор
17042
808
27.01.2012, 08:01
общий
27.01.2012, 08:02
Вы можете разработать проект в Visual C++ 2008, а затем опуубликовать ту часть кода, которая отвечает за реализацию логики работы программы, в форме ответа, воспользовавшись тегом "вставить тег КОД" (кнопка с буквой "а" в красных фигурных скобках) и COPY - PASTE. В этом случае проблема несоответствия версий студий отпадает сама собой.
Так отвечать, как Вы делали в вопросе 185162 (приложили готовый проект, не написав ничего значимого в форме ответа), у нас как раз-таки не рекомендуется - ответ должен содержать решение. Ссылка на файл - это дополнение к ответу, а не сам ответ.
На тот случай, если решите отвечать, продляю срок действия вопроса.
Об авторе:
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
Неизвестный
27.01.2012, 08:44
общий
Адресаты:

при ответе лучше копировать все необходимые коды пофайлово в ответ? и прикладывать на всякий случай файлы к ответу?
давно
Старший Модератор
17042
808
27.01.2012, 08:55
общий
27.01.2012, 08:55
Те файлы, которые дают представление о логике работы программы - да. Пример, как можно это оформить, см., например, здесь.
Об авторе:
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
Неизвестный
27.01.2012, 17:03
общий
В данной вопросе надо выводить значения и формулы только для первой производной соответствующих функций?
давно
Старший Модератор
17042
808
28.01.2012, 07:17
общий
Адресаты:
Насколько я понимаю, вопрос выше адресован Вам.
Об авторе:
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
давно
Посетитель
276566
297
28.01.2012, 19:12
общий
здравствуйте! да только для первой производной
Неизвестный
29.01.2012, 16:21
общий
это ответ
Здравствуйте, Maverick!
В этой программе создадим два класса: Класс линейных функций(LineFunc) и класс степенных функций(PowerFunc).

LineFunc
Заголовочный файл
[code lang=php h=100]#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 С;
};[/code]

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

[code lang=php h=200]#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);
}

[/code]

PowerFunc

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

[code lang=php h=100]#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;
};


[/code]

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

[code lang=php h=200]
#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);
}
[/code]

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

SostFunc

Заголовочный файл
[code lang=php h=100]
#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;
};
[/code]

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

[code lang=php h=200]
#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);
}
[/code]
В свою очередь объект составной функции используем в классе "вектора"(Myvector).
Каждый элементом Myvector является объект класса SostFunc

Myvector

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

[code lang=php h=100]#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);
};
[/code]

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

[code lang=php h=200]
#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;
}
[/code]
В классе Myvector использован контейнерный класс <vector>
Соответственно, можно выводить формулы любого класса функций, можно вывести весь класс "вектор".
Можно добавлять элементы вектора.
Можно получать данные из элементов вектора, соответствующим перегруженным оператором [].
Как пример функция main может быть такой:
[code lang=php h=200]
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;
}[/code]

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