Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование задач с применением структурированных данных. Лабораторный практикум.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ
РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное
учреждение высшего образования
«Воронежский государственный технический университет»
ПРОГРАММИРОВАНИЕ ЗАДАЧ
С ПРИМЕНЕНИЕМ СТРУКТУРИРОВАННЫХ
ДАННЫХ
Лабораторный практикум
Воронеж 2023
1
УДК 681.3.06(075.8)
Сергеев, М. Ю.
ISBN 978-5-7731-1097-2
УДК 681.3.06(075.8) ББК 32.973.2-018я7
ISBN 978-5-7731-1097-2
Сергеев М. Ю., Гребенникова Н. И.,
Сергеева Т. И., 2023
ФГБОУ ВО «Воронежский
университет», 2023
ББК 32.973.2-018я7 С322
Рецензенты:
институт цифровых и интеллектуальных систем,
Воронежский государственный лесотехнический университет
им. Г. Ф. Морозова
(директор института, д-р техн. наук, проф. В. К. Зольников);
Т. М. Леденева, д-р техн. наук, зав. кафедрой вычислительной математики
и прикладных информационных технологий
Воронежского государственного университета
Программирование задач с применением структурированных
данных: лабораторный практикум [Электронный ресурс]. – Электрон-
ные текстовые и графические данные (1,6 Мб)/ М.Ю. Сергеев,
С322
Н.И. Гребенникова, Т.И. Сергеева. – Воронеж: ФГБОУ ВО «Воронеж­ский государственный технический университет», 2023. – 1 электрон. опт. диск (DVD-ROM): цв. – Сиcтем. требования: ПК 500 и выше; 256 Мб ОЗУ; Windows 10; SVGA c разрешением экрана 1024х768; Adobe Acrobat; CD-ROM дисковод; мышь. – Загл. с экрана.
Лабораторный практикум содержит теоретические сведения и варианты заданий для проведения лабораторных работ по курсу «Объектно­ориентированное программирование».
Издание предназначено для студентов направления 09.03.01 «Информа­тика и вычислительная техника» (профиль «Вычислительные машины, ком­плексы, системы и сети») очной и заочной форм обучения.
Ил. 4. Табл. 12. Библиогр.: 7 назв.
Издается по решению редакционно-издательского совета
Воронежского государственного технического университета
государственный технический
2

ВВЕДЕНИЕ

Решение вычислительных задач со сложными структурами данных, явля­ется важной составляющей процесса обучения специалистов в области инфор­матики, вычислительной техники и информационных технологий.
К сложным структурам данных можно отнести: динамические массивы, решение вычислительных задач с применением функций, работа с упакован­ными данными и с данными на битовом уровне, технологии работы с файлами, программная реализация алгоритмов сортировки, решение задач с динамиче­скими структурами данных, создание и использование классов, работа с роди­тельскими и дочерними классами, программирование контейнерных классов и модулей.
В данном практикуме рассматриваются задачи программной обработки сложных структур данных.
Первая лабораторная работа посвящена обработке динамических масси­вов данных с применением функций.
Вторая лабораторная работа посвящена изучению методов работы со строковыми данными и структурами.
В третьей лабораторной работе реализуются программы обработки цело­численных данных.
Четвертая лабораторная работа изучает технологии работы с файлами и выполнения основных операций над ними.
Пятая лабораторная работа исследует методы сортировки и алгоритмы их программной реализации.
В шестой лабораторной работе описаны технологии программирования с применением линейных списков.
Седьмая лабораторная работа посвящена программному созданию и ис­пользованию классов.
Восьмая работа направлена на освоение работы с родительскими и до­черними классами.
Девятая лабораторная работа рассматривает технологии работы с контей­нерными классами и модулями.
Практикум снабжен большим количеством практических примеров, поз­воляющих освоить программную реализацию решения задач со сложными структурами данных. Он может быть полезен всем студентам бакалавриата и магистратуры, осваивающим программное решение разнообразных задач по обработке данных.
Издание соответствует типовой программе по дисциплине «Объектно­ориентированное программирование» и предназначено для студентов бака­лавриата направления подготовки 09.03.01 «Информатика и вычислительная техника» очной и заочной форм обучения.
3
ЛАБОРАТОРНАЯ РАБОТА № 1

