Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные_работы_АИП.docx
Скачиваний:
6
Добавлен:
14.06.2024
Размер:
2.25 Mб
Скачать

Лабораторная работа №12

Создание приложений Windows Forms для обработки строк

ИНДИВИДУАЛЬНОЕ ЗАДАНИЕ НА РАЗРАБОТКУ ПРОЕКТА

Создать проект решения следующей задачи:

Определить, является ли заданная строка записью целого или вещественного числа, или строку нельзя преобразовать в число.

ФОРМАЛИЗАЦИЯ ЗАДАЧИ

Из условия задания следует, что его выполнение распадается на следующие этапы:

  1. Ввод исходной строки.

  2. Удаление всех точек со строки.

  3. Cчитаем количество точек. Если количество точек равно единице и точка не первый элемент, то возвращаем true, иначе false (функция GetCount).

  4. Вычисляем чем является строка.

  5. Вывод того, чем является строка.

РАЗРАБОТКА ГРАФИЧЕСКОГО ИНТЕРФЕЙСА ПОЛЬЗОВАТЕЛЯ ПРИЛОЖЕНИЯ

Графический интерфейс проекта изображен на рисунке 1. Форма содержит 6 объектов:

• текстовое поле txtString для ввода обрабатываемой строки;

• текстовое поле txtFind для вывода найденного слова;

• кнопку cmdFind для запуска процедуры поиска;

• кнопку cmdExit для выхода из приложения;

• надписи lblString и lblRes, комментирующие назначение

текстовых полей.

Рисунок 1 – Форма проекта

В таблице 1 приведены установленные при конструировании свойства основных объектов формы.

Таблица 2

Таблица 1

Объект

Класс объекта

Свойство

Значение свойсвта

Текстовое поле

TextBox

Name

txtString

Text

“”(Пусто)

Кнопка

Button

Name

cmdFind

Text

Найти

Font

Arial; 10pt

Кнопка

Button

Name

cmdExit

Text

Выйти

Font

Arial; 10pt

Текстовое поле

TextBox

Name

txtFind

Text

“”(Пусто)

РАЗРАБОТКА СХЕМ АЛГОРИТМОВ ФУНКЦИЙ

Схемы алгоритмов функций приложения, решающих поставленную задачу, приведены на рис. 2–4.

Рисунок 2 – Схема алгоритма функции Find

Рисунок 3 – Схема алгоритма функции DelDot

Рисунок 4 – Схема алгоритма функции GetCount

Главная функция Find(Рисунок 2) получает входную строку str. Если значение функции GetCount=1, то мы удаляем точки в строке, если очередной элемент строки равен цифре, то мы продолжаем идти по массиву, иначе возвращаем строку “Не является записью числа”. Если количество точек=0, то возвращаем сообщение: “Запись целого числа”, иначе “Запись вещественного числа”

Функция DelDot (Рисунок 3) удаляет из строки лишние пробелы, а также удаляет все точки из строки.

Функция GetCount (Рисунок 4) считает количество точек в строке. Если количество точек равно 1 и первый элемент строки не равен точке, или количество точек равно 0, то функция возвращает true, иначе false.

РАЗРАБОТКА ПРОГРАММНОГО КОДА ПРИЛОЖЕНИЯ

В данном проекте в соответствии с заданием, помимо автоматически сгенерированных системой файлов, создается файл Find.cpp с программным кодом функций пользователя. На рис. 5 приведены тексты функций, содержащихся в файле Find.cpp. Все функции используют свойства и методы класса String.

В начале файла содержится директива include для подключения заголовочного файла stdafx.h. Функция Find получает исходную строку в качестве входного параметра.

#include "stdafx.h"

String^ Find(String^ str, int dot_cnt)

{

if (GetCount(str, dot_cnt) == true)

{

String^ Vowel = "0123456789";

str = DelDot(str);

for (int i = 0; i < str->Length; i++)

{

if (Vowel->IndexOf(str->Substring(i,1)) >= 0)

continue;

else

return "Не является записью числа";

}

if (dot_cnt == 0)

return "Запись целого числа";

if (dot_cnt == 1)

return "Запись вещественного числа";

}

else

return "Не является записью числа";

}

String^ DelDot(String^ str)

{

str = str->Trim();//Удаление начальных и конечных пробелов

while (str->IndexOf(".") > 0)

str = str->Replace(".", "");

return str;

}

bool GetCount(String^ str, int& dot_cnt)

{

for (int i = 0; i < str->Length; i++)

if (str[i].ToString() == ".")

dot_cnt += 1;

if ((dot_cnt == 1 && str[0].ToString() != ".") || dot_cnt == 0)

return true;

return false;

}

Рисунок 5 – Текст файла Find.cpp с функцией пользователя

В файл find.h помещаются директивы using и записываются прототипы используемых функций. В системный заголовочный файл stdafx.h добавляется директива include для подключения созданного заголовочного файла find.h. На рисунке 6 приведен программный код созданного заголовочного файла find.h.

using namespace System;

String^ Find(String^, int);

String^ DelDot(String^);

bool GetCount(String^, int&);

Рисунок 6 – Программный код заголовочного файла find.h

Событийные процедуры проекта приведены на рисунке 7. В процедуре Form1_Load события загрузка формы на всякий случай очищаются оба текстовых поля. В процедуре cmdExit_Click события нажатие кнопки Выйти выполняется выход из приложения. Выход можно выполнить также закрытием окна с формой. Процедура txtString_TextChanged служит для очистки текстового поля с найденным словом при изменении введенной строки перед повторным поиском. Основные действия выполняются в процедуре cmdFind_Click, обрабатывающей нажатие кнопки Найти. Первым делом объявляется строка source и инициализируется значением поля формы txtString. Затем производится проверка длины строки. Если строка пуста (Source->Length==0), выводится окно с сообщением об ошибке, курсор устанавливается в поле ввода строки, и происходит выход из процедуры.

#pragma endregion

private: System::Void cmdFind_Click(System::Object^ sender, System::EventArgs^ e)

{

int det_cnt;

String^ source = txtString->Text;

if (source->Length == 0)

{

MessageBox::Show("Введите строку", "Ошибка", MessageBoxButtons::OK,

MessageBoxIcon::Error);

txtString->Focus();

return;

}

String^ res = Find(source, det_cnt);

txtFind->Text = res;

txtString->Focus();

txtString->SelectionStart = 0;

}

private: System::Void cmdExit_Click(System::Object^ sender, System::EventArgs^ e)

{

this->Close();

}

Рисунок 7 – Программный код событийных процедур

Если же введенная строка не пуста, то вызывается функция обработки Find, решающая поставленную задачу и возвращающая строку с найденным словом или пустую строку, если все слова в строке не отвечают заданному условию. Результат вызова функции Find записывается в строку res. Затем проверяется длина найденного слова. Если строка со словом не пуста (res->Length>0), то она записывается в поле формы txtWord. В противном случае выводится окно с соответствующим сообщением. Далее в обоих случаях курсор устанавливается в начальную позицию поля txtString для ввода новой строки или редактирования старой.

РЕЗУЛЬТАТЫ ВЫПОЛНЕНИЯ ПРИЛОЖЕНИЯ

Рисунок 8 – Результаты выполнения программы