Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

g30zAZLYUG

.pdf
Скачиваний:
3
Добавлен:
15.04.2023
Размер:
1.89 Mб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ МУРМАНСКИЙ ГОСУДАРСТВЕННЫЙ АРКТИЧЕСКИЙ УНИВЕРСИТЕТ

Н. Р. Ланина

СТРУКТУРЫ И АЛГОРИТМЫ ОБРАБОТКИ ДАННЫХ:

ЛАБОРАТОРНЫЙ ПРАКТИКУМ

Учебно-методическое пособие

МУРМАНСК

2018

УДК 004.4(075.8) ББК 32.973.34я73

Л22

Издается по решению Совета по научно-исследовательской работе и редакционноиздательской деятельности Мурманского арктического государственного университета

Рекомендовано учебно-методическим советом МАГУ к использованию в учебном процессе (протокол № 2 от 21.11.2017)

Автор: Н. Р. Ланина, канд. техн. наук, доцент кафедры математики, физики и информационных технологий МАГУ

Рецензенты: О. М. Мартынов, канд. физ.-мат. наук, доцент кафедры математики, физики и информационных технологий МАГУ; Б. М. Верещагин, канд. физ.-мат. наук, доцент, преподаватель математики Мурманского академического лицея

Ланина Н. Р.

Структуры и алгоритмы обработки данных: лабораторный практикум

[Электронный ресурс] : учебно-методическое пособие / Н. Р. Ланина. ‒ Мурманск : МАГУ, 2018. ‒ 121 с.

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

Пособие предназначено для освоения практической части курса «Структуры и алгоритмы обработки данных» студентами специальностей 02.03.03 «Математическое обеспечение и администрирование информационных систем» и 01.03.02 «Прикладная математика и информатика», а также для освоения практической части курса «Типы данных» студентами специальности 02.03.01 «Математика и компьютерные науки». Его могут использовать студенты других специальностей, стремящиеся расширить свои познания в программировании.

Публикуется в авторской редакции.

Ланина Н. Р., 2018ФГБОУ ВО «Мурманский арктический

государственный университет», 2018

2

ВВЕДЕНИЕ

Данное пособие включает в себя лабораторные работы по таким разделам курса «Структуры и алгоритмы обработки данных», как «Структуры данных» (лабораторные работы № 1‒3), «Сортировка» (лабораторная работа № 4), «Быстрый поиск» (лабораторная работа № 5), «Исчерпывающий поиск» (лабораторная работа № 6).

В ходе выполнения лабораторных работ Вы разработаете консольные приложения, позволяющие:

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

сортировать массив записей, как по числовому, так и по строковому полю;

осуществлять быстрый поиск записи по данному ключу;

генерировать комбинаторные объекты, такие как размещения, перестановки сочетания и т.д.

Каждая лабораторная работа включает в себя:

краткие теоретические сведения;

примеры, содержащие подробное пошаговое описание процесса разработки консольного приложения;

пятнадцать вариантов индивидуальных заданий для самостоятельного выполнения;

перечень контрольных вопросов для самопроверки.

Разработка всех консольных приложений осуществляется в среде программирования Microsoft Visual 2010 на языке C++.

Данное пособие предназначено для студентов очного отделения по следующим направлениям подготовки:

02.03.03 «Математическое обеспечение и администрирование информационных систем»;

01.03.02 «Прикладная математика и информатика»;

02.03.01 «Математика и компьютерные науки».

Вучебном плане специальности 02.03.03 дисциплина «Структуры и алгоритмы обработки данных» входит в базовую часть блока обязательных дисциплин.

Вучебном плане специальности 01.03.02 дисциплина «Структуры и алгоритмы обработки данных» входит в вариативную часть блока обязательных дисциплин.

Вучебном плане специальности 02.03.01 дисциплина «Типы данных» входит в вариативную часть блока обязательных дисциплин.

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

3

Автор выражает признательность рецензентам ‒ доценту кафедры математики, физики и информационных технологий Мурманского арктического государственного университета О.М. Мартынову и преподавателю математики Мурманского академического лицея доценту Б.М. Верещагину, чья детальная и благожелательная критика во многом способствовала улучшению первоначального текста рукописи.

4

Лабораторная работа № 1. Статические и динамические массивы

Под массивом типа Т с границами [b ... B] будем понимать соединение B – b + 1 элементов, каждый из которых имеет тип Т.

Над массивом определены следующие операции:

создать пустой массив;