ОБРАБОТКА МАССИВОВ ДАННЫХ С ПРИМЕНЕНИЕМ ФУНКЦИЙ

1.1. Общие рекомендации по работе с динамическими массивами

Цель работы – приобретение практических навыков реализации про-
грамм, осуществляющих создание и обработку динамических массивов данных с применением функций.
Динамические массивы создают с помощью операции new. При создании массива указывают его тип и размерность. Пример создания динамического массива:
int n = 100;
float *p=new float[n];
В примере задают размер массива (n), создают переменную типа float. В динамической памяти при этом отводится непрерывная область, достаточная для размещения 100 элементов вещественного типа. Адрес начала непрерывной области записывается в указатель p. Динамические массивы нельзя при созда­нии инициализировать, и они не обнуляются.
Память, зарезервированная под динамический массив с помощью new [], должна освобождаться операцией delete:
delete [] p;
Освобождение памяти из-под массива выполняется с любым количеством измерений.
Для создания динамического многомерного массива необходимо указать в операции new все его размерности. Наиболее универсальным и безопасным способом выделения памяти под двумерный массив является следующий:
int n = 5;
int m = 4;
int **a = new int *[n]; //1
for (int i = 0; i < n; i++) //2
a[i] = new int [m]; //3
В операторе 1 объявляется переменная типа «указатель на указатель на int». В этом операторе выделяется память под массив указателей на строки мас­сива (количество строк равно n).
В операторе 2 организуется цикл для выделения памяти под каждую строку массива.
4
В операторе 3 каждому элементу массива указателей на строки присваи­вается адрес начала участка памяти, выделенного под строку двумерного мас­сива. Каждая строка состоит из m элементов типа int.
Для тестирования программ, в которых требуется ввод и анализ большого количества числовых данных (например, длинных числовых последовательно­стей или больших по размеру матриц) весьма удобно использовать генератор случайных чисел для задания стартовой последовательности значений.
Для генерации случайного целого числа используется функция
rand()
Данная функция выбирается из модуля «stdlib.h», у которой есть две важ­ных особенности:
- значение генерируется в диапазоне от 0 до константы RAND_MAX
(32767);
- если предварительно не задать начальное значение последовательности случайных чисел, то каждый раз будет генерировать одинаковая последова­тельность целых чисел.
Поэтому необходимо каждый раз изменять начальное значение при по-
мощи функции srand (модуль «stdlib.h»)
srand(seed),
где seed – начальное значение генератора случайных чисел.
Чтобы не придумывать значение каждый раз заново, можно воспользо­ваться величиной, хранящей значение системного времени (для корректной ра­боты требуется подключение к программе модуля «time.h»):
srand((unsigned)time(NULL));
Если нужно задать случайные числа в определенном диапазоне, то следу­ет создать соответствующее выражение, включающее функцию генератора случайных чисел. Например, для диапазона целых чисел функция будет выгля­деть следующим образом:
rand()%(max-min+1)+min
где min – нижний предел диапазона, а max – верхний.
5

1.2. Пример программы для работы с динамическими массивами

