~Massiv()
{
delete[] data; // Освобождаем память при удалении объекта
}
};
9.3Примеры решения задач
Для примера возьмѐм задачу из предыдущего раздела.
Создать тип данных для хранения целочисленного массива произвольной длины. Написать функции для заполнения массива случайными значениями и для вывода на экран всех значений массива. Перегрузить оператор «+» для поэлементного сложения двух целочисленных массивов.
Блок-схемы алгоритмов работы методов класса (здесь не приведены) такие же, как и у функций работы со структурами в примере из предыдущего раздела. Разница только в реализации программным кодом.
//Для использования объектов cin и cout для ввода-вывода
#include <iostream>
//Для получения значения текущего времени для задания начального значения для генератора случайных чисел
#include <time.h>
//Тип данных «целочисленный массив»
class Massiv
{
unsigned int quantity; // Количество данных int *data; // Указатель на данные
public:
// Конструтор
Massiv(unsigned int size)
{
quantity = size; // Запоминаем размер
data = new int[quantity]; // Выделяем память
148
// Заполняем созданный массив нулями for(unsigned int i = 0; i < quantity; i++)
{
data[i] = 0;
}
}
// Конструтор копирования
Massiv(Massiv& m)
{
quantity = m.quantity; data = new int[quantity];
for(unsigned int i = 0; i < quantity; i++)
{
data[i] = m.data[i];
}
}
//Деструктор
~Massiv()
{
delete[] data;
}
//Заполнение массива случайными числами void Zapoln()
{
for(unsigned int i = 0; i < quantity; i++)
{
data[i] = rand() - RAND_MAX / 2;
}
}
//Для вывода элементов массива на экран
void Vivod()
{
for(unsigned int i = 0; i < quantity; i++)
{
std::cout<<data[i]<<"\t";
}
std::cout<<"\n\n";
}
149
// Перегрузка оператора присваивания
Massiv& operator=(const Massiv& m)
{
delete[] data;
quantity = m.quantity; data = new int[quantity];
for(unsigned int i = 0; i < quantity; i++)
{
data[i] = m.data[i];
}
return *this;
}
//Перегрузка оператора "+" для сложения массивов
Massiv operator+(const Massiv& B)
{
//Создаём массив-результат, учитываем что складываемые массивы могут иметь разную длину
Massiv C(quantity > B.quantity ? quantity : B.quantity);
//Заносим в массив-результат суммы элементов массивоваргументов
const unsigned int temp = quantity < B.quantity ? quantity : B.quantity;
for(unsigned int i = 0; i < temp; i++)
{
C.data[i] = data[i] + B.data[i];
}
//Если один из массивов длинее другого, докопируем оставшиеся элементы
const int *temppointer = quantity > B.quantity ? data : B.data;
for(unsigned int i = temp; i < C.quantity; i++)
{
C.data[i] = temppointer[i];
}
return C;
}
};
150
// Для проверки работоспособности созданного класса напишем: void main()
{
srand(time(NULL));
// Создаём два массива
Massiv mass1(5); mass1.Zapoln(); mass1.Vivod();
Massiv mass2(3); mass2.Zapoln(); mass2.Vivod();
//Суммируем их в третий
Massiv mass3 = mass1 + mass2;
//Выводим результат на экран mass3.Vivod();
system("pause");
}
Тесты
Проведѐм несколько тестов созданного класса.
Размер: 5 |
-1886 |
|
2788 |
5564 |
971 |
-11380 |
|
Размер: 3 |
1388 |
|
-110 |
-14277 |
|
|
|
Сумма: |
-498 |
|
2678 |
-8713 |
971 |
-11380 |
|
Размер: 4 |
-1716 |
|
4649 |
-15771 7079 |
|
|
|
Размер: 4 |
690 |
8970 -2102 -2655 |
|
|
|||
Сумма: |
-1026 |
|
13619 |
-17873 4424 |
|
|
|
Размер: 3 |
-1537 |
|
5988 |
-16282 |
|
|
|
Размер: 6 |
-12926 |
10935 |
-4436 |
5243 |
184 |
-13580 |
|
Сумма: |
-14463 |
16923 |
-20718 5243 184 |
-13580 |
|||
Массивы заполняются случайными значениями. Суммы массивов посчитаны правильно. Программа работает верно.
151
9.4Задания:
При выполнении заданий данной лабораторной работы не использовать конструкции для ввода и вывода внутри создаваемых по заданию функций и не использовать глобальных переменных, если это не указано явно.
Допускается использовать внутри создаваемых функций другие пользовательские и библиотечные функции.
При выполнении заданий данной лабораторной работы допускается составлять блок-схемы только для создаваемых функций.
Задача 8.1.1. Создать класс для хранения строки символов. Реализовать конструктор для создания строки с заданным содержимым. Реализовать методы для замены содержимого строки и для получения указателя на содержимое строки. Перегрузить как методы операторы «+» и «+=» для соединия двух строк в одну.
Задача 8.1.2. Создать класс для хранения строки символов. Реализовать конструктор для создания строки с заданным содержимым. Реализовать методы для замены содержимого строки и для получения указателя на содержимое строки. Перегрузить как методы операторы «-» и «-=» для удаления из строки всех вхождений заданного символа.
Задача 8.1.3. Создать класс для хранения строки символов. Реализовать конструктор для создания строки с заданным содержимым. Реализовать методы для замены содержимого строки и для получения указателя на содержимое строки. Перегрузить как методы операторы «>>» и «<<» для циклического сдвига символов в строке на заданное число позиций.
Задача 8.1.4. Создать класс для хранения строки символов. Реализовать конструктор для создания строки с заданным содержимым. Реализовать методы для добавления символов к содержимому строки и для получения указателя на содержимое строки. Перегрузить как методы операторы «==» и «!=» для сравнения двух строк.
Задача 8.1.5. Создать класс для хранения строки символов. Реализовать конструктор для создания строки с заданным содержимым. Реализовать методы для добавления символов к содержимому строки и для получения указателя на содержимое строки. Перегрузить как метод оператор унарный «-» для изменения порядка символов в строке на обратный.
152