получить элемент: по индексу i извлекается элемент mi;

изменить элемент: по индексу i массив M преобразуется в массив

M*, где

M = (m1, …, mi-1, mi, mi+1, …, mn), M*= (m1, …, mi-1, mi*, mi+1, …, mn).

Массив является структурой прямого доступа. Это означает, что каждый элемент полностью определяется заданием имени массива и индекса; чтобы до него добраться, нет необходимости в серии операций над другими элементами. Под массив выделяется сплошная область памяти.

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

п. 1. Начало работы

1.1.Запустите Microsoft Visual Studio C++.

1.2.В открывшемся окне выберите: «Создать проект».

1.3.Затем выберите: «Консольное приложение Win32» и на этой странице в качестве имени проекта укажите lab_01, расположение – выберите свою папку или рабочий стол.

1.4.В появившемся окне нажмите «Далее» (а не «Готово»).

1.5.Снимите галочку с пункта «Предварительно скомпилированный заголовок» и теперь уже нажмите «Готово».

1.6.Замените весь изначально сгенерированный код следующим фрагментом:

#include "stdafx.h" #include <iostream> int main ()

{

printf("Нажмите клавишу ENTER, чтобы закрыть программу\n"); getchar();

return 0;

}

5

Имеющийся в коде оператор getchar() не позволит окну приложения закрыться до тех пор, пока пользователь не нажмет клавишу Enter.

1.7. Запустите программу на выполнение.

Замечание. Возможно, в ходе построения проекта на этапе компиляции у Вас возникнет ошибка вида:

В этом случае в свойствах проекта необходимо переключить инкре-

ментную компоновку в положение «Нет (/INCREMENTAL:NO)»:

Если построение проекта прошло успешно, то, перед Вами возник непонятный набор символов (за исключением слова «ENTER»):

1.8. Чтобы программа смогла распознать русский текст, выполните следующие действия:

1.8.1. в конец группы подключений библиотек добавьте объявление заголовочного файла locale.h:

#include <locale.h>

1.8.2. в начало процедуры main вставьте оператор setlocale:

setlocale(LC_ALL, "RUS");

Запустите программу на выполнение. Как видите, теперь символы русского алфавита распознаются правильно.

6

п. 2. Функции cin и cout

2. 1. В дальнейшем для ввода и вывода информации будем использовать операторы cin и cout. Чтобы транслятор их распознал, сразу после подключений библиотек (операторы include) вставьте строку:

using namespace std;

2.2. Замените оператор printf на оператор cout:

cout << "Нажмите клавишу ENTER, чтобы закрыть программу\n";

изапустите программу на выполнение. Всё работает нормально.

2.3.С помощью оператора cin введём целочисленную переменную «i», а с помощью оператора cout выведем её значение на экран. Для этого после оператора setlocale вставьте код:

int i;

cout << "Введите натуральное число и нажмите клавишу ENTER,\n"; cin >> i;

cout << "i=" << i;

Запустите программу на выполнение. После того как Вы ввели натуральное число, не смотря на наличие оператора getchar(), окно приложения практически сразу закрылось.

2.4 Проблема в следующем. Оператор cin запрашивает у пользователя число. Пользователь вводит число и нажимает <Enter>. Число считывается, а символ перехода на новую строку (из-за нажатия <Enter>) сохраняется во входном потоке. Чтобы очистить входной поток, сразу после оператора «cin >> i;» вставьте строку:

cin.ignore();

Запустите программу на выполнение. Ситуация улучшилась. Окно не закрывается. Переменная прочитана и распечатана.

2.5. Плохо, что при выводе значение переменной «прилипло» к слову «Нажмите». Исправим ситуацию, добавив в оператор cout символ "\n" перехода на новую строку:

cout << "i=" << i << "\n";

7

п. 3. Функции strcmp и strcpy для работы со строковыми переменными

Как известно, присвоить числовой переменной a значение переменной b можно с помощью оператора: a=b;

В языке С++ такой подход для строковых переменных не работает.

Здесь надо использовать функцию strcpy(s1, s2)

(от англ. string copy – копирование строк), которая копирует содержимое строки s2 в строку s1. Другими словами, первый аргумент указывает, куда копировать, а второй – откуда копировать.

3.1. После оператора setlocate объявите четыре переменных строкового типа:

char s1[25]="веретено", s2[75]="весна", s3[50]="вата", s4[75];

