vect1.y = 4;
MyVector vect2; // Создаём другой вектор vect2.x = 6.2;
vect2.y = -5;
// Создаём третий вектор, равный сумме двух предыдущих
MyVector vect3 = vect1 + vect2;
...
}
Использовать стандартный оператор «+» для сложения стандартных типов данных по-прежнему можно. Компилятор отличит его от вышеописанного по типу слагаемых (аргументов).
8.3Примеры решения задач
Задача А Создать тип данных для хранения целочисленного массива произвольной длины. Написать функции для заполнения массива случайными значениями и для вывода на экран всех значений массива. Перегрузить оператор «+» для поэлементного сложения двух целочисленных массивов.
Решение:
Алгорим работы функции для создания массива
Начало
Massiv mass unsigned int size
Получение mass и size
Записываем size (размер массива) в mass.quantity
Выделяем память под массив, указатель на неѐ записываем в mass.data
Обнуляем созданный массив (чтоб «мусора» не было)
Возвращение mass
Конец
133
Алгорим работы оператора "+" для сложения массивов
Начало
Massiv A, Massiv B
Получение A и B
Создать Massiv C, длиной не меньше чем A и чем B
Вычисляем суммы элементов A и B, стоящих на одинаковых позициях, пока не дойдѐм до конца одного из массивов; результаты заносим в C на те же позиции
Если один из массивов длинее другого, докопируем его элементы, не учавствовавшие в сложении в конец C
Возвращение С
Конец
Блок-схемы работы остальных функций здесь не приведены, они аналогичны и довольно просты.
Теперь составим программу:
#include <iostream> // Для использования объектов cin и cout для ввода-вывода
#include <time.h> // Для получения значения текущего времени для задания начального значения для генератора случайных чисел
//Тип данных «целочисленный массив» struct Massiv
{
unsigned int quantity; // Количество данных int *data; // Указатель на данные
};
//Функция для создания массива
void CreateMassiv(Massiv& mass, unsigned int size)
{
mass.quantity = size; // Запоминаем размер mass.data = new int[mass.quantity]; // Выделяем память
// Заполняем созданный массив нулями (избавляемся от «мусора») for(unsigned int i = 0; i < mass.quantity; i++)
{
mass.data[i] = 0;
}
134
}
//Функция для удаления массива void DeleteMassiv(Massiv& mass)
{
delete[] mass.data;
}
//Функция для заполнения массива случайными числами void Zapoln(Massiv& mas)
{
for(unsigned int i = 0; i < mas.quantity; i++)
{
mas.data[i] = rand() - RAND_MAX / 2;
}
}
//Функция для вывода элементов массива на экран void Vivod(const Massiv& mas)
{
for(unsigned int i = 0; i < mas.quantity; i++)
{
std::cout<<mas.data[i]<<"\t";
}
std::cout<<"\n\n";
}
//Перегрузка оператора "+" для сложения массивов
Massiv operator+(const Massiv& A, const Massiv& B)
{
//Создаём массив-результат, учитываем что складываемые массивы могут иметь разную длину
Massiv C;
C.quantity = A.quantity > B.quantity ? A.quantity : B.quantity; C.data = new int[C.quantity];
//Заносим в массив-результат суммы элементов массивов-аргументов const unsigned int temp = A.quantity < B.quantity ? A.quantity :
B.quantity;
for(unsigned int i = 0; i < temp; i++)
{
C.data[i] = A.data[i] + B.data[i];
}
// Если один из массивов длинее другого, докопируем оставшиеся элементы
const int *temppointer = A.quantity > B.quantity ? A.data : B.data; for(unsigned int i = temp; i < C.quantity; i++)
{
C.data[i] = temppointer[i];
}
135
return C;
}
// Для проверки работоспособности созданных функций напишем: void main()
{
srand(time(NULL));
// Создаём два массива
Massiv mass1; CreateMassiv(mass1, 5); Zapoln(mass1); Vivod(mass1);
Massiv mass2;
CreateMassiv(mass2, 3);
Zapoln(mass2);
Vivod(mass2);
//Суммируем их в третий
Massiv mass3 = mass1 + mass2;
//Выводим результат на экран
Vivod(mass3);
//Освобождаем память
DeleteMassiv(mass1);
DeleteMassiv(mass2);
DeleteMassiv(mass3);
system("pause");
}
Тесты
Проведѐм несколько тестов созданных функций. В функцию для создания массива передаѐм указатель на экземпляр структуры «Massiv» и его размер. В остальные функции передаѐм только указатель на экземпляр структуры «Massiv», размер массива уже записан в еѐ поле «quantity».
Размер: 5 |
10060 |
5242 |
5480 |
-10265 9346 |
|
Размер: 3 |
5786 |
15364 |
3682 |
|
|
Сумма: |
15846 |
20606 |
9162 |
-10265 9346 |
|
Размер: 5 |
11285 |
5431 |
-12895 2278 |
10688 |
|
Размер: 5 |
3750 |
2885 |
-12702 -5811 |
-457 |
|
Сумма: |
15035 |
8316 |
-25597 -3533 |
10231 |
|
|
|
|
|
|
136 |
Размер: 6 |
11517 |
14904 |
10277 |
6837 |
-10641 -12364 |
|
|
Размер: 9 |
-5507 |
8838 |
-13136 -10986 |
-4573 -2199 -9022 |
-4629 |
-5947 |
|
Сумма: |
6010 |
23742 |
-2859 |
-4149 |
-15214 -14563 -9022 |
-4629 |
-5947 |
Массивы заполняются случайными значениями. Суммы массивов посчитаны правильно. Программа работает верно.
8.4Задания:
При выполнении заданий данной лабораторной работы не использовать конструкции для ввода и вывода внутри создаваемых по заданию функций и не использовать глобальных переменных, если это не указано явно.
Допускается использовать внутри создаваемых функций другие пользовательские и библиотечные функции.
При выполнении заданий данной лабораторной работы допускается составлять блок-схемы только для создаваемых функций.
Задача 7.1.1. Создать тип данных для хранения информации о книге: название, автор, издательство, год издания, количество страниц. Написать функции для поиска в массиве книг и вывода на экран всех книг заданного автора, заданного издательства.
Задача 7.1.2. Создать тип данных для хранения информации о книге: название, автор, издательство, год издания, количество страниц. Написать функции для поиска в массиве книг и вывода на экран книг, изданных в заданном промежутке времени.
Задача 7.1.3. Создать тип данных для хранения информации о журнале: название, номер, год и месяц издания. Написать функции для поиска в массиве журналов и вывода на экран журналов, выходивших в заданный временной период (с точностью до месяца).
Задача 7.1.4. Создать тип данных для хранения информации о журнале: название, номер, год и месяц издания. Написать функцию для поиска в массиве журналов и вывода на экран даты выхода журнала по его названию и номеру. Написать функцию для определения по массиву журналов, в какой период выпускался заданный (по названию) журнал.
137