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

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

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

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

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

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

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

Наследование. Виртуальные функции

Студент

Филатов А.А.

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

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

Группа

АС-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

double inputParamFromKeyboard()

{

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 Func

{

public:

virtual double calculate(double x) = 0;

virtual void fillParam() = 0;

virtual void otputType() = 0;

};

class Func1 : public Func

{

public:

double calculate(double x)

{

return a/x+b;

}

void fillParam()

{

cout << "Input a: ";

a = inputParamFromKeyboard();

cout << "Input b: ";

b = inputParamFromKeyboard();

}

void otputType()

{

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

}

private:

double a, b;

};

class Func2 : public Func

{

public:

double calculate(double x)

{

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

}

void fillParam()

{

cout << "Input a: ";

a = inputParamFromKeyboard();

cout << "Input b: ";

b = inputParamFromKeyboard();

cout << "Input c: ";

c = inputParamFromKeyboard();

}

void otputType()

{

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

}

private:

double a, b, c;

};

class VectorFunction

{

public:

void fill()

{

int t=0;

bool quit = false, success = false;

do

{

int t;

do

{

cin.clear();

_flushall();

cout << "Choose type of function: ax+b(1), a*ln(bx)+c(2) or end of adding(0): ";

cin >> t;

cout << endl;

if(cin.fail())

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

else

success = true;

}

while(!success);

switch(t)

{

case 1:

vect.push_back(new Func1());

vect.at(vect.size()-1)->fillParam();

break;

case 2:

vect.push_back(new Func2());

vect.at(vect.size()-1)->fillParam();

break;

case 0:

quit = true;

break;

default:

break;

}

}

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

}

void calculateVector(double x)

{

cout << "Values:" << endl;

for(int i=0;i<vect.size();i++)

{

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

cout << vect.at(i)->calculate(x);

cout << endl;

}

}

void outpputFuncVector()

{

cout << "Functions:" << endl;

for(int i=0;i<vect.size();i++)

{

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

vect.at(i)->otputType();

}

}

~VectorFunction()

{

vect.~vector();

}

private:

vector<Func*> vect;

};

void main()

{

bool exit=false;

double t;

VectorFunction vector;

vector.fill();

while(exit!=true)

{

cout << "What to do: Run(1) or Exit(0)? " << endl;

t = inputParamFromKeyboard();

switch((int) t)

{

case 1:

vector.outpputFuncVector();

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

vector.calculateVector(inputParamFromKeyboard());

break;

case 0:

exit = true;

break;

}

}

}

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

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

8