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



ЗНАЕТЕ ЛИ ВЫ?

Имена всех лиц мужского (женского) пола.

Поиск

2. Имена студентов указанного курса.

Имена и должность преподавателей указанной кафедры.

Имена служащих со стажем не менее заданного.

Имена служащих заданной профессии.

Имена рабочих заданного цеха.

Имена рабочих заданной профессии.

8. Имена студентов, сдавших все (заданный) экзамены на отлично (хорошо и отлично).

9. Имена студентов, не сдавших все (хотя бы один) экзамен.

Имена всех монархов на заданном континенте.

11. Наименование всех деталей (узлов), входящих в заданный узел (механизм).

Наименование всех книг в библиотеке (магазине), вышедших не ранее указанного года.

Названия всех городов заданной области.

Наименование всех товаров в заданном отделе магазина.

Количество мужчин (женщин).

16. Количество студентов на указанном курсе.

Количество служащих со стажем не менее заданного.

Количество рабочих заданной профессии.

Количество инженеров в заданном подразделении.

Количество товара заданного наименования.

21. Количество студентов, сдавших все экзамены на отлично.

22. Количество студентов, не сдавших хотя бы один экзамен.

23. Количество деталей (узлов), входящих в заданный узел (механизм).

Количество указанного транспортного средства в автопарке (на автостоянке).

Количество пассажиров во всех вагонах экспресса.

Суммарная стоимость товара заданного наименования.

27. Средний балл за сессию заданного студента.

28. Средний балл по предмету для всех студентов.

Суммарное количество учебников в библиотеке (магазине).

Суммарное количество жителей всех городов в области.

Суммарная стоимость продукции заданного наименования по всем накладным.

32. Средняя мощность всех (заданного типа) транспортных средств в организации.

Средняя мощность всех дизелей, обслуживаемых заданной фирмой.

Средний вес животных заданного вида в зоопарке.

Среднее водоизмещение всех парусников на верфи (в порту).

 

Перегрузка операций

Цель.

Получить практические навыки работы в среде BC++5.02 и создания EasyWin-программы. Получить практические навыки создания абстрактных типов данных и перегрузки операций в языке С++.

3.2 Основное содержание работы.

Определить и реализовать класс - абстрактный тип данных. Определить и реализовать операции над данными этого класса. Написать и выполнить EasyWin-программу полного тестирования этого класса.

 

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

Абстрактный тип данных (АТД).

АТД - тип данных, определяемый только через операции, которые могут выполняться над соответствующими объектами безотносительно к способу представления этих объектов.

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

Для реализации АТД необходимо, во-первых, выбрать представление памяти для объектов и, во-вторых, реализовать операции в терминах выбранного представления.

Примером абстрактного типа данных является класс в языке С++.

Перегрузка операций.

Возможность использовать знаки стандартных операций для записи выражений как для встроенных, так и для АТД.

В языке С++ для перегрузки операций используется ключевое слово operator, с помощью которого определяется специальная операция-функция (operator function).

Формат операции-функции:

тип_возвр_значения operator знак_операции (специф_параметров)

{операторы_тела_функции}

Перегрузка унарных операций

Любая унарная операция Å может быть определена двумя способами: либо как компонентная функция без параметров, либо как глобаль-

 

ная (возможно дружественная) функция с одним параметром. В первом случае выражение Å Z означает вызов Z.operator Å (), во втором - вызов operator Å(Z).

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

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

Синтаксис:

а) в первом случае (описание в области класса):

тип_возвр_значения operator знак_операции

б) во втором случае (описание вне области класса):

тип_возвр_значения operator знак_операции(идентификатор_типа)

 

Примеры.

1) class person                                   2) class person

{ int age;                                             { int age;

...                                                        ...

public:                                                   public:

…                                                      ...

void operator++(){ ++age;}             friend void operator++(person&);

};                                                        };

void main()                                   void person::operator++(person& ob)

{class person jon;                               {++ob.age;}

++jon;}                                              void main()

                                                            {class person jon;

                                                            ++jon;}

 

Перегрузка бинарных операций

· Любая бинарная операция Å может быть определена двумя способами: либо как компонентная функция с одним параметром, либо как глобальная (возможно дружественная) функция с двумя параметрами. В первом случае x Å y означает вызов x.operator Å (y), во втором – вызов operator Å (x,y).

 

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