Пример. Найти количество отрицательных элементов в целочисленной
матрице. Размерность матрицы задается пользователем. Значения элементов матрицы задаются с помощью генератора случайных чисел, диапазон значений также задается пользователем.
Листинг программы на С++ приведен ниже.
#include "stdafx.h" // Добавляется в в старые версии (например в 2010
// и 2015) по умолчанию (в новых версия Visual // Studio не нужен)
#include <iostream> //Подключение заголовочного файла
// с функциями ввода-вывода
#include <iomanip> // Подключение заголовочного файла
//для управления отображением данных на экране using namespace std; // Использование пространства имен std int main()
{ setlocale(LC_ALL, "Russian"); // Установка кодовой страницы //Ввод размерности матрицы int n, m; cout << "Введите количество строк матрицы \n"; cin >> n; cout << "Введите количество столбцов матрицы\n"; cin >> m; //Выделение памяти под матрицу int** y = new int* [n]; for (int i = 0; i < n; i++) y[i] = new int[m]; //Инициализация генератора случайных чисел (ГСЧ) srand(time(NULL)); //Задание диапазона ГСЧ int dmin, dmax; cout << "Введите нижний предел ГСЧ\n"; cin >> dmin; cout << "Введите верхний предел ГСЧ\n"; cin >> dmax; //Заполнение матрицы случайными числами for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) y[i][j] = rand() % (dmax - dmin + 1) + dmin; //Подсчет количества отрицательных элементов int otr = 0; for (int i = 0; i < n; i++)
6
for (int j = 0; j < m; j++)
Вариант
Задание
1
В целочисленной матрице найти количество строк, не содержащих ни одного нулевого элемента.
2
В целочисленной матрице найти количество столбцов, содержащих хотя бы один нулевой элемент.
3
В целочисленной матрице найти количество строк, сумма элемен­тов которых больше величины, заданной пользователем.
4
В целочисленной матрице найти количество столбцов, сумма эле­ментов которых больше нуля
if (y[i][j] < 0) otr++; //Вывод результатов cout << "Массив n[" << n << "]\n"; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) cout << setw(4) << y[i][j] << " "; cout << endl; } cout << "\n Кол-во отрицательных элементов в матрице = " << otr << endl; system("pause"); for (int i = 0; i < n; i++) //Удаление массива из динамической памяти delete[]y[i]; return 0; }

1.3. Первое задание к лабораторной работе № 1

Задание
При выполнении задания необходимо:
- написать и отладить программу на С++ в консольном режиме в соответ-
ствии с вариантом задания для обработки динамических массивов;
- варианты задания приведены в табл. 1; номер варианта совпадает с по-
рядковым номером студента в списке;
- проверить работу программы в консольном режиме.
Отчет
Отчет должен содержать титульный лист, вариант задания, текст про-
граммы с комментариями, скриншот результатов работы программы.
Варианты заданий для реализации работы с динамическими массивами
Таблица 1
7
Продолжение табл. 1
Вариант
Задание
5
В целочисленной квадратной матрице найти сумму модулей эле­ментов, размещенных на главной диагонали
6
В целочисленной квадратной матрице найти сумму элементов вы­ше главной диагонали
7
В целочисленной квадратной матрице найти количество положи­тельных элементов на главной диагонали
8
В целочисленной матрице определить количество строк, в которых положительных элементов больше, чем отрицательных
9
В целочисленной квадратной матрице найти максимальный по мо-
гонали
10
В целочисленной матрице найти количество строк, содержащих значение, заданное пользователем
11
В целочисленной матрице найти количество столбцов, где четных элементов меньше, чем нечетных
12
В целочисленной квадратной матрице найти количество нулевых элементов, размещенных под главной диагональю
13
В целочисленной матрице найти количество столбцов, в которых количества положительных и отрицательных элементов совпадают
14
В целочисленной матрице найти количество элементов, значения
вателем
15
В целочисленной квадратной матрице найти, где больше нечетных элементов – над или под главной диагональю
16
В целочисленной матрице найти количество строк, где содержится столько нулевых элементов, сколько указал пользователь
17
В целочисленной матрице найти количество положительных эле­ментов, расположенных над главной диагональю
18
В целочисленной матрице найти сумму четных элементов, распо­ложенных под главной диагональю
19
В целочисленной матрице найти разность между суммами элемен­тов, расположенных над и под главной диагональю
20
В целочисленной матрице найти сумму элементов в столбце, номер которого указал пользователь
21
В целочисленной матрице найти произведение элементов в строке, номер которой указал пользователь
22
В целочисленной матрице найти максимальный элемент в строке, номер которой указал пользователь
23
В целочисленной матрице найти количество столбцов, где содер­жится столько элементов, равных 1, сколько указал пользователь
дулю элемент, среди элементов расположенных выше главной диа-
которых входят в диапазон [a, b]. Значения a и b задаются пользо-
8
Окончание табл. 1
Вариант
Задание
24
В целочисленной квадратной матрице найти количество нечетных положительных элементов, размещенных над главной диагональю
25
В целочисленной матрице найти количество столбцов, где содер­жится элемент, указанный пользователем
26
В целочисленной матрице найти количество строк, сумма элемен­тов в которых меньше значения, указанного пользователем
27
В целочисленной квадратной матрице найти количество четных отрицательных элементов на главной диагонали
28
В целочисленной квадратной матрице найти, где больше нулевых элементов – над или под главной диагональю
29
В целочисленной квадратной матрице найти, где меньше четных элементов – над или под главной диагональю
30
В целочисленной квадратной матрице найти, где больше сумма элементов – над или под главной диагональю
31
В целочисленной квадратной матрице заменить все нулевые эле­менты на 100. Вывести исходную и новую матрицы.
32
В целочисленной квадратной матрице заменить все отрицательные элементы на 0. Вывести исходную и новую матрицы.
33
В целочисленной квадратной матрице заменить все максимальные элементы на 99. Вывести исходную и новую матрицы.
34
В целочисленной квадратной матрице заменить все минимальные элементы на 0. Вывести исходную и новую матрицы.
35
В целочисленной квадратной матрице все нечетные элементы умножить на два. Вывести исходную и новую матрицы.
36
В целочисленной квадратной матрице все четные элементы умно­жить на три. Вывести исходную и новую матрицы.
37
В целочисленной квадратной матрице заменить все положительные элементы на 2. Вывести исходную и новую матрицы.
38
В целочисленной квадратной матрице переставить местами строки,
вую матрицы.
39
В целочисленной квадратной матрице переставить местами столб-
новую матрицы.
40
В целочисленной квадратной матрице заменить все отрицательные
номера которых заданы пользователем. Вывести исходную и но-
цы, номера которых заданы пользователем. Вывести исходную и
элементы на их модули. Вывести исходную и новую матрицы.
9

1.4. Общие рекомендации по использованию функций

Цель лабораторной работы - освоение технологии программирования
задач, использующих функции.
Функция – это именованная последовательность описаний и операторов,
выполняющая какое-либо законченное действие.
Исходные данные могут передавать в функцию через параметры. Функ-
ция имеет единственный результат и передает его через значение.
Любая программа на языке С++ состоит из набора функций. Одна из
функций должна иметь имя main. С этой функции начинается выполнение про­граммы.
Любая функция должна быть сначала объявлена, а затем определена.
Объявлений функции может быть несколько, а определение только одно. Объ­явление функции должно находиться в тексте раньше ее вызова для того, чтобы компилятор мог осуществить проверку правильности вызова. Итак, функция начинает выполняться в момент вызова.
Объявление функции (прототип, заголовок, сигнатура) задает ее имя, тип
возвращаемого значения и список передаваемых параметров.
Определение функции содержит объявление, тело функции, представля-
ющее собой последовательность операторов и описаний в фигурных скобках:
[класс] тип имя ([список параметров]) {тело функции}
С помощью необязательного модификатора класс можно явно задать об-
ласть видимости функции, используя ключевые слова extern и static.
Слово extern обозначает глобальную видимость во всех модулях про-
граммы. Действует по умолчанию.
Слово static обозначает видимость только в пределах модуля, в котором
определена функция.
Тип значения, которое возвращает функция, может быть любым, кроме
массива и функции. Однако возвращаемое значение может быть указателем на массив или функцию. Если функция не должна возвращать значение, то указы­вают тип void.
Список параметров определяет величины, которые требуется передать в
функцию при ее вызове. Элементы списка параметров разделяются запятыми. Для каждого параметра, передаваемого в функцию, указывается его тип и имя (в объявлении имена можно опускать).
В определении, в объявлении и при вызове одной и той же функции типы
и порядок следования параметров должны совпадать. На имена параметров ограничений по соответствию не накладывается, поскольку функцию можно вызывать с различными аргументами.
Тип возвращаемого значения и типы параметров совместно определяют
тип функции.
10
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]