Файл: Международные и отечественные стандарты языков программирования, сходство и отличия стандартов.pdf
Добавлен: 04.04.2023
Просмотров: 303
Скачиваний: 2
using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
namespace TeachingApp
{
// Теоретическая форма (чтение лекции по выбранной теме)
public partial class TheoryForm : Form
{
string path = ""; // путь к pdf-файлу
int themeNumber = 0; // номер выбранной темы
/*
* Конструктор формы - создает объект формы с находящимися на нем компонентами
*/
public TheoryForm(int n)
{
InitializeComponent();
themeNumber = n; // получение номера темы из главной формы
path = Application.StartupPath + @"\theory\" + themeNumber + ".pdf"; // ввод пути к соответствующему теме pdf-файлу
// Если файл по заданному пути существует, то
if (File.Exists(path))
{
axAcroPDF1.src = path; // загрузить файл в pdf-ридер
this.Text = "Тема " + themeNumber; // ввести в заголовок формы номер выбранной темы
}
else // иначе
MessageBox.Show("Файл " + themeNumber + ".pdf не найден!"); // вывести на экран сообщение о том, что файл не найден
// Если номер темы = 1, то кнопка перехода к предыдущей теме должна быть неактивной
if (themeNumber == 1)
leftButton.Enabled = false;
// Если номер темы = 6, то кнопка перехода к следующей теме должна быть неактивной
if (themeNumber == 6)
rightButton.Enabled = false;
}
/*
* Обработчик закрытия формы - выполняет выход из приложения
*/
private void TheoryForm_FormClosing(object sender, FormClosingEventArgs e)
{
Application.Exit();
}
/*
* Обработчик кнопки "Вернуться к выбору темы"
*/
private void menuButton_Click(object sender, EventArgs e)
{
MainForm mf = new MainForm(); // создаем новую форму для выбора темы
mf.Show(); // показываем ее
this.Hide(); // скрываем текущую форму
}
/*
* Обработчик кнопки "Пройти итоговый тест"
*/
private void testButton_Click(object sender, EventArgs e)
{
TestForm test = new TestForm(); // создаем новую форму для прохождения теста
test.Show(); // показываем ее
this.Hide(); // скрываем текущую форму
}
/*
* Обработчик кнопки "Дополнительные материалы" - открывает папку books при помощи системного процесса
*/
private void addStuffButton_Click(object sender, EventArgs e)
{
Process.Start(Application.StartupPath + @"\books");
}
/*
* Обработчик кнопок перехода к соседней теме
*/
private void changeThemeButton(object sender, EventArgs e)
{
// Если номер темы >= 1, то кнопка перехода к предыдущей теме должна быть неактивной
if (themeNumber >= 1)
leftButton.Enabled = true;
// Если номер темы <= 6, то кнопка перехода к следующей теме должна быть неактивной
if (themeNumber <= 6)
rightButton.Enabled = true;
// Находим направление сдвига по тегу соответствующей кнопки
int shiftSign = int.Parse((sender as Button).Tag.ToString());
// Если направление - влево и номер темы = 1, то выполнить выход из обработчика
if (shiftSign == -1 && themeNumber == 1)
return;
// Если направление - вправо и номер темы = 6, то выполнить выход из обработчика
if (shiftSign == 1 && themeNumber == 6)
return;
themeNumber += shiftSign; // выполнить соответствующий сдвиг для перехода к соседней теме путем изменения номера темы
path = Application.StartupPath + @"\theory\" + themeNumber + ".pdf"; // ввод пути к соответствующему теме pdf-файлу
// Если файл по заданному пути существует, то
if (File.Exists(path))
{
axAcroPDF1.src = path; // загрузить файл в pdf-ридер
this.Text = "Тема " + themeNumber; // ввести в заголовок формы номер выбранной темы
}
else // иначе
MessageBox.Show("Файл " + themeNumber + ".pdf не найден!"); // вывести на экран сообщение о том, что файл не найден
}
}
}
Приложение 3. Исходный код модуля 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", // путь к файлу с номерами правильных ответов
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()
{
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(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());
}
}
}
Приложение 4. Исходный код модуля ResultsForm.cs
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
namespace TeachingApp
{
// Форма для просмотра результатов тестирования
public partial class ResultsForm : Form
{
string text = ""; // печатаемый текст
/*
* Конструктор формы - создает объект формы с находящимися на нем компонентами
*/
public ResultsForm(List<string[]> test, List<string> checkedAnswers)
{
InitializeComponent();
// Цикл по количеству вопросов в тесте
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]); // нахождение номера правильного ответа