Программные компоненты для решения задач линейной алгебры



 

1. Создать динамические классы для работы с числовыми матрицами и векторами. Тип элементов матрицы и вектора - double, матрицы квадратные, размеры матрицы и вектора переменные.

2. Для создания объектов, правильного их удаления, инициализации предусмотреть соответствующие конструкторы и деструкто­ры. Предусмотреть также конструкторы копирования.

3. Создать перегруженные операции:

   - динамическое присваивание, символ "=" ;

   - сложение и вычитание матриц, символы "+" , "- ";

   - сложение и вычитание векторов, символы "+" , "- ";

   - умножение матрицы на вектор, символ "*";

   - деление числа на матрицу, символ "/";

   - деление матрицы на матрицу, символ "/";

   - скалярное умножение векторов;

   - вывод матрицы, вектора в файл, символ ">>";

   - ввод матрицы, вектора из файла, символ "<<".

4. Предусмотреть функции - члены классов:

   - вычисление определителя матрицы;

   - заполнение матрицы, вектора случайными числами из заданного
     интервала.

5. Создать внешнюю функцию для решение системы линейных уравнений методом Гаусса.

6. Разработать демонстрационно-тестирующую программу. Выполнить оценку погрешности выполнения следующих операций:

   - обращение матрицы;

   - решение системы линейных уравнений методом обращения матрицы;

   - решение системы линейных уравнений методом Гаусса.

В тестовых примерах при вычислении погрешностей использовать случайные значения коэффициентов системы (случайные числа с равномерным распределением из интервала [0,1]). Указанные погрешности найти для следующих вещественных типов: float, double, long double. Порядок используемых матриц и систем - не менее 1000.

 

 

Тема 4

   Класс для работы с бинарными кодами произвольной длины

 

1. Для программирования операций с бинарными кодами произвольной длины создать динамический класс BitVector.

2. Для создания и удаления объектов и их инициализации в создаваемом классе предусмотреть соответствующие конструкторы, деструкто­р и конструктор копирования.

3. Для программирования операций над битовыми векторами перегрузить следующие символы операций:

   - побитовые операции:

      инверсия, символ "!",

      дизъюнкция (операция ИЛИ), символ "|",

      конъюнкция (операция И), символ "&" ;

   - сравнение двух битовых векторов, символы "==" , "!=" ;

   - динамическое присваивание, символ "=" ;

   - конкатенация (присоединение одного битового вектора к другому), символ "+" ;

   - ввод из файла, символ "<<";

   - вывод в файл, символ ">>".

4. Предусмотреть следующие функции - члены класса:

void BitVector::set(bool q) - присвоить всем элементам битового вектора значение q;

bool BitVector::get(int k) - прочитать значение бита номер k;

void BitVector::set(int k) - установить бит с номером k в 1;

void BitVector::clear(int k) - установить бит с номером k в 0;

int BitVector::length()         - длина битового вектора;

int BitVector::num_true() - количество битов равных 1;

int BitVector::num_false()  - количество битов равных 0;

5. Разработать демонстрационно-тестирующую программу. Вы-полнить тестирование созданных программных средств.

Тема 5

   Класс для работы со структурами типа "Связный список"

 

1. Создать класс List для работы со структурами типа "Однонап-равленный связный список". Тип элемента списка должен быть представлен шаблоном.

Элемент однонаправленного связного списка содержит значение некоторого типа, которое он сохраняет, и адрес следующего элемента списка (указатель next). Значение указателя next, который содержится в последнем элементе списка, устанавливается равным значению NULL .

2. Для создания объектов и правильного их удаления предусмо-треть соответствующие конструкторы и деструкто­р. Предусмотреть в классе конструктор копирования.

3. Для программирования операций над связными списками пере-грузить следующие символы операций:

   - динамическое присваивание для переменных типа List, символ "=" ;

   - конкатенация (объединение двух связных списков в один), символ "+" ;

   - проверка двух связных списков на совпадение, символ "==";

   - ввод списка из файла, символ "<<";

   - вывод списка в файл, символ ">>".

4. Предусмотреть следующие функции - члены класса:

int List::size()    - количество элементов списка;

elem& List::front() - возвращает ссылку на первый элемент;

          elem& List::back() - возвращает ссылку на последний элемент;

   void List::push_back(const elem&) - добавить новый элемент в конец списка;

elem List::pop_back()      - извлечь последний элемент;

   void List::push_front(const elem&) - добавить новый элемент в начало списка;

elem List::pop_front()      - извлечь первый элемент;

          bool List::find(const elem&) - проверить, есть ли заданный элемент в списке;

5. Разработать демонстрационно-тестирующую программу. Вы-полнить тестирование созданных программных средств.

       Литература: [17]

 

 

