Файл: Алгоритмизация как основной этап разработки программ.pdf
Добавлен: 04.04.2023
Просмотров: 313
Скачиваний: 2
СОДЕРЖАНИЕ
Роль этапа алгоритмизации в процессе разработки программ
Понятие алгоритма и его свойства
Формализация и проектирование алгоритма
Разработка программы для решения поставленной задачи
Постановка задачи и анализ предметной области
Выбор языка программирования и среды разработки
Этапы формализации и алгоритмизации
- Главный модуль программы (MainForm – титульная форма с заставкой);
- Тестовый модуль (TestForm – форма для прохождения итогового теста);
- Модуль результатов (ResultsForm – форма для просмотра результатов тестирования).
Структурная схема разрабатываемого приложения приведена на рис. 1.
Рис. 1 – Структурная схема обучающей программы
Теоретический учебный материал хранится в виде файлов на жестком диске, каждый из которых может быть открыт пользователем вручную. Директория с дополнительными материалами открывается по запросу пользователя при помощи программного вызова метода системного процесса. После ввода данных для сохранения результатов теста и фамилии, имени и отчества того, кто проходит тест, может быть выполнен переход к тестовому модулю программы.
Важнейшим алгоритмом тестового модуля является обработка подтверждения выбранного варианта ответа для текущего вопроса. В этом случае осуществляется переход к следующему вопросу теста; данные формы, в том числе заголовок, обновляются, а текст ответа добавляется в список выбранных ответов, который используется для просмотра результатов. При совпадении выбранного варианта с правильным счетчик верных ответов увеличивается. По окончании теста все вопросы можно распечатать. Блок-схема этого этапа приведена на рис.2.
Создание объекта формы для прохождения тестирования подразумевает получение данных из файла и добавление их на форму в процессе выполнения теста (рис. 3).
Печать вопросов теста выполняется встроенными средствами языка C# построчно (рис. 4).
Проектирование программы
Дополнительный учебный материал, используемый в приложении, представлен каталогом электронных книг по основам изучаемой темы. Книги в формате pdf расположены в директории по пути \bin\Debug\books. Как показано в листинге 1, обработчик кнопки для открытия каталога запускает ресурс системного процесса и связывает его с новым компонентом Process.
Листинг 1. Обработка кнопки «Дополнительные материалы»
private void addStuffButton_Click(object sender, EventArgs e)
{
Process.Start(Application.StartupPath + @"\books");
}
Рис. 1 – Фрагмент блок-схемы, описывающий обработку подтверждения ответа в тесте
Рис. 2 – Фрагмент блок-схемы, описывающий создание объекта формы для теста
Рис. 3 – Фрагмент блок-схемы, описывающий обработку печати
Структура приложения позволяет перейти к тестовому модулю из любого другого модуля программы. Вопросы и ответы для итогового теста загружаются из текстовых файлов «questions.txt» и «answers.txt», расположенных в директории по пути \bin\Debug. В листинге 2 приводятся все глобальные переменные этого модуля, необходимые для организации тестирования.
Листинг 2. Глобальные переменные класса TestForm
// путь к файлу с вопросами для теста:
string path = Application.StartupPath + @"/questions.txt",
// путь к файлу с номерами правильных ответов:
path2 = Application.StartupPath + @"/answers.txt",
path3 = "", // путь к файлу с результатами теста
name = "", // ФИО того, кто проходит тест
text = ""; // текст, считываемый из файла
// список строковых массивов, каждый из которых
// содержит вопрос, варианты ответа и правильный ответ:
List<string[]> test = new List<string[]>();
// список строк - выбранных ответов:
List<string> checkedAnswers = new List<string>();
int j = 0, // номер текущего вопроса
checkedAnswer = 1, // номер выбранного ответа
score = 0; // количество правильных ответов
Конструктор формы тестового модуля создает объект формы с компонентами, получает данные для теста из файла и загружает их на форму (см. рис. 3). Для этих целей предназначены функции FillTestInformation (листинг 3) и FillTestForm (листинг 4).
Листинг 3. Заполнение тестовой информации
private void FillTestInformation()
{
// считывание текста вопросов из файла:
text = File.ReadAllText(path);
// разбиение текста в массив строк, исключая пустые строки:
string[] ls = text.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
// считывание правильных ответов и разбиение в массив строк:
string[] rightAnswers = File.ReadAllText(path2).Split(new char[] { '[', ']', ',' }, StringSplitOptions.RemoveEmptyEntries);
// номер ячейки в массиве rightAnswers,
// содержащей правильный ответ на соответствующий вопрос:
int k = 1;
// Цикл по количеству считанных строк.
// Каждая пятая строка соответствует новому вопросу.
for (int i = 0; i < ls.Length; i += 5)
{
// получение строки вопроса:
string q = ls[i].Split(')')[1];
// получение строки с первым вариантом ответа:
string var1 = ls[i + 1].Split(')')[1];
// получение строки cо вторым вариантом ответа:
string var2 = ls[i + 2].Split(')')[1];
// получение строки с третьим вариантом ответа:
string var3 = ls[i + 3].Split(')')[1];
// получение строки с четвертым вариантом ответа:
string var4 = ls[i + 4].Split(')')[1];
// добавление массива строк в список:
test.Add(new string[6] { q, var1, var2, var3, var4, rightAnswers[k] });
k++; // переход к следующему правильному ответу
}
}
Листинг 4. Заполнение компонентов теста на форме
private void FillTestForm()
{
questionTextBox.Text = test.ElementAt(j)[0];
radioButton1.Text = test.ElementAt(j)[1];
radioButton2.Text = test.ElementAt(j)[2];
radioButton3.Text = test.ElementAt(j)[3];
radioButton4.Text = test.ElementAt(j)[4];
}
Обработка подтверждения ответа в тесте в соответствии с изображенным на рис. 2 фрагментом блок-схемы представлена в листинге 5.
Листинг 5. Обработка кнопки «Подтвердить»
private void acceptButton_Click_1(object sender, EventArgs e)
{
// получение правильного ответа для текущего вопроса:
int rightAnswer = int.Parse(test.ElementAt(j)[5]);
// добавление текста выбранного ответа в список:
checkedAnswers.Add(test.ElementAt(j)[checkedAnswer]);
// Если правильный ответ = выбранному, то
if (rightAnswer == checkedAnswer)
score++; // увеличить количество правильных ответов
// Если текущий вопрос не последний, то
if (j < test.Count - 1)
{
j++; // перейти к следующему вопросу
// и поменять заголовок формы
this.Text = "Вопрос " + (j + 1);
FillTestForm(); // ввести данные на форму
}
else // иначе
{
// строка с результатом:
string result = "Результат: " + score.ToString() + " правильных ответов из " + test.Count.ToString();
// процент правильных ответов:
double percentage = (double) score / test.Count * 100;
// если процент правильных ответов не превышает 40, // то оценка за тест = 2. Кнопка вывода результатов // по-прежнему неактивна.
if (percentage <= 40)
MessageBox.Show(result + "\n Ваша оценка: 2 (неудовлетворительно)");
else // иначе
// вывести оценку в зависимости от набранных баллов
// и сделать активной кнопку вывода результатов
{
if (percentage > 85)
MessageBox.Show(result + "\n Ваша оценка: 5 (отлично)");
if (percentage > 60 && percentage <= 85)
MessageBox.Show(result + "\n Ваша оценка: 4 (хорошо)");
if (percentage > 40 && percentage <= 60)
MessageBox.Show(result + "\n Ваша оценка: 3 (удовлетворительно)");
resultsButton.Enabled = true;
}
// сделать активной кнопку печати теста:
printTest.Enabled = true;
}
}
После прохождения теста его вопросы можно распечатать. В случае успешной сдачи теста (при получении любой оценки, кроме неудовлетворительной) также могут быть распечатаны результаты. Обработка печати приводится листинге 6.
Листинг 6. Обработка создания документа для печати теста или его результатов
private void printDocument2_PrintPage(object sender, PrintPageEventArgs e)
{
int charactersOnPage = 0; // число символов на странице
int linesPerPage = 0; // число строк на странице
//Установить значение числа символов charactersOnPage и //числа строк linesPerPage, которое будет соответствовать //границам страницы:
e.Graphics.MeasureString(text,this.Font, e.MarginBounds.Size, StringFormat.GenericTypographic, out charactersOnPage, out linesPerPage);
// Нарисовать строку в пределах границы страницы:
e.Graphics.DrawString(text,this.Font,Brushes.Black, e.MarginBounds, StringFormat.GenericTypographic);
// Удалить часть строки, которая была напечатана:
text = text.Substring(charactersOnPage);
// Проверить, нужно ли еще печатать страницы:
e.HasMorePages = (text.Length > 0);
}
Полный исходный код программы с подробными комментариями приведен в приложении А.
Схема классов программы представлена на рис. 5.
Диаграмма прецедентов программы представлена на рис. 6.
Рис. 4 – Состав классов программы
Рис. 5 – Диаграмма прецедентов
Описание программы
Обучающая программа содержит три формы. На главной (титульной) форме приложения расположены кнопки для перехода к дополнительным материалам курса и итоговому тесту, а также заставка в виде gif-анимации. Здесь необходимо ввести фамилию, имя и отчество (ФИО) того, кто проходит тест, а также путь к файлу для записи результатов теста (при успешном прохождении). Вид формы приводится на рис. 7.
Вопросы и ответы итогового теста загружаются на тестовую форму из текстовых файлов «questions.txt» и «answers.txt», расположенных в директории по пути \bin\Debug. Вопросы теста имеют одиночный тип выбора ответов – варианты представлены радиокнопками, а непосредственный выбор осуществляется по нажатию на кнопку «Подтвердить». Кроме того, теоретическая форма содержит кнопку возврата к главной форме программы, а также кнопки для печати вопросов и просмотра результатов, которые неактивны во время прохождения теста. Вид формы после ответа на последний тестовый вопрос приведен на рис. 8.
Рис. 6 – Вид главной формы приложения
По окончании прохождения теста его вопросы можно распечатать и выполнить сохранение результатов в текстовый файл с именем, заданным на главной форме программы. В случае оценки 3 и выше доступен переход к форме с результатами (рис. 9). После нажатия на кнопку просмотра ответов результаты будут записаны в заданный в начале программы текстовый файл (рис. 10).
Рис. 7 – Вид тестовой формы после ответа на последний вопрос теста
Рис. 8 – Вид тестовой формы после успешного прохождения теста
Рис. 9 – Вид тестовой формы после нажатия на кнопку просмотра ответов
Форма для просмотра результатов теста содержит кнопки возврата к главной форме приложения и к тестовой форме, а также кнопку для печати результатов тестирования. Вид формы приведен на рис. 11.
Рис. 10 – Вид формы для просмотра результатов тестирования
ЗАКЛЮЧЕНИЕ
В ходе выполнения работы были подробно рассмотрены основные этапы разработки программ, получено представление о понятиях алгоритма, программы и данных.
В рамках данной курсовой работы также были выполнены все этапы разработки программы: подробно проанализирована рассмотренная предметная область, спроектирован пользовательский интерфейс обучающего приложения с интуитивно-понятным для пользователя управлением, а также описаны его основные алгоритмы. Результатом выполнения работы является созданный на языке высокого уровня C# с помощью интерфейса программирования приложений Windows.Forms программный продукт для обучения графической библиотеке языка C#, который является полностью функциональным (все необходимые функции в нем реализованы). Несмотря на это, допускается его дальнейшая модернизация как в плане пользовательского интерфейса, так и с точки зрения функциональных и алгоритмических возможностей в следующей версии приложения. В качестве одного из возможных усовершенствований может выступать модуль регистрации пользователей с хранением допустимых в системе тестирования логинов и паролей, принцип работы которого основан на записи и чтении из файла основной информации о пользователях программы.
Таким образом, все цели и задачи курсовой работы выполнены в полном объеме.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
- Аршинов М. Н. Коды и математика / М.: Наука, 1983. – 257 с.
- Буркатовская Ю. Б. Быстродействующие алгоритмы деления полиномов в арифметике по модулю два / Ю. Б. Буркатовская, А. Н. Мальчуков, А. Н. Осокин // Изв. Томск. политехн. ун-та. – 2006. – № 1 (309). – с. 19–24.
- Демидович, Е.М. Основы алгоритмизации и программирования. Учебное пособие / Е. М. Демидович. - 2-е изд., испр. и доп. - СПб. : БХВ - Петербург, 2008. - 440 с.
- Документация по семейству продуктов Visual Studio [Электронный ресурс]. – Режим доступа: https://docs.microsoft.com/ru-ru/visualstudio/?view=vs-2019 – (Дата обращения – 15.06.2020).
- Коробейников А. Г, Ю.А.Гатчин. Математические основы криптологии. Учебное пособие / СПб: СПб ГУ ИТМО, 2004. – 106 с.
- Коутинхо С. Введение в теорию чисел. Алгоритм RSA / М.: Постчаркет, 2001. – 328 с.
- Мыцко Е. А. Особенности программной реализации вычисления контрольной суммы CRC32 на примере PKZIP, WINZIP, ETHERNET / Е. А. Мыцко, А. Н. Мальчуков // Вестн. науки Сибири. – 2011. – № 1 (1). – с. 279–282.
- Олифер В. Г. Компьютерные сети. Принципы, технологии, протоколы / В. Г. Олифер, Н. А. Олифер. ‒ СПб.: Питер, 2008. ‒ 958 с.
- Темников Ф. Е. Теоретические основы информационной техники: учеб. пособие. – 2-е изд., испр. и доп. / Ф. Е. Темников, В. А. Афонин, В. И. Дмитриев. – М.: Энергия, 1979. – 512 с.
- Яковлев В. В. Оценка влияния помех на производительность протоколов канального уровня / В. В. Яковлев, Ф. И. Кушназаров // Изв. Петерб. гос. ун-та путей сообщения. – СПб.: ПГУПС, 2015. – Вып. 1 (42). – с. 133–138.
- Arthur-Durett K. The Weakness Of Winrar Encrypted Archives To Compression Side-channel Attack, Open Access Theses, Purdue University, 2014
- C# docs [Электронный ресурс]. – Режим доступа: https://docs.microsoft.com/ru-ru/dotnet/csharp/ – (Дата обращения – 16.06.2020).
- Systems Engineering and Software Development Life Cycle Framework [Электронный ресурс]. – Режим доступа: http://opensdlc.org/mediawiki/index.php?title=Main_Page – (Дата обращения – 15.06.2020).