Вы находитесь на странице: 1из 44

Министерство образования и науки Украины

Донбасская государственная машиностроительная академия

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

МЕТОДИЧЕСКИЕ УКАЗАНИЯ

к выполнению лабораторных работ


и самостоятельной работе

(для студентов специальности «Системный анализ»)

Утверждено
на заседании кафедры ИСПР
Протокол № 21 от 31.08.2017г.

Краматорск 2017
УДК 681.3

Алгоритмы и структуры данных : методические указания к выполне-


нию лабораторных работ и самостоятельной работе для студентов специ-
альности «Системный анализ» всех форм обучения / Cост. A.Ю. Мельни-
ков. – Краматорск : ДГМА, 2017. – 44 с.

Содержат задания к работам по составлению программ на языках


программирования Turbo-Pascal и Turbo-C.

Составитель Мельников А.Ю., канд. техн. наук, доцент

Отв. за выпуск Гитис В.Б., канд. техн. наук, доцент

2
СОДЕРЖАНИЕ

Лабораторная работа №1. Обработка массивов разной размерности…. 4


Лабораторная работа №2. Работа с файлами записей……...................... 10
Лабораторная работа №3. Динамические структуры данных…………. 18
Лабораторная работа №4. Алгоритмы сортировки данных……………. 26
Лабораторная работа №5. Алгоритмы поиска данных…………………. 33
Задание для самостоятельной работы…………………………………… 34

Список рекомендованной литературы………………………………... 44

3
ЛАБОРАТОРНАЯ РАБОТА №1

Обработка массивов разной размерности

Цель работы: получение навыков составления программ для обра-


ботки массивов и матриц на языках программирования Паскаль и Си.

Задача 1. Язык Паскаль

Теоретические сведения – [1, c. 20 – 22; 2, c. 53 – 61].


Задание к работе. В приведенных в табл. 1 заданиях ввод исходных
данных и их контрольный вывод оформить как процедуры, а обработку – в
виде функции или процедуры. Привести как минимум два тестирующих
примера.

Таблица 1 – Варианты заданий

Вар. Задание
1 2
Найти количества четных элементов в массивах А, В, С, а затем – их
0
среднее арифметическое
Вычислить процент четных элементов в массивах А, В, С. Определить
1
максимальный из них
Найти количества положительных элементов в массивах А, В, С, а за-
2
тем – их среднее арифметическое
3 Определить сумму максимальных четных элементов массивов A, B, C
Найти среднее геометрическое нечетных элементов каждого из масси-
4
вов A, B, C. Определить их сумму
Найти среднее арифметическое элементов главных диагоналей матриц
5
Х, У, Z и определить наибольшее из них
Подсчитать число точек, находящихся внутри круга радиусом R = 2 и
с центром в начале координат, координаты точек ввести в массивы
6
Х(20) и Y(20). Расстояние от центра к точке вычислять в подпрограм-
ме-функции
Определить максимальный из периметров десяти треугольников, вер-
шины которых A, B, C заданы координатами (x, v) в массивах: AX(10),
7
AY(10), BX(10), BY(10), СХ(10), CY(10) соответственно. Периметр
сторон треугольника вычислять в подпрограмме-функции
Даны три матрицы X, Y, Z. Распечатать ту из них, в которой больше
8
нулевых элементов
Даны три матрицы А, В, С. Вычислить !!A!!+!!B!!+!!C!!, где !!X!! –
9
максимальный по модулю элемент матрицы

4
Продолжение табл. 1

1 2
Длины сторон 10 треугольников заданы в массивах А[10], B[10],
C[10]. Найти сумму длин медиан каждого из треугольников и опреде-
10
лить максимальную из них (длина медианы, проведенной к стороне а,
равна: 0.5 / 2b*b+2c*c–a*a)
В каждом из массивов А, В и С найти максимальный по модулю эле-
11
мент и вычесть его из каждого элемента соответствующего массива
В каждой из матриц X,Y и Z найти суммы элементов, лежащих ниже
12
главной диагонали. Вычислить произведение полученных значений
Даны три квадратные матрицы x, y, z. Для каждой из них найти сумму
13 элементов, лежащих выше главной диагонали, определить максималь-
ную из них.
Заданы три массива А, В и С. Вычислить:
min(B) + mах(С), если min(A) < mах(В);
t=
14
mах(А) + min(C), в противном случае.
Здесь min(X) – минимальный, а mах(Х) – максимальный элемент мас-
сива X
Вычислить среднее арифметическое произведений положительных,
15
кратных 3 элементов массивов А, В и С
В каждой матрице X,Y и Z найти номер столбца, содержащий наи-
16
большее количество положительных элементов
В каждом массиве А, В и С найти индекс максимального элемента и
17
сложить эти индексы
Найти максимальное значение средних геометрических четных эле-
18
ментов массивов А, В и С
Найти среднее арифметическое количество положительных, кратных 3
19
элементов массивов А, В и С
Найти наибольшее значение среди сумм положительных элементов
20
побочных диагоналей квадратных матриц Х, Y и Z
Определить количество точек, попавших внутрь верхней части круга
21 радиусом R = 4 и с центром в начале координат. Координаты точек
ввести в массивы X и Y
Даны три массива А, В и C. Сформировать массивы А1, В1 и С1, со-
22 держащие положительные нечетные элементы массивов А, В и С со-
ответственно
В массивах А, В и С каждый элемент разделить на среднее арифмети-
23
ческое элементов массива
В каждой из трех матриц Х, Y и Z найти минимальный элемент и раз-
24
делить на него каждый положительный элемент матрицы
Подсчитать количества элементов в матрицах Х, Y и Z, значения ко-
25
торых находятся в интервале [–3, 15]

5
Продолжение табл. 1

1 2
В каждой из трех матриц Х, Y и Z найти максимальный элемент и раз-
26
делить на него каждый отрицательный элемент матрицы
В каждой матрице X, Y и Z найти номер строки, содержащей наи-
27
меньшее количество отрицательных элементов

Пример выполнения задания


Даны три массива – A (15), B (10), C (7). Найти сумму их максималь-
ных четных элементов.

Program lab1;
Uses Crt;
Type mas = array [1..15] of integer;
Var a,b,c:mas; mc:integer;
Procedure InMas (var m:mas; n:integer; mas_name:char);
Var i:integer;
Begin
writeln('Введите массив ',mas_name, 'из ',n,' элементов:');
for i:=1 to n do read(m[i])
End;
Procedure OutMas (m:mas; n:integer; mas_name:char);
Var i:integer;
Begin
writeln('Массив ',mas_name, ':');
for i:=1 to n do write(m[i]);
writeln
End;
Function MaxChet (m:mas; n:integer):integer;
Var i,max:integer;
Begin
max:=-maxint;
for i:=1 to n do if (m[i] > max) and (m[i] mod 2 = 0) then max:=m[i];
if max=-maxint then MaxChet:=0 else MaxChet:=max
End;
Begin
clrscr;
InMas(a,15,'A'); InMas(b,10,'B'); InMas(c,7,'C');
OutMas(a,15,'A'); OutMas (b,10,'B'); OutMas (c,7,'C');
mc:= MaxChet(a,15)+ MaxChet(b,10)+ MaxChet(c,7);
writeln('Сумма: ',mc:3);
End.

6
Задача 2. Язык Си

Теоретические сведения – [1, с. 74-77; 3, c. 130 – 156; 4, c. 61 – 71,


80 – 86; 5, c. 58 – 64; 6, c. 55 – 88; 7, с. 78 – 96].
Задание к работе. Составить программу для решения задач, вариан-
ты которых приведены в табл. 2, с обязательным использованием подпро-
граммы для ввода матрицы с экрана, ее обработки и вывода на экран.
Таблица 2 – Варианты заданий

Вар. Задание
1 2
Из каждого элемента матрицы A(3,3) вычесть сумму ее положи-
0
тельных элементов
Из каждого элемента матрицы A(3,3) вычесть сумму ее четных по-
1
ложительных элементов
Из каждого элемента матрицы A(3,3) вычесть сумму ее нечетных
2
положительных элементов
Из каждого элемента матрицы A(3,3) вычесть сумму ее четных от-
3
рицательных элементов
Из каждого элемента матрицы A(3,3) вычесть сумму ее нечетных
4
отрицательных элементов
Из каждого элемента матрицы A(3,3) вычесть произведение ее
5
четных положительных элементов
Из каждого элемента матрицы A(3,3) вычесть произведение ее не-
6
четных положительных элементов
Из каждого элемента матрицы A(3,3) вычесть произведение ее
7
четных отрицательных элементов
Из каждого элемента матрицы A(3,3) вычесть произведение ее не-
8
четных отрицательных элементов
Каждый элемент матрицы A(3,3) умножить на сумму ее четных
9
положительных элементов
Каждый элемент матрицы A(3,3) умножить на сумму ее нечетных
10
положительных элементов
Каждый элемент матрицы A(3,3) умножить на сумму ее четных
11
отрицательных элементов
Каждый элемент матрицы A(3,3) умножить на сумму ее нечетных
12
отрицательных элементов
Каждый элемент матрицы A(3,3) умножить на произведение ее
13
четных положительных элементов
Каждый элемент матрицы A(3,3) умножить на произведение ее не-
14
четных положительных элементов

7
Продолжение табл. 2

