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

Babalova_Algoritmizaciya_zadach_i_strukturirovanie_programm_2013

.pdf
Скачиваний:
120
Добавлен:
27.03.2016
Размер:
1.29 Mб
Скачать

5.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

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