Разработка комплекса программ и реализация алгоритмов поиска подстроки

 












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

Разработка комплекса программ и реализация алгоритмов поиска подстроки




Пояснительная записка


Пояснительная записка содержит 37 страниц, 7 рисунков, 1 таблицу, 4 источника, 2 приложения.

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

В процессе разработки на базе анализа проблемы проведено обоснование и выбор средств разработки программного комплекса.

В результате разработана структура, программного комплекса, класс абстрактного типа данных - список (далее АТД - список). На программном уровне комплекс реализован на языке С++ в среде разработки Visual Studio.

При разработке программного комплекса была использована современная технология объектно-ориентированного программирования и проектирования графического пользовательского интерфейса, такая, как Windows Forms.




Оглавление


Введение

Постановка задачи

Описание структуры данных

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

Разработка структуры программы

Описание программы

Экспериментальная часть

Заключение

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

Приложение А. Графическая часть

Приложение Б. Исходный код программы




Введение


В процессе выполнения курсового проекта должен быть реализован комплекс программ поиска подстроки в тексте алгоритмом прямого поиска и алгоритмом Кнута-Морриса-Пратта. Должен быть разработан АТД или с представлением описания. Должна быть разработана программа тестирования трудоёмкости операций. Эффективность работы алгоритмов должна быть представлена на графиках. Должен быть выполнен сравнительный анализ теоретических и экспериментальных оценок эффективности алгоритмов. Работа алгоритмов должна быть представлена скриншотами интерфейса программы. ПО должно быть разработано на языке программирования С++.



Постановка задачи


Быстрый поиск точно заданной подстроки в строке является одной из самых простейших задач поиска информации. Однако эта задача является чрезвычайно важной. Данная функция встроена в различные текстовые редакторы и базы данных, что существенно ускоряет процесс поиска информации и редактирование (замену) фрагментов.

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


Описание структуры данных.


АТД - массив структур struct line, содержит int id - идентификатор строки, char str[255] - строка. line *arr - указатель на сам массив. Массив сразу создаётся с размером n = 0. Размер n изменяется при последующем добавлении элементов. АТД - список имеет компонентные функции: загрузка данных из файла, добавление элемента, удаление элемента. Вызов функций АТД реализован в пользовательском интерфейсе программы. Исходный код АТД см. приложение 1.

Данные:

Параметры:id - идентификатор элемента массива структур;str[255] - строка.

Структура данных:

Массив структур размером n.

Операции:

Загрузка из файла:

Вход: имя файла с входными данными wchar_t file[255];

Процесс: формирование массива из файла;

Выход: новый размер списка n;

Добавить строку:

Вход: String^ str - строка для добавления;

Процесс: включение полученной строки в массив, выполняется функцией Addline();

Выход: новый размер массива n+1;

Удалить строку:

Вход: int number - идентификатор удаляемой строки;

Процесс: поиск идентификатора строки и присваивание ему значения -10;

Выход: новый размер size-1;

Удаление массива структур:

Процесс: удаление массива структур;

Конец АТД.


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


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

Пусть заданы массивы символов типа char: строка S как размером N,подстрока P размером M (см. блок 2). Поиск завершается после поиска подстроки P во всех строках S , это позволяет получить результат о всех найденных вхождениях P в S. Поиск считается удачным, если количество совпавших символов будет равно длине подстроки (см. блоки 7-9). Алгоритм содержит условие, предотвращающее выход за пределы строки (см. блок 10). Проход по каждому символу строки осуществляется счетчиками (см. блок 4, блок 6).

Алгоритм Кнута-Морриса-Пратта.

В этом алгоритме подстрока (образ) размером N сравнивается со строкой S размером M и если встречается несовпадение, следующее сравнение начинается с первой несовпадающей позиции в строке. Если совпадения вообще нет, то сравнение начинается со следующей позиции в строке.