1 2
Каждый элемент матрицы A(3,3) умножить на произведение ее
15
четных отрицательных элементов
Каждый элемент матрицы A(3,3) умножить на произведение ее не-
16
четных отрицательных элементов
Каждый элемент матрицы A(3,3) разделить на сумму ее четных
17
положительных элементов.
Каждый элемент матрицы A(3,3) разделить на сумму ее нечетных
18
положительных элементов
Каждый элемент матрицы A(3,3) разделить на сумму ее четных
19
отрицательных элементов
Каждый элемент матрицы A(3,3) разделить на сумму ее нечетных
20
отрицательных элементов
Каждый элемент матрицы A(3,3) разделить на произведение ее
21
четных положительных элементов
Каждый элемент матрицы A(3,3) разделить на произведение ее не-
22
четных положительных элементов
Каждый элемент матрицы A(3,3) разделить на произведение ее
23
четных отрицательных элементов
Каждый элемент матрицы A(3,3) разделить на произведение ее не-
24
четных отрицательных элементов
К каждому элементу матрицы A(3,3) прибавить сумму ее четных
25
положительных элементов
К каждому элементу матрицы A(3,3) прибавить сумму ее четных
26
элементов
К каждому элементу матрицы A(3,3) прибавить сумму ее положи-
27
тельных элементов

Примеры выполнения задания


1 К каждому элементу матрицы M(3,3) прибавить сумму ее нечетных
отрицательных элементов.
#include <stdio.h>
#include <conio.h>
void vvod(int a[3][3])
{
printf("Введите матрицу:\n");
for (int i=0;i<3;i++) {
for (int j=0;j<3;j++) {scanf("%i",&a[i][j]);}}
}
void vyvod(int a[3][3])
{
for (int i=0;i<3;i++) {

8
for (int j=0;j<3;j++) {printf("%4i",a[i][j]);}
printf("\n");}
}
int summa(int a[3][3])
{
int sum=0;
for (int i=0;i<3;i++) {
for (int j=0;j<3;j++) {
if ((a[i][j] < 0) && (a[i][j]%2!=0)) {sum+=a[i][j];}
}}
return sum;
}
void work(int s,int a[3][3]) {
for (int i=0;i<3;i++) {
for (int j=0;j<3;j++) {a[i][j]+=s;}}}
void main()
{
int m[3][3];
clrscr();
vvod(m);
printf("\nИсходная матрица:\n");
vyvod(m);
int s=summa(m);
printf("\nСумма = %3i\n",s);
work(s,m);
printf("\nРезультат:\n");
vyvod(m);
getch();
}

2 Каждый элемент матрицы M(3,3) разделить на сумму ее положи-


тельных элементов.
#include <stdio.h>
#include <conio.h>
void vvod(float a[3][3])
{
float b;
printf("Введите матрицу:\n");
for (int i=0;i<3;i++) { for (int j=0;j<3;j++) {
scanf("%f",&b);a[i][j]=b; }}
}
void vyvod(float a[3][3])
{
for (int i=0;i<3;i++) {
for (int j=0;j<3;j++) {printf("%6.2f",a[i][j]);}

9
printf("\n");}
}
float summa(float a[3][3])
{
float sum=0;
for (int i=0;i<3;i++) {
for (int j=0;j<3;j++) {
if (a[i][j] > 0) {sum+=a[i][j];}
}}
return sum;
}
void work(float s,float a[3][3])
{
for (int i=0;i<3;i++) {
for (int j=0;j<3;j++) {a[i][j]/=s;}}
}
void main()
{
float m[3][3];
clrscr(); vvod(m);
printf("\nИсходная матрица:\n");
vyvod(m);
float s=summa(m);
printf("\nСумма = %5.2f\n",s);
work(s,m);
printf("\nРезультат:\n"); vyvod(m);
getch();
}

ЛАБОРАТОРНАЯ РАБОТА №2
Работа с файлами записей
Цель работы: получение навыков составления программ для обра-
ботки файлов записей на языках программирования Паскаль и Си.

Задача 1. Язык Паскаль


Теоретические сведения – [1, c. 24 – 29; 2, c. 100 – 121].
Задание к работе. Создать файл и выполнить его обработку в соот-
ветствии с табл. 3. Обработка заключается в выборе из файла и выдаче на
экран требуемой информации. Варианты структуры файла приведены в
табл. 4.
Примечания:
1. Если в табл. 3 написано «заданный» (заданный город, заданная
группа и т. д.), необходимо организовать ввод данного с клавиатуры.
2. В задачах, где речь идет о возрасте, необходимо вычислить воз-
раст как разность между заданной датой (годом) и годом рождения.

10
Таблица 3 – Варианты заданий

Вар.
Вар. Задание
cтрукт.
1 2 3
Список абитуриентов, которые прошли по конкурсу на задан-
0 1 ную специальность (сдали экзамен на оценку не ниже задан-
ной минимальной)
Список студентов заданной группы, родившихся ранее задан-
1 2
ного года
Список кафедр первого корпуса, на которых работает меньше
2 3
10 сотрудников
3 4 Список книг заданного автора, изданных за последние 5 лет
Список кафедр заданного факультета, у которых процент ос-
4 3
тепененности преподавателей не превышает 50 %
Список абитуриентов из заданного города, которые прошли по
5 1 конкурсу (сдали экзамен на оценку не ниже заданной мини-
мальной)
Список лучших (имеющих максимальные оценки по всем
6 2
предметам) студентов заданной группы
Список кафедр второго корпуса, на которых работает больше
7 3
10 сотрудников
Список книг заданного автора, имеющих объем более 300
8 4
страниц
Список кафедр заданного факультета, на которых работает
9 3
меньше 10 сотрудников
Список студентов заданной группы, родившихся не ранее за-
10 2
данного года
Список кафедр заданного факультета, которые располагаются
11 3
во втором корпусе
Список абитуриентов, которые не прошли по конкурсу на за-
12 1 данную специальность (сдали экзамен на оценку ниже задан-
ной минимальной)
13 4 Список книг заданного автора, изданных ранее заданного года
Список кафедр первого корпуса, на которых работает больше
14 3
10 сотрудников
Список худших (имеющих минимальные оценки по всем
15 2
предметам) студентов заданной группы
Список абитуриентов, подавших заявления на заданную спе-
16 1
циальность, которые окончили школу не в текущем году
Список кафедр второго корпуса, на которых работает меньше
17 3
10 сотрудников
Список книг заданного автора, имеющих объем в заданном
18 4
диапазоне

11
Продолжение таблицы 3

1 2 3
Список абитуриентов из заданного города, которые не прошли по
19 1
конкурсу (сдали экзамен на оценку ниже заданной минимальной)
Список неуспевающих (имеющих хотя бы одну неудовлетвори-
20 2
тельную оценку) студентов заданной группы
Список кафедр заданного факультета, на которых работает боль-
21 3
ше 10 сотрудников
Список абитуриентов из заданного города, которые подали заяв-
22 1
ления на заданную специальность
Список успевающих (не имеющих ни одной неудовлетворитель-
23 2
ной оценки) студентов заданной группы
Список кафедр заданного факультета, которые располагаются в
24 3
первом корпусе
Список абитуриентов из заданного города, которые окончили
25 1
школу не в текущем году
Список кафедр заданного факультета, у которых процент остепе-
26 3
ненности преподавателей превышает 50 %
Список книг Александра Сергеевича Пушкина, изданных в поза-
27 4
прошлом веке
Таблица 4 – Варианты структур
Вариант структуры Структура файла
Фамилия абитуриента
Год рождения
1 Место жительства
Специальности (1, 2, 3 по предпочтению)
Экзаменационная оценка
Фамилия студента
Год рождения
2
Название группы
Оценки по 5 предметам
Название кафедры
Название факультета
3 Расположение (номер корпуса)
Число сотрудников всего
Число сотрудников со степенями и званиями
Название книги
Фамилия автора
4
Год издания
Количество страниц

12
Задача 1. Язык Си

Теоретические сведения – [1, с. 82-87; 3, c. 237 – 262; 4, c. 87 – 92;


5, c. 67 – 71; 6, c. 110 – 131; 7, с. 150 – 171].

Задание к работе. Создать файл («БД») и выполнить его обработку


в соответствии с табл. 5. Обработка заключается в выборе из файла и вы-
даче на экран требуемой информации.

Таблица 5 – Варианты заданий

Вар. Формат данных Действие


1 2 3
Данные о студентах в виде Добавление введенных данных к
«Фамилия, имя, группа, да- существующей БД и возвращение
0
та рождения, средний рей- содержимого базы, отсортированно-
тинг» го по фамилиям
Данные о студентах в виде Добавление введенных данных к
«Фамилия, имя, группа, да- существующей БД и возвращение
1
та рождения, средний рей- содержимого базы, отсортированно-
тинг» го по датам рождения
Данные о студентах в виде Добавление введенных данных к
«Фамилия, имя, группа, да- существующей БД и возвращение
2
та рождения, средний рей- содержимого базы, отсортированно-
тинг» го по среднему рейтингу
Данные о книгах в виде Добавление введенных данных к
«Автор, название, изда- существующей БД и возвращение
3
тельство, год издания, чис- содержимого базы, отсортированно-
ло страниц, цена» го по авторам
Данные о книгах в виде Добавление введенных данных к
«Автор, название, изда- существующей БД и возвращение
4
тельство, год издания, чис- содержимого базы, отсортированно-
ло страниц, цена» го по названию
Данные о книгах в виде Добавление введенных данных к
«Автор, название, изда- существующей БД и возвращение
5
тельство, год издания, чис- содержимого базы, отсортированно-
ло страниц, цена» го по году издания
Данные о книгах в виде Добавление введенных данных к
«Автор, название, изда- существующей БД и возвращение
6
тельство, год издания, чис- содержимого базы, отсортированно-
ло страниц, цена» го по числу страниц

