ВАРИАНТЫ ЗАДАНИЙ. КОНТРОЛЬНЫЕ ВОПРОСЫ




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 см.

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2021-04-07 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: