Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задания и методические указания.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
398 Кб
Скачать
☆

Задания к лабораторной работе 1

  1. Создайте класс с именем Complex для выполнения арифметических действий с комплексными числами. Напишите программу драйвера для проверки вашего класса. Комплексные числа имеют форму realPart + imaginaryPart * j , где j – квадратный корень из (-1).

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

a) сложения двух комплексных чисел: отдельно складываются действительные и мнимые части;

б) вычитания двух комплексных чисел: действительная часть правого операнда вычитается из действительной части левого операнда, а мнимая часть правого операнда вычитается из мнимой части левого операнда;

в) печати комплексных чисел в форме (a, b), где a – действительная часть, b –мнимая часть.

  1. Создайте класс по имени Rational для выполнения арифметических действий с дробями. Напишите программу драйвера для вашего класса.

Используйте целые переменные для представления закрытых данных класса – числителя и знаменателя. Создайте функцию-конструктор, которая позволяет объекту этого класса принимать начальные значения при его объявлении. Конструктор должен содержать значения по умолчанию на случай отсутствия заданных начальных значений и должен хранить дроби в сокращенном виде (т.е. дробь 2/4 должна храниться в объекте как 1 в числителе и 2 в знаменателе). Создайте открытые функции-элементы для каждого из следующих случаев:

a) сложения двух чисел Rational (результат должен храниться в сокращенной форме);

б) вычитания двух чисел Rational;

в) перемножения двух чисел Rational;

г) деления двух чисел Rational;

д) печати чисел Rational в форме a / b, где а – числитель, b – знаменатель;

е) печати чисел Rational в форме с плавающей точкой.

  1. Создайте класс Rectangle (прямоугольник). Класс имеет атрибуты length (длина) и width (ширина), каждый из которых по умолчанию равен единице. Он имеет функции-элементы, которые вычисляют периметр (perimeter) и площадь (area) прямоугольника, а также функции записи и чтения как для length, так и для width. Функции записи должны проверять, что length и width – числа с плавающей запятой, находящиеся в пределах от 0.0 до 20.0.

  2. Создайте более совершенный (по отношению к предшествующему заданию) класс Rectangle. Он должен хранить только декартовы координаты четырех углов прямоугольника. Конструктор вызывает набор функций, которые принимают четыре группы координат и проверяют, чтобы каждая из координат x и y находилась в первом квадранте, в диапазоне от 0.0 до 20.0. Также должна выполняться проверка: действительно ли переданные координаты определяют прямоугольник. Должны быть предусмотрены функции-элементы, вычисляющие length, width, perimeter и area. Длиной считается большее из двух измерений. Включите предикатную функцию square, которая определяла бы, не является ли прямоугольник квадратом.

  3. Модифицируйте класс Rectangle в предыдущем задании так, чтобы добавить в него функцию draw, которая изображает прямоугольник внутри окна 25 на 25, перекрывающего часть первого квадранта, в котором находится прямоугольник. Включите функцию setFillCharacter, чтобы задавать символ, которым будет заполняться прямоугольник внутри. Добавьте функцию setPerimeterCharacter, чтобы задавать символ, которым будут печататься границы прямоугольника. Можете включить функции масштабирования размера прямоугольника, его вращения и перемещения в пределах первого квадранта.

  4. Создайте класс HugeInteger, который использует массив из 40 элементов для хранения целых чисел, содержащих до 40 цифр. Создайте функции элементы inputHugeInteger, outputHugeInteger, addHugeIntegers и substractHugeIntegers для ввода, вывода, сложения и вычитания этих больших целых. Для сравнения объектов HugeInteger создайте функции isEqualTo (равно), isNotEqualTo (неравно), isGreaterThan (больше), isLessThan (меньше), isGreaterThanOrEqualTo (больше или равно), isLessThanOrEqualTo (меньше или равно) – каждая из них является предикатной функцией, которая просто возвращает единицу (истина), если соответствующее соотношение между двумя большими целыми выполняется. Создайте предикатную функцию isZero (нуль). Можно подготовить также функции-элементы multiplayHugeIntegers (умножение), divideHugeIntegers (деление) и modulusHugeIntegers (нахождение абсолютной величины).

  5. Создайте класс Date со следующими возможностями:

a) с выводом дат в форматах: DD YYYY; MM/DD/YY; Июнь 14, 2007;

b) с использованием перегруженных конструкторов для создания объектов Date с начальными значениями дат в форматах пункта а);

c) с конструктором Date, который читает системную дату, используя стандартные библиотечные функции заголовочного файла time.h, и передает ее элементам Date.

Напишите демонстрационную программу.

  1. Создайте класс SavingsAccount (хранение вкладов) со статическим элементом данных annualInterestRate (процентная ставка) для хранения информации о каждом вкладчике. Каждый элемент этого класса содержит закрытый элемент данных savingsBalance, указывающий сумму, которую вкладчик имеет на депозите. Напишите функцию-элемент calculateMonthlyInterest (расчет ежемесячного дохода), которая ежемесячно вычисляет доход путем деления на 12 произведения balance и annualInterestRate; этот доход $ + 7 % должен прибавляться к savingsBalance. Напишите статическую функцию-элемент modifyInterestRate (изменение процентной ставки), которая задает annualnterestRate новое значение. Напишите программу-драйвер для проверки класса SavingsAccount saver1 и saver2, с балансами $2000.00 и $3000.00 соответственно. Установите annualInterstRate равным 3 %, затем вычислите месячный доход по вкладу и напечатайте новые балансы для каждого из вкладчиков. Затем установите annualInterestRate равным 4 % и повторите операции.

  2. Создайте класс IntegerSet (множество целых). Каждый объект класса может вмещать целые в диапазоне от 0 до 100. Множество представляется массивом из нулей и единиц. Элемент массива a[i] равен единице, если целое i находится во множестве. Элемент массива a[j] равен нулю, если целого j нет во множестве. Конструктор по умолчанию инициализирует множество как пустое, т.е. множество, содержащее только нули. Напишите функции-элементы для типичных операций над множествами: функцию-элемент unionOfIntegerSet, которая создает третье множество, являющееся теоретико-множественным объединением двух существующих. (Элемент массива третьего множества устанавливается равным единице, если соответствующий элемент равен единице хотя бы в одном или обоих существующих множествах, и элемент массива третьего множества устанавливается равным нулю, если этот элемент равен нулю в обоих существующих множествах). Функция-элемент intersectionOfIntegerSets создает третье множество, являющееся теоретико-множественным пересечением двух существующих наборов (т.е. элемент массива третьего множества устанавливается равным нулю, если этот элемент равен нулю в одном или обоих существующих множествах, и элемент массива третьего множества устанавливается равным единице, если этот элемент единичный в обоих существующих).

  3. Создайте класс SalesPerson, отслеживающий суммы продаж служащего за определенный срок работы. Полями класса должны быть имя продавца PersonName и динамический массив или самоссылочная конструкция для хранения сумм вырученных от продаж средств за каждый месяц MonthlySales. С помощью конструктора всем данным должны присваиваться нулевые начальные значения. Класс должен содержать функции-члены по анализу объемов продаж. Функция-член TotalSales возвращает сумму продаж за весь период работы. MonthSales возвращает сумму, вырученную за один определенный месяц. PeriodSales возвращает сумму продаж за указанный промежуток времени. Все функции-члены класса должны выводить информацию на экран в удобном и понятном для пользователя виде.

  4. Создайте три способа работы с данными логического типа boolean:

а) традиционный с использованием препроцессора

#define TRUE 1

#define FALSE 0

#define Boolean int

б) в ANSI C и С++ c использованием перечислимых типов

enum Boolean {false, true};

в) в С++ как класс

class Boolean

{

public: // различные функции-члены, включая перегрузку ! && || == !=

};

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

  1. Разработайте класс person, который содержит соответствующие члены для хранения имени, возраста, пола и телефонного номера. Напишите функции-члены, которые смогут изменять члены-данные индивидуально. Напишите функцию-член person::print(), которая печатает хорошо отформатированные данные о человеке.

  2. Определите dequeue (двустороннюю очередь), которая является симмет-ричной очередью, допускающей помещение и выталкивание с обеих сторон.

class dequeue

{ char s[max_len];

int bottom, top;

public:

void reset() {top = bottom = max_len / 2; top--;}

};