Тема 6

   Класс для работы со структурами типа "Двухсвязный список"

 

 

Тема 7

   Класс "Очередь" на основе одномерного массива

 

1. Создать класс Queue для работы со структурами данных типа "Очередь". Тип элемента очереди должен быть представлен шаблоном.

Очередь является структурой данных типа "Первый пришел - первый вышел" (FIFO - first-in, first-out). Действие очереди напомина-ет работу эскалатора в метро. Класс Queue построить на основе одно-мерного массива. Размер массива определяет максимальное количест-во элементов, помещаемых в очередь. Размер массива должен опреде-ляться при создании объекта типа Queue и оставаться после этого неизменным.

2. Для создания объектов и правильного их удаления предусмо-треть соответствующие конструкторы и деструкто­р. Предусмотреть в классе конструктор копирования.

3. Для программирования операций над структурами типа "Очередь" выполнить перегрузку следующих символов операций:

   - динамическое присваивание, символ "=" ;

   - доступ к элементу по его индексу, символ "[..]";

   - ввод очереди из файла, символ "<<";

   - вывод очереди в файл, символ ">>".

4. Предусмотреть следующие функции - члены класса:

   int Queue::num() - количество элементов, которые находятся в очереди в данный момент;

   int Queue::max() - количество мест в очереди (максимально возможное количество элементов, помещаемых в очередь);

   bool Queue::empty() - проверка, является ли очередь пустой;

elem& Queue::pop() - извлечь первый элемент очереди;

   void Queue::push(elem&) - добавить новый элемент в конец очереди;

          int Queue::find(elem&) - найти заданный элемент в очереди и вернуть его индекс, при отсутствии элемента - вернуть значение -1;

5. Разработать демонстрационно-тестирующую программу. Вы-полнить тестирование созданных программных средств.

 

 

Тема 8

   Класс "Очередь" на основе связного списка

 

1. Создать класс Queue для работы со структурами типа "Очередь". Тип элемента очереди должен быть представлен шаблоном.

Очередь является структурой данных типа "Первый пришел - первый вышел" (FIFO - first-in, first-out). Действие очереди напомина-ет работу эскалатора в метро. Класс Queue построить на основе связ-ного списка.

2. Для создания объектов и правильного их удаления предусмо-треть соответствующие конструкторы и деструкто­р. Предусмотреть в классе конструктор копирования.

3. Для программирования операций над структурами типа "Очередь" выполнить перегрузку следующих символов операций:

   - динамическое присваивание, символ "=" ;

   - ввод очереди из файла, символ "<<";

   - вывод очереди в файл, символ ">>".

4. Предусмотреть следующие функции - члены класса:

   int Queue::num() - количество элементов, которые находятся в очереди в данный момент;

   int Queue::max() - количество мест в очереди (максималь-но возможное количество элементов, помещаемых в очередь);

   bool Queue::empty() - проверка, является ли очередь пустой;

elem& Queue::pop() - извлечь первый элемент очереди;

   void Queue::push(elem&) - добавить новый элемент в конец очереди;

          elem* Queue::find(elem&) - найти заданный элемент в очереди и вернуть его адрес, при отсутствии элемента - вернуть значение NULL;

5. Разработать демонстрационно-тестирующую программу. Вы-полнить тестирование созданных программных средств.

 

       Литература: [17]

 

 

Тема 9

   Класс "Множество" на основе динамического массива

 

1. Для программирования операций с объектами типа "Множество" создать класс Set. Тип элемента множества представить шаблоном. Множество представляет собой набор элементов, каждый из которых является уникальным, повторение элементов не допускает-ся. В качестве базовой структуры для создания класса "Множество" использовать одномерный динамический массив.

 

2. Для создания объектов типа "Множество", их инициализации и правильного их удаления предусмотреть следующие функции класса:

     2.1. Конструктор без параметров.

     2.2. Конструктор копирования.

     2.3. Конструктор для инициализации создаваемого объекта с помощью внешнего массива.

     2.4. Деструктор.

 