13
Продолжение таблицы 5

1 2 3
Данные о книгах в виде Добавление введенных данных к су-
«Автор, название, издатель- ществующей БД и возвращение со-
7
ство, год издания, число держимого базы, отсортированного
страниц, цена» по цене книги
Данные о книгах на складе в Добавление введенных данных к су-
виде «Автор, название, из- ществующей БД и возвращение со-
8
дательство, год издания, це- держимого базы, отсортированного
на, число экземпляров» по цене одной книги
Данные о книгах на складе в Добавление введенных данных к су-
виде «Автор, название, из- ществующей БД и возвращение со-
9
дательство, год издания, це- держимого базы, отсортированного
на, число экземпляров» по числу экземпляров
Данные о книгах на складе в Добавление введенных данных к су-
виде «Автор, название, из- ществующей БД и возвращение со-
10 дательство, год издания, це- держимого базы, отсортированного
на, число экземпляров» по общей стоимости каждого наиме-
нования
Поиск в базе данных вида Поиск данных и возвращение, как
«Фамилия, имя, группа, дата всего содержимого базы, так и запи-
11 рождения, средний рейтинг» сей, удовлетворяющим условиям по-
студентов с заданной фами- иска (список отсортировать по фами-
лией лиям)
Поиск в базе данных вида Поиск данных и возвращение, как
«Фамилия, имя, группа, дата всего содержимого базы, так и запи-
12 рождения, средний рейтинг» сей, удовлетворяющим условиям по-
студентов с заданной груп- иска (список отсортировать по фами-
пой лиям)
Поиск в базе данных вида Поиск данных и возвращение, как
«Фамилия, имя, группа, дата всего содержимого базы, так и запи-
13 рождения, средний рейтинг» сей, удовлетворяющим условиям по-
студентов с заданным годом иска (список отсортировать по фами-
рождения лиям)
Поиск в базе данных вида Поиск данных и возвращение, как
«Фамилия, имя, группа, дата всего содержимого базы, так и запи-
14 рождения, средний рейтинг» сей, удовлетворяющим условиям по-
студентов с заданным сред- иска (список отсортировать по фами-
ним рейтингом лиям)

14
Продолжение таблицы 5

1 2 3
Поиск в базе данных вида «Фами- Поиск данных и возвращение, как
лия, имя, группа, дата рождения, всего содержимого базы, так и за-
15 средний рейтинг» всех студентов, писей, удовлетворяющим услови-
чьи фамилии в списке находятся ям поиска (список отсортировать
между двумя заданными по фамилиям)
Поиск в базе данных вида «Фами- Поиск данных и возвращение, как
лия, имя, группа, дата рождения, всего содержимого базы, так и за-
16 средний рейтинг» всех студентов, писей, удовлетворяющим услови-
чьи даты рождения в списке нахо- ям поиска (список отсортировать
дятся между двумя заданными по фамилиям)
Поиск в базе данных вида «Фами-
Поиск данных и возвращение, как
лия, имя, группа, дата рождения,
всего содержимого базы, так и за-
средний рейтинг» всех студентов,
17 писей, удовлетворяющим услови-
чей средний рейтинг в списке на-
ям поиска (список отсортировать
ходится между двумя заданными
по фамилиям)
значениями
Поиск в базе данных вида «Фами- Поиск данных и возвращение, как
лия, имя, группа, дата рождения, всего содержимого базы, так и за-
18 средний рейтинг» всех студентов, писей, удовлетворяющим услови-
чей средний рейтинг в списке не ям поиска (список отсортировать
ниже заданного значения по фамилиям)
Поиск в базе данных вида «Фами- Поиск данных и возвращение, как
лия, имя, группа, дата рождения, всего содержимого базы, так и за-
19 средний рейтинг» всех студентов, писей, удовлетворяющим услови-
чей средний рейтинг в списке не ям поиска (список отсортировать
выше заданного значения по фамилиям)
Поиск в базе данных вида «Автор, Поиск данных и возвращение, как
название, издательство, год изда- всего содержимого базы, так и за-
20 ния, число страниц, цена» всех писей, удовлетворяющим услови-
книг, изданных ранее заданного ям поиска (список отсортировать
года по названиям)
Поиск в базе данных вида «Автор, Поиск данных и возвращение, как
название, издательство, год изда- всего содержимого базы, так и за-
21 ния, число страниц, цена» всех писей, удовлетворяющим услови-
книг с объемом, превышающим ям поиска (список отсортировать
заданное число страниц по названиям)
Поиск в базе данных вида «Автор, Поиск данных и возвращение, как
название, издательство, год изда- всего содержимого базы, так и за-
22 ния, число страниц, цена» всех писей, удовлетворяющим услови-
книг с объемом, находящимся в ям поиска (список отсортировать
заданном диапазоне по авторам)

15
Продолжение таблицы 5

1 2 3
Поиск в базе данных вида «Ав- Поиск данных и возвращение,
тор, название, издательство, год как всего содержимого базы,
23 издания, число страниц, цена» так и записей, удовлетворяю-
всех книг с числом страниц, на- щим условиям поиска (список
ходящимся в заданном диапазоне отсортировать по авторам)
Поиск в базе данных вида «Ав- Поиск данных и возвращение,
тор, название, издательство, год как всего содержимого базы,
24 издания, число страниц, цена» так и записей, удовлетворяю-
всех книг с ценой, находящейся в щим условиям поиска (список
заданном диапазоне отсортировать по авторам)
Данные о студентах в виде «Фа- Добавление введенных данных
милия, имя, группа, дата рожде- к существующей БД и возвра-
25
ния, средний рейтинг» щение содержимого базы, от-
сортированного по фамилиям
Данные о студентах в виде «Фа- Добавление введенных данных
милия, имя, группа, дата рожде- к существующей БД и возвра-
26 ния, средний рейтинг» щение содержимого базы, от-
сортированного по датам рож-
дения
Данные о студентах в виде «Фа- Добавление введенных данных
милия, имя, группа, дата рожде- к существующей БД и возвра-
27 ния, средний рейтинг» щение содержимого базы, от-
сортированного по среднему
рейтингу

Пример выполнения задания


Сформировать файл «список студентов» форматом «фамилия-
группа-год_рождения-5_рейтингов», предварительно вычислив дополни-
тельное поле – максимальный рейтинг. Вывести на экран и в текстовый
файл список студентов заданной группы.

#include <stdio.h>
#include <conio.h>
#include <string.h>
void main(void)
{
struct stud {char fam[10],gr[10];
int year,rt[5],max; };
stud ek[3]={{"Иванов","ЭК-03-1",1986,{70,55,55,60,75}},
{"Петров","ЭК-03-2",1986,{61,62,63,74,55}},
{"Сидоров","ЭК-03-2",1986,{98,99,97,90,91}}}, s1;

16
// ищем максимальный рейтинг
int i,j,max;
for (i=0;i<3;i++) {
max=ek[i].rt[1];
for (j=0;j<5;j++) {
if (ek[i].rt[j] > max) {max=ek[i].rt[j];}}
ek[i].max=max;}
FILE *f,*g;
// запись в файл
f=fopen("rgr2.dat","w");
for (i=0;i<3;i++) {
fwrite(&ek[i],sizeof(stud),1,f);}
fclose(f);
// чтение
printf("Содержимое файла:\n");
if ((f=fopen("rgr2.dat","r"))==NULL) {
printf("Ошибка при чтении файла!\n");return;}
g=fopen("rgr2.txt","w");
fprintf(g,"Содержимое файла:\n");
do {
fread(&s1,sizeof(stud),1,f);
if (!feof(f)) {
printf("%12s%12s%6i ",s1.fam,s1.gr,s1.year);
fprintf(g,"%12s%12s%6i ",s1.fam,s1.gr,s1.year);
for (j=0;j<5;j++) {printf("%3i",s1.rt[j]);fprintf(g,"%3i",s1.rt[j]);}
printf("%6i\n",s1.max);fprintf(g,"%3i\n",s1.max);
}} while (!feof(f));
// чтение с поиском
char group[10];
printf("Введите группу для поиска:\n");
scanf("%s",&group);
printf("Студенты группы %s:\n",group);
fprintf(g,"Студенты группы %s:\n",group);
fseek(f,0L,SEEK_SET);
do {
fread(&s1,sizeof(stud),1,f);
if ((!feof(f))&&(!strcmp(s1.gr,group))) {
printf("%12s%12s%6i ",s1.fam,s1.gr,s1.year);
fprintf(g,"%12s%12s%6i ",s1.fam,s1.gr,s1.year);
for (j=0;j<5;j++) {printf("%3i",s1.rt[j]);fprintf(g,"%3i",s1.rt[j]);}
printf("%6i\n",s1.max);fprintf(g,"%3i\n",s1.max);
}} while (!feof(f));
fclose(f);fclose(g);
getch();
}

