Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №3 Вариант 16

.doc
Скачиваний:
29
Добавлен:
20.06.2014
Размер:
223.23 Кб
Скачать

Липецкий государственный технический университет

Кафедра автоматизированных систем управления

Лабораторная работа №3

по объектно-ориентированному программированию

Параметризованные классы

Студент

Филатов А.А.

подпись, дата

фамилия, инициалы

Группа

АС-09-2

Принял

Овчинников В.В.

ученая степень, звание

подпись, дата

фамилия, инициалы

Липецк 2012

1. Задание

Реализовать на языке C++ концепцию векторной функции скалярного аргумента (с привлечением механизма параметризованных классов) вида

,

где - параметры элемента вектор-фукнции;

- скалярный аргумент вектор-функции;

- функция вычисления одного элемента вектор-функции (выбирается пользователем из множества функций, заданных студенту);

- размерность вектор-функции, заданная пользователем.

Количество элементов вектора результата и аргумент x, для которого производится вычисление, задается пользователем. Вид функции, по которому вычисляется значение каждого элемента вектора результата, указывается пользователем из заданного множества параметризованных функций (параметры функций вводятся пользователем для каждого элемента вектора результата отдельно при формировании вектора функций). Отличие от предыдущей лабораторной работы заключается в том, что элементами вектор-функции могут быть только функции одного вида из следующих возможных:

Таблица 1. Вариант

Вид/ Вариант

a/x+b

a*ln(bx)+c

16

+

+

  1. UML-диаграмма классов

Рисунок 1. UML-диаграмма

3. Исходный текст программы

#include <stdio.h>

#include <math.h>

#include <vector>

#include <iostream>

using namespace std;

//Ввод с клавиатуры значения типа double

class InputFromKeyboard

{

public:

static double inputDouble()

{

double temp;

bool success = false;

do

{

cin.clear();

//очистка буферов

_flushall();

cin >> temp;

cout << endl;

if(cin.fail())

cout << "Incorrect input. Please try again: " << endl;

else

success = true;

}

while(!success); //контроль ввода

return temp;

}

};

class Func1

{

public:

double calculate(double x)

{

return a/x+b;

}

void fillParam()

{

cout << "Input a: ";

a = InputFromKeyboard::inputDouble();

cout << "Input b: ";

b = InputFromKeyboard::inputDouble();

}

void otputType()

{

cout << a << "/x+" << b << endl;

}

private:

double a, b;

};

class Func2

{

public:

double calculate(double x)

{

return a*log(b*x)+c;

}

void fillParam()

{

cout << "Input a: ";

a = InputFromKeyboard::inputDouble();

cout << "Input b: ";

b = InputFromKeyboard::inputDouble();

cout << "Input c: ";

c = InputFromKeyboard::inputDouble();

}

void otputType()

{

cout << a << "*log(" << b << "*x)+" << c << endl;

}

private:

double a, b, c;

};

template <class T>

class VectorFunction

{

public:

void Fill()

{

for(int i=0;i<nVect;i++)

vect[i].fillParam();

}

void calculateVector(double x)

{

cout << "Values:" << endl;

for(int i=0;i<nVect;i++)

{

cout << i+1 << ": ";

cout << vect[i].calculate(x);

cout << endl;

}

}

void outpputFuncVector()

{

cout << "Functions:" << endl;

for(int i=0;i<nVect;i++)

{

cout << i+1 << ": ";

vect[i].otputType();

}

}

VectorFunction(int _nVect)

{

if(_nVect > 0)

nVect = _nVect;

else nVect = 1;

vect = new T[nVect];

}

~VectorFunction()

{

delete vect;

}

private:

T *vect;

int nVect;

};

void main()

{

bool exit=false;

double t = 0;

int _nVect = 0;

bool quit = false, success = false;

while(!(_nVect >0))

{

cout << "Input size of vector: ";

_nVect = (int) InputFromKeyboard::inputDouble();

}

while(t!= 1 && t!=2)

{

cout << "Choose type of function: a/x+b(1), a*ln(bx)+c(2)? ";

t = InputFromKeyboard::inputDouble();

}

switch((int) t)

{

case 1:

{

VectorFunction<Func1> vect(_nVect);

vect.Fill();

vect.outpputFuncVector();

cout << endl << "Input X: ";

vect.calculateVector(InputFromKeyboard::inputDouble());

}

break;

case 2:

{

VectorFunction<Func2> vect(_nVect);

vect.Fill();

vect.outpputFuncVector();

cout << endl << "Input X: ";

vect.calculateVector(InputFromKeyboard::inputDouble());

}

break;

case 0:

quit = true;

break;

default:

break;

}

system("pause");

}

4. Контрольный пример

Рисунок 2. Пример работы программы

Вывод

При выполнении данной лабораторной работы были получены навыки работы с параметризованными классами на языке C++.

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

9