Липецкий государственный технический университет
Кафедра Автоматизированных систем управления
ЛАБОРАТОРНАЯ РАБОТА №4
по дисциплине «Объектно-ориентированное программирование»
«Реализация концепции векторной функции скалярного аргумента с привлечением стандартной библиотеки шаблонов»
|
Студент |
|
|
|
Ключанских А.С |
|
||||||||
|
|
|
подпись, дата |
|
фамилия, инициалы |
|
||||||||
|
Группа |
|
АС-10 |
|
|
|
|
|||||||
|
|
|
|
|
|
|
||||||||
|
Принял |
|
|
|
|
|
||||||||
|
ассистент |
|
|
|
Тищенко А.Д. |
|
||||||||
|
ученая степень, звание |
|
подпись, дата |
|
фамилия, инициалы |
|
Липецк 2012
-
Цель работы
Изучить шаблоны классов стандартной библиотеки шаблонов и получить практические навыки разработки программ с их использованием.
-
Задание кафедры
Выполнить лабораторные №2 и №3 с использованием контейнеров стандартной библиотеки шаблонов (вместо средств работы с динамической памятью).
Вид/ Вариант |
a*sin(bx) |
a*cos(bx) |
a/x+b |
a*ln(bx) |
a*x^b |
11 |
|
+ |
|
|
+ |
-
Краткие теоретические сведения
Класс 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 в качестве допустимого значения для ссылочных типов и разрешает дублирование элементов.
-
UML-диаграмма классов
Рисунок 1. UML-диаграмма к программе №1
Рисунок 2. UML-диаграмма к программе №2
-
Экспериментальные результаты
Программный текст реализованных классов:
Программа №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);
}
}