Для работы алгоритма вводится дополнительный массив для вычисления сдвига на очередном шаге - D. Этот массив может быть получен на основе анализа образа Р и зависит только от содержимого подстроки. До начала самого поиска подстроки в строке можно вычислить значения сдвигов, которые используются в дальнейшем поиске. Причем в массив D помещается значение = -1, если производится сдвиг на целый образ. Чем меньше значение D, тем на большее число позиций производится сдвиг по строке. Сдвиг для ячейки j вычисляется как j-d[j]. Основным отличием КМП-алгоритма от алгоритма прямого поиска является осуществления сдвига слова не на один символ на каждом шаге алгоритма, а на некоторое переменное количество символов. Таким образом, перед тем как осуществлять очередной сдвиг, необходимо определить величину сдвига. Для повышения эффективности алгоритма необходимо, чтобы сдвиг на каждом шаге был бы как можно большим.

Блок схемы алгоритмов представлены см. приложение А.



Разработка структуры программы

алгоритм поиск подстрока

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

Разработанная программа состоит из 4 основных функций:ShowStruct() - функция вывода массива на экран;LineFind(array<Char>^ fstr,int m) - функция прямого поиска подстроки. Вход: искомая подстрока, размер искомой строки.

Выход: Возвращает 1 если поиск успешен, 0 - если не успешен.algorithm_KMP(array<Char>^ fstr,int l) - функция поиска алгоритма Бойера-Мура. Вход: искомая подстрока, адрес строки в массиве строк. Выход: возвращает адрес строки.Addline() - функция добавления строки в массив структур. Выход: возвращает 1 - если добавление успешно, 0 - если добавление неудачно.

Помимо основных функций АТД в программе присутствуют функции обработки нажатий на кнопки:

private:System::Void Form1_Load (System::Object^sender, System::EventArgs^ e) - функция открытия формы.: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) - функция поиска.: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) - функция загрузки из файла массива структур.: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) - функция удаления массива структур и закрытия формы.:System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) - функция добавления строки в массив структур.:System::Void button5_Click(System::Object^ sender, System::EventArgs^ e) - функция удаления строки из массива структур.:System::Void очиститьМассивСтруктурToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) - функция очищения всех полей и удаления массива структур.:System::Void открытьToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) - функция выбора файла для чтения.

Структурная схема программы представлена в приложении А. Исходный код см. приложение Б.

Описание программы.

В программе реализована возможность загрузки текста из файла или вручную. Помимо этого также реализована функция удаления строки. Из полученных данных формируется массив структур, размер которого в дальнейшем может быть изменен пользователем посредством функций добавления и удаления строки. Результатом работы программы являются координаты найденной подстроки в тексте и время поиска, выведенные в специальные поля. Результаты работы программы выводятся на экран, см.Рис4-5.

Работа алгоритмов представлена скриншотами.

Для заполнения списка строками можно воспользоваться возможностью загрузки текста из файла: для начала нужно выбрать файл (Файл - открыть) см. Рис1.


Рис1. Пример выбора файла


Рис2. Добавление строки


Затем заполнить массив структур с помощью кнопки «Заполнить массив». Присутствует возможность ввести строки вручную используя кнопку «Добавить строку». Кнопка добавления также предоставляет пользователю возможность добавить строку к загруженному из файла тексту, см. Рис2.


Кнопка «Удалить строку» реализует возможность удаления строки из текста, см. Рис3.


Рис3. Удаление строки


Рис4. Поиск и вывод результатов работы.

Рис5.Поиск и вывод результатов работы


Экспериментальная часть


Исследование эффективности алгоритмов

Тестирование программы проводилось на входных данных различного размера. В качестве входной информации были использованы текстовые файлы содержащие английский текст. Зависимость времени поиска от размера для каждого алгоритма представлено в Таблице 1 и Рис 6.


ВремяКоличество символовПрямой поискАлгоритм КМП20330.013930.0127245600.0390.0297065930.047230,03294131860,0970,1Таблица1.


Рис 6. График зависимости времени от кол-ва символов.


Анализируя график Рис 6 и Таблицу 1 можно утверждать, что алгоритм КМП дает выигрыш в тех случаях, когда несовпадению предшествует некоторое число совпадений, так как в этом случае образ сдвигается сразу на несколько позиций. Но это бывает не так часто, поэтому выигрыш, по сравнению с прямым поиском, не всегда значителен

Исследование трудоёмкости.

Для алгоритма прямого поиска была подсчитана трудоёмкость операций, под которой подразумевается количество элементарных операций необходимое для решения определенной задачи. График зависимости трудоёмкости от размерности см. Рис 7.