17
ЛАБОРАТОРНАЯ РАБОТА №3

Динамические структуры данных


Цель работы: получение навыков составления программ для обра-
ботки динамических структур данных (стеков, очередей, списков) на язы-
ках программирования Паскаль и Си.
Задача 1. Язык Паскаль
Задание к работе. Сформировать динамическую структуру (вид
структуры выбирается из табл. 6) записей (не менее 5), содержащую дан-
ные по студентам в следующем виде: «Фамилия Имя Группа ГР RS», где
ГР – год рождения, RS – средний рейтинг (данные можно считывать из
предварительно набранного текстового файла). Осуществить обработку
структуры согласно своему заданию (вывести на экран требуемые записи).
Таблица 6 – Варианты заданий
№ Структура Задание
0 Стек (LIFO) Все студенты, чьи фамилии начинаются с буквы "А"
1 Очередь (FIFO) Все студенты, чьи фамилии начинаются с буквы "Б"
2 Связный список Все студенты, чьи фамилии начинаются с буквы "В"
3 Стек (LIFO) Все студенты, чьи имена начинаются с буквы "А"
4 Очередь (FIFO) Все студенты, чьи имена начинаются с буквы "Б"
5 Связный список Все студенты, чьи имена начинаются с буквы "В"
6 Стек (LIFO) Все студенты, обучающиеся в группах "ИС"
7 Очередь (FIFO) Все студенты, обучающиеся в группах "ИС"
8 Связный список Все студенты, обучающиеся в группах "ИС"
9 Стек (LIFO) Все студенты старше 18 лет
10 Очередь (FIFO) Все студенты старше 19 лет
11 Связный список Все студенты старше 20 лет
12 Стек (LIFO) Все студенты младше 18 лет
13 Очередь (FIFO) Все студенты младше 19 лет
14 Связный список Все студенты младше 20 лет
15 Стек (LIFO) Все студенты со средним рейтингом, меньшим 3.0
16 Очередь (FIFO) Все студенты со средним рейтингом, меньшим 3.1
17 Связный список Все студенты со средним рейтингом, меньшим 3.2
18 Стек (LIFO) Все студенты со средним рейтингом, большим 4.0
19 Очередь (FIFO) Все студенты со средним рейтингом, большим 4.1
20 Связный список Все студенты со средним рейтингом, большим 4.2
21 Стек (LIFO) Все студенты со средним рейтингом от 3.0 до 4.0
22 Очередь (FIFO) Все студенты со средним рейтингом от 3.5 до 4.5
23 Связный список Все студенты со средним рейтингом от 4.0 до 5.0
24 Связный список Все студенты со средним рейтингом не ниже 4.75
25 Стек (LIFO) Все студенты, чьи фамилии начинаются с буквы "И"
26 Очередь (FIFO) Все студенты, чьи фамилии начинаются с буквы "К"
27 Связный список Все студенты, чьи фамилии начинаются с буквы "Л"

18
Пример выполнения задания
Создать поочередно каждую из динамических структур и осущест-
вить их обработку: вывести на экран информацию о всех студентах (фами-
лия, имя, группа, год рождения, средний рейтинг), чьи фамилии начинают-
ся с буквы «И».
program dynamic_structures;
type
student=record
fam,name,group:string[20];
year:integer;
sr:real
end;
pstud=^dstud;
dstud=record
s:student;
p:pstud
end;
var stud:student;
f,g:text;
st:string;
{Вспомогательная процедура разделения строки}
procedure get_string(st:string;var s:student);
var kod:integer;
begin
with s do
begin
fam:=copy(st,1,pos(' ',st)-1);
delete(st,1,pos(' ',st));
name:=copy(st,1,pos(' ',st)-1);
delete(st,1,pos(' ',st));
group:=copy(st,1,pos(' ',st)-1);
delete(st,1,pos(' ',st));
val(copy(st,1,pos(' ',st)-1),year,kod);
delete(st,1,pos(' ',st));
val(st,sr,kod)
end;
end;
{Вспомогательная процедура для вывода заголовка в файл}
procedure put_header(header:string);
begin
writeln(g,header);
writeln(g,'|-----------------------------------------------');
writeln(g,'| Фамилия | Имя | Группа | Г.р. | С.р. |');
writeln(g,'|-----------------------------------------------');

19
end;
{Вспомогательная процедура для вывода строки в файл}
procedure put_string(s:student);
begin
with s do
writeln(g,'|',fam:11,'|',name:9,'|',group:10,'|',year:6,'|',sr:6:1,'|');
end;
{Вспомогательная процедура для вывода последних данных в файл}
procedure put_sub;
begin
writeln(g,'|-----------------------------------------------');
writeln(g);
end;
{Работа со стеком}
procedure LIFO;
var pTop1,pTop,pHelp:pstud;
begin
reset(f);
{Начальное формирование}
new(pTop);
pTop^.p:=nil;
readln(f,st);get_string(st,stud);
pTop^.s:=stud;
{Добавление данных}
while not eof(f) do
begin
readln(f,st);get_string(st,stud);
new(pHelp);
pHelp^.p:=pTop;
pTop:=pHelp;
pTop^.s:=stud
end;
pTop1:=pTop;
{Извлечение всех данных}
put_header('Исходные данные для стека:');
repeat
stud:=pTop^.s;
put_string(stud);
pTop:=pTop^.p
until pTop=nil;
put_sub;
{Извлечение данных по условию и удаление стека}
pTop:=pTop1;
put_header('Студенты, чьи фамилии начинаются с буквы "И":');
repeat

20
stud:=pTop^.s;
if stud.fam[1]='И' then put_string(stud);
pHelp:=pTop;
pTop:=pTop^.p;
dispose(pHelp)
until pTop=nil;
put_sub
end;
{Работа с очередью}
procedure FIFO;
var pBegin1,pBegin,pEnd,pHelp:pstud;
begin
reset(f);
{Начальное формирование}
new(pBegin);
pBegin^.p:=nil;
readln(f,st);get_string(st,stud);
pBegin^.s:=stud;
pEnd:=pBegin;
{Добавление данных}
while not eof(f) do
begin
readln(f,st);get_string(st,stud);
new(pHelp);
pHelp^.p:=nil;
pHelp^.s:=stud;
pEnd^.p:=pHelp;
pEnd:=pHelp
end;
pBegin1:=pBegin;
{Извлечение всех данных}
put_header('Исходные данные для очереди:');
repeat
stud:=pBegin^.s;
put_string(stud);
pBegin:=pBegin^.p
until pBegin=nil;
put_sub;
{Извлечение данных по условию и удаление очереди}
pBegin:=pBegin1;
put_header('Студенты, чьи фамилии начинаются с буквы "И":');
repeat
stud:=pBegin^.s;
if stud.fam[1]='И' then put_string(stud);
pHelp:=pBegin;

21
pBegin:=pBegin^.p;
dispose(pHelp)
until pBegin=nil;
put_sub
end;
{Главная программа}
begin
assign(g,'result.txt');
{$i-}append(g);{$i+} if ioresult <> 0 then rewrite(g);
assign(f,'data.txt');
LIFO; FIFO;
close(f);close(g); writeln('Ok')
end.

Исходный текстовый файл:

Сидорова Елена ИС-10-1 1993 75.8


Петров Павел ИС-10-1 1993 88.2
Иванов Алексей ИС-10-1 1993 61.8
Зосимова Елена ИС-10-2 1993 55.0
Иванов Иван ИС-10-2 1991 95.4

Результаты:
Исходные данные для стека:
|-----------------------------------------------
| Фамилия | Имя | Группа | Г.р. | С.р. |
|-----------------------------------------------
| Иванов| Иван| ИС-10-2| 1991| 95.4|
| Зосимова| Елена| ИС-10-2| 1993| 55.0|
| Иванов| Алексей| ИС-10-1| 1993| 61.8|
| Петров| Павел| ИС-10-1| 1993| 88.2|
| Сидорова| Елена| ИС-10-1| 1993| 75.8|
|-----------------------------------------------
Студенты, чьи фамилии начинаются с буквы "И":
|-----------------------------------------------
| Фамилия | Имя | Группа | Г.р. | С.р. |
|-----------------------------------------------
| Иванов| Иван| ИС-10-2| 1991| 95.4|
| Иванов| Алексей| ИС-10-1| 1993| 61.8|
|-----------------------------------------------

22
Исходные данные для очереди:
|-----------------------------------------------
| Фамилия | Имя | Группа | Г.р. | С.р. |
|-----------------------------------------------
| Сидорова| Елена| ИС-10-1| 1993| 75.8|
| Петров| Павел| ИС-10-1| 1993| 88.2|
| Иванов| Алексей| ИС-10-1| 1993| 61.8|
| Зосимова| Елена| ИС-10-2| 1993| 55.0|
| Иванов| Иван| ИС-10-2| 1991| 95.4|
|-----------------------------------------------
Студенты, чьи фамилии начинаются с буквы "И":
|-----------------------------------------------
| Фамилия | Имя | Группа | Г.р. | С.р. |
|-----------------------------------------------
| Иванов| Алексей| ИС-10-1| 1993| 61.8|
| Иванов| Иван| ИС-10-2| 1991| 95.4|
|-----------------------------------------------

Задача 2. Язык Си

