1. Изучите теоретический материал.
2. Напишите программу, согласно заданному в варианте задания условию.
3. Ответьте на контрольные вопросы.
ВАРИАНТЫЗАДАНИЙ
Вариант. 1
Добавьте в класс Distance из программы ENGLPLUS перегруженную операцию -, которая вычисляет разность двух интервалов. Она должна позволять выполнение выражений типа dist3=distl-dist2;. Предполагаем, что эта операция никогда не будет использоваться для вычитания большего интервала из меньшего (так как отрицательного интервала быть не может).
Вариант. 2
Напишите программу, которая заменяет перегруженную операцию + на перегруженную операцию += в программе STRPLUS. Эта операция должна позволять записывать выражения типа:
si += s2;
где s2 прибавляется (объединяется) к строке si, результат при этом остается в si. Операция должна также позволять использовать результат для других вычислений, например в выражениях типа
s3 = si += s2;
Вариант. 3
Модифицируйте класс time из упражнения 3 главы 6 так, чтобы вместо метода add_time() можно было использовать операцию + для складывания двух значений времени. Напишите программу для проверки класса.
Вариант. 4
Создайте класс Int, основанный на упражнении 1 из главы 6. Перегрузите четыре целочисленных арифметических операции (+, -, * и /) так, чтобы их можно было использовать для операций с объектами класса Int. Если результат какой-либо из операций выходит за границы типа int (в 32- битной системе), имеющие значение от 2 14 7 483 648 до -2 147 483 648, то операция должна послать сообщение об ошибке и завершить программу. Такие типы данных полезны там, где ошибки могут быть вызваны арифметическим переполнением, которое недопустимо. Подсказка: для облегчения проверки переполнения выполняйте вычисления с использованием типа long double. Напишите программу для проверки этого класса.
|
Вариант. 5
Пополните класс time, рассмотренный в упражнении 3, перегруженными операциями увеличения (++) и уменьшения (--), которые работают в обеих, префиксной и постфиксной, формах записи и возвращают значение. Дополните функцию main(), чтобы протестировать эти операции.
Вариант. 6
Добавьте в класс time из упражнения 5 возможность вычитать значения времени, используя перегруженную операцию -, и умножать эти значения, используя тип float и перегруженную операцию *.
Вариант. 7
Модифицируйте класс fraction в четырехфункциональном дробном калькуляторе из упражнения 11 главы 6 так, чтобы он использовал перегруженные операции сложения, вычитания, умножения и деления. (Вспомните правила арифметики с дробями в упражнении 12 главы 3 «Циклы и ветвления».) Также перегрузите операции сравнения == и!= и используйте их для выхода из цикла, когда пользователь вводит 0/1, 0 и 1 значения двух частей дроби. Вы можете модифицировать и функцию lowterms() так, чтобы она возвращала значение ее аргумента, уменьшенное до несократимой дроби. Это будет полезным в арифметических функциях, которые могут быть выполнены сразу после получения ответа.
Вариант. 8
Модифицируйте класс ЬМопеу из упражнения 12 главы 7 «Массивы и строки», включив арифметические операции, выполненные с помощью перегруженных операций:
bМопеу = bМопеу + bМопеу bМопеу = bМопеу - bМопеу
bМопеу = bМопеу * long double (цена за единицу времени, затраченного на изделие) long double = bМопеу / bМопеу (общая цена, деленная на цену за изделие) bМопеу = bМопеу / long double (общая цена, деленная на количество изделий)
|
Заметим, что операция / перегружена дважды. Компилятор может различить оба варианта, так как их аргументы разные. Помним, что легче выполнять арифметические операции с объектами класса ЬМопеу, выполняя те же операции с его long double данными.
Убедитесь, что программа main() запросит ввод пользователем двух денежных строк и числа с плавающей точкой. Затем она выполнит все пять операций и выведет результаты. Это должно происходить в цикле, так, чтобы пользователь мог ввести еще числа, если это понадобится.
Некоторые операции с деньгами не имеют смысла: ЬМопеу*ЬМопеу не представляет ничего реального, так как нет такой вещи, как денежный квадрат; вы не можете прибавить ЬМопеу к long double (что же будет, если рубли сложить с изделиями?). Чтобы сделать это невозможным, скомпилируйте такие неправильные операции, не включая операции преобразования для ЬМопеу в long double или long double в ЬМопеу. Если вы это сделаете и запишете затем выражение типа:
bmon2 = bmonl + widgets; //это не имеет смысла
то компилятор будет автоматически преобразовывать widgets в ЬМопеу и выполнять сложение. Без них компилятор будет отмечать такие преобразования как ошибки, что позволит легче найти концептуальные ошибки. Также сделайте конструкторы преобразований явными.
Вот некоторые другие вероятные операции с деньгами, которые мы еще не умеем выполнять с помощью перегруженных операций, так как они требуют объекта справа от знака операции, а не слева:
|
long double * ЬМопеу // Пока не можем это сделать: ЬМопеу возможен только справа long double / ЬМопеу // Пока не можем это сделать: ЬМопеу возможен только справа
Вариант. 9
Дополните класс safearray из программы ARR0VER3 этой главы так, чтобы пользователь мог определять и верхнюю, и нижнюю границы массива (например, индексы, начинающиеся с 100 и заканчивающиеся 200). Имеем перегруженную операцию доступа к членам массива, проверяющую индексы каждый раз, когда к массиву нужен доступ, для проверки того, что мы не вышли за пределы массива. Вам понадобится конструктор с двумя аргументами, который определяет верхнюю и нижнюю границы. Так как мы еще не изучили, как выделять память динамически, то данные класса все еще будут размещаться в массиве, состоящем из 100 элементов, но вообще вы можете преобразовывать индексы массива safearray в индексы реального массива целых чисел произвольным образом. Например, если пользователь определил диапазон от 100 до 175, то вы можете преобразовать его в диапазон от агг[0] до агг[75].
Вариант. 10
Только для любителей математики: создайте класс Polar, который предназначен для хранения полярных координат (радиуса и угла). Перегрузите операцию + для выполнения сложения для объектов класса Polar. Сложение двух объектов выполняется путем сложения координат X объектов, а затем координат Y. Результат будет координатами новой точки. Таким образом, вам нужно будет преобразовать полярные координаты к прямоугольным, сложить их, а затем обратно преобразовать прямоугольные координаты результата к полярным.
Вариант. 11
Напишите программу, объединяющую в себе классы ЬМопеу из варианта 8 и sterling из упражнения 11. Напишите операцию преобразования для преобразования между классами ЬМопеу и sterling, предполагая, что один фунт (£1.0.0) равен пятидесяти долларам ($50.00). Это приблизительный курс обмена для XIX века, когда Британская империя еще использовала меру фунты-шиллинги-пенсы. Напишите программу main(), которая позволит пользователю вводить суммы в каждой из валют и преобразовывать их в другую валюту с выводом результата. Минимизируйте количество изменений в существующих классах ЬМопеу и sterling.
Форма отчёта: отчет выполняется в тетрадях по практическим работам в письменном виде.
Содержание отчета:
Тема работы.
Цель работы.
Выполненные задания.
Система оценки: двухбалльная.
КОНТРОЛЬНЫЕ ВОПРОСЫ
Перегрузка операций:
а) преобразовывает операции(орегаШг) С++ для работы с объектами;
б) предоставляет операциям С++ больше, чем они могут обработать;
в) дает новое значение существующим в С++ операциям;
г) создает новые операции С++.
Предположим, что класс X не использует перегруженные операции. Напишите выражение, в котором вычитается объект xl класса X из другого объекта х2 этого же класса. Результат помещается в хЗ.
Предположим, что класс X включает в себя процедуру перегрузки операции -. Напишите выражение, которое будет выполнять те же действия, что и выражение, описанное в вопросе 2.
Истинно ли следующее утверждение: операция >= может быть перегружена?
Запишите полное определение для перегруженной операции в классе Counter программы C0UNTPP1, которая вместо увеличения счетчика уменьшает его.
Сколько аргументов требуется для определения перегруженной унарной операции?
Предположим, что существует класс С с объектами objl, obj2 и obj3. Выражение obj3=objl-obj2 работает правильно. Здесь перегруженная операция должна: *
а) принимать два аргумента;
б) возвращать значение;
в) создавать именованный временный объект;
г) использовать объект, вызвавший операцию, как операнд.
Чем отличается действие перегруженной операции ++ при ее использовании в префиксной форме от использования в постфиксной форме?
Истинно ли следующее утверждение: перегруженная операция всегда требует на один аргумент меньше, чем количество операндов?
Список использованной литературы
Х.Дейтел Как программировать на C; Пер. с англ. под ред. В. Тимофеева. - М.: БИНОМ, 2000. - 1005 с.: ил.; 24
Язык программирования С / Брайан Керниган, Деннис Ритчи; [пер. с англ. и ред. В. Л. Бродового]. - 2-е изд., перераб. и доп. - Москва [и др.]: Вильямс, 2007. - 289 с.; 23 см.
Бьерн Страуструп Язык программирования C++; Пер. с англ. С. Анисимова и М. Кононова под ред. Ф. Андреева, А. Ушакова. - 3. изд. - М.: Binom Pablishers; СПб.: Нев. диалект, 2004. - 990 с.: ил.; 24 см.