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

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

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

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

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

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

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

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

Студент

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

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

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

Группа

АС-10

Принял

ассистент

Тищенко А.Д.

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

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

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

Липецк 2012

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

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

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

Вариант 11:

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

,

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

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

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

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

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

Вид/ Вариант

a*sin(bx)

a*cos(bx)

a/x+b

a*ln(bx)

a*x^b

11

+

+

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

При определении универсального типа можно ограничить виды типов, которые могут использоваться клиентским кодом в качестве аргументов типа при инициализации соответствующего класса. При попытке клиентского кода создать экземпляр класса с помощью типа, который не допускается ограничением, в результате возникает ошибка компиляции. Это называется ограничениями. Ограничения определяются с помощью контекстно-зависимого ключевого слова where.

Предложение where используется в определении универсального типа для указания ограничений типов, которые могут использоваться в качестве аргументов параметра типа, определенного в универсальном объявлении. Например, можно объявить универсальный класс MyGenericClass, чтобы параметр типа T реализовывал интерфейс IComparable<T>.

Кроме ограничений интерфейса, предложение where может включать ограничение базового класса, указывающее, что тип должен обладать указанным классом в качестве базового (или являться этим классом), чтобы его можно было использовать как аргумент типа для этого универсального типа. Если такое ограничение используется, оно должно располагаться перед любыми другими ограничениями данного параметра типа.

class MyClass<T, U>

where T : class

where U : struct

{ }

Предложение where также может включать ограничение конструктора. Можно создать экземпляр параметра типа с помощью нового оператора, однако для этого оператор типа должен быть ограничен ограничением конструктора new(). Ограничение new() указывает компилятору, что у любого типа предоставленных аргументов должен быть доступный конструктор без параметров или по умолчанию. Например:

public class MyGenericClass<T> where T : IComparable, new()

{

// The following line is not possible without new() constraint:

T item = new T();

}

Ограничение new() располагается последним в предложении where.

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());

Console.Write("Функции в векторе имеют вид 1 (a*cos(b*x)+c) или 2 (a*x^b)? Введите 1 или 2\n");

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

}

catch (Exception)

{

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

return;

}

switch (choice)

{

case 1:

VectorFunc<Cosinus> cos = new VectorFunc<Cosinus>(n);

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

{

cos.vector[i].Input_Params(i+1);

cos.vector[i].Func(x);

}

Console.WriteLine("Вывод результатов:");

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

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

break;

case 2:

VectorFunc<Pow> pow = new VectorFunc<Pow>(n);

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

{

pow.vector[i].Input_Params(i+1);

pow.vector[i].Func(x);

}

Console.WriteLine("Вывод результатов:");

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

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

break;

default:

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

break;

}

}

}

Cosinus.cs:

class Cosinus

{

private double a, b, c;

public double result;

public void Input_Params(int i)

{

Console.WriteLine("Ввод параметров {0}-й функции вектора", i);

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 void Func(double x)

{

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

}

}

Pow.cs:

class Pow

{

private double a, b;

public double result;

public void Input_Params(int i)

{

Console.WriteLine("Ввод параметров {0}-й функции вектора", i);

try

{

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

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

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

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

}

catch (Exception)

{

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

}

}

public void Func(double x)

{

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

}

}

Vector.cs:

class VectorFunc <T> where T: new()

{

public T[] vector;

public VectorFunc(int n)

{

vector = new T[n];

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

{

vector[i] = new T();

}

}

}

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

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

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

  1. Выводы

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

9