3. Для программирования операций над объектами типа "Множество" выполнить перегрузку символов операций, указанных ниже.

     3.1. Динамическое присваивание, символ "=". При выполне-нии операции вида A = B, где A и B имеют тип "Множество", объект A должен стать идентичным объекту B. Значение, возвращаемое операцией - ссылка на левый операнд.

     3.2. Проверка, являются ли два множества одинаковыми, символ "==". Операция вида A == B, где A и B имеют тип "Множество", должна возвращать значение true, если множества A и B идентичны, и значение false в противном случае.

     3.2. Объединение множеств, символ "+". Операция вида A + B, где A и B имеют тип "Множество", должна возвращать множество, которое является объединением множеств A и B.

     3.3. Пересечение множеств, символ "*". Операция вида A * B, где A и B имеют тип "Множество", должна возвращать множество, которое является пересечением множеств A и B.

     3.4. Вычитание множеств, символ "-". Операция вида A - B, где A и B имеют тип "Множество", должна возвращать множество, которое является разностью множеств A и B.

     3.5. Отношение включения, символ "<=". Операция вида A <= B, где A и B имеют тип "Множество", должна возвращать значение true, если множество A является подмножеством B, и значение false в противном случае.

     3.6. Ввод множества из файла, символ ">>". Операция вида f >> A, где f - переменная типа ifstream, а A - переменная типа "Множество", должна приводить к считываию значения A из потока f. Операция должна возвращать ссылку на левый операнд (поток f).

     3.7. Вывод множества в файл, символ "<<". Операция вида f << A, где f - переменная типа ofstream, а A - переменная типа "Множество", должна приводить к записи значения A в поток f. Операция должна возвращать ссылку на левый операнд (поток f).

4. Предусмотреть следующие функции - члены класса:

   void Set::include(type x)  - добавить новый элемент к множеству;

void Set::exclude(type x) - удалить значение x из множества;

          bool Set::find(type x) - проверить, содержит ли множество заданный элемент.

5. Разработать демонстрационно-тестирующую программу. Выполнить тестирование созданного класса.

 

 

Тема 10

   Класс для работы со структурами типа Мультимножество"

 

1. Для программирования операций с объектами типа "Мульти-множество" создать класс MultiSet. Тип элемента множества представить шаблоном. В отличие от обычного множества мульти-множество может включать в себя идентичные элементы. Для построения класса в качестве базовой структуры рекомендуется использовать одномерный динамический массив.

2. Для создания объектов типа MultiSet, их инициализации и правильного их удаления предусмотреть соответствующие конструкторы и деструкто­р. Предусмотреть в классе конструктор копирования.

3. Для программирования операций над объектами типа MultiSet выполнить перегрузку следующих символов операций:

   - динамическое присваивание, символ "=" ;

   - проверка двух мультимножеств на совпадение, символ   "==";

   - объединение мультимножеств, символ "+" ;

   - пересечение мультимножеств, символ "* " ;

   - вычитание мультимножеств, символ "-" ;

   - ввод мультимножества из файла, символ "<<";

   - вывод мультимножества в файл, символ ">>".

4. Предусмотреть следующие функции - члены класса:

   void Set::include(type& x) - добавить новый элемент к мультимножеству;

   void Set::exclude(type& x) - удалить заданный элемент из мультимножества;

   int Set::size()     - получить число элементов мульти-множества;

   bool Set::empty() - проверка, является ли мультимножество пустым;

          int Set::multip(type& x) - возвращает кратность заданного элемента, при отсутствии заданного значения x в мультимножестве
возвращает 0.

5. Разработать демонстрационно-тестирующую программу. Выполнить тестирование созданного класса.

 

 

Тема 11

   Класс для работы со структурами типа "Словарь"

 

1. Создать класс Map для работы со структурами типа "Словарь". Такого рода структуру называют еще ассоциативный массив или отображение. Элемент словаря включает два компонента: ключ и значение. Значение ключа должно быть уникальным в пределах данного словаря. Порядок записи элементов словаря автоматически упорядочивается по значениям ключей. Типы, используемые для ключа и значения, должны быть представлены шаблоном. Структуры типа "Словарь" широко используются при построении ассоциативных баз данных.

2. Для создания объектов типа Map, их инициализации и правильного их удаления предусмотреть соответствующие конструкторы и деструкто­р. Предусмотреть в классе конструктор копирования.

3. Для программирования операций над объектами типа Map выполнить перегрузку следующих символов операций:

   - динамическое присваивание, символ "=" ;

   - проверка того, являются ли два словаря одинаковыми, символ "==";

   - объеднение двух словарей в один, символ "+" ;

   - операция доступа к элементу словаря по ключу, символ "[..]" ;

- ввод словаря из файла, символ "<<";

   - вывод словаря в файл, символ ">>".

4. Предусмотреть следующие функции - члены класса:

   int Map::size()   - количество значений, хранящихся в словаре;

   bool Map::empty()   - проверка, является ли словарб пустым;

   void Map::include(eltype x) - добавить новый элемент x в словарь;

   eltype Map::exclude(keytype q) - извлечь элемент словаря с заданным ключом q;

          valtype Map::find(keytype q)  - найти значение, которое соответствует заданному ключу q;

5. Разработать демонстрационно-тестирующую программу. Выполнить тестирование созданного класса.

 

 

