Материал: ЛР 7 Информатика 2 сем 2020

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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

Источник: https://studfile.net/preview/16421897/