Теоретические сведения – [5, c. 114 – 127; 6, c. 169 – 211; 7, с. 211 –


232].

Задание к работе. Сформировать динамическую структуру (вид


структуры выбирается по варианту из табл. 7, содержащую данные по сту-
дентам в следующем виде: "Фамилия Имя Группа ГР RS", где ГР – год ро-
ждения, RS – средний рейтинг (не менее 5 записей). Осуществить обработ-
ку структуры согласно своему заданию (вывести на экран требуемые запи-
си).
Таблица 7 – Варианты заданий

Струк-
Вар. Задание
тура
1 2 3
1 Стек Все студенты, чьи фамилии начинаются с буквы "А"
2 Очередь Все студенты, чьи фамилии начинаются с буквы "Б"
3 Список Все студенты, чьи фамилии начинаются с буквы "В"
4 Стек Все студенты, чьи имена начинаются с буквы "А"
5 Очередь Все студенты, чьи имена начинаются с буквы "Б"
6 Список Все студенты, чьи имена начинаются с буквы "В"
7 Стек Все студенты, обучающиеся в группах "ЭК"
8 Очередь Все студенты, обучающиеся в группах "ЭК"

23
Продолжение таблицы 7

1 2 3
9 Список Все студенты, обучающиеся в группах "ЭК"
10 Стек Все студенты старше 18 лет
11 Очередь Все студенты старше 19 лет
12 Список Все студенты старше 20 лет
13 Стек Все студенты младше 18 лет
14 Очередь Все студенты младше 19 лет
15 Список Все студенты младше 20 лет
16 Стек Все студенты со средним рейтингом, меньшим 3.0
17 Очередь Все студенты со средним рейтингом, меньшим 3.1
18 Список Все студенты со средним рейтингом, меньшим 3.2
19 Стек Все студенты со средним рейтингом, большим 4.0
20 Очередь Все студенты со средним рейтингом, большим 4.1
21 Список Все студенты со средним рейтингом, большим 4.2
22 Стек Все студенты со средним рейтингом от 3.0 до 4.0
23 Очередь Все студенты со средним рейтингом от 3.5 до 4.5
24 Список Все студенты со средним рейтингом от 4.0 до 5.0
25 Список Все студенты со средним рейтингом не ниже 4.75

Пример выполнения задания

Сформировать связный список структур, содержащий данные по


студентам. Вывести на экран список студентов, у которых фамилии начи-
наются на букву A.

#include <stdio.h>
#include <conio.h>
#include <math.h>
struct stud {
char fam[10],name[10],group[10];
int gr,rs;
};
struct dstud {
stud data;
dstud *pPrior;
dstud *pNext;
};
void sread(stud &s)
{
printf("Family: \n");scanf("%s",&s.fam);
if (s.fam[0] != '*') {
printf("Name: \n");scanf("%s",&s.name);

24
printf("Group: \n");scanf("%s",&s.group);
printf("Year: \n");scanf("%i",&s.gr);
printf("Rating: \n");scanf("%i",&s.rs);
}
}
void main(void)
{
dstud *pBegin=NULL,*pEnd=NULL,*pList=NULL;
stud s;
int k=0;
// Создание списка
clrscr();
pList=new(dstud);
(*pList).pPrior=NULL;
(*pList).pNext=NULL;
sread(s);(*pList).data=s;
pBegin=pList;
// Добавление данных
while (s.fam[0] != '*')
{
sread(s);
if (s.fam[0] != '*') {
pEnd=new(dstud);
(*pEnd).pPrior=pList;
(*pEnd).pNext=NULL;
(*pEnd).data=s;
(*pList).pNext=pEnd;
pList=pEnd;
}
}
printf("Весь список:\n");
pList=pBegin;
while (pList)
{
printf("F=%s N=%s G=%s Y=%i
Rs=%i\n",(*pList).data.fam,(*pList).data.name,(*pList).data.group,(*pLis
t).data.gr,(*pList).data.rs);
pList=(*pList).pNext;
}
printf("Требуемые студенты:\n");
pList=pBegin;
while (pList)
{
if ((*pList).data.fam[0]=='A')
{

25
k++;
printf("F=%s N=%s G=%s Y=%i
Rs=%i\n",(*pList).data.fam,(*pList).data.name,(*pList).data.group,(*pLis
t).data.gr,(*pList).data.rs);
}
pList=(*pList).pNext;
}
printf("Всего найдено %i студентов.",k);
}

ЛАБОРАТОРНАЯ РАБОТА №4

Алгоритмы сортировки данных

Цель работы: получение навыков составления программ для реали-


зации некоторых алгоритмов сортировки данных на языке программирова-
ния Паскаль.

Теоретические сведения – [11, c. 85 – 163].

Задание к работе. Сформировать массив записей (не менее 5), со-


держащий данные по студентам в следующем виде: «Фамилия Имя Группа
ГР RS», где ГР – год рождения, RS – средний рейтинг (данные можно счи-
тывать из предварительно набранного текстового файла). Осуществить
сортировку массива по заданному полю заданным методом (табл. 8).

Таблица 8 – Варианты заданий

Вар. Поле для сортировки Алгоритм сортировки


0 Фамилия Пирамида Уильямса-Флойда
1 Фамилия Сортировка обменами
2 Имя Сортировка вставками
3 Группа Сортировка выбором
4 Год рождения Быстрая сортировка Хоора
5 Средний рейтинг Пирамида Уильямса-Флойда
6 Средний рейтинг Сортировка обменами
7 Фамилия Сортировка вставками
8 Имя Сортировка выбором
9 Группа Быстрая сортировка Хоора
10 Год рождения Пирамида Уильямса-Флойда
11 Год рождения Сортировка обменами
12 Средний рейтинг Сортировка вставками
13 Фамилия Сортировка выбором
14 Имя Быстрая сортировка Хоора

26
Продолжение таблицы 8

Вар. Поле для сортировки Алгоритм сортировки


15 Группа Пирамида Уильямса-Флойда
16 Группа Сортировка обменами
17 Год рождения Сортировка вставками
18 Средний рейтинг Сортировка выбором
19 Фамилия Быстрая сортировка Хоора
20 Имя Пирамида Уильямса-Флойда
21 Имя Сортировка обменами
22 Группа Сортировка вставками
23 Год рождения Сортировка выбором
24 Средний рейтинг Быстрая сортировка Хоора
25 Фамилия Пирамида Уильямса-Флойда
26 Фамилия Сортировка обменами
27 Имя Сортировка вставками

Пример выполнения задания


Осуществить сортировку вышеописанного массива по фамилии каж-
дым из пяти методов.
program analize_methods;
type
student=record
fam,name,group:string[20];
year:integer;
sr:real
end;
ar=array [1..10] of student;
var a,b:ar;
stud:student;
amax,i,k:integer;
{Вспомогательная процедура для ввода данных из файла}
procedure input_from_file(name:string;var a:ar);
var st:string;kod:integer;f:text;
begin
assign(f,name);
reset(f);
amax:=0;
while not eof(f) do
begin
readln(f,st);
with stud do
begin
fam:=copy(st,1,pos(' ',st)-1);

27
delete(st,1,pos(' ',st));
name:=copy(st,1,pos(' ',st)-1);
delete(st,1,pos(' ',st));
group:=copy(st,1,pos(' ',st)-1);
delete(st,1,pos(' ',st));
val(copy(st,1,pos(' ',st)-1),year,kod);
delete(st,1,pos(' ',st));
val(st,sr,kod)
end;
if amax < 10 then amax:=amax+1;
a[amax]:=stud
end;
close(f)
end;
{Вспомогательная процедура для вывода данных в файл}
procedure output_to_file(name,header:string;a:ar);
var f:text;i:integer;
begin
assign(f,name);
{$i-} append(f); {$i+}
if ioresult <> 0 then rewrite(f);
writeln(f,header);
writeln(f,'|-----------------------------------------------');
writeln(f,'| Фамилия | Имя | Группа | Г.р. | С.р. |');
writeln(f,'|-----------------------------------------------');
for i:=1 to amax do with a[i] do
writeln(f,'|',fam:11,'|',name:9,'|',group:10,'|',year:6,'|',sr:6:1,'|');
writeln(f,'|-----------------------------------------------');
writeln(f);
close(f)
end;
{Стандартная процедура для обмена значениями}
procedure obmen(var a,b:student);
var r:student;
begin
r:=a;a:=b;b:=r
end;
{Метод сортировки обменами (алгоритм "пузырька")}
procedure sort_exchange(var m:ar);
var i,j:integer;
begin
for i:=2 to amax do
for j:=amax downto i do
if m[j-1].fam > m[j].fam then obmen(m[j-1],m[j])
end;

28
{Метод сортировки вставками}
procedure sort_insert(var m:ar);
var k,i,j:integer;r:student;
begin
for i:=2 to amax do
for j:=1 to i-1 do
if m[j].fam > m[i].fam then
begin
r:=m[i];
for k:=i downto j+1 do m[k]:=m[k-1];
m[j]:=r
end
end;
{Метод сортировки выбором}
procedure sort_choice(var m:ar);
var k,i,j:integer;
begin
for i:=1 to amax-1 do
begin
k:=i;
for j:=i+1 to amax do if m[k].fam > m[j].fam then k:=j;
obmen(m[k],m[i])
end
end;
{Метод "быстрой" сортировки (алгоритм Хоора)}
procedure sort_hoor(var m:ar);
procedure sort(l,r:integer);
var i,j:integer;x:student;
begin
i:=l;j:=r;x:=m[(l+r) div 2];
while i <= j do
begin
while m[i].fam < x.fam do i:=i+1;
while m[j].fam > x.fam do j:=j-1;
if i <= j then
begin
obmen(m[i],m[j]);i:=i+1;j:=j-1;
end;
end;
if l < j then sort(l,j);
if i < r then sort(i,r);
end;
begin
sort(1,amax);
end;