Рис 7. Зависимость трудоемкости от размера.

График Рис 7 показывает, что чем больше количество символов в списке строк, тем больше потребуется произвести операций для получения результата. В коде программы за количество элементарных операций отвечает счетчик kol.



Заключение


В результате написания курсового проекта мною были разработаны и реализованы: алгоритмы поиска подстроки в тексте, АТД - массив структур, программа тестирования трудоёмкости для алгоритма прямого поиска. После чего, были приведены график эффективности алгоритмов поиска и график зависимости трудоёмкости прямого поиска от размера текста. Также пояснительная записка содержит описание АТД - список и структуры программы. Работоспособность программы показана на рисунках. Комплекс программ разработан на языке программирования С++ в среде Visual Studio.

В разработанной программе реализованы следующие возможности:

Формирование массива строк из файла;

Добавление строки в массив;

Удаление строки из массива;

Очистка массива;

Прямой поиск;

Поиск алгоритмом Кнута-Морриса-Пратта;

Вывод результатов работы программы в отдельное поле.



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


1. Д. Макконнел. Основы современных алгоритмов. М.: Техносфера, 2010. 368 с.

. Н. Вирт. Алгоритмы и структуры данных. М.: Невский Диалект, 2009. 352 с.

. Р. Седжвик. Фундаментальные алгоритмы C++. Части 1-4. М.: Диасофт,



ПРИЛОЖЕНИЕ А
































ПРИЛОЖЕНИЕ Б


#pragma once

#include <iostream>

#include <fstream>

#include <string>

#include <stdlib.h>

#include <ctime>

#include <time.h>

#include <omp.h>

#include <vcclr.h>KursachSia_Kod {namespace System;namespace System::Runtime::InteropServices;namespace System::ComponentModel;namespace System::Collections;namespace System::Windows::Forms;namespace System::Data;namespace System::Drawing;namespace System::IO;namespace std;line

{str[255]; id;

};*arr; n=-1,m=0,choice=0,longstr=0,kol=0;_t file[255];

/// <summary>

/// Сводка для Form1

/// </summary>ref class Form1 : public System::Windows::Forms::Form

{:(void)

{();

//

//TODO: добавьте код конструктора

//

}:

/// <summary>

/// Освободить все используемые ресурсы.

/// </summary>

~Form1()

{(components)

{components;

}

}: System::Windows::Forms::RadioButton^ radioButton1;: : System::Windows::Forms::RadioButton^ radioButton2;: System::Windows::Forms::TextBox^ textBox1;: System::Windows::Forms::TextBox^ textBox2;: System::Windows::Forms::Button^ button1;: System::Windows::Forms::TextBox^ textBox3;: : : System::Windows::Forms::Label^ label1;: System::Windows::Forms::Label^ label2;: System::Windows::Forms::Label^ label3;: System::Windows::Forms::Button^ button2;: System::Windows::Forms::Button^ button3;: System::Windows::Forms::Label^ label6;: System::Windows::Forms::Label^ label4;: System::Windows::Forms::ToolTip^ toolTip1;: System::Windows::Forms::Button^ button4;: System::Windows::Forms::TextBox^ textBox4;: System::Windows::Forms::Button^ button5;: System::Windows::Forms::TextBox^ textBox5;: System::Windows::Forms::Label^ label7;: System::Windows::Forms::Label^ label8;: System::Windows::Forms::MenuStrip^ menuStrip1;: System::Windows::Forms::ToolStripMenuItem^ файлToolStripMenuItem;: System::Windows::Forms::ToolStripMenuItem^ открытьToolStripMenuItem;: System::Windows::Forms::ToolStripMenuItem^ очиститьМассивСтруктурToolStripMenuItem;: System::Windows::Forms::OpenFileDialog^ openFileDialog1;: System::ComponentModel::IContainer^ components;

private:

/// <summary>

/// Требуется переменная конструктора.

/// </summary>

#pragma region Windows Form Designer generated code

/// <summary>

/// Обязательный метод для поддержки конструктора - не изменяйте

/// содержимое данного метода при помощи редактора кода.

/// </summary>InitializeComponent(void)

{>components = (gcnew System::ComponentModel::Container());>radioButton1 = (gcnew System::Windows::Forms::RadioButton());>radioButton2 = (gcnew System::Windows::Forms::RadioButton());>textBox1 = (gcnew System::Windows::Forms::TextBox());>textBox2 = (gcnew System::Windows::Forms::TextBox());>button1 = (gcnew System::Windows::Forms::Button());>textBox3 = (gcnew System::Windows::Forms::TextBox());>label1 = (gcnew System::Windows::Forms::Label());>label2 = (gcnew System::Windows::Forms::Label());>label3 = (gcnew System::Windows::Forms::Label());>button2 = (gcnew System::Windows::Forms::Button());>button3 = (gcnew System::Windows::Forms::Button());>label6 = (gcnew System::Windows::Forms::Label());>label4 = (gcnew System::Windows::Forms::Label());>toolTip1 = (gcnew System::Windows::Forms::ToolTip(this->components));>button4 = (gcnew System::Windows::Forms::Button());>textBox4 = (gcnew System::Windows::Forms::TextBox());>button5 = (gcnew System::Windows::Forms::Button());>textBox5 = (gcnew System::Windows::Forms::TextBox());>label7 = (gcnew System::Windows::Forms::Label());>label8 = (gcnew System::Windows::Forms::Label());>menuStrip1 = (gcnew System::Windows::Forms::MenuStrip());>файлToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());>открытьToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());>очиститьМассивСтруктурToolStripMenuItem = (gcnew System::Windows::Forms::ToolStripMenuItem());>openFileDialog1 = (gcnew System::Windows::Forms::OpenFileDialog());>menuStrip1->SuspendLayout();>SuspendLayout();

