Программа частотного словаря сочетаний слов

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 23.07.2012
Размер файла 3,3 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Курсовая работа

«Программа частотного словаря сочетаний слов»

Техническое задание

Требуется разработать программу дляформирования частотного словаря сочетаний пар словдля некоторого текста. Программа должна обеспечивать следующие функции:

- обработка текстов, полученных методом копирования-вставки или расположенных в текстовом файле (разрешена работа с файлами, имеющими расширения.txt и.rtf);

- возможность пользователю самостоятельно определять символы, являющиеся разделителями слов;

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

- сохранение созданного в результате работы программы словаря в файл одного из текстовых форматов (.txtили.rtf);

- возможность сортировки словосочетаний словаря по алфавиту и по частоте их употребления в тексте;

- поиск словосочетания и частоты его употребления в словаре;

- отсутствие различий между символами верхнего и нижнего регистра в ходе обработки текста и словаря.

Введение

Задача создания программы, обладающей функционалом, определяемым заданием, предполагает решение более простых подзадач:

- возможность обработки текста из файла;

- формирование из заданного текста списка словосочетаний, в котором каждый элемент соответствует некоторому слову из текста;

- возможность перемещения словаря в файл текстового формата;

- поиск словосочетания в словаре;

- сортировка словосочетаний в словаре по заданному признаку;

- нечувствительность к регистру.

1. Теоретическая часть

приложение тестирование интерфейс пользователь

Сортировкой или упорядочением массива называется расположение его элементов по возрастанию (или убыванию). [1] Если не все элементы различны, то надо говорить о неубывающем (или невозрастающем) порядке. Критерии оценки эффективности этих алгоритмов могут включать следующие параметры:

· количество шагов алгоритма, необходимых для упорядочения;

· количество сравнений элементов;

· количество перестановок, выполняемых при сортировке. [1]

Самым простым методом сортировки является так называемый метод «пузырька». Чтобы уяснить его идею, представьте, что массив (таблица) расположен вертикально. Элементы с большим значением всплывают вверх наподобие больших пузырьков. При первом проходе вдоль массива, начиная проход «снизу», берется первый элемент и поочередно сравнивается с последующими. При этом:

· если встречается более «легкий» (с меньшим значением) элемент, то они меняются местами;

· при встрече с более «тяжелым» элементом, последний становится «эталоном» для сравнения, и все следующие сравниваются с ним.

В результате наибольший элемент оказывается в самом верху массива.

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

Заметим, что при втором и последующих проходах, нет необходимости рассматривать ранее «всплывшие» элементы, т.к. они заведомо больше оставшихся. Другими словами, во время j-го прохода не проверяются элементы, стоящие на позициях выше j.

Алгоритм данной сортировки считается учебным и практически не применяется вне учебной литературы, вместо него на практике применяются более эффективные алгоритмы сортировки. В то же время метод сортировки обменами лежит в основе некоторых более совершенных алгоритмов, таких как шейкерная сортировка и пирамидальная сортировка. [1]

Шейкерная сортировка (сортировка перестановками) - разновидность пузырьковой сортировки. Анализируя метод пузырьковой сортировки можно отметить два обстоятельства.

Во-первых, если при движении по части массива перестановки не происходят, то эта часть массива уже отсортирована и, следовательно, ее можно исключить из рассмотрения. [1]

Во-вторых, при движении от конца массива к началу минимальный элемент «всплывает» на первую позицию, а максимальный элемент сдвигается только на одну позицию вправо. [1]

Эти две идеи приводят к следующим модификациям в методе пузырьковой сортировки. Границы рабочей части массива (т.е. части массива, где происходит движение) устанавливаются в месте последнего обмена на каждой итерации. Массив просматривается поочередно справа налево и слева направо.

Лучший случай для этой сортировки - отсортированный массив (О(n)), худший - отсортированный в обратном порядке (O (nІ)). [1]

Пирамидальная - алгоритм сортировки, работающий в худшем, в среднем и в лучшем случае (то есть гарантированно) заИ (n log n) операций при сортировке n элементов. Количество применяемой служебной памяти не зависит от размера массива (то есть, O(1)). [1]