29
{Метод пирамиды (метод Уильямса-Флойда)}
procedure sort_wf(var m:ar);
var t,k,i:integer;
begin
{создание структуры бинарного дерева-"пирамиды"}
for i:=2 to amax do
begin
t:=i;
while t <> 1 do
begin
k:=t div 2;
if m[k].fam >= m[t].fam then t:=1
else
begin
obmen(m[k],m[t]);t:=k
end
end
end;
{Сортировка полученной "пирамиды"}
for i:=amax-1 downto 1 do
begin
obmen(m[i+1],m[1]);t:=1;
while t <> 0 do
begin
k:=t+t;
if k > i then t:=0
else
begin
if k < i then
if m[k+1].fam > m[k].fam then k:=k+1;
if m[t].fam >= m[k].fam then t:=0
else
begin
obmen(m[t],m[k]);t:=k
end
end
end
end
end;
{Главная программа}
begin
input_from_file('data.txt',a);
output_to_file('result.txt','Исходный массив',a);
b:=a; sort_exchange(b);
output_to_file('result.txt','После сортировки обменами:',b);

30
b:=a; sort_insert(b);
output_to_file('result.txt','После сортировки вставками:',b);
b:=a; sort_choice(b);
output_to_file('result.txt','После сортировки выбором:',b);
b:=a; sort_hoor(b);
output_to_file('result.txt','После быстрой сортировки Хоора:',b);
b:=a; sort_wf(b);
output_to_file('result.txt','После сортировки методом пирамиды
Уильямса-Флойда:',b);
writeln('Ok')
end.

Исходный текстовый файл:


Сидорова Елена ИС-10-1 1993 75.8
Петров Павел ИС-10-1 1993 88.2
Иванов Алексей ИС-10-1 1993 61.8
Зосимова Елена ИС-10-2 1993 55.0
Иванов Иван ИС-10-2 1991 95.4

Результаты:
Исходный массив
|-----------------------------------------------
| Фамилия | Имя | Группа | Г.р. | С.р. |
|-----------------------------------------------
| Сидорова| Елена| ИС-10-1| 1993| 75.8|
| Петров| Павел| ИС-10-1| 1993| 88.2|
| Иванов| Алексей| ИС-10-1| 1993| 61.8|
| Зосимова| Елена| ИС-10-2| 1993| 55.0|
| Иванов| Иван| ИС-10-2| 1993| 95.4|
|-----------------------------------------------

После сортировки обменами:


|-----------------------------------------------
| Фамилия | Имя | Группа | Г.р. | С.р. |
|-----------------------------------------------
| Зосимова| Елена| ИС-10-2| 1993| 55.0|
| Иванов| Алексей| ИС-10-1| 1993| 61.8|
| Иванов| Иван| ИС-10-2| 1991| 95.4|
| Петров| Павел| ИС-10-1| 1993| 88.2|
| Сидорова| Елена| ИС-10-1| 1993| 75.8|
|-----------------------------------------------

31
После сортировки вставками:
|-----------------------------------------------
| Фамилия | Имя | Группа | Г.р. | С.р. |
|-----------------------------------------------
| Зосимова| Елена| ИС-10-2| 1993| 55.0|
| Иванов| Алексей| ИС-10-1| 1993| 61.8|
| Иванов| Иван| ИС-10-2| 1991| 95.4|
| Петров| Павел| ИС-10-1| 1993| 88.2|
| Сидорова| Елена| ИС-10-1| 1993| 75.8|
|-----------------------------------------------

После сортировки выбором:


|-----------------------------------------------
| Фамилия | Имя | Группа | Г.р. | С.р. |
|-----------------------------------------------
| Зосимова| Елена| ИС-10-2| 1993| 55.0|
| Иванов| Алексей| ИС-10-1| 1993| 61.8|
| Иванов| Иван| ИС-10-2| 1991| 95.4|
| Петров| Павел| ИС-10-1| 1993| 88.2|
| Сидорова| Елена| ИС-10-1| 1993| 75.8|
|-----------------------------------------------

После быстрой сортировки Хоора:


|-----------------------------------------------
| Фамилия | Имя | Группа | Г.р. | С.р. |
|-----------------------------------------------
| Зосимова| Елена| ИС-10-2| 1993| 55.0|
| Иванов| Иван| ИС-10-2| 1991| 95.4|
| Иванов| Алексей| ИС-10-1| 1993| 61.8|
| Петров| Павел| ИС-10-1| 1993| 88.2|
| Сидорова| Елена| ИС-10-1| 1993| 75.8|
|-----------------------------------------------

После сортировки методом пирамиды Уильямса-Флойда:


|-----------------------------------------------
| Фамилия | Имя | Группа | Г.р. | С.р. |
|-----------------------------------------------
| Зосимова| Елена| ИС-10-2| 1993| 55.0|
| Иванов| Алексей| ИС-10-1| 1993| 61.8|
| Иванов| Иван| ИС-10-2| 1991| 95.4|
| Петров| Павел| ИС-10-1| 1993| 88.2|
| Сидорова| Елена| ИС-10-1| 1993| 75.8|
|-----------------------------------------------

32
ЛАБОРАТОРНАЯ РАБОТА №5

Алгоритмы поиска данных


Цель работы: получение навыков составления программ для реали-
зации некоторых алгоритмов поиска данных на языке программирования
Паскаль.
Теоретические сведения – [11, c. 61 – 81].
Задание к работе. Сформировать массив записей (не менее 5), со-
держащий данные по студентам в следующем виде: «Фамилия Имя Отче-
ство Группа Город ГР RS», где ГР – год рождения, RS – средний рейтинг
(данные можно считывать из предварительно набранного текстового фай-
ла). Найти студента, полностью соответствующего заданным параметрам
(варианты 1-14, табл. 9) или чьи текстовые параметры содержат заданную
строку (варианты 15-24).

Таблица 9 – Варианты заданий

Вар. Поле для поиска Алгоритм поиска


1 Фамилия
2 Имя
3 Отчество
4 Группа Линейный (прямой) поиск
5 Город
6 Год рождения
7 Средний рейтинг
8 Фамилия
9 Имя
10 Отчество
11 Группа Двоичный поиск
12 Город
13 Год рождения
14 Средний рейтинг
15 Фамилия
16 Имя
17 Отчество Алгоритм Кнута-Морриса-Пратта
18 Группа
19 Город
20 Фамилия
21 Имя
22 Отчество Алгоритм Боуэра-Мура
23 Группа
24 Город

33
САМОСТОЯТЕЛЬНАЯ РАБОТА

Разработка системы для сравнения алгоритмов сортировки данных

Теоретические сведения – [11, 14].


Задание
В соответствии с вариантом реализовать один или два заданных ал-
горитма (табл.10) и выполнить их анализ по критерию «Время выполне-
ния»: для первого и второго алгоритма; для наилучшего, наихудшего и
среднего случая. Критериями «Требования к объему оперативной памяти»
и «Сложность алгоритма» пренебрегаем. Для исследований используется
массив, состоящий из 10 000 элементов – целых чисел.
Отчет по работе должен содержать описание анализируемых алго-
ритмов, оценку их категорий сложности, таблицы оценок времени выпол-
нения (общий, наихудший, наилучший случай для каждого алгоритма в
каждой среде программирования) и анализ полученных результатов.

Таблица 10 – Варианты заданий


№ Ф Алгоритм
1,2 А Сортировка выбором
3,4 Б Сортировка вставками (метод прямого включения)
5,6 В Сортировка прямыми обменами (пузырьковый метод)
7 Г Шейкерная сортировка (улучшенный пузырьковый метод)
8 Д Улучшенная сортировка вставками (метод Шелла)
9,10 Е,Ж Сортировка с помощью дерева (метод Уильямса-Флойда)
11,12 З,И Быстрая сортировка (метод Хоора)
Улучшенная быстрая сортировка (метод медианы из трех
13 К
элементов)
Быстрая сортировка с разделением на три части (метод
14 Л
Бентли-Макилроя)
15 М Сортировка двухпутевым слиянием
16 Н Сортировка абстрактным обменным слиянием
17 О Нисходящая сортировка слиянием
18 П Сортировка слиянием без копирования
19 Р Восходящая сортировка слиянием
20 С,Т Бинарная быстрая сортировка
21 У,Ф Поразрядная сортировка MSD
22 Х, Ц Трехпутевая поразрядная быстрая сортировка
23 Ч,Ш Поразрядная сортировка LSD
24 Щ,Э Четно-нечетная сортировка слиянием (1-й метод Бэтчера)
25 Ю,Я Нечетно-четная сортировка слиянием (2-й метод Бэтчера)

34
Пример выполнения задания
Выдан вариант № 5, первая буква фамилии студента – З.
Сравниваются алгоритмы сортировки прямыми обменами (пузырь-
ковый метод) и быстрой сортировки (метод Хоора).

Описание выбранных алгоритмов сортировки


Суть метода сортировки обменами («метода пузырька») состоит в
последовательном просмотре массива от конца к началу или от начала к
концу и сравнении каждой пары элементов между собой. При этом «не-
правильное» расположение элементов устраняется путем их перестановки
(обмена значениями). Процесс просмотра и сравнения элементов повторя-
ется до получения результата. При сортировке по неубыванию «легкие»
элементы с меньшим значением как бы «всплывают» к началу массива по-
добно тому, как это делают пузырьки воздуха в стакане с водой – отсюда и
происходит популярное название алгоритма. «Пузырьковая» сортировка
имеет очень плохие временные характеристики – ее трудоемкость выража-
ется величиной вида O(n2), где n – размер массива.
Метод «быстрой» сортировки, предложенный К. Хоором, осно-
ван на разделении массива на два непустых непересекающихся подмноже-
ства элементов. При этом в одной части массива должны оказаться все
элементы, которые не превосходят по значению некоторый предваритель-
но выбранный элемент массива, а в другой части – все элементы, не мень-
шие его. Аналогично следует поступить с каждой из полученных групп
(при этом элемент для разделения можно выбирать просто из «середины»
группы). Очевидно, что на определенном этапе массив окажется полно-
стью отсортированным. В подавляющем большинстве реальных случаев
использование «быстрой» сортировки дает лучшие результаты по времени,
чем все прочие методы.

Реализация методов в среде Turbo-Pascal

program analize_methods;
uses dos;
const amax=10000;
type ar=array [1..amax] of integer;
ar3=array [1..3] of ar;
var a:ar3;b:^ar3;
time:array [1..2,1..3] of real;
hour,min,sec,sec100:word;
r,r1,r2:real;
ns,i,k:integer;
f:text;

35
{Стандартная процедура для обмена значениями}
procedure obmen(var a,b:integer);
var r:integer;
begin
r:=a;a:=b;b:=r
end;
{Метод сортировки обменами (алгоритм "пузырька")}
procedure sort_obmen(var m:ar);
var i,j:integer;
begin
for i:=2 to amax do
for j:=amax downto i do
if m[j-1] > m[j] then obmen(m[j-1],m[j])
end;
{Метод "быстрой" сортировки (алгоритм Хоора)}
procedure hoor(var m:ar);
procedure sort(l,r:integer);
var i,j,x:integer;
begin
i:=l;j:=r;x:=m[(l+r) div 2];
while i <= j do
begin
while m[i] < x do i:=i+1;
while m[j] > x do j:=j-1;
if i <= j then
begin
obmen(m[i],m[j]);i:=i+1;j:=j-1;
end;
end;
if l < j then sort(l,j);
if i < r then sort(i,r);
end;
begin
sort(1,amax);
end;
{Главная программа}
begin
randomize;
assign(f,'pasc.txt');rewrite(f);
writeln(f,'Сравнение двух методов сортировки в Турбо-Паскале');
writeln(f); new(b);
{Заполнение идеальными данными}
for i:=1 to amax do a[1,i]:=i;
{Заполнение случайными данными}
for i:=1 to amax do a[2,i]:=random(amax);

36
{Заполнение худшими данными}
for i:=1 to amax do a[3,i]:=amax+1-i;
{Начинаем сортировку}
for ns:=1 to 2 do begin {два алгоритма}
if ns=1 then begin
writeln('Метод сортировки обменами');
writeln(f,'Метод сортировки обменами');
end
else begin
writeln('Метод быстрой сортировки');
writeln(f,'Метод быстрой сортировки');
end;
writeln;writeln(f);
{Передаем во второй массив}
for k:=1 to 3 do b^[k]:=a[k];
{Сортировка}
for i:=1 to 3 do begin
case i of
1: begin writeln('Идеальное расположение');
writeln(f,'Идеальное расположение') end;
2: begin writeln('Случайное расположение');
writeln(f,'Случайное расположение') end;
3: begin writeln('Обратное расположение');
writeln(f,'Обратное расположение') end;
end;
writeln('До сортировки:');writeln(f,'До сортировки:');
for k:=1 to 10 do begin write(b^[i,k],' ');write(f,b^[i,k],' ') end;
writeln;writeln(f);
gettime(hour,min,sec,sec100);
r1:=sec100/100+sec+min*60+hour*3600;
if ns=1 then sort_obmen(b^[i]) else hoor(b^[i]);
gettime(hour,min,sec,sec100);
r2:=sec100/100+sec+min*60+hour*3600;
time[ns,i]:=r2-r1;
writeln('После сортировки:');writeln(f,'После сортировки:');
for k:=1 to 10 do begin write(b^[i,k],' ');write(f,b^[i,k],' ') end;
writeln;writeln(f);
writeln('Время: ',time[ns,i]:0:2);writeln;
writeln(f,'Время: ',time[ns,i]:0:2);writeln(f);
end;{i}
writeln;writeln(f);
end;{ns}
writeln('Подведение итогов (время в секундах)');
writeln(f,'Подведение итогов (время в секундах)');
writeln('|----------------------------------------------|');

37
writeln('| Алгоритм | Идеальный | Случайный | Наихудший |');
writeln('|----------------------------------------------|');
writeln(f,'|----------------------------------------------|');
writeln(f,'| Алгоритм | Идеальный | Случайный | Наихудший |');
writeln(f,'|----------------------------------------------|');
for ns:=1 to 2 do begin
if ns=1 then begin write('| Обмен ');write(f,'| Обмен ') end
else begin write('| Хоор ');write(f,'| Хоор ') end;
for i:=1 to 3 do begin
write('|',time[ns,i]:11:2);write(f,'|',time[ns,i]:11:2) end;
writeln('|');writeln(f,'|')
end;
writeln('|----------------------------------------------|');
writeln(f,'|----------------------------------------------|');
close(f);
dispose(b)
end.
Сравнение двух методов сортировки в Турбо-Паскале

Метод сортировки обменами

Идеальное расположение
До сортировки:
1 2 3 4 5 6 7 8 9 10
После сортировки:
1 2 3 4 5 6 7 8 9 10
Время: 2.81

Случайное расположение
До сортировки:
298 6179 5360 8197 9804 1173 8346 6670 7217 141
После сортировки:
0 1 1 2 2 4 5 6 7 8
Время: 8.56

Обратное расположение
До сортировки:
10000 9999 9998 9997 9996 9995 9994 9993 9992 9991
После сортировки:
1 2 3 4 5 6 7 8 9 10
Время: 13.63
Метод быстрой сортировки

Идеальное расположение
До сортировки:
1 2 3 4 5 6 7 8 9 10
После сортировки:
1 2 3 4 5 6 7 8 9 10
Время: 0.00

38
Случайное расположение
До сортировки:
298 6179 5360 8197 9804 1173 8346 6670 7217 141
После сортировки:
0 1 1 2 2 4 5 6 7 8
Время: 0.00

Обратное расположение
До сортировки:
10000 9999 9998 9997 9996 9995 9994 9993 9992 9991
После сортировки:
1 2 3 4 5 6 7 8 9 10
Время: 0.00

Подведение итогов (время в секундах)


|----------------------------------------------|
| Алгоритм | Идеальный | Случайный | Наихудший |
|----------------------------------------------|
| Обмен | 2.81| 8.56| 13.63|
| Хоор | 0.00| 0.00| 0.00|
|----------------------------------------------|

Реализация методов в среде Turbo-С++


#include <dos.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define amax 10000
// Метод сортировки обменами (алгоритм "пузырька")
void sort_obmen(int m[amax])
{
int r,i,j;
for (i=2;i<=amax;i++) {
for (j=amax;j>=i;j--) {
if (m[j-1-1] > m[j-1])
{ r=m[j-1-1];m[j-1-1]=m[j-1];m[j-1]=r; }
}}
}
// Метод "быстрой" сортировки (алгоритм Хоора)
void hoor(int m[],int l,int r)
{
int i,j,x,o;
i=l;j=r;x=m[int(floor((l+r)/2))];
while (i<=j)
{
while (m[i-1] < x) {i++;}
while (m[j-1] > x) {j--;}

39
if (i <= j) {
o=m[i-1];m[i-1]=m[j-1];m[j-1]=o;
i++;j--;}
}
if (l < j) {hoor(m,l,j);}
if (i < r) {hoor(m,i,r);}
}
// Главная программа
void main(void)
{
int a[3][amax],ns,i,k;
float time[2][3],r1,r2;
struct time t;
FILE *f;
srand(1);
f=fopen("res_cpp.txt","w");
fprintf(f,"Сравнение двух методов сортировки в Турбо-C++\n\n");
// начинаем сортировку
for (ns=1;ns<=2;ns++) // два алгоритма
{
if (ns==1) {printf("Метод сортировки обменами\n");
fprintf(f,"Метод сортировки обменами\n");}
else {printf("Метод быстрой сортировки\n");
fprintf(f,"Метод быстрой сортировки\n");}
// заполнение идеальными данными
for (i=1;i<=amax;i++) {a[0][i-1]=i;}
// заполнение случайными данными
for (i=1;i<=amax;i++) {a[1][i-1]=abs(rand()%amax);}
// заполнение худшими данными
for (i=1;i<=amax;i++) {a[2][i-1]=amax+1-i;}
// сортировка
for (i=1;i<=3;i++)
{
switch (i) {
case 1: printf("Идеальное расположение\n");
fprintf(f,"Идеальное расположение\n");break;
case 2: printf("Случайное расположение\n");
fprintf(f,"Случайное расположение\n");break;
case 3: printf("Обратное расположение\n");
fprintf(f,"Обратное расположение\n");break;}
printf("До сортировки\n");fprintf(f,"До сортировки\n");
for (k=0;k<10;k++)
{printf("%6i",a[i-1][k]);fprintf(f,"%6i",a[i-1][k]);}
printf("\n");fprintf(f,"\n");
gettime(&t);

40
r1=float(t.ti_hund)/100+t.ti_sec+t.ti_min*60+t.ti_hour*3600;
if (ns==1) {sort_obmen(a[i-1]);} else {hoor(a[i-1],1,amax);}
gettime(&t);
r2=float(t.ti_hund)/100+t.ti_sec+t.ti_min*60+t.ti_hour*3600;
time[ns-1][i-1]=r2-r1;
printf("После сортировки\n");fprintf(f,"После сортировки\n");
for (k=0;k<10;k++)
{printf("%6i",a[i-1][k]);fprintf(f,"%6i",a[i-1][k]);}
printf("\n");fprintf(f,"\n");
printf("Время: %0.2f\n",time[ns-1][i-1]);
fprintf(f,"Время: %0.2f\n",time[ns-1][i-1]);
} // i
printf("\n");fprintf(f,"\n");
} // ns
printf("Подведение итогов (время в секундах)\n");
printf("|----------------------------------------------|\n");
printf("| Алгоритм | Идеальный | Случайный | Наихудший |\n");
printf("|----------------------------------------------|\n");
fprintf(f,"Подведение итогов (время в секундах)\n");
fprintf(f,"|----------------------------------------------|\n");
fprintf(f,"| Алгоритм | Идеальный | Случайный | Наихудший |\n");
fprintf(f,"|----------------------------------------------|\n");
for (ns=1;ns<=2;ns++)
{
if (ns==1) {printf("| Обмен ");fprintf(f,"| Обмен ");}
else {printf("| Хоор ");fprintf(f,"| Хоор ");}
for (i=1;i<=3;i++) {printf("|%11.3f",time[ns-1][i-1]);
fprintf(f,"|%11.3f",time[ns-1][i-1]);}
printf("|\n");fprintf(f,"|\n");
} // ns
printf("|----------------------------------------------|\n");
fprintf(f,"|----------------------------------------------|\n");
fclose(f);
} // main
Сравнение двух методов сортировки в Турбо-C++

Метод сортировки обменами


Идеальное расположение
До сортировки
1 2 3 4 5 6 7 8 9 10
После сортировки
1 2 3 4 5 6 7 8 9 10
Время: 1.64
Случайное расположение
До сортировки
346 130 982 1090 1656 7117 7595 6415 2948 1126

41
После сортировки
0 0 1 1 2 3 4 4 6 6
Время: 3.25
Обратное расположение
До сортировки
10000 9999 9998 9997 9996 9995 9994 9993 9992 9991
После сортировки
1 2 3 4 5 6 7 8 9 10
Время: 4.22
Метод быстрой сортировки
Идеальное расположение
До сортировки
1 2 3 4 5 6 7 8 9 10
После сортировки
1 2 3 4 5 6 7 8 9 10
Время: 0.00
Случайное расположение
До сортировки
3369 2020 5703 2762 828 6252 8648 7041 3444 6604
После сортировки
3 4 5 5 6 6 10 11 11 13
Время: 0.00
Обратное расположение
До сортировки
10000 9999 9998 9997 9996 9995 9994 9993 9992 9991
После сортировки
1 2 3 4 5 6 7 8 9 10
Время: 0.00

Подведение итогов (время в секундах)


|----------------------------------------------|
| Алгоритм | Идеальный | Случайный | Наихудший |
|----------------------------------------------|
| Обмен | 1.640| 3.250| 4.220|
| Хоор | 0.000| 0.000| 0.000|
|----------------------------------------------|

Анализ полученных результатов

Как видно из результатов, быстрая сортировка Хоора практически не


зависит от начального расположения элементов. Кроме того, время, кото-
рое требуется алгоритму Хоора, ничтожно мало по сравнению с пузырько-
вой сортировкой. Поэтому диаграммы (рис. 1 – 3) проиллюстрируют толь-
ко сравнение эффективности обменной сортировки в зависимости от на-
чального расположения элементов и выбранной среды программирования.

42
Время работы алгоритмов
Идеальный
16,00 Случайный
13,63
14,00 Наихудший
12,00 Средний
10,00 8,56 8,33
8,00
6,00 4,22
4,00 2,81 3,25 3,04
2,15 1,74
2,00 1,27 1,81 1,64

0,00
Turbo-Pascal Borland-Delphil Turbo-C++

Рисунок 1 – Время работы алгоритма сортировки обменами

Отклонение времени работы от среднего по состоянию данных


120%
104% Turbo-Pascal

100% Borland-Delphil
87%
Turbo-C++
80% 71% 70% Среднее
63%
58%
60% 50%
46%
40% 33% 34%
25%
20%
4%
0%
Идеальный Случайный Наихудший

Рисунок 2 – Отклонение времени работы алгоритма сортировки об-


менами от среднего значения в зависимости от расположения данных

Отклонение времени работы от среднего по среде


70% 66%
64% Идеальный
60% Случайный
Наихудший
50% 44% 46%
Средний
39%
40%
31%
30% 27%
23%
18%
20%

10% 7%
3% 4%
0%
Turbo-Pascal Borland-Delphil Turbo-C++

Рисунок 3 – Отклонение времени работы алгоритма сортировки об-


менами от среднего значения в зависимости от выбранной среды

43
СПИСОК РЕКОМЕНДОВАННОЙ ЛИТЕРАТУРЫ
1 Мельников, А.Ю. Алгоритмизация и программирование :
Учебное пособие для студентов специальности «Интеллектуальные систе-
мы принятия решений» / А.Ю. Мельников. – Издание 2-е, с изменениями.
– Краматорск: ДГМА, 2010. – 96 с. – ISBN 978-966-379-437-2
2 Немнюгин, С.А. Turbo Pascal. – СПб. : Питер, 2002. – 496 с. –
ISBN 5-8046-0137-7.
3 Подбельский, В.В. Язык С++ : учебное пособие / В. В. Под-
бельский. – 5-е изд. – М. : Финансы и статистика, 2001. – 560 с. – ISBN 5-
279-02204-7.
4 Практикум для виконання лабораторних робіт з дисципліни
«Мови об’єктно-орієнтованого програмування» : Навчальний посібник /
укл.: О. Ф. Тарасов, О. В. Алтухов. – Краматорськ : ДДМА, 2001. – 152 с. –
ISBN 5-7763-2108-5.
5 Павловская, Т.А. С/С++. Программирование на языке высо-
кого уровня / Т. А. Павловская. – СПб. : Питер, 2001. – 464с. – ISBN 5-318-
00001-0.
6 Павловская, Т.А. С/С++. Структурное программирование :
практикум / Т. А. Павловская, Ю. А. Щупак. – СПб. : Питер, 2002. – 240 с.
– ISBN 5-94723-447-5.
7 Касаткин, А.И. Профессиональное программирование на язы-
ке Си: от Turbo C к Borland C++ : Справочное пособие / А. И. Касаткин, А.
Н. Вальвачев ; под общ. ред. А. И. Касаткина. – Минск : Выш. шк., 1992. –
240 с. – ISBN 5-339-00807-X.
8 Грызлов, В.И. Турбо-Паскаль 7.0. Учебный курс / В. И. Грыз-
лов, Т. П. Грызлова. – 3-е изд., испр. и доп. - СПб. : Питер, 2005. – 416 с. –
ISBN: 5-469-00648-4.
9 Немнюгин, С.А. Turbo Pascal: практикум. – СПб. : Питер,
2002. – 256 с. – ISBN 5-272-00068-4.
10 Программирование на языке Паскаль: задачник / под ред. О. Ф.
Усковой. – СПб. : Питер, 2002. – 336 с. – ISBN 5-318-00553-5.
11 Вирт, Н. Алгоритмы и структуры данных / Пер. с англ. – 2-е
изд., испр. – СПб. : Невский Диалект, 2001. – 352 с. – ISBN 5-7940-0065-1.
12 Климова, Л.М. PASCAL 7.0 Практическое программирование.
Решение типовых задач / Л. М. Климова. – М. : КУДИЦ-ОБРАЗ, 2000. –
528 с. – ISBN 5-93378-033-2.
13 Кравченко, В.І. Методичний посібник до лабораторних і са-
мостійних робіт з дисципліни “Основи програмування та алгоритмічні мо-
ви”: Частина 1. (для студентів спеціальності 7.080402) / В. І. Кравченко, О.
В. Веремій, В. В. Зоненко. – Краматорськ : ДДМА, 2005. – 104 с. – ISBN
14 Седжвик, Р. Фундаментальные алгоритмы на С. Анализ.
Структуры данных. Сортировка. Поиск. Алгоритмы на графах / Р. Сед-
жвик; пер. с. англ. – СПб : ООО «ДиаСофтЮП», 2003. – 1136 с.

44