//

// radioButton1

// >radioButton1->AutoSize = true;>radioButton1->Location = System::Drawing::Point(235, 28);>radioButton1->Name = L"radioButton1";>radioButton1->Size = System::Drawing::Size(201, 17);>radioButton1->TabIndex = 0;>radioButton1->TabStop = true;

this->radioButton1->Text = L"Прямой поиск подстроки в строке";

this->radioButton1->UseVisualStyleBackColor = true;>radioButton1->CheckedChanged += gcnew System::EventHandler(this, &Form1::radioButton1_CheckedChanged);

//

// radioButton2

// >radioButton2->AutoSize = true;>radioButton2->Location = System::Drawing::Point(235, 61);>radioButton2->Name = L"radioButton2";>radioButton2->Size = System::Drawing::Size(101, 17);>radioButton2->TabIndex = 1;>radioButton2->TabStop = true;>radioButton2->Text = L"Алгоритм КМП";>radioButton2->UseVisualStyleBackColor = true;>radioButton2->CheckedChanged += gcnew System::EventHandler(this, &Form1::radioButton2_CheckedChanged);

//

// textBox1

// >textBox1->Location = System::Drawing::Point(12, 41);>textBox1->Multiline = true;>textBox1->Name = L"textBox1";>textBox1->ScrollBars = System::Windows::Forms::ScrollBars::Both;>textBox1->Size = System::Drawing::Size(195, 235);>textBox1->TabIndex = 2;>textBox1->TextChanged += gcnew System::EventHandler(this, &Form1::textBox1_TextChanged);

//

// textBox2

// >textBox2->Location = System::Drawing::Point(272, 124);>textBox2->Name = L"textBox2";>textBox2->ScrollBars = System::Windows::Forms::ScrollBars::Vertical;>textBox2->Size = System::Drawing::Size(147, 20);>textBox2->TabIndex = 3;

//

// button1

// >button1->Location = System::Drawing::Point(12, 295);>button1->Name = L"button1";>button1->Size = System::Drawing::Size(75, 23);>button1->TabIndex = 4;>button1->Text = L"Поиск";>button1->UseVisualStyleBackColor = true;>button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);

//

// textBox3

// >textBox3->AcceptsReturn = true;>textBox3->ImeMode = System::Windows::Forms::ImeMode::NoControl;>textBox3->Location = System::Drawing::Point(213, 180);>textBox3->Multiline = true;>textBox3->Name = L"textBox3";>textBox3->ReadOnly = true;>textBox3->ScrollBars = System::Windows::Forms::ScrollBars::Vertical;>textBox3->Size = System::Drawing::Size(263, 54);>textBox3->TabIndex = 5;