Может рассматриваться как усовершенствованная сортировка пузырьком, в которой элемент всплывает (min-heap) / тонет (max-heap) по многим путям.

Сортировка пирамидой использует сортирующее дерево. Сортирующее дерево - это такое двоичное дерево, у которого выполнены условия:

1. Каждый лист имеет глубину либо , либо ,  - максимальная глубина дерева.

2. Значение в любой вершине больше, чем значения её потомков.

Удобная структура данных для сортирующего дерева - такой массив Array, что Array[1] - элемент в корне, а потомки элемента Array[i] - Array[2i] и Array [2i+1].

Алгоритм сортировки будет состоять из двух основных шагов:

1. Выстраиваем элементы массива в виде сортирующего дерева:

Array[i] ? Array[2i]

Array[i] ? Array [2i+1], при n/2 ? i ? 1.

Этот шаг требует  операций.

2. Будем удалять элементы из корня по одному за раз и перестраивать дерево. То есть на первом шаге обмениваем Array[1] и Array[n], преобразовываем Array[1], Array[2], …, Array [n-1] в сортирующее дерево. Затемпереставляем Array[1] и Array [n-1], преобразуем Array[1], Array[2], …, Array [n-2] в сортирующее дерево. Процесс продолжается до тех пор, пока в сортирующем дереве не останется один элемент. Тогда Array[1], Array[2], …, Array[n] - упорядоченная последовательность. [1] Этот шаг требует  операций.

Выбор алгоритма сортировки перестановкамиобусловлен его простотой и быстродействием по сравнению с остальными описанными выше алгоритмами.

В основе алгоритма лежит обмен соседних элементов массива. Каждый элемент массива, начиная с первого, сравнивается со следующим, и если он больше следующего, то элементы меняются местами. Таким образом, элементы с меньшим значением продвигаются к началу массива (всплывают), а элементы с большим значением - к концу массива (тонут). Поэтому данный метод сортировки обменом иногда называют методом «пузырька». Этот процесс повторяется столько раз, сколько элементов в массиве, минус единица. [3]

На рис. 1.1 цифрой 1 обозначено исходное состояние массива и перестановки на первом проходе, цифрой 2 - состояние после перестановок на первом проходе и перестановки на втором проходе, и т.д.

Рис. 1.1. Сортировка перестановками

Процедура сортировки, запускается нажатием кнопки Сортировка (Button1). Значения элементов массива вводятся из ячеек компонента stringGrid1. Во время сортировки, после выполнения очередного цикла обменов элементов массива, программа выводит массив в поле метки Label2.

Листинг 1.1. Сортировка массива методом обмена [3]

procedure TForm1. Button1Click (Sender: TObject);

const

SIZE=5;

var

a:array [1..SIZE] of integer;

k:integer; // текущий элемент массива

i:integer; // индекс для ввода и вывода массива

changed:boolean; // TRUE, если в текущем цикле были обмены

buf:integer; // буфер для обмена элементами массива

begin

 // вводмассива

for i:=1 to SIZE do

a[i]:= StrToInt (StringGrid1. Cells [i-1, 0]);

label2.caption:='';

 // сортировка массива repeat

Changed:=FALSE; // пусть в текущем цикле нет обменов

for k:=l to SIZE-1 do

if a[k] > a [k+l] then

begin // обменяем k-й и k+1-й элементы

buf:= a[k]; a[k]:= a [k+l]; a [k+l]:= buf;

changed:= TRUE;

end;

 // выводмассива

for i:=l to SIZE do

Label2.caption:=label2.caption+' '+IntTostr (a[i]);

Label2.caption:=label2.caption+#13;

untilnot changed; // еслинебылообменов, значит

 // массивотсортирован

Label2.caption:=label2.caption

+#13+'Maccив отсортирован.';

end;

Следует отметить, что максимальное необходимое количество циклов проверки соседних элементов массива равно количеству элементов массива минус один. Вместе с тем возможно, что массив реально будет упорядочен за меньшее число циклов. Например, последовательность чисел 5 1 2 3 4, если ее рассматривать как представление массива, будет упорядочена за один цикл, и выполнение оставшихся трех циклов не будет иметь смысла.

