Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №4 Вариант 11 (C#).doc
Скачиваний:
22
Добавлен:
20.06.2014
Размер:
172.03 Кб
Скачать

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

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

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

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

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

Студент

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

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

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

Группа

АС-10

Принял

ассистент

Тищенко А.Д.

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

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

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

Липецк 2012

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

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

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

Выполнить лабораторные №2 и №3 с использованием контейнеров стандартной библиотеки шаблонов (вместо средств работы с динамической памятью).

Вид/ Вариант

a*sin(bx)

a*cos(bx)

a/x+b

a*ln(bx)

a*x^b

11

+

+

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

Класс List<T> является универсальным эквивалентом класса ArrayList.Он реализует универсальный интерфейс IList<T> с помощью массива, размер которого динамически увеличивается по мере необходимости.

Класс List<T> использует компаратор проверки на равенство и компаратор упорядочения.

Такие методы, как Contains, IndexOf, LastIndexOf и Remove, используют компаратор проверки на равенство для элементов списка.Компаратор проверки на равенство, используемый по умолчанию для типа T, определяется следующим образом.Если тип T реализует универсальный интерфейс IEquatable<T>, в качестве компаратора проверки на равенство используется метод Equals(T) этого интерфейса; в противном случае по умолчанию используется метод Object.Equals(Object).

Такие методы, как BinarySearch и Sort, используют компаратор упорядочения для элементов списка.Компаратор, используемый по умолчанию для типа T, определяется следующим образом.Если тип T реализует универсальный интерфейс IComparable<T>, в качестве компаратора по умолчанию используется метод CompareTo(T) этого интерфейса; в противном случае, если тип T реализует неуниверсальный интерфейс IComparable, в качестве компаратора по умолчанию используется метод CompareTo(Object) этого интерфейса.Если тип T не реализует ни один из интерфейсов, компаратор по умолчанию не определяется; в этом случае компаратор или делегат сравнения должен быть задан явным образом.

Сортировка списка List<T> is не гарантируется.Необходимо отсортировать List<T> до выполнения операций (таких, как BinarySearch), для которых требуется отсортированный список List<T>.

Доступ к элементам этой коллекции осуществляется с помощью целочисленного индекса.Индексы в этой коллекции начинаются с нуля.

Для очень больших List<T> объекты, можно увеличить максимальную емкость до 2 миллиарда элементов в системе путем установки обновления 64 (sp2) enabled атрибут gcAllowVeryLargeObjects элемент конфигурации true в такой среде выполнения.

Объект List<T> принимает null в качестве допустимого значения для ссылочных типов и разрешает дублирование элементов.

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

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

Рисунок 2. UML-диаграмма к программе №2

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

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

Программа №1 (ЛР №2):

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;

}

List<Base> Vector = new List<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.Add(new Cosinus());

Vector[i].Input_Data();

Vector[i].Func(x);

break;

case 2:

Vector.Add(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));

}

}

}

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;

}

}

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;

}

}

Программа №2 (ЛР №3):

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:

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

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

{

cos.Add(new Cosinus());

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

cos[i].Func(x);

}

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

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

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

break;

case 2:

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

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

{

pow.Add(new Pow());

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

pow[i].Func(x);

}

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

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

Console.WriteLine("Vector_pow[{0}] = {1}", i+1, Math.Round(pow[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);

}

}