//

// label1

// >label1->AutoSize = true;>label1->Location = System::Drawing::Point(269, 108);>label1->Name = L"label1";>label1->Size = System::Drawing::Size(152, 13);>label1->TabIndex = 6;>label1->Text = L"Введите искомую подстроку";

//

// label2

// >label2->AutoSize = true;>label2->Location = System::Drawing::Point(46, 25);>label2->Name = L"label2";>label2->Size = System::Drawing::Size(107, 13);>label2->TabIndex = 7;>label2->Text = L"Содержимое файла";

//

// label3

// >label3->AutoSize = true;>label3->Location = System::Drawing::Point(295, 159);>label3->Name = L"label3";>label3->Size = System::Drawing::Size(106, 13);>label3->TabIndex = 8;>label3->Text = L"Результаты поиска";

//

// button2

// >button2->Location = System::Drawing::Point(12, 339);>button2->Name = L"button2";>button2->Size = System::Drawing::Size(111, 23);>button2->TabIndex = 9;>button2->Text = L"Заполнить массив";>button2->UseVisualStyleBackColor = true;>button2->Click += gcnew System::EventHandler(this, &Form1::button2_Click);

//

// button3

// >button3->Location = System::Drawing::Point(401, 441);>button3->Name = L"button3";>button3->Size = System::Drawing::Size(75, 23);>button3->TabIndex = 11;>button3->Text = L"Выход";>button3->UseVisualStyleBackColor = true;>button3->Click += gcnew System::EventHandler(this, &Form1::button3_Click);

//

// label6

// >label6->AutoSize = true;>label6->Location = System::Drawing::Point(247, 250);>label6->Name = L"label6";>label6->Size = System::Drawing::Size(125, 13);>label6->TabIndex = 14;>label6->Text = L"Количество символов: ";

//

// label4

// >label4->AutoSize = true;>label4->Location = System::Drawing::Point(247, 274);>label4->Name = L"label4";>label4->Size = System::Drawing::Size(43, 13);>label4->TabIndex = 12;>label4->Text = L"Время:";

//

// button4

// >button4->Location = System::Drawing::Point(12, 383);>button4->Name = L"button4";>button4->Size = System::Drawing::Size(111, 23);>button4->TabIndex = 16;>button4->Text = L"Добавить строку";>button4->UseVisualStyleBackColor = true;>button4->Click += gcnew System::EventHandler(this, &Form1::button4_Click);

//

// textBox4

// >textBox4->Location = System::Drawing::Point(139, 386);>textBox4->Name = L"textBox4";>textBox4->Size = System::Drawing::Size(237, 20);>textBox4->TabIndex = 17;

//

// button5

// >button5->Location = System::Drawing::Point(12, 430);>button5->Name = L"button5";>button5->Size = System::Drawing::Size(111, 23);>button5->TabIndex = 18;>button5->Text = L"Удалить строку";>button5->UseVisualStyleBackColor = true;>button5->Click += gcnew System::EventHandler(this, &Form1::button5_Click);

//

// textBox5

// >textBox5->Location = System::Drawing::Point(139, 433);>textBox5->Name = L"textBox5";>textBox5->Size = System::Drawing::Size(237, 20);>textBox5->TabIndex = 19;

//

// label7

// >label7->AutoSize = true;>label7->Location = System::Drawing::Point(196, 414);>label7->Name = L"label7";>label7->Size = System::Drawing::Size(122, 13);>label7->TabIndex = 20;>label7->Text = L"Введите номер строки";

//

// label8

// >label8->AutoSize = true;>label8->Location = System::Drawing::Point(210, 367);>label8->Name = L"label8";>label8->Size = System::Drawing::Size(86, 13);>label8->TabIndex = 21;>label8->Text = L"Введите строку";

//

// menuStrip1

// >menuStrip1->Items->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(1) {this->файлToolStripMenuItem});>menuStrip1->Location = System::Drawing::Point(0, 0);>menuStrip1->Name = L"menuStrip1";>menuStrip1->Size = System::Drawing::Size(487, 24);>menuStrip1->TabIndex = 22;>menuStrip1->Text = L"menuStrip1";