3.2. Ниже, с помощью функции strcpy значение переменной s1 скопируйте в s4 и распечатайте s4:

strcpy(s4, s1);

cout << "s4=" << s4 << "\n";

Запустите программу на выполнение, чтобы убедиться, что присвоение прошло успешно.

Для сравнения числовых значений используются операции: <, >, <=,

=>.

Сравнение строковых переменных в языке С++ осуществляет специальная функция

strcmp(s1,s2)

(от англ. string compare – сравнение строк), которая с учётом регистра сравнивает строку s1 со строкой s2 и возвращает результат типа int:

-1, если s1<s2,

+1, если s1>s2,

= 0, если строки эквивалентны.

Считается, что слово s1 меньше слова s2, если в словаре слово s1

расположено выше (раньше) слова s2.

3.3. Ниже выведите на печать результаты сравнения переменной s1 с переменными s2, s3 и s4:

cout << "Сравниваем веретено-весна:" << "\t" << strcmp(s1,s2) << "\n"; cout << "Сравниваем веретено-вата:" << "\t" << strcmp(s1,s3) << "\n"; cout << "Сравниваем веретено-веретено:" << "\t" << strcmp(s1,s4) << "\n";

8

Запустите программу на выполнение.

Результат «-1» означает, что «веретено» < «весна». В самом деле, в словаре слово «веретено» предшествует слову «весна». Результат «+1» означает, что «веретено» > «вата». Действительно, слово «веретено» в словаре находится ниже, чем слово «вата». Результат «0» показывает, что строки совпали.

п. 4. Работа с текстовыми файлами

Файлы позволяют пользователю считывать большие объёмы данных непосредственно с диска, не вводя их с клавиатуры.

Текстовыми называются файлы, состоящие из любых символов. Они организуются по строкам, каждая из которых заканчивается символом «конца строки». Конец самого файла обозначается символом «конца файла». При записи информации в текстовый файл, просмотреть который можно с помощью любого текстового редактора, все данные преобразуются к символьному типу и хранятся в символьном виде.

Для работы с файлами используются специальные типы данных, называемые потоками. Поток ifstream служит для работы с файлами в режиме чтения, а ofstream в режиме записи. Для работы с файлами в режиме как записи, так и чтения служит поток fstream.

Введём целочисленную переменную i из входного файла и выведем её значение в выходной файл.

4.1. В папке Вашего проекта, в том же директории, где находятся C++-файлы, создайте текстовый файл (в любом подходящем для этой цели редакторе – например, в «Блокноте») с именем input. Поместите в этот файл какое-нибудь натуральное число.

4.2. В программах на языке C++ при работе с текстовыми файлами необходимо подключить библиотеки iostream и fstream. Библиотека iostream у нас уже подключена. Чтобы подключить библиотеку fstream, в конец группы подключений библиотек добавьте строку:

#include <fstream>

4.3. Закомментируйте строки:

cout << "Введите натуральное число и нажмите клавишу ENTER,\n"; cin >> i;

cin.ignore();

9

4.4. После объявления переменной «i» опишите переменную типа ifstream (назовём её «f») и откройте для чтения созданный ранее текстовый файл с именем input:

ifstream f; f.open("input.txt");

4.5. После открытия файла в режиме чтения из него можно считывать информацию точно так же, как и с клавиатуры, только вместо cin нужно указать имя потока, из которого будет происходить чтение данных. Считайте переменную «i» из файла «f», после чего закройте файл:

f >> i; f.close();

Запустите программу на выполнение. Если Вы всё сделали правильно, то переменная «i» благополучно прочитана из файла, и её значение выведено на экран:

4.6. Перенаправим вывод переменной «i» с консоли в выходной файл. Закомментируйте строку

cout << "i=" << i << "\n";

4.7. Опишите переменную типа ofstream (назовём её «f1»), откройте для записи файл output.txt (его создаст сама программа), запишите туда значение переменной «i» и закройте файл:

ofstream f1; f1.open("output.txt"); f1 << "i=" << i << "\n"; f1.close();

Запустите программу на выполнение. Закрыв приложение, проверьте содержимое папки проекта (той, где хранятся cpp-файлы). Здесь появился новый текстовый файл с именем output, в который записано значение переменной «i».

Закомментируйте или удалите содержимое процедуры main, оставив следующий фрагмент:

setlocale(LC_ALL, "RUS");

cout << "Нажмите клавишу ENTER, чтобы закрыть программу\n"; getchar();

return 0;

10

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]