- •Міністерство освіти та науки україни
- •Аннотация
- •Анотація
- •Лабораторная работа 1 “Одномерный массив - вектор”
- •1. Общие указания
- •2. Пример реализации
- •3. Варианты задания
- •4. Требования к отчету
- •2. Пример реализации
- •3. Варианты задания
- •4. Требования к отчету
- •1.2. Динамические структуры данных: стек, очередь список
- •2. Пример реализации
- •4.Варианты заданий
- •Порядок выполнения работы.
- •Лабораторная работа №4 “Обработка строк”
- •1. Общие указания
- •2.1. Функции ввода/вывода строк
- •2.2. Другие функции работы со строками
- •3. Пример реализации класса «строка»
- •3.1. Класс Слово (word)(строка в одно слово)
- •3.2. Класс Сообщение (Message)(строка длиной до 80 символов (одна экранная строка)
- •3.3. Класс Предложение (sentence) (Строка, состоящая из одного Предложения, занимающего одну или более строк)
- •4. Варианты задания
- •5. Требования к отчету
- •2. Варианты задания
- •3. Содержание отчета
- •Лабораторная работа 6 “Множественное наследование”
- •1. Общие указания
- •4.Варианты заданий
- •Приложение b Терминологический словарь
4. Требования к отчету
1. Обоснование выбора структуры памяти класса и его интерфейса.
2. Блок-схемы алгоритмов функций обработки (ПО3).
3. Описание класса + схемы (ПО2, ПО4).
4. Результаты тестирования класса.
5. Заключение.
ЛАБОРАТОРНАЯ РАБОТА №3
ПЕРЕГРУЗКА ОПЕРАЦИЙ
Цель:Получить практические навыки работы с механизмом перегрузки операций для различных динамических структур данных.
1. Общие указания
1.1. Перегрузка операций
Для перегрузки операции для класса в С++ используется следующий синтаксис:
<Тип> operator <операция>(<входные параметры>) { <операторы>; }
где < Тип > - тип, возвращаемый функцией;
operator - ключевое слово;
< операция > - перегружаемая операция.
В языке С++ имеются следующие ограничения на перегрузку операций:
С++ не различает префиксную и постфиксную формы ++ и - -;
переопределяемая операция должна присутствовать в языке (например, нельзя определить операцию с символом #);
нельзя переопределить операторы, заданные следующими символами . * :: ? ;
переопределённые операции сохраняют свой изначальный приоритет.
1.2. Динамические структуры данных: стек, очередь список
Поскольку с динамическими структурами данных вы уже знакомы из предыдущего курса по программированию, приведем только требования к памяти и интерфейсу классов этих структур.
СТЕК:
обычно реализуется с помощью массива. Реализует концепцию LIFO (Last In First Out), то есть элемент, который добавили в стек последним выйдет из него первым.
Память класса:
[private:]
enum {EMPTY = -1, FULL = 999};// Нижняя и верхняя границы стека
<тип> <имя>[FULL + 1]; // Массив для хранения данных (стек)
int top; // Указатель на вершину стека
Методы класса
Обязательными есть конструктор[ы], деструктор;
Необходимыми есть: добавление элемента void Push(char c); выталкивание элемента char Pop(); очистка стека; проверка существования элементов в стеке; проверка на переполнение стека; определение количества элементов в стеке;
3 функции перегрузки, в соответствии с вариантом задания.
Пример (простейший стек)
#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////
class Stack
{
private:
enum { MAX = 10 }; //(non-standard syntax)
int st[MAX]; //stack: array of integers
int top; //number of top of stack
public:
Stack() //constructor
{ top = 0; }
void push(int var) //put number on stack
{ st[++top] = var; }
int pop() //take number off stack
{ return st[top--]; }
};
////////////////////////////////////////////////////////////////
int main()
{
Stack s1;
s1.push(11);
s1.push(22);
cout << “1: “ << s1.pop() << endl; //22
cout << “2: “ << s1.pop() << endl; //11
s1.push(33);
s1.push(44);
s1.push(55);
s1.push(66);
cout << “3: “ << s1.pop() << endl; //66
cout << “4: “ << s1.pop() << endl; //55
cout << “5: “ << s1.pop() << endl; //44
cout << “6: “ << s1.pop() << endl; //33
return 0;
}
ОЧЕРЕДЬ:
представляет концепцию FIFO (First In First Out), то есть элемент, который добавили в очередь первым, первым ее и покинет. Реализуется с помощью динамического массива или списка.
Память класса:
[private:]
<тип> *<имя>; // Очередь
unsigned MaxLength; // Максимальный размер очереди
unsigned QueueLength// Текущий размер очереди
Методы класса
Обязательными есть конструктор[ы], деструктор;
Необходимыми есть добавление элемента в очередь, удаление элемента из очереди, получение текущей длины очереди, получение максимальной длины очереди, установка максимальной длины очереди, путая/заполненная, очистка очереди.
3 функции обработки, в соответствии с вариантом задания.
СПИСОК:
это линейный набор ссылающихся на себя структур, называемых узлами, и объединенных указателем-связкой. Доступ к связующим узлам производится через связывающий указатель, хранящийся в каждом узле. Список не имеет фиксированного размера - он может расти или сокращаться по мере необходимости. Эта его особенность становится существенной, если число объектов в списке неизвестно до времени выполнения.
Элемент(узел) данных списка может быть представлен, например, структурой
struct <имя_struct>
{
<тип> <имя>;[<тип> <имя>;] // Данные
<имя_struct>* Next; // Адрес следующего элемента списка
};
Память класса:
[private: ]
<имя_struct>*<имя>; // Адрес головного элемента списка (в нашем примере типа структура)
<тип> <имя>; // Количество элементов списка
Методы класса
Обязательными есть конструктор[ы], деструктор;
Необходимыми есть добавление элемента в список, удаление элемента списка, распечатка содержимого списка, получение количества элементов, находящихся в списке,
3 функции обработки, в соответствии с вариантом задания.