//

// файлToolStripMenuItem

// >файлToolStripMenuItem->DropDownItems->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(2) {this->открытьToolStripMenuItem, >очиститьМассивСтруктурToolStripMenuItem});>файлToolStripMenuItem->Name = L"файлToolStripMenuItem";>файлToolStripMenuItem->Size = System::Drawing::Size(48, 20);>файлToolStripMenuItem->Text = L"Файл";

//

// открытьToolStripMenuItem

// >открытьToolStripMenuItem->Name = L"открытьToolStripMenuItem";>открытьToolStripMenuItem->Size = System::Drawing::Size(126, 22);>открытьToolStripMenuItem->Text = L"Открыть";>открытьToolStripMenuItem->Click += gcnew System::EventHandler(this, &Form1::открытьToolStripMenuItem_Click);

//

// очиститьМассивСтруктурToolStripMenuItem

// >очиститьМассивСтруктурToolStripMenuItem->Name = L"очиститьМассивСтруктурToolStripMenuItem";>очиститьМассивСтруктурToolStripMenuItem->Size = System::Drawing::Size(126, 22);>очиститьМассивСтруктурToolStripMenuItem->Text = L"Очистить";>очиститьМассивСтруктурToolStripMenuItem->Click += gcnew System::EventHandler(this, &Form1::очиститьМассивСтруктурToolStripMenuItem_Click);

//

// openFileDialog1

// >openFileDialog1->FileName = L"openFileDialog1";

//

// Form1

// >AllowDrop = true;>AutoScaleDimensions = System::Drawing::SizeF(6, 13);>AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;>ClientSize = System::Drawing::Size(487, 465);>Controls->Add(this->label8);>Controls->Add(this->label7);>Controls->Add(this->textBox5);>Controls->Add(this->button5);>Controls->Add(this->textBox4);>Controls->Add(this->button4);>Controls->Add(this->label6);>Controls->Add(this->label4);>Controls->Add(this->button3);>Controls->Add(this->button2);>Controls->Add(this->label3);>Controls->Add(this->label2);>Controls->Add(this->label1);>Controls->Add(this->textBox3);>Controls->Add(this->button1);>Controls->Add(this->textBox2);>Controls->Add(this->textBox1);>Controls->Add(this->radioButton2);>Controls->Add(this->radioButton1);>Controls->Add(this->menuStrip1);>MainMenuStrip = this->menuStrip1;>Name = L"Form1";>RightToLeftLayout = true;>Text = L"Form1";>Load += gcnew System::EventHandler(this, &Form1::Form1_Load);>menuStrip1->ResumeLayout(false);>menuStrip1->PerformLayout();>ResumeLayout(false);>PerformLayout();


}

#pragma endregionLineFind(array<Char>^ fstr,int m)

{i=0,j=0,s=0,k=-1,res=0;(true)

{++;kol++;= strlen(arr[k].str);(arr[k].id != -10)

{=-1;kol++;(true)

{++;=0;kol++;((j<m)&&(arr[k].str[i+j]==fstr[j]))

{++;++;((j==m)||(i==s-m))

{++;(j==m)

{ ++;

textBox3->Text +="Подстрока найдена в строке "+ (k) + " по адресу " + (i) + "\r\n";

res=1;

}

}

}(i>s) break;

}(k==n);

}

}res;

}Addline()

{^ str = textBox4->Text;= longstr + str->Length;(str->Length!=0)

{++;[n].id=n;* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);(arr[n].str,str2);->Text += arr[n].id + " : " + gcnew String(arr[n].str) + "\r\n";

//kolstr = kolstr + n;

//label5->Text = "Количество элементарных итераций: " + (n);


return 1;

}0;

}ShowStruct()

{(int i=0;i<=n;i++)(arr[i].id != -10)->Text += arr[i].id + " : " + gcnew String(arr[i].str) + "\r\n";

}algorithm_KMP (array<Char>^ fstr,int l)