Объявите и реализуйте push_t, pop_t, push_t, pop_b, out_stack, top_of, bottom_of, empty и full. Функция push_t означает вталкивание на дно. Функция out_stack должна выводить стек от дна до вершины. Функция pop_t и pop_b соответствуют выталкиванию из вершины и выталкиванию со дна. Пустой стек обозначается наличием падения вершины ниже дна. Проверьте каждую функцию.

  1. Расширьте тип данных двусторонняя очередь dequeue (см. задание 13), добавляя функцию-член relocate (перемещение). Если двусторонняя очередь полна, тогда вызывается relocate, и содержимое двусторонней очереди перемещается для уравновешивания свободной памяти около центра max_len/ 2 массива s. Функция должна возвращать true, если relocate успешно, false, если она терпит неудачу

boolean dequeue::relocate().

  1. Разработать класс вектор в трехмерном евклидовом пространстве, который задается своими полярными координатами. Обязательны функции-члены класса для ввода вектора и вывода квадрата вектора;

  2. Разработать класс угол на плоскости с членами класса:

– величина угла в градусах;

– функции-члены для ввода/вывода величины угла;

– перевода угла в радианы;

– нахождение sin угла.

  1. Разработать класс квадратная целочисленная матрица с функциями-членами класса для ввода/вывода матрицы и вычисления произведения матриц.

  2. Разработать класс точка в текстовом режиме. Должны быть предоставлены возможности:

– высветить точку в определенном месте экрана с определенным цветом;

– определить, видима ли точка в данный момент;

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

  1. Разработать класс кольцевой список. Обязательны функции-члены класса:

– для добавления/удаления элемента;

– проверки присутствия указанного элемента;

– вывода текущих элементов списка.

  1. Создайте класс stopwatch для имитации секундомера (примечание: используйте конструктор для начальной установки секундомера в нуль). Обязательны функции-члены класса для запуска секундомера, для его остановки, снятия показаний секундомера (примечание: используйте функцию clock() из библиотеки <time.h>).

  2. Создайте класс, который хранил бы информацию о книге: название, автор, дата издания. Создать несколько объектов. Если в конструктор передан символьный параметр, например «а», то контролировать, начинается ли имя автора с данной буквы. Если нет, то выводить сообщение об ошибке. Если параметр не задан, то контролировать не надо.

  3. Определите класс t_end_d, которому при его создании передается текущее системное время и дата в виде параметров конструктора. Этот класс должен включать функцию-член, выводящую время и дату на экран. (Для нахождения и вывода на экран этих данных воспользуйтесь стандартной библиотечной функцией.)

  4. Создайте класс box, конструктору которого передаются три величины типа double, представляющие длины сторон параллелепипеда. Класс box должен подсчитывать его объем и хранить результат типа double. Включите функцию-член volume(), которая выводит на экран объем каждого объекта класса box.

  5. Создайте класс stopwatch для имитации работы секундомера. Используйте конструктор для начальной установки секундомера в нуль. Образуйте две функции-члена класса start() и stop() соответственно для запуска и остановки секундомера. Включите в класс и функцию-член show() для вывода на экран величины истекшего промежутка времени (время привести в секундах). Также используйте деструктор для автоматического вывода на экран времени, прошедшего с момента создания объекта класса stopwatch до его удаления.

  6. Одномерный массив в С – полезный и эффективный тип. Однако исполь-зование его может приводить к возникновению ошибок. Частой ошибкой является попытка обращения к элементам, которые находятся за пределами массива. С++ справляется с этой проблемой с помощью определения типа, аналогичного массиву, в котором пределы могут быть проверены.

Напишите класс, реализующий функциональность массива без этих недостатков. Должны быть реализованы:

– конструктор по умолчанию, динамически распределяющий 10 элементов массива;

– конструктор, принимающий в качестве параметра количество размещаемых элементов. Также необходим деструктор, удаляющий все распределенные элементы массива. Реализуйте следующие функции:

int& element(int i) – возвращения i-го элемента массива;