· Операции, перегружаемые вне области класса, должны иметь два операнда, один из которых должен иметь тип класса.

Примеры.

1) class person{…};

class adresbook

{ // содержит в качестве компонентных данных множество объектов типа       //person, представляемых как динамический массив, список или дерево

public:

person& operator[](int); //доступ к i-му объекту

};

person& adresbook:: operator[](int i){...}

void main()

{class adresbook persons;

class person record;

record = persons [3];

}

 

2) class person{…};

class adresbook

{ // содержит в качестве компонентных данных множество объектов типа//person, представляемых как динамический массив, список или дерево

public:

friend person& operator[](const adresbook&,int);//доступ к i-му объекту

};

 person& operator[](const adresbook& ob,int i){...}

void main()

{class adresbook persons;

class person record;

record = persons [3];

}

 

Перегрузка операции присваивания

Операция отличается тремя особенностями:

· операция не наследуется;

· операция определена по умолчанию для каждого класса в качестве операции поразрядного копирования объекта, стоящего справа от знака операции, в объект, стоящий слева.

· операция может перегружаться только в области определения класса. Это гарантирует, что первым операндом всегда будет леводопустимое выражение.

Формат перегруженной операции присваивания:

имя_класса & operator= (имя_класса &);

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

Во-вторых, функция operator=() возвращает не объект, а ссылку на него. Смысл этого тот же, что и при использовании параметра-ссылки. Функция возвращает временный объект, который удаляется после завершения ее работы. Это означает, что для временной переменной будет вызван деструктор, который освобождает распределенную память. Но она необходима для присваивания значения объекту. Поэтому, чтобы избежать создания временного объекта, в качестве возвращаемого значения используется ссылка.

 

Порядок выполнения работы.

1. Выбрать класс АТД в соответствии с вариантом.

2. Определить и реализовать в классе конструкторы, деструктор, функции Input (ввод с клавиатуры) и Print (вывод на экран), перегрузить операцию присваивания.

3. Написать программу тестирования класса и выполнить тестирование.

4. Дополнить определение класса заданными перегруженными операциями (в соответствии с вариантом).

5. Реализовать эти операции. Выполнить тестирование.

 

Методические указания.

1.Класс АТД реализовать как динамический массив. Для этого определение класса должно иметь следующие поля:

- указатель на начало массива;

- максимальный размер массива;

- текущий размер массива.

2. Конструкторы класса размещают массив в памяти и устанавливают его максимальный и текущий размер. Для задания максимального массива использовать константу, определяемую вне класса.

3. Чтобы у вас не возникало проблем, аккуратно работайте с константными объектами. Например:

конструктор копирования следует определить так:

MyClass (const MyClass& ob);

операцию присваивания перегрузить так:

MyClass& operator = (const MyClass& ob);

 

 

4. Для удобства реализации операций-функций реализовать в классе private(protected)-функции, работающие непосредственно с реализацией класса. Например, для класса множество это могут быть следующие функции:

- включить элемент в множество;

- найти элемент и возвратить его индекс;

- удалить элемент;

- определить, принадлежит ли элемент множеству.

Указанные функции используются в реализации общедоступных функций-операций (operator).

Содержание отчета.

1. Титульный лист.

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

3. Определение класса.

4. Обоснование включения в класс нескольких конструкторов, деструктора и операции присваивания.

5. Объяснить выбранное представление памяти для объектов реализуемого класса.

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

7. Тестовые данные и результаты тестирования.

Вопросы для самоконтроля.

1. Что такое абстрактный тип данных?

2. Приведите примеры абстрактных типов данных.

3. Каковы синтаксис/семантика “операции-функции”?

4. Как можно вызвать операцию-функцию?

5. Нужно ли перегружать операцию присваивания относительно определенного пользователем типа данных, например класса? Почему?

6. Можно ли изменить приоритет перегруженной операции?

7. Можно ли изменить количество операндов перегруженной операции?

8. Можно ли изменить ассоциативность перегруженной операции?

9. Можно ли, используя дружественную функцию, перегрузить оператор присваивания?

10. Все ли операторы языка  С++ могут быть перегружены?

 

 

11. Какими двумя разными способами определяются перегруженные операции?

12. Все ли операции можно перегрузить с помощью глобальной дружественной функции?