Поэтому в программу введена логическая переменная changed, которой перед выполнением очередного цикла присваивается значение FALSE. Процесс сортировки (цикл repeat) завершается, если после выполнения очередного цикла проверки соседних элементов массива (цикл for) ни один элемент массива не был обменен с соседним, и, следовательно, массив уже упорядочен.

Рис. 1.2. Этапы сортировки массива методом обмена после завершения процесса сортировки

Для организации поиска в массиве могут быть использованы различные алгоритмы.

Линейный, последовательный поиск - алгоритм нахождения заданного значения произвольной функции на некотором отрезке. [2] Данный алгоритм является простейшим алгоритмом поиска и в отличие, например, от двоичного, не накладывает никаких ограничений на функцию и имеет простейшую реализацию. Поиск значения функции осуществляется простым сравнением очередного рассматриваемого значения (как правило поиск происходит слева направо, то есть от меньших значений аргумента к большим) и, если значения совпадают (с той или иной точностью), то поиск считается завершённым. [2]

Если отрезок имеет длину N, то найти решение с точностью до  можно за время . Т.о. асимптотическая сложность алгоритма - . В связи с малой эффективностью по сравнению с другими алгоритмами линейный поиск обычно используют только если отрезок поиска содержит очень мало элементов, тем не менее линейный поиск не требует дополнительной памяти или обработки / анализа функции, так что может работать в потоковом режиме при непосредственном получении данных из любого источника. Так же, линейный поиск часто используется в виде линейных алгоритмов поиска максимума / минимума.

Двоичный (бинарный) поиск (также известен как метод деления пополам и дихотомия) - классический алгоритм поиска элемента в отсортированном массиве (векторе), использующий дробление массива на половины. [4]

Частным случаем двоичного поиска является метод бисекции, который применяется для поиска корней заданной непрерывной функции на заданном отрезке.

Листинг 1.2. Двоичныйпоискэлементавмассиве. [5]

functionRecurceFind (L, R: Integer): Integer;

var

M: Integer;

begin

if R < L then

begin

Result:=L; // Result:= -1 еслипоискточный

Exit;

end;

M:= (L + R) div 2;

if A[M] = X then

begin

Result:= M;

Exit;

end;

if A[M] > X then

Result:=RecurceFind (L, M - 1)

else

Result:=RecurceFind (M + 1, R)

end;

begin

Result:=RecurceFind (Low(A), High(A));

end;

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

2. Описание использованных структур данных

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

Количество используемых индексов массива может быть различным. Массивы с одним индексом называют одномерными, с двумя - двумерными и т.д. Одномерный массив нестрого соответствует вектору в математике, двумерный - матрице.

Рис. 2.1. Схематическое изображение двумерного массива

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

3. Описание процедур и функций procedureTForm1. Button1Click (Sender: TObject)

Данная процедура позволяет выбрать файл для работы из файловой системы Windows. При этом открывается диалоговое окно с каталогом. Делается это с помощью переменной типа TOpenDialog. Свойство Filter позволило создать ограничение на открытие файлов. Программа открывает только файлы с расширением.txtи.rtf. Путь к выбранному файлу записывается в глобальную переменную Failтипа String, после чего открывается файл по указанному пути, и содержание файла копируется в поле МЕМО1.

procedure TForm1. Button2Click (Sender: TObject):

ДаннаяпроцедуранаподобииprocedureTForm1. Button1Click (Sender:TObject) открывает файл настройки с разделителями и выводит его в MEMO3.

procedureTForm1. Button3Click (Sender: TObject):

Данная процедура выполняет основную задачу программы - создает словарь. На первом этапе работы процедуры создается массив разделителей razd, получаемый из поля MEMO3. Затем текст из MEMO1 построчно считывается в переменную строкового типа s. Если какой-либо символ этой строки оказывается равным одному из разделителей, то слово записывается в массив строк slova, где каждому слову соответствует один из элементов массива. Далее из пар элементов массива slova формируется массив frazi, элементами которого являются все словосочетания текста. После этого запускается алгоритм поиска одинаковых словосочетаний. При наличии некоторого числа одинаковых элементов в массиве fraziпроисходит удаление всех одинаковых элементов за исключением проверяемого и увеличение счетчика на количество найденных элементов. После обхода по всему массиву в проверяемый элемент дописывается значение счетчика, отображающее частоту употребления словосочетания в тексте и переход к проверке следующего словосочетания. Далее происходит сортировка (методом перестановок) полученного словаря по алфавиту.

