
Babalova_Algoritmizaciya_zadach_i_strukturirovanie_programm_2013
.pdf5.34.В файл занести последовательность слов. Прочитать последовательность слов в список. Если количество слов четно, то тогда создать список из 2-го, 4-го и т.д. слов. Если же последовательность содержит нечетное количество слов, тогда создается список из 1-го, 3-го и т.д. слов. Обеспечить вывод на экран исходной последовательности слов и результатов обработки этой последовательности.
5.35.В файле записать сведения о результатах выступлений спортсменов по некоторым соревнованиям, например, стрельбе из лука. Каждый судья записывает свои сведения в формате: фамилия спортсмена, пять оценок за каждую из стрельб. При обработке сведений из каждых пяти оценок отбрасывается самая высокая и самая низкие оценки и из остальных берется средняя оценка. Вывести список типа стека по результатам соревнований в соответствии с набранными баллами. На вершине стека должен быть спортсмен с наивысшими результатами. Обеспечить исправление оценок и количества участников соревнований.
5.36.В файл занести сведения об игроках футбольной команды. Формат сведений: фамилия, имя, отчество игрока, количество сыгранных матчей, категория игрока. Прочитать сведения о команде в стек, на вершине которого стоят спортсмены с наименьшим количеством сыгранных матчей. Обеспечить коррекцию сведений по запросу пользователя (удалить игрока, дополнить список). На экран вывести результирующий список.
5.37.Последовательность целых чисел заносится в файл. Прочитать из файла последовательность и записать в память в виде линейного списка. Найти сумму элементов списка с конца и с начала списка. Проверить решение на произвольном количестве последовательностей. Вывести на экран последовательность и результаты вычислений
5.38.В один файл заносится упорядоченная последовательность целых чисел. В другом файле записана произвольная последовательность чисел. Создать список из чисел первого файла. Прочитать числа из второго файла и вставить их на правильные места в созданный список, чтобы упорядоченность не была нарушена.
5.39.Последовательность произвольных неупорядоченных чисел вводится и сохраняется в файле. Создать список из этих чисел. Удалить из списка наименьшее количество чисел таким образом,
91
чтобы список стал упорядоченным. Вывести полученный список и его длину на экран.
5.40. Задана последовательность из английских слов длиной n. Создать список из этих слов. Получить из исходного списка новый список из зашифрованных слов, каждую букву в слове заменяя на следующую букву по алфавиту. Дешифровать этот список слов. Вывести на экран зашифрованный и дешифрованный списки слов.
92
Тема 6. АЛГОРИТМИЗАЦИЯ ПРОЦЕССОВ ОБРАБОТКИ ТАБЛИЦ
Таблица создается на основе более простых структур данных типа массив или список. При работе с табличными структурами данных наиболее востребованными действиями являются сортировка данных и поиск данных.
Если сортировка в строках и столбцах таблиц может быть выполнена методами для работы с одномерными массивами, то алгоритмические решения задачи поиска требуют других подходов. В этом разделе рассмотрим некоторые алгоритмы поиска в таблицах.
Для объявления таблицы поиска можно воспользоваться определением двумерного массива или массива из указателей на списки любого типа. Прежде всего, таблица должна быть объявлена типом данных. Например, объявление таблицы в форме массива из элементов другого массива:
Type VectorP=^Vector; Vector=array of integer; TableP=^Table; Table=array of VectorP; var
tp:tablep; begin
{ выделение памяти для указателей строк} setlength (tp,m);
{ выделение памяти для элементов строк} For i:=0 to m-1 do setlength (tp^[i],n);
Здесь выполнено выделение памяти для m строк и n элементов в каждой строке. Для динамического массива можно выполнить формирование каждой новой строки своей размерности.
Обработка элементов таблицы обеспечивается записью tp^[i]^[j], где i, j – индексы строк и столбцов таблицы. Освобождение памяти осуществляется в обратном порядке:
setlength (tp^[i],0); setlength (tp,0);
Объявление таблицы из строк в форме списков любого вида: type
ss=string[30];
93
aa=record
a,b:ss;
end;
//Определен элемент списочной структуры pList=^List;
List=record
inf:aa;
next:pList;
end;
//Определен связный список для строки таблицы ttab_hash= record
lit:string[1]; //Ключ для хеширования next:Plist;
end;// Это формат элемента таблицы.
//Второе поле указывает на элемент следующий списка
tab =array[1..26] of ttab_hash;// Определение таблицы из 26
значений ключей
Создание ключей для организации поиска в таблицах.
1.Ключом может быть любая последовательность символов или чисел. Каждый ключ должен однозначно определять требуемую запись в строке таблицы.
2.Хеширование таблицы выполняется для создания хорошо различающихся ключей. На сегодняшний день предложено много методов для организации хеш-таблиц. Для примера приведем три варианта вычисления ключей с помощью хеш-функций.
Метод деления. Некоторый целый ключ делится на размер таблицы:
H (Key) =mod (Key , m) Пример 1987 mod 100 = 87
Метод середины квадрата. Ключ умножается сам на себя и из полученного числа выбирается несколько средних цифр этого квадрата. Пример:
1987*1987=3948169 или 1986*1986=3944196.
Получены разные ключи.
Метод свертки. Ключ в двоичном представлении разбивается на сегменты и над этими сегментами выполняется операция XOR.
Например: Ключ = 1101010011. Разбиваем ключ на два числа по 5 разрядов и над двумя числами выполняем операцию XOR:
94
11010
10011
Ключ будет равен 01001.
Операция XOR при не совпадении разрядов дает результат 1 в этом разряде.
При хешировании ключей из символов или строк надо помнить, что представление всех символов обеспечивается их цифровыми кодами.
Деление текста программы на модули. Для программирования методов работы с таблицами из любых сложных типов данных предлагаются в технологии программирования методы обработки каждого типа данных размещать в программной единице – модуле.
Модулем называется программа, которая не делится на части, а передается и хранится целиком и может быть доступна другим программам.
Модуль выполняется только с помощью основной программы и состоит из двух частей – интерфейса и тела (реализация модуля).
Стандартная структура пустого модуля в среде Delphi, присоединяемого к программе, имеет следующий формат:
unit Unit1; interface
Uses<список других модулей>;
<описание всех определяемых типов данных модуля> implementation < реализация>
begin //
<Это раздел инициализации модуля> end.
Заголовок модуля – interface. За заголовком следует текст, который вписывает программист. Тело модуля начинается со слова implementation. Это раздел для описания всех методов модуля. Здесь должны быть представлены все функции и процедуры, включаемые программистом в этот модуль.
Пример 6.1. Дан некоторый фрагмент англо-русского словаря. Разработать программу, которая обеспечивает сохранение в памяти исходного словаря и обеспечивает поиск перевода требуемого слова в словаре.
Для решения задачи используем структуру данных в форме хеш-таблицы. Ключами в таблице будут 26 букв латинского алфа-
95

