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

Лабораторная работа №2 Вариант 11 (C#)

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

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

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

ЛАБОРАТОРНАЯ РАБОТА №2

по дисциплине «Объектно-ориентированное программирование»

«Реализация концепции векторной функции скалярного аргумента»

Студент

Ключанских А.С

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

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

Группа

АС-10

Принял

ассистент

Тищенко А.Д.

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

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

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

Липецк 2012

  1. Цель работы

Изучить понятия наследования и виртуальных функций объектно-ориентированного программирования и получить практические навыки разработки классов с их привлечением.

  1. Задание кафедры

Вариант 11:

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

,

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

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

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

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

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

Вид/ Вариант

a*sin(bx)

a*cos(bx)

a/x+b

a*ln(bx)

a*x^b

11

+

+

  1. Краткие теоретические сведения

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

Наследование, вместе с инкапсуляцией и полиморфизмом, является одной из трех основных характеристик (или базовых понятий) объектно-ориентированного программирования. Наследование позволяет создавать новые классы, которые повторно используют, расширяют и изменяют поведение, определенное в других классах. Класс, члены которого наследуются, называется базовым классом, а класс, который наследует эти члены, называется производным классом. Производный класс может иметь только один непосредственный базовый класс. Однако наследование является транзитивным. Если ClassC является производным от ClassB, и ClassB является производным от ClassA, ClassC наследует члены, объявленные в ClassB и ClassA.

Концептуально, производный класс является специализацией базового класса. Например, при наличии базового класса Animal, возможно наличие одного производного класса, который называется Mammal, и еще одного производного класса, который называется Reptile. Mammal является Animal, а Reptile является Animal, но каждый производный класс представляет разные специализации базового класса.

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

Ниже иллюстрируется класс WorkItem, представляющий рабочий элемент в бизнес-процессе. Подобно всем классам, он является производным от System.Object и наследует все его методы. В WorkItem имеется пять собственных членов. Сюда входит конструктор, поскольку конструкторы не наследуются. Класс ChangeRequest наследуется от WorkItem и представляет конкретный вид рабочего элемента. ChangeRequest добавляет еще два члена к членам, унаследованным от WorkItem и Object. Он должен добавить собственный конструктор, и он также добавляет originalItemID.

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

  1. Экспериментальные результаты

Программный текст реализованных классов:

Program.cs:

class Program

{

static void Main()

{

int n, choice;

double x;

try

{

Console.Write("Введите размерность вектора-функции: ");

n = Convert.ToInt32(Console.ReadLine());

Console.Write("Введите переменную х: ");

x = Convert.ToDouble(Console.ReadLine());

}

catch (Exception)

{

Console.WriteLine("Некорректный ввод, работа программы будет завершена.");

return;

}

Base [] Vector = new Base [n];

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

{

Console.Write("Функция {0} имеет вид 1 (a*cos(b*x)+c) или 2 (a*x^b)? Введите 1 или 2\n", (i+1));

try

{

choice = Convert.ToInt32(Console.ReadLine());

}

catch (Exception)

{

Console.WriteLine("Некорректный ввод, повторите снова");

i--;

continue;

}

switch (choice)

{

case 1:

Vector[i] = new Cosinus();

Vector[i].Input_Data();

Vector[i].Func(x);

break;

case 2:

Vector[i] = new Pow();

Vector[i].Input_Data();

Vector[i].Func(x);

break;

default:

Console.WriteLine("Выберите либо 1, либо 2");

i--;

break;

}

}

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

{

Console.WriteLine("Vector[{0}] = {1}", (i + 1), Math.Round(Vector[i].result, 4));

}

}

}

Base.cs:

class Base

{

protected double a, b;

public double result;

public virtual void Input_Data()

{

Console.Write("Этот метод должен быть переопределен в классах-потомках");

}

public virtual double Func(double x)

{

Console.Write("Этот метод должен быть переопределен в классах-потомках");

return 0.0;

}

}

Cosinus.cs:

class Cosinus: Base

{

protected double c;

public override void Input_Data()

{

try

{

Console.Write("Введите а: ");

a = Convert.ToDouble(Console.ReadLine());

Console.Write("Введите b: ");

b = Convert.ToDouble(Console.ReadLine());

Console.Write("Введите с: ");

c = Convert.ToDouble(Console.ReadLine());

}

catch (Exception)

{

Console.WriteLine("Некорректный ввод, необходимо ввести десятичное число");

}

}

public override double Func(double x)

{

result = a * Math.Cos(b * x) + c;

return result;

}

}

Pow.cs:

class Pow: Base

{

public override void Input_Data()

{

try

{

Console.Write("Введите а: ");

a = Convert.ToDouble(Console.ReadLine());

Console.Write("Введите b: ");

b = Convert.ToDouble(Console.ReadLine());

}

catch (Exception)

{

Console.WriteLine("Некорректный ввод, необходимо ввести десятичное число");

}

}

public override double Func(double x)

{

result = a * Math.Pow(x, b);

return result;

}

}

  1. Анализ полученных результатов

Практические результаты, полученные в ходе работы программы, представлены на следующих скриншотах:

Как видно из данных скриншотов, программа верно решает поставленную задачу и корректно реагирует на ввод недопустимых данных пользователем.

  1. Выводы

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

9