Тема 12

   Класс "Стек" на основе одномерного массива

 

1. Создать класс Stack для роботы со структурами типа стек. Стек представляет собой одномерную структуру, которая работает по принципу "последний вошел - первый вышел" (или LIFO - last-in, first-out). Тип элементов создаваемого стека должен определяться шаблоном. В качестве базовой структуры для построения стека использовать одномерный динамический массив.

2. Для создания объектов типа Stack, их инициализации и правильного их удаления предусмотреть соответствующие конструкторы и деструкто­р. Предусмотреть в классе конструктор копирования.

3. Количество мест для значений, помещаемых в стек (размер стека), должна быть константой для данного стека-объекта. Значение этого параметра должно устанавливаться при создании стека-объекта.

4. Для программирования операций над объектами класса Stack выполнить перегрузку следующих символов операций:

   - динамическое присваивание, символ "=" ;

   - проверка, являются ли два стека одинаковыми по размеру и содержимому, символ "==";

   - прокрутка содержимого стека вперед на одну позицию, символ
">>" ;

   - прокрутка содержимого стека назад на одну позицию, символ "<<" .

4. Предусмотреть следующие функции - члены класса:

   int Stack::num() - количество элементов, сохраняемых в стеке в данный момент;

   bool Stack::empty() - проверка, является ли стек пустым;

          void Stack::push(type x)  - загрузить новое значение x в стек;

          type Stack::pop() - извлечь значение из вершины стека;

          type Stack::top() - прочитать значение из вершины стека.

5. Разработать демонстрационно-тестирующую программу. Выполнить тестирование созданного класса.

 

       Литература: [17]

 

 

Тема 13

   Класс "Стек" на основе связного списка

 

1. Создать класс Stack для роботы со структурами типа стек. Стек представляет собой структуру типа "последний вошел - первый вышел" (или LIFO - last-in, first-out). Тип элементов стека должен определяться шаблоном. В качестве базовой структуры для построения стека использовать структуру связного списка.

2. Для создания объектов типа Stack, их инициализации и правильного их удаления предусмотреть соответствующие конструкторы и деструкто­р. Предусмотреть в классе конструктор копирования.

3. Для программирования операций над объектами класса Stack выполнить перегрузку следующих символов операций:

   - динамическое присваивание, символ "=" ;

   - проверка, являются ли размеры и содержимое двух стеков одинаковыми, символы "==";

   - прокрутка стека вперед, символ ">>" ;

   - прокрутка стека назад, символ "<<" .

4. Предусмотреть следующие функции - члены класса:

   int Stack::num() - количество элементов, сохраняемых в стеке в данный момент;

   bool Stack::empty() - проверка, является ли стек пустым;

          void Stack::push(type) - загрузить новое значение в стек;

          type Stack::pop() - извлечь значение из вершины стека;

          type Stack::top() - прочитать значение из вершины стека.

5. Разработать демонстрационно-тестирующую программу. Выполнить тестирование созданного класса.

 

       Литература: [17]

 

 

Тема 14

Классы для вычислений на ориентированных  графах: матрица смежности и таблица связей

 

1. Создать классы Tgraph и Mgraph для представления таблиц связей и матриц смежности графов.

2. Для создания объектов классов, их инициализации и правильного удаления предусмотреть соответствующие конструкторы и деструкто­р. В каждом из классов предусмотреть конструктор копирования.

3. Для программирования операций над объектами типа Tgraph и Mgraph выполнить перегрузку следующих символов операций:

   - динамическое присваивание, символ "=";

   - формирование значения, которое соответствует графу с нулевым количеством вершин, символ "=", правый операнд - число 0;

   - формирование значения, которое соответствует безреберному графу с заданным количеством вершин, символ "=", правый операнд - целое число;

   - ввод из файла таблицы связей или матрицы смежности, символ "<<";

   - вывод в файл таблицы связей или матрицы смежности, символ ">>".

4. В каждом из классов предусмотреть следующие функции:

      void  del_v(int k) - удаление вершины с номером k из графа;

      void  add_v() - добавление изолированной вершины в граф;

      void  del_r(int i, int k) - удаление ребра с конечными                                               вершинами i,k из графа ;

      void  add_r(int i, int k) - дабавление ребра с конечными                                               вершинами i,k в граф;

      int  Tgraph::pow(int k) - получить степень вершины с номером k.

5. Для создаваемых классов Tgraph и Mgraph предусмотреть средства взаимного преобразования типов.

6. Разработать демонстрационно-тестирующую программу. Выполнить тестирование созданного класса.

 

 

Тема 15


Дата добавления: 2018-04-15; просмотров: 410; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!