Файл: Международные и отечественные стандарты языков программирования, сходство и отличия стандартов.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]); // нахождение номера правильного ответа