
- •Кафедра с а п р
- •Часть 1
- •1. Алфавит языка Паскаль
- •Данные в языке Паскаль
- •2.1 Порядковые типы данных
- •2.1.1 Целые типы данных
- •2.1.2 Логический тип данных
- •Символьный тип данных
- •2.1.4 Перечислимый тип данных
- •Ограниченный тип данных
- •2.2 Вещественные типы данных
- •3. Структура программ на языке TurboPascal
- •Описание меток
- •Описание переменных
- •Var имя переменной : тип;
- •Описание типов
- •Описание простых и типизированных констант
- •Арифметические выражения
- •Логические выражения
- •Оператор присваивания
- •Составной оператор
- •Процедуры ввода и вывода данных
- •Линейные алгоритмы и программы
- •Операторы условной и безусловной передачи управления
- •Алгоритмы и программы с разветвлением
- •10. Оператор выбора
- •11. Операторы циклов
- •11.1 Оператор цикла с предусловием
- •Оператор цикла с постусловием
- •Оператор цикла с параметром
- •Циклические алгоритмы и программы
- •Вариант 3
- •Использование циклических алгоритмов и программ для вычисления суммы членов ряда
- •При составлении алгоритма и программы будем считать, что точность
- •Массивы и их описание
- •Var Имя_массива: Array[t1] of [t2];
- •Var Имя_массива: Имя_типа_массива;
- •12.1 Работа с одномерными массивами
- •12.2 Работа с двумерными массивами
- •Текст программы
- •Варианты заданий
- •Строковый тип данных. Операции над строками
- •Множества в Паскале, их описание. Операции над множествами
- •Var Имя множества:Set of базовый тип;
- •Var Имя множества:Имя типа;
- •Тип данных - записи, их описание и использование. Оператор присоединения
- •1. Var Имя записи:record
- •Var Имя записи:Имя типа для записи;
- •15.1 Работа с массивом из записей
- •16 Подпрограммы
- •16. 1 Процедуры. Описание процедур. Область действия имён Локальные и глобальные параметры
- •16.2 Подпрограммы типа function, их описание
- •17. Задача сортировки: алгоритмы и программы
- •Сортировка выбором
- •Обменная сортировка
- •Сортировка слиянием
- •18 Задача поиска: алгоритмы и программы
- •18.1 Линейный поиск
- •Двоичный поиск
18 Задача поиска: алгоритмы и программы
Наряду с задачей сортировки актуальной при работе с данными является поиск данных по заданному признаку. Если данные не упорядочены, то для поиска приходится просматрить весь объем информации. В том случае, если данные упорядочены, для поиска используют один из двух известных алгоритмов поиска: линейный или двоичный поиск. Рассмотрим эти алгоритмы и реализующие их программы.
Пусть задан массив Х, содержащий n целых чисел, расположенных в порядке возрастания значений. Требуется найти заданное число isk.
18.1 Линейный поиск
Линейный поиск заключается в последовательном сравнении элементов упорядоченного массива Х с искомым значением isk. Поиск в этом случае заканчивается в двух случаях:
Очередной элемент массива Х равен искомому значению isk, в этом случае элемент найден.
Очередной элемент массива Х больше искомого значения, а так как все последующие элементы также больше isk, то искомого элемента не может быть в Х.
Схема алгоритма линейного поиска
нет да
нет
да
В худшем случае для поиска заданного элемента алгоритмом линейного поиска приходится проводить n сравнений, т.е. временная сложность алгоритма n.
Текст программы линейного поиска
Uses crt;
Var
X:array[1..10000] of integer;
i, n, isk:integer;
Begin
write(' Введите число элементов в массиве - n ');
readln(n);
write(' Введите элементы массива Х ');
for i:=1 to n do read(X[i]); writeln;
write(' Введите искомое число'); readln(isk);
for i:=1 to n do
if X[i]=isk then
begin
writeln(' Элемент найден по адресу i = ' ,i );
readln; exit
end
else if X[i]>isk then break;
writeln(' Заданного элемента нет');
readln;
End.
Двоичный поиск
Двоичный поиск заключается в следующем: вычисляется середина массива и элемент xi, находящийся по найденному адресу, сравнивается с искомым. Если элементы xi и isk равны, то поиск закончен. Если xi < isk, то искомый элемент может находиться в последующей xi части массива, в противном случае поиск надо осуществлять в предшествующей xi части массива. Такой подход позволяет сократить число просматриваемых элементов в 2 раза. Далее в выделенной части массива также определяется средний элемент, и он сравнивается с искомым. Подобная процедура повторяется до тех пор, пока ни будет найден заданный элемент или пока не совпадут начальный и конечный адрес просматриваемой, на очередном шаге, части массива. Если эти адреса совпадут и к этому моменту элемент не найден, то его в массиве нет.
Временная сложность алгоритма двоичного поиска log2n.
Схема алгоритма двоичного поиска
First - адрес начала просматриваемой части.
Last - адрес конца просматриваемой части
<
=
>
Текст программы
Uses crt;
Var X:array[1..10000] of integer;
isk,i,n,adr,First,Last:integer;
Begin
write(' Введите число элементов в массиве - n ');
readln(n);
write(' Введите элементы массива Х ');
for i:=1 to n do read(X[i]);
writeln;
write(' Введите искомое число');
readln(isk);
First:=1; Last:=n;
while First <= Last do begin
adr:=(First+Last) div 2;
if isk=X[adr] then
begin writeln('Yes! isk = ',isk,' adr = ',adr);
exit
end
else if isk<X[adr] then Last:=adr-1
else First:=adr+1;
end;
writeln(' Not found');
end.
Лабораторная работа №11
Цель работы:
Изучить алгоритмы поиска.
Приобрести навыки программирования задач поиска данных различных типов.
Типовое задание
Разработать схему алгоритма и программу решения задачи поиска в массиве записей по заданным полям, с использованием алгоритмов линейного и двоичного поиска.
Варианты самостоятельных заданий
В а р и а н т 1
Дан список, содержащий 10 записей, каждая из которых имеет структуру:
Шифр книги Ф.И.О. авторов Название Год
тип строка тип строка тип строка издания
5 символов 20 символов 15 символов целое
Список упорядочен по возрастанию года издания.
Разработать алгоритмы и программы линейного и двоичного поиска всех книг, изданных до 1960 год с выводом найденных записей на экран.
В а р и а н т 2
Дан список, содержащий 10 записей, каждая из которых имеет структуру:
Шифр товара Наименование Цена (в руб.) Количество
тип строка тип строка вещественное экземпляров
5 символов 20 символов число целое число
Список упорядочен по убыванию цены товара.
Разработать алгоритмы и программы линейного и двоичного поиска всех товаров, имеющих цену меньше 20000 руб. с выводом найденных записей на экран.
В а р и а н т 3
Дан список, содержащий 10 записей, каждая из которых имеет структуру:
Номер рейса Пункт отправления Пункт назначения Дни
тип строка тип строка тип строка полетов
5 символов 10 символов 10 символов от 1 до 7
Список упорядочен по наименованию пунктов отправления (по алфавиту).
Разработать алгоритмы и программы линейного и двоичного поиска рейсов, вылетающих из всех пунктов, наименование которых начинается с буквы "К" с выводом найденных записей на экран.
В а р и а н т 4
Дан список, содержащий 10 записей, каждая из которых имеет структуру:
Ф.И.О. Домашний адрес Номер участка Год
тип строка тип строка тип рождения
15 символов 20 символов integer 1900..2000
Список упорядочен по возрастанию года рождения.
Разработать алгоритмы и программы линейного и двоичного поиска всех граждан из списка, родившихся до 1950 года с выводом найденных записей на экран.
В а р и а н т 5
Дан список, содержащий 10 записей, каждая из которых имеет структуру:
Шифр товара Наименование товара Цена (руб.) Признак
тип строка тип строка число типа наличия или
5 символов 20 символов real отсутствия
Список упорядочен по убыванию цены товара.
Разработать алгоритмы и программы линейного и двоичного поиска всех товаров, цена которых не превышает 15000 руб., с выводом найденных записей на экран.
В а р и а н т 6
Дан список, содержащий 10 записей, каждая из которых имеет структуру:
Ф.И.О. Факультет Группа Год рождения
20 символов 5 символов 6 символов целое число
Список упорядочен по убыванию года рождения.
Разработать алгоритмы и программы линейного и двоичного поиска всех студентов, родившихся до 1979 года с выводом найденных записей на экран.
В а р и а н т 7
Дан список, содержащий 10 записей, каждая из которых имеет структуру:
Ф.И.О. авторов Название Год Шифр
тип строка тип строка издания строка
20 символов 20 символов целое 8 символов
Список упорядочен по убыванию года рождения.
Разработать алгоритмы и программы линейного и двоичного поиска книг, изданных до 1990 года с выводом найденных записей на экран.
В а р и а н т 8
Дан список, содержащий 10 записей, каждая из которых имеет структуру:
Ф.И.О. авторов Название Год Шифр
тип строка тип строка издания строка
20 символов 20 символов целое 8 символов
Список упорядочен по возрастанию года издания.
Разработать алгоритмы и программы линейного и двоичного поиска книг, изданных после 1990 года с выводом найденных записей на экран.
В а р и а н т 9
Дан список, содержащий 10 записей, каждая из которых имеет структуру:
Номер рейса Пункт отправления Пункт назначения Дни
тип тип строка тип строка полетов
integer 20 символов 10 символов от 1 до 7
Список упорядочен по возрастанию номеров рейсов.
Разработать алгоритмы и программы линейного и двоичного поиска всех рейсов с номерами большими, чем 50 с выводом найденных записей на экран.
В а р и а н т 10
Дан список, содержащий 10 записей, каждая из которых имеет структуру:
Ф.И.О. Домашний адрес Номер участка Год
тип строка тип строка тип рождения
15 символов 30 символов integer 1900..2000
Список упорядочен оп убыванию года рождения.
Разработать алгоритмы и программы линейного и двоичного поиск всех граждан, родившихся до 1970 года с выводом найденных записей на экран.
В а р и а н т 11
Дан список, содержащий 10 записей, каждая из которых имеет структуру:
Шифр книги Ф.И.О. авторов Название Год
тип строка тип строка тип строка издания
5 символов 20 символов 15 символов целое
Список упорядочен по убыванию года издания.
Разработать алгоритмы и программы линейного и двоичного поиска книг, изданных до 1950 году с выводом найденных записей на экран.
В а р и а н т 12
Дан список, содержащий 10 записей, каждая из которых имеет структуру:
Шифр товара Наименование Цена(в руб.) Количество
тип строка тип строка вещественное экземпляров
5 символов 20 символов число целое число
список упорядочен по возрастанию цены.
Разработать алгоритмы и программы линейного и двоичного поиска товаров, имеющих цену не меньше 20000 руб. с выводом найденных записей на экран.
В а р и а н т 13
Дан список, содержащий 10 записей, каждая из которых имеет структуру:
Номер рейса Пункт отправления Пункт назначения Дни
тип строка тип строка тип строка полетов
5 символов 12 символов 10 символов от 1 до 7
Список упорядочен по полю "Пункт назначения" (по алфавиту).
Разработать алгоритмы и программы линейного и двоичного поиска рейсов, вылетающих в города, начинающиеся с буквы "В", с выводом найденных записей на экран.
В а р и а н т 14
Дан список, содержащий 10 записей, каждая из которых имеет структуру:
Ф.И.О. Домашний адрес Номер участка Год
тип строка тип строка тип рождения
15 символов 20 символов integer 1900..2000
Список упорядочен по убыванию года рождения.
Разработать алгоритмы и программы линейного и двоичного поиска всех граждан из списка, родившихся до 1980 года с выводом найденных записей на экран.
В а р и а н т 15
Дан список, содержащий 10 записей, каждая из которых имеет структуру:
Шифр товара Наименование товара Цена(руб.) Признак
тип строка тип строка число типа наличия или
5 символов 20 символов real отсутствия
Список упорядочен по возрастанию цены.
Разработать алгоритмы и программы линейного и двоичного поиска всех товаров, имеющих цену, не меньше 25000 руб. с выводом найденных записей на экран.
В а р и а н т 16
Дан список, содержащий 10 записей, каждая из которых имеет структуру:
Ф.И.О. Факультет Группа Год рождения
20 символов 5 символов 6 символов целое число
Список упорядочен по убыванию года рождения.
Разработать алгоритмы и программылинейного и двоичного поиска всех студентов, родившихся до 1980 года с выводом найденных записей на экран.
В а р и а н т 17
Дан список, содержащий 10 записей, каждая из которых имеет структуру:
Ф.И.О. авторов Название Год Шифр
тип строка тип строка издания строка
20 символов 20 символов целое 8 символов
Список упорядочен по возрастанию года издания.
Разработать алгоритмы и программы линейного и двоичного поиска книг, изданных после 1990 года с выводом найденных записей на экран.
В а р и а н т 18
Дан список, содержащий 10 записей, каждая из которых имеет структуру:
Ф.И.О. авторов Название Год Шифр
тип строка тип строка издания строка
20 символов 20 символов целое 8 символов
Список упорядочен по полю "Шифр" (по алфавиту).
Разработать алгоритмы и программы линейного и двоичного поиска книг, поле шифр которых начинаются с буквы " Т" с выводом найденных записей на экран.
В а р и а н т 19
Дан список, содержащий 10 записей, каждая из которых имеет структуру:
Номер рейса Пункт отправления Пункт назначения Дни
тип тип строка тип строка полетов
integer 20 символов 15 символов от 1 до 7
Список упорядочен по убыванию номеров рейсов.
Разработать алгоритмы и программы линейного и двоичного поиска всех рейсов с номерами меньшими, чем 100 с выводом найденных записей на экран.
В а р и а н т 20
Дан список, содержащий 10 записей, каждая из которых имеет структуру:
Ф.И.О. Домашний адрес Номер участка Год
тип строка тип строка тип рождения
15 символов 30 символов integer 1900..2000
Список упорядочен по возрастанию года рождения.
Разработать алгоритмы и программы линейного и двоичного поиска всех граждан, родившихся после 1970 г. с выводом найденных записей на экран.
Литература
В.В. Фаронов ТурбоПаскаль 7.0. Начальный курс. Учебное пособие. - М.: «Нолидж», 1997
Вирт Н. Алгоритмы + структуры данных = программы.- М.: Мир, 1985
Кнут Д. Искусство программирования для ЭВМ. Т. 3. Сортировка и
поиск.- М.:Мир, 1978.