13. В каких случаях операцию можно перегрузить только глобальной функцией?

14. В каких случаях глобальная операция-функция должна быть дружественной?

15. Обязателен ли в функции operator параметр типа “класс” или “ссылка на класс”?

16. Наследуются ли перегруженные операции?

17. Можно ли повторно перегрузить в производном классе операцию, перегруженную в базовом классе?

18. В чем отличие синтаксиса операции-функции унарной и бинарной операции?

19. Приведите примеры перегрузки операций для стандартных типов.

20. Перегрузите операцию “+” для класса “комплексное число”.

21. Перегрузите операции “<”,”>”,”==” для класса “строка символов”.

Варианты заданий.

1.Множество с элементами типа char. Дополнительно перегрузить следующие операции:

· +  - добавить элемент в множество(типа char + set);

· + - объединение множеств;

· = = - проверка множеств на равенство.

2.Множество с элементами типа char. Дополнительно перегрузить следующие операции:

· - - удалить элемент из множества (типа  set-char);

· пересечение множеств;

· < - сравнение множеств.

3.Множество с элементами типа char. Дополнительно перегрузить следующие операции:

· - - удалить элемент из множества (типа set-char);

· проверка на подмножество;

·!= - проверка множеств на неравенство.

 

 

4.Множество с элементами типа char. Дополнительно перегрузить следующие операции:

· + - добавить элемент в множество (типа set+char);

· пересечение множеств;

· int()- мощность множества.

5.Множество с элементами типа char. Дополнительно перегрузить следующие операции:

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

· + - объединение множеств;

· <= - сравнение множеств.

6.Множество с элементами типа char. Дополнительно перегрузить следующие операции:

· проверка на принадлежность(char in set Паскаля);

· пересечение множеств;

· < - проверка на подмножество.

7.Список с элементами типа char. Дополнительно перегрузить следующие операции:

· + – объединить списки (list+list);

· -- – удалить элемент из начала (типа --list);

· = = – проверка на равенство.

8.Однонаправленный список с элементами типа char. Дополнительно перегрузить следующие операции:

· + – добавить элемент в начало(char+list);

· -- – удалить элемент из начала(типа –list);

· = = – проверка на равенство.

9.Однонаправленный список с элементами типа char. Дополнительно перегрузить следующие операции:

· + - добавить элемент в конец (list+char);

· -- - удалить элемент из конца (типа list--);

·!= - проверка на неравенство.

10. Однонаправленный список с элементами типа char. Дополнительно перегрузить следующие операции:

· [] - доступ к элементу в заданной позиции, например:

· int i; char c;

· list L;

· c=L[i];

· + - объединить два списка;

· = = - проверка на равенство.

11. Однонаправленный список с элементами типа char. Дополнительно перегрузить следующие операции:

· [] - доступ к элементу в заданной позиции, например:

· int i; char c;

· list L;

· c=L[i];

· + - объединить два списка;

·!= - проверка на неравенство.

12. Однонаправленный список с элементами типа char. Дополнительно перегрузить следующие операции:

· () - удалить элемент в заданной позиции, например:

· int i;

· list L;

· L[i];

· () - добавить элемент в заданную позицию, например:

· int i; char c;

· list L;

· L[с,i];

·!= - проверка на неравенство.

13. Стек. Дополнительно перегрузить следующие операции:

· + - добавить элемент в стек;

· извлечь элемент из стека;

· bool()- проверка, пустой ли стек.

14. Очередь. Дополнительно перегрузить следующие операции:

· + - добавить элемент;

· извлечь элемент;

· bool() – проверка, пустая ли очередь.

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

· + - сложение векторов (a[i]+b[i] для всех i);

· [] - доступ по индексу;

· + - добавить число к вектору (double+vector).

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

· - - вычитание векторов (a[i]-b[i] для всех i);

· [] - доступ по индексу;

· - - вычесть из вектора число (vector-double).

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

· умножение векторов (a[i]*b[i] для всех i);

· [] - доступ по индексу;

· умножить вектор на число (vector*double).

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

· int() - размер вектора;

· () - установить новый размер;

· - - вычесть из вектора число (vector-double);

· [] - доступ по индексу;

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

· = - присвоить всем элементам вектора значение (vector=double);

· [] - доступ по индексу;

· = = - проверка на равенство;