{ i=0, j=-1, N, M;= strlen(arr[l].str);= fstr->Length;*d =(int*)malloc(M*sizeof(int)); // динамический массив длины М

// Вычисление префикс-функции [0]=-1;(i<M-1)

{++;((j>=0) && (fstr[j]!=fstr[i]))

{= d[j];++;

}++;++;(fstr[i]==fstr[j])

{[i]=d[j];++;

}

{[i]= j;++;

}

}

/* поиск */(i=0,j=0;(i<N)&&(j<M); i++,j++)((j>=0)&&(fstr[j]!=arr[l].str[i]))

{=d[j];++;

}(d); /* освобождение памяти массива d */

if (j==M)i-j;/* i==N */-1;

}: System::Void textBox1_TextChanged(System::Object^ sender, System::EventArgs^ e)

{

}: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e)

{>Text = "Поиск подстроки";->SetToolTip(textBox2, "Введите искомую подстроку");->IsBalloon = true;->FileName="";->Filter="Текстовые файлы (*.txt)|*.txt|All files (*.*)|*.*";

//button5->Enabled = false;

//textBox5->Enabled = false;=new line[10000];

}: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e)

{->Clear();(wcslen(file)!=0)

{input;.open(file);(!input.eof())

{++;>>arr[n].str;=longstr + strlen(arr[n].str);[n].id = n;

}.close();();->Text = "Количество символов: " + longstr;

}::Show("Выберите файл: Файл - открыть");

}: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)

{(n != -1)

{textBox3->Clear();a,b=0;= 0;Time1,Time2;<Char>^ fstr = textBox2->Text->ToCharArray();= fstr->Length;(m != 0)

{= omp_get_wtime();(choice==1)

{(LineFind(fstr,m)==0)->Text = "Подстрока не найдена";=0;

}(choice==2)

{(int l=0;l<=n;l++)

{ ++;=algorithm_KMP(fstr,l);

if(a != -1)

{->Text +="Подстрока найдена в строке "+ (l) + " по адресу " + (a) + "\r\n";=1;

}

}(b == 0)->Text = "Подстрока не найдена";

kol=0;

}= omp_get_wtime();= Time2 - Time1;->Text ="Время: " + String::Format("{0:F5}",Time2);

}::Show("Введите искомую подстроку");

}::Show("Массив структур не заполнен");

}: System::Void radioButton1_CheckedChanged(System::Object^ sender, System::EventArgs^ e)

{= 1;

}: System::Void radioButton2_CheckedChanged(System::Object^ sender, System::EventArgs^ e)

{= 2;

}: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e)

{[] arr;>Close();

}: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e)

{(Addline()==1)

{->Text = "Количество символов: " + longstr;::Show("Элемент добавлен");

}::Show("Ошибка при добавлении элемента");

}: System::Void button5_Click(System::Object^ sender, System::EventArgs^ e)

{(n!=-1)

{number=-1;(textBox5->Text != "")

{= Convert::ToInt32(textBox5->Text);(number!=-1)

{(int i=0;i<=n;i++)(arr[i].id == number)

{= longstr - strlen(arr[i].str);[i].id=-10;

}

->Text = "Количество символов: " + longstr;->Clear();();

}::Show("Удаление успешно");

}::Show("Произошла ошибка при удалении");

}::Show("Заполните массив структур");

}: System::Void очиститьМассивСтруктурToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)

{->Clear();->Clear();->Clear();->Clear();->Clear();= 0;

label6->Text = "Количество символов: ";->Text ="Время: ";

delete[] arr;=new line[10000];=-1;

}: System::Void открытьToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)

{->ShowDialog();(openFileDialog1->FileName == nullptr) return;

{ ^ filename = openFileDialog1->FileName;_ptr<const wchar_t> whs =PtrToStringChars(filename);_s(file,whs);MyReader = gcnew IO::StreamReader(openFileDialog1->FileName, System::Text::Encoding::GetEncoding(1251)); ->Text= MyReader->ReadToEnd();>Close();

}(IO::FileNotFoundException^ Ситуация)

{::Show(Ситуация->Message + "\nФайл не найден", "Ошибка", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);

}(Exception^ Ситуация)

{::Show(Ситуация->Message, "Ошибка", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);

}

}

};

}


Курсовая работа Разработка комплекса программ и реализация алгоритмов поиска подстроки Пояснительн

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