Файл: Алгоритмизация как основной этап разработки программ.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 04.04.2023

Просмотров: 315

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

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

Листинг А1. Исходный код модуля MainForm.cs

using System;

using System.Diagnostics;

using System.Windows.Forms;

namespace TeachingApp

{

// Главная форма (меню выбора)

public partial class MainForm : Form

{

/*

* Конструктор формы - создает объект формы с находящимися на нем компонентами

*/

public MainForm()

{

InitializeComponent();

}

/*

* Обработчик закрытия формы - выполняет выход из приложения

*/

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)

{

Application.Exit();

}

/*

* Обработчик кнопки "Дополнительные материалы" - открывает папку books при помощи системного процесса

*/

private void addStuffButton_Click(object sender, EventArgs e)

{

Process.Start(Application.StartupPath + @"\books");

}

/*

* Обработчик кнопки "Итоговый тест"

*/

private void testButton_Click(object sender, EventArgs e)

{

// получаем ФИО и путь к файлу для записи результатов из формы:

string name = nameTextBox.Text;

string path = resultPathTextBox.Text;

// проверяем, что данные введены:

if (string.IsNullOrEmpty(name))

{

MessageBox.Show("ФИО не заданы!", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Error);

return;

}

if (string.IsNullOrEmpty(path))

{

MessageBox.Show("Имя выходного файла не задано!", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Error);

return;

}

TestForm test = new TestForm(name, path); // создаем новую форму для прохождения теста

test.Show(); // показываем ее

this.Dispose(false); // уничтожаем текущую форму

}

}

}

Листинг А2. Исходный код модуля TestForm.cs

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Drawing.Printing;

using System.IO;

using System.Linq;

using System.Windows.Forms;

namespace TeachingApp

{

// Форма для прохождения тестирования

public partial class TestForm : Form

{

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; // количество правильных ответов

/*

* Функция заполнения тестовой информации

*/

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); // считывание правильных ответов и разбиение в массив строк

int k = 1; // номер ячейки в массиве rightAnswers, содержащей правильный ответ на соответствующий вопрос (индексируется с единицы, т.к. rightAnswers[0] содержит строку текста, предшествующую числовым значениям

// Цикл по количеству считанных строк. Каждая пятая строка соответствует новому вопросу.

for (int i = 0; i < ls.Length; i += 5)

{

string q = ls[i].Split(')')[1]; // получение строки вопроса

string var1 = ls[i + 1].Split(')')[1]; // получение строки с первым вариантом ответа

string var2 = ls[i + 2].Split(')')[1]; // получение строки cо вторым вариантом ответа

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++; // переход к следующему правильному ответу

}

}

/*

* Функция заполнения компонентов теста на форме

*/

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];

}

/*

* Конструктор формы - создает объект формы с находящимися на нем компонентами

*/

public TestForm(string nm, string pth)

{

this.name = nm;

this.path3 = pth;

InitializeComponent();

FillTestInformation(); // получаем данные теста из файла

FillTestForm(); // вводим данные на форму

this.Text = "Вопрос 1"; // меняем заголовок формы

}

/*

* Обработчик закрытия формы - выполняет выход из приложения

*/

private void TestForm_FormClosing(object sender, FormClosingEventArgs e)

{

Application.Exit();

}

/*

* Обработчик кнопки "Вернуться к стартовой форме"

*/

private void backToMenuButton_Click(object sender, EventArgs e)

{

MainForm mf = new MainForm(); // создаем новую форму для ввода ФИО

mf.Show(); // показываем ее

this.Dispose(false); // уничтожаем текщую форму

}

/*

* Обработчик кнопки "Посмотреть ответы"

*/

private void resultsButton_Click(object sender, EventArgs e)

{

ResultsForm rf = new ResultsForm(name, path3, test, checkedAnswers); // создаем объект формы результатов теста

rf.Show(); // показываем ее

this.Dispose(false); // уничтожаем текущую форму

}

/*

* Обработчик создания документа для печати теста

*/

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);

}

/*

* Обработчик печати теста

*/

private void printTest_Click(object sender, EventArgs e)

{

printDocument2.Print();

}

/*

* Обработчик кнопки "Подтвердить"

*/

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; // процент правильных ответов