int ub() – для возвращения текущей верхней границы массива.

  1. Определите класс cyl для хранения информации о цилиндре. Класс должен содержать конструктор задающий радиус и высоту цилиндра и функции вычисляющие объем и полную площадь цилиндра. Перегрузите конструктор так чтобы при отсутствии параметров вычислялся объем цилиндра с высотой 9 и радиусом 5.

  2. Создайте класс strtype, который динамически выделяет память под строку. Сама строка задается как параметр конструктора. Для выделения памяти используйте операторы new и delete.

  3. Напишите программу, которая создает безопасный двумерный массив целых чисел (класс) и перемножает матрицы A,B размерностью n*m. Размеры массива задать в виде параметров конструктора. Все матрицы размещаются в оперативной памяти динамически с помощью операции new, а значения n и m вводится по запросу с клавиатуры. В конце работы программы освободить выделенную память. Вывести исходные и результирующую матрицы.

  4. Создайте класс prompt. Введите в него конструктор, который выводит на экран приглашение (строку) и затем позволяет ввести целые числа. Класс должен выделить память под строки с длинами, равными введенным целым числам, и случайным образом заполнить их. Функция-член op() должна сформировать новую строку и заполнить ее поочередно символами первой и второй строк.

  5. Создайте класс strtype, который получает в качестве параметра длину строки (через конструктор) и выделяет под строку память. Функция full должна заполнить эту строку случайным образом. Сделайте так, чтобы при отсутствии параметров создавалась бы строка длиной 10 символов (память освободить деструктором).

  6. Создайте класс, содержащий поля: фамилия, имя, отчество, год рождения.

Добавьте конструктор по умолчанию, который бы динамически выделял память для каждого из полей. Добавьте деструктор для освобождения выделенной памяти при разрушении класса.

Прототип класса:

class record

{ public:

record(){} ;

char* surname;

char* name;

int* year;

~record() {} ;

};

  1. Определите класс, содержащий информацию о комплексном числе. Класс должен содержать конструктор, который определяет комплексное число (действительную и комплексную составляющие), если параметров нет, то комплексное число установить равным 3+3i. Класс должен содержать функцию, выводящую комплексное число, ее параметром должен быть объект. Создать функцию, перемножающую два комплексных числа (в виде объектов) и возвращающую объект.

  2. Определите класс strtype_a, в состав которого входит функция-член invert, инвертирующая строку и конструктор, параметрами его являются номер символа, до которого будет произведено инвертирование и сама строка. По умолчанию произвести инвертирование всей строки.

  3. Создайте класс stack (стек) так, чтобы для стека память выделялась динамически. Элементы стека – целые числа. При этом длина стека должна задаваться параметром конструктора. (Не забудьте освободить эту память с помощью деструктора). Реализовать операции занесения в стек, снятия с верхушки стека, чтения верхнего элемента без снятия.

  4. Создайте класс strtype, который динамически выделяет память под несколько строк (их число и длину задать в конструкторе). Определите функцию, которая возвращает ту строку, в которой наибольшее число букв 'a'. Память освободить деструктором.

  5. Разработать класс list, реализующий список строк (элементов типа char*).

Обеспечить вставку строк в любую заданную позицию списка, выборку из заданной позиции, удаление элементов из заданной позиции. Хранение указателей на строки и на элементы осуществлять в массиве. Размер массива N получать в параметре конструктора. В конструкторе по умолчанию предусмотреть установку значения размера массива, равного 10. При попытке добавить N+1-й (11-й) элемент ничего не делать. Обеспечить освобождение памяти массива в деструкторе.

  1. Создайте класс strtype, который получает в качестве параметра строку и число (через конструктор) и выделяет под нее память. Функция drob должна разделить эту строку на число строк, заданное в параметре конструктора. Сделайте так, чтобы при отсутствии параметров создавалась строка длиной 10 символов (память освободить деструктором).

  2. Создать класс strtype, в состав которого входит функция-член invert, инвертирующая строку и конструктор, параметрами которого является сама строка. По умолчанию произвести инвертирование заданной по умолчанию строки.

  3. Создайте класс stack (стек) так, чтобы для стека память выделялась динамически. При этом, предельная длина и имя стека должны задаваться параметрами конструктора. Если параметров нет, то размер порции стека установить равной 20, а имя - "default". Захваченную память освобождать деструктором.

  4. Разработать класс list, реализующий список строк (элементов типа char*).

Обеспечить вставку строк в любую заданную позицию списка, выборку из заданной позиции, удаление элементов из заданной позиции. Хранение указателей на строки и на элементы осуществлять в динамически занимаемой памяти. Обеспечить освобождение памяти в функции-члене удаления элемента и (для всех оставшихся элементом) в деструкторе.