·!= - проверка на неравенство;

20. Двухмерный массив (матрица) вещественных чисел. Дополнительно перегрузить следующие операции:

· () - доступ по индексу;

· умножение матриц;

· умножение матрицы на число;

· умножение числа на матрицу.

21. Двухмерный массив (матрица) вещественных чисел. Дополнительно перегрузить следующие операции:

· () - доступ по индексу;

· - - разность матриц;

· - - вычесть из матрицы число;

· = = - проверка матриц на равенство.

22. Двухмерный массив (матрица) вещественных чисел. Дополнительно перегрузить следующие операции:

· () - доступ по индексу;

· = - присвоить всем элементам матрицы значение (matr=double);

· + - сложение матриц;

· + - сложить матрицу с числом (matr+double).

23. Двухмерный массив (матрица) вещественных чисел. Дополнительно перегрузить следующие операции:

· () - доступ по индексу;

· = = - проверка матриц на равенство;

· ++ - транспонировать матрицу.

24. Система плоских геометрических фигур: круг, квадрат. прямоугольник. Предусмотреть методы для создания объектов, перемещения на плоскости, Дополнительно перегрузить следующие операции:

· ++, -- - изменения размеров

· +α, -α - вращения на заданный угол.

25. Комплексные чисел с возможностью задания вещественной и мнимой частей как числами типов double, так и целыми числами. Обеспечить выполнение операций сложения, вычитания и умножения комплексных чисел.

26. Цепные списки строк (строки произвольной длины) с операциями:

· +α - включения в список.

· -α - удаления из списка элемента с заданным значением данного.

· / - - удаления всего списка

· /α - -  удаления конца списка. начиная с заданного элемента.

27. Вектора, задаваемых координатами концов в трехмерном пространстве. Обеспечить операции:

· + - сложения

· - - вычитания

· * - вычисления скалярного произведения двух векторов

· |α - длины вектора,

· αcosβ - угла между векторами.

28. Прямоугольники со сторонами, параллельными осям координат. Предусмотреть возможность перемещения прямоугольников на плоскости,

· ++ - изменение размеров,

· α+β - построение наименьшего прямоугольника, содержащего два заданных прямоугольника,

· α-β - прямоугольника, являющегося общей частью (пересечением) двух прямоугольников.

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

· + - поэлементного сложения

· - - вычитания массивов с одинаковыми границами индексов

· *α - умножения

· /α - деления всех элементов массива на скаляр

· p() - печати (вывода на экран) элементов массива по индексам

· p - печати всего массива.

30. Одномерный массив строк фиксированной длины. Предусмотреть возможность обращения к отдельным строкам массива по индексам, контроль выхода за пределы индексов, выполнения операций:

· + - поэелементного сцепления двух массивов с образованием нового массива

· ++ - слияния двух массивов с исключением повторяющихся элементов

· p() - печати (вывода на экран) элементов массива по индексам

· p - печати всего массива.

31. Многочлены от одной переменной, задаваемых степенью многочлена и массивом коэффициентов. Предусмотреть методы для вычисления значения многочлена для заданного аргумента, операции:

· + - поэлементного сложения

· - - вычитания массивов с одинаковыми границами индексов

· *α - умножения

· /α - деления всех элементов массива на скаляр

· p() - печати (вывода на экран) элементов массива по индексам

· p - печати всего массива.

32. Одномерный массив строк, каждая строка задается длиной и указателем на выделенную для нее память. Предусмотреть возможность обращения к отдельным строкам массива по индексам, контроль выхода за пределы индексов, выполнения операций:

· + - поэелементного сцепления двух массивов с образованием нового массива

· ++ - слияния двух массивов с исключением повторяющихся элементов

· p(i) - печати (вывода на экран) элементов массива по индексам

· p - печати всего массива.

33. Тип TMatr, обеспечивающий размещение матрицы произвольного размера с операциями:

· ++, -- - изменения числа строк и столбцов

· p(i, j, k, l) - печати (вывода на экран) элементов массива по индексам

· p() - печати всего массива.

Шаблоны функций и классов

Цель.

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

4.2 Основное содержание работы.

Создать шаблон заданного класса и использовать его для данных различных типов.



Поделиться:


Последнее изменение этой страницы: 2021-11-27; просмотров: 164; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.224.38.170 (0.008 с.)