На входе процедуры подается текст из MEMO1. На выходе в MEMO2 выводится отсортированный словарь вида <кол-во повторений> `…….'<словосочетание>.

procedure TForm1. Button4Click (Sender: TObject):

Данная процедура позволяет сохранять полученный ранее словарь в текстовой файл. В ней также открывается диалоговое окно с каталогом файловой системы. Используется переменная типа TSaveDialog. Путь к файлу записывается в переменную Slvrтипа String. Информация для записи в файл берется из поля MEMO2.

procedureTForm1. Button5Click (Sender: TObject):

Данная процедура выполняет сортировку словаря методом перестановок. Если значение свойстваIndexItemкомпонента RadioGroupравно 0, то словарь сортируется по алфавиту, иначе по частоте.

procedure TForm1. Button6Click (Sender: TObject)):

Данная процедура осуществляет двоичный поиск по словарю. На входе подается словарь frazi, на выходе в Labelзаписывается результат поиска.

4. Описание структуры приложения и интерфейса пользователя

Задача была реализована на языке Delphiв интегрированной среде Embarcadero RAD Studio XE2. Приложение состоит из одного модуля Unit1. В основной форме данной программы определены три компонента текстового ввода, кнопка открытия файла, кнопка открытия файла с настройками, кнопка создания словаря, кнопка сохранения словаря и поле для ввода слов для поиска (рис. 4.1)

Рис. 4.1. Главное окно программы

Для работы программы необходимо, чтобы в полях «Исходный текст» и «Список разделителей» были символы. Для этого можно пользоваться соответствующими кнопками открытия файлов или вводить текст непосредственно в поле (рис. 4.2).

Рис. 4.2. Ввод обрабатываемого текста и списка разделителей.

После этого можно будет нажать кнопку «Пуск!» и в поле «Частотный словарь словосочетаний» появится информация (рис. 4.3).

Рис. 4.3. Составленный словарь словосочетаний

Полученный словарь можно отсортировать по частоте или по алфавиту, выбрав соответствующий пункт в поле «Сортировка словаря» инажав кнопку «Сортировка» (рис. 4.4).

Рис. 4.4. Сортировка по частоте

Поиск словосочетания по словарю осуществляется путем ввода в поле «Поиск» требуемой фразы и клика на кнопку «Поиск» или нажатия кнопки Enterна клавиатуре. Результаты поиска выводятся под полем «Поиск» (рис. 4.5).

Рис. 4.5. Поиск словосочетания «не смотрите»

Полученный словарь можно сохранить в файл с помощью кнопки «Сохранить» (рис. 4.6).

Рис. 4.6. Сохоанение словаря на жестком диске

При сохранении файла необходимо через точку в имени файла указать его расширение (.txt или.rtf).

5. Системные требования и имеющиеся ограничения

1. Операционная система: MSWindowsXP/Vista/7 с установленным

NET Framework (версии 2.0 и старше). Количество необходимой памяти: 8 Мб ОЗУ, 8 Мб свободного места на жёстком диске.

2. Программа работает с текстовыми файлами форматов.txtи.rtf. Разделители вводятся в строку через пробел! Разделитель - один символ.

3. В процессе работы приложения не учитывается регистр.

4. Программа обрабатывает тексты, занимающие не более 32 Кб памяти в силу ограничений компонента Memo.

6. Тестирование приложения

Тестирование заключалось в проверке работоспособности приложения вне зависимости от объема введенного текста. Результаты тестирования приведены в рисунках 4.1-4.3.

Рис. 6.1 Текст, состоящий и 79 слов

Рис. 6.2 Текст, состоящий из 2146 слов

Рис. 6.3 Текст, состоящий из 3910 слов

7. Анализ временных характеристик и выводы

При помощи команды «showmessage» произведен тестпроизводительности алгоритма на разных объёмах входных данных. Тествыдавал информацию о количественных характеристиках работы алгоритма, таких как объем обрабатываемого текста (таб. 6.1) и количество словосочетаний, перестановок при сортировке и обходов частей массива при поиске (таб. 6.2).Ссылаясь на результаты тестирования, можно сделать вывод, что время составления словаря линейно зависит от количества входящей информации.

Таб. 6.1 Зависимость времени составления словаря от объема текста

Объем текста

Время

100 строк

15

200 строк

31

500 строк

109

1000 строк

203

Таб. 6.2 Кол-во перестановок при сортировке и обходов при поиске.

Объем словаря

Время сортировки

Кол-во перестановок при сортировке

Кол-во обходов при поиске

200

15

92

6

400

47

858

7

660

78

4120

8

Рис. 7.1 Зависимость времени составления словаря от объема введенного текста

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

Линейная зависимость первых двух графиков является подтверждением правильности реализации проверяемых алгоритмов.

Нелинейность последнего графика обусловлена тем, что кол-во словосочетаний зависит не только от объема текста, но и от количества предложений в нем

Заключение

приложение тестирование интерфейс пользователь

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

Список литературы

1. А.Я. Архангельский. Программирование в Delphi. - Москва: Изд-во Бином-Пресс, 2003-1152 с.

2. Е.П. Марков. Программирование в Delphi 7. - Санкт-Петербург: Изд-во БХВ-Петербург, 2005 - 784 с.

3. Сортировка методом обмена // Уроки программированияURL:http://progclub.ru/? param=book&name=delphi7_dlya_nachinaushih&dir=glava5&file=index14 (дата обращения: 20.05.2012).

4. Двоичный поиск // Википедия - свободная энциклопедия URL: http://ru.wikipedia.org/wiki/Двоичный поиск (дата обращения: 20.05.2012).

5. Двоичный поиск // Delphiпрограммирование URL: http://www.delphisources.ru/pages/faq/base/binary_int_array_search.html (дата обращения: 20.05.2012).

6. DelphiTOpenDialog // DelphiпрограммированиеURL: http://www.delphisources.ru/pages/faq/faq_delphi_basics/TOpenDialog.php.html (Дата обращения: 20.05.2012).

7. Delphi TSaveDialog // DelphiпрограммированиеURL: http://www.delphisources.ru/pages/faq/faq_delphi_basics/TSaveDialog.php.html (Дата обращения: 20.05.2012).

Приложение. Текст программы

unitUnit1;

interface

uses

Winapi. Windows, Winapi. Messages, System. SysUtils, System. Variants, System. Classes, Vcl. Graphics,

Vcl. Controls, Vcl. Forms, Vcl. Dialogs, Vcl. StdCtrls, Vcl. ExtCtrls;

type

TForm1 = class(TForm)

Memo1: TMemo;

Memo2: TMemo;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Button4: TButton;

Edit1: TEdit;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Memo3: TMemo;

Button6: TButton;

RadioGroup1: TRadioGroup;

Button5: TButton;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

procedure Button1Click (Sender: TObject);

procedure Button2Click (Sender: TObject);

procedure Button4Click (Sender: TObject);

procedure Button3Click (Sender: TObject);

procedure Button6Click (Sender: TObject);

procedure Button5Click (Sender: TObject);

procedure Edit1KeyPress (Sender: TObject; var Key: Char);

private

{Private declarations}

public

{Public declarations}

end;

var

Form1: TForm1;

Fail, Slvr, Razdel:string;

frazi: array of string;

implementation

{$R *.dfm}

procedure TForm1. Button1Click (Sender: TObject); // Открыть

varOpenDialog: TOpenDialog;

Tekst: TextFile;

s:string;

begin

Memo1. Clear;

Memo1. Lines. Add (' ');

openDialog:= TOpenDialog. Create(self);

openDialog. InitialDir:= GetCurrentDir;

 // Только разрешенные существующие файлы могут быть выбраны

openDialog. Options:= [ofFileMustExist];

 // Разрешено выбрать только.txt и.rtf файлы

openDialog. Filter:=

'Text Files|*.txt;*.rtf';

 // Диалоготкрытияфайла

ifopenDialog. Execute

then

begin

Fail:=openDialog. FileName;

AssignFile (Tekst, Fail);

Reset(Tekst);

while not eof(Tekst) do

begin

ReadLn (Tekst, s);

Memo1. Lines. Add(s);

end;

Memo1. Lines. Delete(0);

end;

end;

procedure TForm1. Button2Click (Sender: TObject); // Настройки

varOpenDialog: TOpenDialog;

Tekst: TextFile;

s:string;

begin

if Memo3. Lines. Count=0 then Memo3. Lines. Add('');

openDialog:= TOpenDialog. Create(self);

openDialog. InitialDir:= GetCurrentDir;

 // Только разрешенные существующие файлы могут быть выбраны

openDialog. Options:= [ofFileMustExist];

 // Разрешено выбрать только.txt и.rtf файлы

openDialog. Filter:=

'Text Files|*.txt;*.rtf';

 // Диалоготкрытияфайла

ifopenDialog. Execute

then

begin

Razdel:=openDialog. FileName;

AssignFile (Tekst, Razdel);

Reset(Tekst);

while not eof(Tekst) do

begin

ReadLn (Tekst, s);

Memo3. Lines. Add(s);

end;

Memo3. Lines. Delete(0);

end;

end;

procedure TForm1. Button3Click (Sender: TObject); // Пуск

vari, p, j, k, e, p1, h, x, t: integer;

slova: array of string;

razd: array of char;

s, s1: string;

buf: string;

priz:boolean;

begin

Memo2. Clear;

setlength (slova, 0); // обнуление словаря

setlength (razd, 0); // обнуления списка разделителей

i:=0;

p:=0;

j:=1;

 ////////////////////////////

s:=memo3. Lines[0]; //

while j<= length(s) do //

begin //

setLength (razd, p+1); //

razd[p]:=s[j]; // // создание массива с разделителями

p:=p+1; //

j:=j+2; //

end; //

 ///////////////////////////

setlength (razd, length(razd)+1);

razd [length(razd) - 1]:= #13;

setlength (razd, length(razd)+1);

razd [length(razd) - 1]:= #9;

p:= 0;

j:= 1;

i:= 0;

t:=GetTickCount(); // начало замера времени

whilei<>memo1. Lines. Count do

begin

s:= memo1. Lines[i]; // просмотрi-й строки

whilepos (' ', s)=1 do delete (s, 1,1); // удаляемотступы

{Чтобы символ '-' не определялся как слово}

h:= 1;

while h<=length(s) - 2 do

begin

for p1:= 0 to length(razd) - 1 do

if s[h]='-' then if s [h+1]=razd[p1] then

delete (s, h, 1);

h:= h+1;

end;

whilelength (s)>0 do // если конец строки, то переход на следующую

begin

k:= 0;

e:= -1;

{Проверка строки на наличие разделителя}

while k<= length(razd) - 1 do

begin

if (s[j]= razd[k]) then e:= 1;

k:= k+1

end;

ife>0 then // если проверяемый символ оказался разделителем

begin

 // Заносим слово в массив 'slova'

 //////////////////////////////////////////////////////////////////////////

begin //

if s[j]='.' then s1:= copy (s, 1, j) else if s[j]='!' //

then s1:= copy (s, 1, j) else if s[j]='?' then s1:= copy (s, 1, j) //

else s1:= copy (s, 1, j-1); //

s1:= AnsiUpperCase(s1); // перевод всех букв в слове в верхний регистр //

if (length (s1)=0) or (s1='-') then begin j:= j+1; delete (s, 1,1); end //

else begin //

setLEngth (slova, p+1); //

slova[p]:=s1; //

p:= p+1; //

delete (s, 1, j); //

j:=1; end; end; end //

else j:= j+1; //

end; //

i:= i+1; //

end; //

 //////////////////////////////////////////////////////////////////////////

{Очистка слов от оставшихся разделителей}

For i:=0 to length(slova) - 1 do

For k:=0 to length(razd) - 1 do

whilepos (razd[k], slova[i])>0 do delete (slova[i], pos (razd[k], slova[i]), 1);

{Составляем фразы из полученных слов}

p:= 0; i:= 0;

whilei<= Length(slova) - 2 do

begin

j:= pos ('.', slova[i]);

if j=0 then if pos ('!', slova[i])=0 then if pos ('?', slova[i])=0 then

ifslova[i]<>'' then if slova [i+1]<>'' then

begin

setLEngth (frazi, p+1);

frazi[p]:=slova[i]+' '+slova [i+1];

p:= p+1;

end;

i:= i+1;

end;

{Удаление оставшихся знаков препинания}

fori:= 0 toLength(frazi) - 1 do

begin

s:= frazi[i];

j:= length (s);

if s[j]='.' then delete (s, j, 1) else if s[j]='!'

then delete (s, j, 1) else if s[j]='?' then delete (s, j, 1);

frazi [i]:= s;

end;

{Подсчет и удаление одинаковых фраз}

h:= High(frazi);

i:= 0;

whilei<= h do begin

S:=frazi[i];

e:= 1;

for j:= h downtoi + 1 do begin

iffrazi[j] = S then begin

Inc(e);

for k:= j to h - 1 do frazi[k]:= frazi [k + 1];

Dec(h);

end;

end;

p:= length (frazi[i]);

ifpos (' ', frazi[i])<>p then

frazi[i]:= IntToStr(e) + '……..' + S

else begin x:= i+1;

end;

Inc(i);

end;

SetLength (frazi, h + 1);

{Чистка словаря отсловосочетаний с пустыми строками вместо слов}

k:=0;

while k <= length(frazi) - 1 do

begin

p:= length (frazi[k]);

ifpos (' ', frazi[k])=p then begin for i:=K+1 to Length(frazi) - 1 do

frazi [i-1]:= frazi[i];

SetLength (frazi, Length(frazi) - 1); end; inc(k);

end;

t:=GetTickCount() - t; // конец замера времени

{Сортировка фраз по алфавиту}

repeat

priz:=false;

fori:= 0 to length(frazi) - 2 do

begin

p:= pos ('.', frazi[i])+8;

p1:= pos ('.', frazi [i+1])+8;

s:= copy (frazi[i], p, length (frazi[i]));

s1:= copy (frazi [i+1], p1, length (frazi[i+1]));

if (s>s1) then

begin

buf:= frazi[i];

frazi[i]:= frazi [i+1];

frazi [i+1]:=buf;

priz:=true;

end;

end;

untilpriz=false;

{Вывод словаря в мемо}

Memo2. Clear;

fori:= 0 to length(frazi) - 1 do

begin

Memo2. Lines. Add (' ');

Memo2. Lines[i]:=frazi[i];

end;

Label6. Caption:= 'Времяработы t='+inttostr(t);

end;

procedure TForm1. Button4Click (Sender: TObject); // Сохранить

var

saveDialog:TSaveDialog;

begin

saveDialog:= TSaveDialog. Create(self);

saveDialog. InitialDir:= GetCurrentDir;

 // Разрешаемсохранятьфайлытипа.txt и.rtf

saveDialog. Filter:= 'Text Files|*.txt|Text Files|*.rtf';

 // Отображение диалог сохранения файла

ifsaveDialog. Execute

then

begin

Slvr:=saveDialog. FileName;

Memo2. Lines. SaveToFile(Slvr);

end;

end;

procedure TForm1. Button5Click (Sender: TObject); // Сортировка

vari, p, p1: integer;

buf, s, s1: string;

priz:boolean;

begin

{Сортировкапоалфавиту}

if RadioGroup1. ItemIndex=0 then begin

repeat

priz:=false;

fori:= 0 to length(frazi) - 2 do

begin

p:= pos ('.', frazi[i])+8;

p1:= pos ('.', frazi [i+1])+8;

s:= copy (frazi[i], p, length (frazi[i]));

s1:= copy (frazi [i+1], p1, length (frazi[i+1]));

if (s>s1) then

begin

buf:= frazi[i];

frazi[i]:= frazi [i+1];

frazi [i+1]:=buf;

priz:=true;

end;

end;

untilpriz=false;

{Вывод в мемо}

Memo2. Clear;

fori:= 0 to length(frazi) - 1 do

begin

Memo2. Lines. Add (' ');

Memo2. Lines[i]:=frazi[i];

end;

end

else begin

{Сортировкапочастоте}

repeat

priz:=false;

fori:= 0 to length(frazi) - 2 do

begin

p:= pos ('.', frazi[i]);

p1:= pos ('.', frazi [i+1]);

s:= copy (frazi[i], 1, p-1);

s1:= copy (frazi [i+1], 1, p-1);

if p<p1 then begin

buf:= frazi[i];

frazi[i]:= frazi [i+1];

frazi [i+1]:=buf;

priz:=true;

end;

if (s<s1) and (p=p1) then

begin

buf:= frazi[i];

frazi[i]:= frazi [i+1];

frazi [i+1]:=buf;

priz:=true;

end;

end;

untilpriz=false;

{Вывод в мемо}

Memo2. Clear;

fori:= 0 to length(frazi) - 1 do

begin

Memo2. Lines. Add (' ');

memo2.lines[i]:= frazi[i];

end; end;

end;

procedure TForm1. Button6Click (Sender: TObject); // Поиск

varobr:string;

i, k, j, p, p1:integer;

s, s1, buf: string;

priz:boolean;

begin

label1. Caption:='';

repeat

priz:=false;

fori:= 0 to length(frazi) - 2 do

begin

p:= pos ('.', frazi[i])+8;

p1:= pos ('.', frazi [i+1])+8;

s:= copy (frazi[i], p, length (frazi[i]));

s1:= copy (frazi [i+1], p1, length (frazi[i+1]));

if (s>s1) then

begin

buf:= frazi[i];

frazi[i]:= frazi [i+1];

frazi [i+1]:=buf;

priz:=true;

end;

end;

untilpriz=false;

obr:=AnsiUpperCase (edit1. Text);

i:=0; j:=length(frazi) - 1;

k:=0;

whilei<= j do

begin

k:= i + (j - i) div 2;

p:= pos ('.', frazi[k])+8;

s:= copy (frazi[k], p, length (frazi[k]));

s1:= copy (frazi[k], 1, p-9);

ifobr> s then

i:= k + 1

else if obr< s then

j:= k - 1

else

break;

end;

if s= obr then

Label1. Caption:='Словосочетание «'+s+'» встречается в тексте '+s1+' раз(-а)'

elseLabel1. Caption:='Словосочетание не найдено';

if Edit1. Text='' then label1. Caption:='';

end;

procedure TForm1. Edit1KeyPress (Sender: TObject; var Key: Char);

begin

if Key = #13 then Button6Click(Button6);

end;

end.

Размещено на Allbest.ru


Подобные документы

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

    курсовая работа [1,2 M], добавлен 07.07.2012

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

    курсовая работа [537,9 K], добавлен 28.06.2011

  • Описание технологии asp.net. Страницы веб-приложения, тестирование системы. Описание функциональной, динамической модели системы. Диаграммы вариантов использования, последовательности, база данных приложения. Реализация программы, интерфейс, тестирование.

    курсовая работа [3,2 M], добавлен 30.01.2013

  • Разработка консольного приложения: описание и сценарий использования программы, интерфейс пользователя. Поэтапное описание создание кода компьютерной игры "Крестики нолики". Функциональные и нефункциональные требования, описание исключительных ситуаций.

    методичка [819,6 K], добавлен 12.05.2013

  • Автоматизация системы снятия показаний счетчиков энергии. Разработка базы данных и клиентского приложения для структур жилищно-коммунального хозяйства, занимающихся составлением квитанций. Описание предметной области. Тестирование клиентского приложения.

    курсовая работа [953,3 K], добавлен 01.09.2016

  • Логическая и физическая структура базы данных. Аппаратное и программное обеспечение системы. Создание представлений, хранимых процедур, пользовательских функций, триггеров. Описание основной структуры ASP.NET документов. Пользовательский интерфейс.

    курсовая работа [4,2 M], добавлен 21.05.2013

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

    курсовая работа [2,2 M], добавлен 26.04.2015

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

    курсовая работа [678,1 K], добавлен 15.02.2016

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

    дипломная работа [1,0 M], добавлен 10.07.2017

  • Разработка программного продукта - приложения, позволяющего заносить данные анкетирования в базу данных MS SQL. Описание логики работы приложения, особенности пользовательского интерфейса. Формы просмотра анкет, описание процедур и функций программы.

    курсовая работа [1,2 M], добавлен 16.08.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.