вита. Таблица в каждой строке будет содержать все имеющиеся слова с переводом на одну из букв.
Структура программы. В основной программе, названной «Словарь», отражены все действия, которые реализованы в примере построения таблицы (рис. 33). Работа со словарем организована через меню, в котором отражены действия по созданию таблицы из 26 строк. В каждой строке помещены списки из пар слов: русского и английского языков.
Тест программы разработан из основной программы с перечислением альтернатив меню и двух модулей Unit_list_cons и Unit_tab_cons. Первый модуль содержит все методы для работы со строками таблицами, а второй модуль реализует создание хештаблицы и методы поиска слов в таблице словаря.
Рис. 33. Структура программы для работы с таблицей
96
program Project_hash_console; {$APPTYPE CONSOLE}
uses SysUtils,
Windows, unit_tab_cons,Unit_list_cons; const a:array[1..6]of string[40]=(
'1. Создать файл', '2. Создание таблицы с ключами' ,
'3. Вывод таблицы из файла' , '4. Вывод хеш - таблицы', '5. Поиск слова ', '6. Выход') ;
//Меню работ для организации
//интерфейса var ft:ff; i,n:integer;
function ToRus(winStr:String):string; begin
setlength(Result,Length(WinStr));
CharToOEM(PChar(WinStr),PChar(Result));
end;
//Эта функция нужна только для консольного
//приложения. Вы ее просто копируете в каждую новую
//свою программу, если хотите видеть
//комментарии на русском языке.
begin
writeln(ToRus('*****начало работы****'));
Assignfile(ft,'Wind.dat'); For i:=1 to 6 do
writeln(ToRus(a[i]):40);
//Вывод меню работ
Repeat
writeln(ToRus('*****Введите номер выполняемого действия****'));
write(' *** '); readln(n);
case n of 1: begin
writeln(ToRus('*****Файл надо создать****'));
97
rewrite(ft); save_data_file(ft);
end; 2: begin
reset(ft); init_tab;
Writeln(ToRus('*****Создание таблицы с ключами****' )); create_tab_hash(ft);
//При создании таблицы сортируем строки
//таблицы по алфавиту для ускорения поиска end;
3: begin
writeln (ToRus('*****Вывод таблицы из файла****'));
read_tab(ft); end;
4: begin
writeln (ToRus('*****Вывод хеш таблицы****'));
show_tab_hash; readln;
end; 5: begin
writeln (ToRus('*****Поиск слова****'));
poisk_slovo(); readln;
end;
6: Halt; end;
Until false;
{ TODO -oUser -cConsole Main : Insert code here } end.
unit Unit_tab_cons;
//Модуль, описывающий методы
//обработки таблицы
{$APPTYPE CONSOLE} interface
uses Sysutils,Windows,unit_list_cons;
//В модуле unit_list_cons определена
//списочная структура данных
98
const key_sl:array[1..26]of char=('a','b','c','d','e',
,'g','h','j','i','k','l','m','n','o','p','q','r','s',
't','u','v','x','y','w','z'); type
ff=file of aa; ttab_hash= record
lit:string[1];
next:Plist;
end;
tab =array[1..26] of ttab_hash;
// Таблица ключей из букв алфавита var
key:String[1];
tt:tab;
ab:aa;
ft:ff;
pp:Plist; procedure init_tab;
procedure save_data_file(var ft:ff); procedure read_tab(var ft:ff); procedure create_tab_hash(var ft:ff); procedure show_tab_hash; procedure poisk_slovo();
//Названы все процедуры, которые
//вызываются в других модулях проекта implementation
function ToRus(winStr:String):string; begin setlength(Result,Length(WinStr));
CharToOEM(PChar(WinStr),PChar(Result));
end;
procedure init_tab; var i : integer; begin
for i:= 1 to 26 do begin
tt[i].lit:='';
99
tt[i].next:=nil;
end;
end;
procedure save_data_file(var ft:ff); var
ch:char; begin
writeln(ToRus('******Введите исходные данные')); repeat
with ab do begin
writeln(ToRus('Английское слово'):20); readln(a);
writeln(ToRus('Русское слово '):20); readln(b);
end;
write(ft,ab); writeln(ToRus('******Есть еще сведения? '));
readln(ch); until ch ='n';
closefile(ft);
writeln(ToRus('******Данные сохранены в файле*** ')); readln;
end;
procedure read_tab(var ft:ff);
// читаем введенные данные из файла begin
reset(ft);
while not eof(ft) do begin
read(ft,ab);
writeln (ab.a:20,ab.b:30); end;
closefile(ft);
end;
procedure create_tab_hash(var ft:ff); var i:integer;
begin
100