Пензенский государственный университет Кафедра "Информационно-вычислительные системы" РАБОТА С ФАЙЛАМИ Отчет о лабораторной работе №3 по дисциплине «Программирование» Выполнил: ст-т гр. 19ВО1 Иванов А.A. Проверил: К.т.н, доцент каф ИВС Убиенных Г.Ф. 2020 2 1 Формулировка задачи Дан текстовой файл, содержащий произвольный текст. Разработать программу, которая читает этот файл и выводит в алфавитном порядке все слова, имеющие заданную длину n. 2 Техническое задание 2.1 Введение Программа «Слова в алфавитном порядке» применяется для чтения заданного файла и вывода в алфавитном порядке всех слов, имеющие заданную длину n. 2.2 Основания для разработки Разработка программы «Слова в алфавитном порядке» ведётся на основании документа «Варианты заданий к лабораторным работам по дисциплине “Программирование”». Темой разработки является работа с файлами в языке программирования C++. 2.3 Требования к программе Программа должна: -предоставлять пользователю возможность выбрать нужный файл в формате txt; -читать файл, содержащий текст на русском или английском языке; -выдавать сообщение, если файл пустой; -выводить на экран текст файла; 3 -предоставлять пользователю возможность вводить целую длину слов n; -выдавать сообщение «Недопустимый символ!», если в поле ввода длины слов n введено не целое число; -определять в тексте слова, имеющие заданную длину n; -выводить слова, имеющие заданную длину n в алфавитном порядке. 2.4 Стадии и этапы разработки Разработка технического задания. Для решения поставленной задачи необходимо первоначально разработать алгоритм решения программы. Алгоритм должен выполнять все требования к программе и быть оформлен в виде блоксхемы. Разработка программы. По разработанному алгоритму требуется написать программу на языке C++. Написанную программу тестируют на работоспособность. По результатам проверки делается вывод о работоспособности программы. На работоспособную программу создаётся документация. 2.5 Порядок контроля и приёмки Для контроля правильности работы программы мы должны запустить программу и выбрать нужный нам текстовый файл. После этого мы должны открыть данный текстовый файл, выбрать длину n и с помощью ручного подсчета выявить слова, имеющие заданную длину n и записать их в алфавитном порядке. Если слова, записанные в алфавитном порядке имеющие заданную длину n определенные с помощью ручного подсчета совпадут с результатом работы программы, то это будет означать, что программа работает правильно. Для проверки 4 работоспособности защиты от некорректного ввода, предусмотренной в программе, необходимо выбрать неподходящий файл (пустой файл). Программа верно обрабатывает входные данные из правильных адресов файлов, защита от ошибок, предусмотренная в программе, работает исправно. 3 Описание программы 3.1 Общие сведения Программа разработана в среде Microsoft Visual Studio 2015, её текст приведен в приложении А. 3.2 Функциональное назначение Программа предназначена для чтения заданного файла и вывода в алфавитном порядке всех слов, имеющие заданную длину n. Для решения поставленной задачи необходимо разработать следующие классы: fileReader. 5 Диаграмма классов представлена на рисунке 1. fileReader + double textFromFile + double result + double n +double readFile() +double work() Рисунок 1 – Диаграмма классов Для выполнения поставленной задачи разработаны классы fileReader Класс fileReader имеет следующие атрибуты: textFromFile – текст из файла result – результат работы программы n – длина слова Класс fileReader имеет следующие методы: Метод чтения текста из файла void readFile(). Метод нахождения всех слов, имеющие заданную длину n void work(). 6 Блок-схема метода «readFile» (страница 5): 1)Начало работы кнопки (блок 1). 2)Выбор файла (блок 2). 3)Запись текста из выбранного файла в поле на textFromFile (блок 3). 1 Начало 2 Выбор файла 3 Запись текста из выбранного файла в Поле textFromFile 4 Конец Рисунок 1 — Схема метода «readFile» Блок-схема метода void work() (Страница 7): 1)Начало работы кнопки (блок 1). 2)В строку s записывается текст из файла, строка delimStr принимает значение знаков препинания, переменная k равняется 0 (блок 2). 3)Массив words= массив слов из текста (блок 3). 4)Ввод длины слов n (блок 4). 5)Строка m принимает значение английского и русского алфавита (блок 5). 6)Начало работы цикла А с установленным числом повторений и условием 0 < g < последний символ m (блок 6). 7 7)Начало работы вложенного цикла Б с установленным числом повторений и условием 0 < i < последнее слово words (блок 7). 8)Проверка условия длина слова words=n и m[g] == words[i][0]) (блок 8). 9)Если условие выполняется, то переменной result добавляется слово words и переменная k увеличивает свое значение на 1 (блок 9). 10)Завершение работы вложенного цикла Б по i (блок 10). 11)Завершение работы цикла A по g (блок 11). 12)Проверка условия k=0 (блок 12). 13)Если условие выполняется, то переменной result присваивается значение «Таких слов нет!» (блок 13). 8 1 Начало 2 A 8 s=текст из файла delimStr=строка знаков препинания k=0 Длина слова words=n Нет и m[g] == words[i][0]) Да 9 3 words=массив слов из текста 4 k=k+1 Result += words 10 Цикл Б i Ввод длины слов n 5 11 m=английский и русский алфавит Цикл A g 6 Цикл A 0<g<последний символ m 7 12 k=0 13 Цикл Б 0<i<последнее слово words Да Result = «Таких слов нет» 14 A Конец Рисунок 1 — Схема метода void work() Нет 9 4 Описание программы 4.1 Входные и выходные данные После запуска программы пользователь должен нажать кнопку «Выбрать файл». После нажатия на кнопку у пользователю предложат выбрать нужный ему текстовый файл (рисунок Б.1). Если во время ввода пользователь допустит ошибку (неверное имя файла), то программа выведет на монитор сообщение об ошибке открытия и существования файла (рисунок Б.2). Затем пользователю нужно ввести длину слов n. После того как файл выбран и длина слов n введена, программа выводит на монитор содержимое файла (текст), а затем слова в алфавитном порядке имеющие заданную длину слов n (рисунок Б.3). Примеры работы программы находятся в Приложении Б. 4.2 Описание интерфейса программы Текст программы представлен в приложении А. Программа состоит из единственного модуля Form1. На форме модуля Form1 расположены следующие объекты: Один однострочный редактор textBox1(для ввода длины слова n) Три кнопки Button1(Выбор файла), Button2(вывод в алфавитном порядке слов длинной n), Button3(выход) . Два многосточных редакторов richTextBox1(для вывода текста из файла), richTextBox2(для выхода из программы), Метка label1, для вывода пояснений пользователю. 10 5 Программа и методики испытаний 5.1 Объект испытаний Программа «Слова в алфавитном порядке» предназначена для: -предоставления пользователю возможности выбора нужного файла в формате txt; -прочтения файла, содержащего текст на русском или английском языке; -вывода сообщения, если файл пустой; -вывода на экран текста файла; -предоставления пользователю возможности ввода целой длины слов n; -вывода сообщения «Недопустимый символ!», если в поле ввода длины слов n введено не целое число; -определения в тексте слов, имеющие заданную длину n; -вывода слов, имеющих заданную длину n в алфавитном порядке. 5.2 Цель испытаний Испытания проводятся с целью выявления ошибок и недочётов в работе программы. 5.3 Средства и порядок испытаний Испытания проводятся внутри среды ОС Microsoft Windows 7. Никаких дополнительных программных и технических средств, не применяется. Испытания проводятся в следующем порядке: Запуск программы с корректными входными данными (проверка работы основной части программы). 11 Запуск программы с некорректными входными данными (проверка работы защитной части программы). 5.4 Методы испытаний Результаты испытаний программы находятся в Приложении Б. Запуск программы с некорректными входными данными. Запуск программы с корректными входными данными. 5.5 Контрольный тест Для проведения контрольного теста мы запустим программу на выполнение и введем корректные данные. На рисунке Б.3 показан результат работы программы. Текст: кошка имеет четыре лапы и хвост. Заданная длина слов n = 5. Слова в алфавитном порядке и заданной длиной слов 5: имеет, кошка, хвост. Значения приведенные выше нужно сравнить с результатами работы программы приведенными на рисунке Б.3 если они совпадут, это будет означать что программа работает верно. Если сравнить тестовые наборы приведенные выше с приведенными результатами работы программы, несложно заметить, что они совпадают, а это означает, что программа работает верно. 12 Выводы В ходе выполнения лабораторной работы было сформулировано техническое задание, разработан алгоритм программы использующий работу с файлами и обработку текста для решения поставленной задачи и описывающая его блок-схема. В соответствии алгоритму, на языке программирования C++ была написана программа, решающая поставленную задачу . Были проведены испытания программы, которые позволили проверить правильность работы программы в соответствии со всеми требованиями Технического Задания. Оформлена документация, содержащая в себе описание требований к программе, методы тестирования программы, алгоритм решения задачи и его блок-схема, описание и результаты тестирования программы, описание работы с программой, текст программы, выводы по проведённой работе, приложения к документации. Требования Технического Задания выполнены в полном объёме. 13 ТЕКСТ ПРОГРАММЫ Приложение А (обязательное) 14 #pragma endregion private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) //кнопка "Выбрать файл" { OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog(); openFileDialog1->ShowDialog(); if (openFileDialog1->FileName == nullptr) return; try { auto MyReader = gcnew IO::StreamReader(openFileDialog1->FileName, System::Text::Encoding::GetEncoding(1251)); richTextBox1->Text= MyReader->ReadToEnd(); MyReader->Close(); } catch (IO::FileNotFoundException^ Ситуация) { MessageBox::Show(Ситуация->Message + "\nФайл не найден", "Ошибка", MessageBoxButtons::OK, MessageBoxIcon::Exclamation); } catch (Exception^ Ситуация) { MessageBox::Show(Ситуация->Message, "Ошибка", MessageBoxButtons::OK, MessageBoxIcon::Exclamation); } if (richTextBox1->Text=="") MessageBox::Show( "Ошибка, пустой файл"); } private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) //кнопка "Вывести в алфавитном порядке слова длиной n" { String^ s = richTextBox1->Text; String^ delimStr = " ,.;!?:\r\n\t"; int k=0; array<Char>^ delimiter = delimStr->ToCharArray( ); array<String^>^ words = s->Split(delimiter); if (textBox3->Text=="") MessageBox::Show( "Введите длину слова!"); else { int n =Int32::Parse(textBox3->Text); richTextBox2->Text =richTextBox2->Text + "Слова с длинной "+n+":\r\n"; String^ m = "ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯabcdef ghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя"; for (int g = 0;g<m->Length;g++) for(int i = 0;i<words->Length;i++) 15 if ((words[i]->Length == n) && (m[g] == words[i][0])) { richTextBox2->Text = richTextBox2- >Text + words[i] +"\r\n"; k++; } if (k==0) richTextBox2->Text =richTextBox2>Text + "Слов с длинной "+n+" нет!\r\n"; } } private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) //кнопка "Выход" { Close(); } private: System::Void textBox3_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) //защита от неправильного ввода { if ((e->KeyChar != (char)8 ) && (e->KeyChar < (char)48 || e->KeyChar > (char)57)) { e->Handled = true; MessageBox::Show("Недопустимый символ!"); } } #pragma once using namespace System::IO; using namespace System::Text; class fileReader { public: String textFromFile; String result; int n; void readFile() { OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog(); openFileDialog1->ShowDialog(); if (openFileDialog1->FileName == nullptr) return; try { auto MyReader = gcnew IO::StreamReader(openFileDialog1>FileName, System::Text::Encoding::GetEncoding(1251)); textFromFile= MyReader->ReadToEnd(); MyReader->Close(); } catch (IO::FileNotFoundException^ Ситуация) { MessageBox::Show(Ситуация->Message + "\nФайл не найден", "Ошибка", MessageBoxButtons::OK, MessageBoxIcon::Exclamation); } catch (Exception^ Ситуация) { MessageBox::Show(Ситуация->Message, "Ошибка", MessageBoxButtons::OK, MessageBoxIcon::Exclamation); } 16 if (textFromFile=="") MessageBox::Show( "Ошибка, пустой файл"); } void work() { String^ s = textFromFile; String^ delimStr = " ,.;!?:\r\n\t"; int k=0; array<Char>^ delimiter = delimStr->ToCharArray( ); array<String^>^ words = s->Split(delimiter); if (n==0) MessageBox::Show( "Введите длину слова!"); else { result =result + "Слова с длинной "+n+":\r\n"; String^ m = "ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯabcdefghijklmnopqrstuvwxyzабвгд еёжзийклмнопрстуфхцчшщъыьэюя"; for (int g = 0;g<m->Length;g++) for(int i = 0;i<words->Length;i++) if ((words[i]->Length == n) && (m[g] == words[i][0])) { result = richTextBox2->Text + words[i] +"\r\n"; k++; } if (k==0) result =result + "Слов с длинной "+n+" нет!\r\n"; } } }; 17 РЕЗУЛЬТАТЫ ИСПЫТАНИЙ Приложение Б (обязательное) 18 Рисунок Б.1 Рисунок Б.2 19 Рисунок Б.3