if (percentage <= 40) // если процент правильных ответов не превышает 40, то оценка за тест = 2. Кнопка вывода результатов по-прежнему неактивна.

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; // делаем активной кнопку печати теста

}

}

/*

* Обработчик события изменения выбранного варианта ответа

*/

private void radioButtons_CheckedChanged(object sender, EventArgs e)

{

// Получение выбранного номера ответа по тегу соответствующей радиокнопки

checkedAnswer = int.Parse((sender as RadioButton).Tag.ToString());

}

}

}

Листинг А3. Исходный код модуля ResultsForm.cs

using System;

using System.Collections.Generic;

using System.Drawing;

using System.IO;

using System.Linq;

using System.Windows.Forms;

namespace TeachingApp

{

// Форма для просмотра результатов тестирования

public partial class ResultsForm : Form

{

string text = "", // печатаемый текст

path = "", // путь к файлу с результатами теста


name = ""; // ФИО того, кто проходит тест

/*

* Конструктор формы - создает объект формы с находящимися на нем компонентами

*/

public ResultsForm(string nm, string pth, List<string[]> test, List<string> checkedAnswers)

{

this.name = nm;

this.path = pth;

InitializeComponent();

resultsTextBox.Text += "ФИО: " + name; // добавление строки с ФИО того, кто проходил тест

resultsTextBox.Text += Environment.NewLine; // переход на новую строку

// Цикл по количеству вопросов в тесте

for (int i = 0; i < test.Count; i++)

{

resultsTextBox.Text += "Вопрос " + (i + 1) + ": " + test.ElementAt(i)[0]; // добавление строки вопроса

resultsTextBox.Text += Environment.NewLine; // переход на новую строку

resultsTextBox.Text += "Варианты ответов: ";

resultsTextBox.Text += Environment.NewLine;

resultsTextBox.Text += "а) " + test.ElementAt(i)[1]; // добавление первого варианта ответа

resultsTextBox.Text += Environment.NewLine;

resultsTextBox.Text += "б) " + test.ElementAt(i)[2]; // добавление второго варианта ответа

resultsTextBox.Text += Environment.NewLine;

resultsTextBox.Text += "в) " + test.ElementAt(i)[3]; // добавление третьего варианта ответа

resultsTextBox.Text += Environment.NewLine;

resultsTextBox.Text += "г) " + test.ElementAt(i)[4]; // добавление четвертого варианта ответа

resultsTextBox.Text += Environment.NewLine;

resultsTextBox.Text += "Ваш ответ: " + checkedAnswers.ElementAt(i); // добавление текста выбранного ответа

resultsTextBox.Text += Environment.NewLine;

int number = int.Parse(test.ElementAt(i)[5]); // нахождение номера правильного ответа

resultsTextBox.Text += "Правильный ответ: " + test.ElementAt(i)[number]; // добавление текста правильного ответа

resultsTextBox.Text += Environment.NewLine;

resultsTextBox.Text += Environment.NewLine; // доп. пустая строка между вопросами

}

text = resultsTextBox.Text;

StreamWriter sw = new StreamWriter(path);

sw.Write(text);

sw.Close();

MessageBox.Show("Результаты записаны в файл " + path + "!", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

/*

* Обработчик закрытия формы - выполняет выход из приложения

*/

private void ResultsForm_FormClosing(object sender, FormClosingEventArgs e)

{

Application.Exit();

}

/*

* Обработчик кнопки "Вернуться к стартовой форме"

*/

private void backToMenuButton_Click(object sender, EventArgs e)

{

MainForm mf = new MainForm(); // создаем новую форму для ввода ФИО

mf.Show(); // показываем ее

this.Dispose(false); // уничтожаем текущую форму

}

/*

* Обработчик кнопки "Вернуться к прохождению теста"

*/

private void textButton_Click(object sender, EventArgs e)

{

TestForm test = new TestForm(name, path); // создаем новую форму для прохождения теста

test.Show(); // показываем ее

this.Dispose(false); // уничтожаем текущую форму

}

/*

* Обработчик создания документа для печати теста

*/

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)

{

int charactersOnPage = 0; // число символов на странице

int linesPerPage = 0; // число строк на странице

// Устанавливаем значение числа символов charactersOnPage и числа строк linesPerPage, которое будет соответствовать границам страницы.