Создание тестовой информационной системы для проверки знаний по предмету ООП

Пошаговая методика разработки тестовой информационной системы (ИС) для проверки знаний по предмету ООП. Создание приложения для просмотра изображений, uml-диаграммы "Прецедентов" и uml-диаграммы "Классов", кода программы на языке программирования C#.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 21.12.2013
Размер файла 645,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

24

Размещено на http://www.allbest.ru/

1. Цели и основные задачи курсовой работы

программа информационный тестовый

Объектно-ориентированное программирование - это целый набор концепций и идей, позволяющих осмыслить задачу, стоящую при разработке компьютерной программы, а затем найти путь к ее решению более понятным, а значит, и более эффективным способом. Цель курсовой работы - закрепление основ и углубление знаний в области объектно-ориентированного программирования и создание тестовой информационной системы (ИС) для проверки знаний по предмету ООП.

Курсовая работа решает такие задачи как:

- Закрепление знаний, полученных при изучении теоретического курса, как по дисциплине ООП, так и по смежным дисциплинам;

- Выработка навыков и умения анализировать, создавать модели, алгоритмы, решать практические задания с использованием современных методов ООП.

2. Описание предметной области

Предметной областью решаемой задачи является информационная система (ИС) для просмотра графических файлов, которая будет представлять собой приложение, позволяющее пользователю удобно просматривать изображения, например фотографии.

Разработку данной ИС необходимо начать с определения выполняемых приложением функций и его возможностей.

Разрабатываемый программный продукт (ПП) будет обладать следующими функциями:

- Ввод информации об испытуемом;

- Проверка знаний испытуемого;

- Прохождение теста испытуемым;

- Получение результата прохождения теста испытуемого;

- Получение подробного отчета теста об ответах испытуемого;

3. Используемые подходы, методы и технологии программирования

Разработка программного обеспечения включает в себя следующие этапы:

1. Анализ;

2. Проектирование;

3. Эволюция;

4. Модификация.

В предыдущем параграфе был проведён анализ предметной области. Далее перейдём к подробному рассмотрению функционала ПП.

Тестирование как эффективный способ проверки знаний находит все большее применение. Одним из основных и несомненных его достоинств является минимум временных затрат на получение надежных итогов контроля. При тестировании используют как бумажные, так и электронные варианты. Последние особенно привлекательны, так как позволяют получить результаты сразу по завершении теста.

Тестирование в педагогике выполняет три основные взаимосвязанные функции: диагностическую, обучающую и воспитательную:

· Диагностическая функция заключается в выявлении уровня знаний, умений, навыков учащегося.

· Обучающая функция тестирования состоит в мотивировании учащегося к активизации работы по усвоению учебного материала.

· Воспитательная функция проявляется в периодичности и неизбежности тестового контроля. Это дисциплинирует, организует и направляет деятельность учащихся, помогает выявить и устранить пробелы в знаниях, формирует стремление развить свои способности.

Тестирование -- более справедливый метод, оно ставит всех учащихся в равные условия, как в процессе контроля, так и в процессе оценки, практически исключая субъективизм преподавателя.

С помощью тестирующей программы возможна организация и проведение тестирования как с целью выявить уровень знаний по любым учебным дисциплинам, так и с обучающими целями. Предприятия и организации могут осуществлять аттестацию и сертификацию своих сотрудников.

4. Uml-диаграмма «Прецедентов» решаемой задачи

На данном этапе разработки мы определяем систему, не зависящую от условий эксплуатации, а именно разрабатываем диаграмму прецедентов. На рисунке 1 изображена Uml-диаграмма «Прецедентов» нашей системы.

Рисунок 1 - Uml-диаграмма «Прецедентов»

5. Uml-диаграмма «Классов» решаемой задачи

Данный этап включает в себя разработку структуры классов решаемой задачи.

Рисунок 2.1 - Uml-диаграмма класса Type

Рисунок 2.2 - Uml-диаграмма Main

Рисунок 2.3 - Uml-диаграмма Login

Рисунок 2.4 - Uml-диаграмма Report

6. Текст программы на языке программирования C#

На данном этапе необходимо реализовать и подключить классы к проекту. Результат работы приложения представлен на рисунках. Вопросы к тесту представлены в приложении А.

Рисунок 3 - Окно Login

Рисунок 4 - Главное окно программы

Рисунок 5 - Отчет

Рисунок 6 - Подробный отчет

Код программы на Языке программирования C# представлен в листингах 1-4.

Листинг 1- Type

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Xml;

using System.IO;

namespace tester

{

public class Type

{

/// <summary>

/// Имя файла с вопросами

/// </summary>

public static string ContentFile = "\\content.qdb";

/// <summary>

/// Номер текущего вопроса

/// </summary>

public static int Index;

/// <summary>

/// Имя тестируемого

/// </summary>

public static string FirstName;

/// <summary>

/// Фамилия тестируемого

/// </summary>

public static string SecondName;

/// <summary>

/// Папка с отчетами

/// </summary>

public static string ReportDir = "\\reports";

/// <summary>

/// Запись в файл (текстовый)

/// </summary>

/// <param name="File">Имя файла</param>

/// <param name="Line">Строка</param>

public static void WriteFile(string File, string Line)

{

System.IO.StreamWriter sw;

using (sw = new System.IO.StreamWriter(File, true, Encoding.UTF8))

{ sw.WriteLine(Line); }

sw.Dispose();

}

/// <summary>

/// Случайные индексы

/// </summary>

/// <param name="Count">Размер</param>

/// <returns>Возвращает массив перемешанных чисел (от 1) заданного размера</returns>

public int[] Randomize(int Count)

{

int[] d = new int[Count];

bool b = false;

Random r = new Random();

int f = -1;

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

{

do

{

f = r.Next(Count + 1);

if (Array.IndexOf(d, f) < 0)

{ d[i] = f; b = true; }

}

while (b == false);

b = false;

}

return d;

}

/// <summary>

/// Количество вопросов

/// </summary>

public int GetCount

{

get

{

XmlDocument xmlDoc = new XmlDocument();

xmlDoc.Load(ContentFile);

XmlNodeList list = xmlDoc.GetElementsByTagName("question");

return list.Count;

}

}

/// <summary>

/// Чтение вопроса по номеру

/// </summary>

/// <param name="Index">Номер вопроса</param>

public void ReadItem(int Index)

{

XmlDocument xmlDoc = new XmlDocument();

xmlDoc.Load(ContentFile);

XmlNodeList list = xmlDoc.GetElementsByTagName("question");

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

{

XmlElement id = (XmlElement)xmlDoc.GetElementsByTagName("question")[i];

XmlElement text = (XmlElement)xmlDoc.GetElementsByTagName("question_text")[i];

XmlElement ans_1 = (XmlElement)xmlDoc.GetElementsByTagName("answer_1")[i];

XmlElement ans_2 = (XmlElement)xmlDoc.GetElementsByTagName("answer_2")[i];

XmlElement ans_3 = (XmlElement)xmlDoc.GetElementsByTagName("answer_3")[i];

XmlElement v = (XmlElement)xmlDoc.GetElementsByTagName("answer_V")[i];

if (id.GetAttribute("id") == (Index).ToString())

{

Question = text.InnerText;

Answer_1 = ans_1.InnerText;

Answer_2 = ans_2.InnerText;

Answer_3 = ans_3.InnerText;

Answer_V = int.Parse(v.InnerText);

}

}

}

public string Question;

public string Answer_1;

public string Answer_2;

public string Answer_3;

public int Answer_V;

}

}

Листинг 2 - Login

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace tester

{

public partial class frmLogin : Form

{

public frmLogin()

{

InitializeComponent();

this.Text = "Test";

this.StartPosition = FormStartPosition.CenterScreen;

this.lblF.Text = "Фамилия";

this.lblN.Text = "Имя";

this.btnExit.Text = "Закрыть";

this.btnOk.Text = "Вход";

}

private void btnExit_Click(object sender, EventArgs e)

{

Application.Exit();

}

private void btnOk_Click(object sender, EventArgs e)

{

//Запись имени и фамилии

Type.FirstName = this.txtF.Text.Trim();

Type.SecondName = this.txtN.Text.Trim();

if (Type.FirstName != "" & Type.SecondName != "")

{

//открытие основной формы программы

this.ShowInTaskbar = false;

frmMain f = new frmMain();

f.ShowDialog();

Application.Exit();

}

}

private void btnExit_Click_1(object sender, EventArgs e)

{

Application.Exit();

}

}

}

Листинг 3 - Main

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace tester

{

public partial class frmMain : Form

{

Type c = new Type();

int[] RandomIndex;

int[] Results;

public frmMain()

{

InitializeComponent();

this.Text = "Тестируется " + Type.FirstName + " " + Type.SecondName;

this.StartPosition = FormStartPosition.CenterScreen;

Start();

button2.Visible = false;

}

public void Start()

{

pictureBox1.Visible = false;

pictureBox2.Visible = false;

radioButton1.Image = pictureBox1.Image;

radioButton2.Image = pictureBox1.Image;

radioButton3.Image = pictureBox1.Image;

radioButton1.Text = "";

radioButton2.Text = "";

radioButton3.Text = "";

radioButton4.Visible = false;

radioButton4.Checked = true;

textBox1.Enabled = false;

textBox2.Enabled = false;

textBox3.Enabled = false;

txtQ.ReadOnly = true;

Type.ContentFile = Application.StartupPath + Type.ContentFile;

if (System.IO.File.Exists(Type.ContentFile) == false)

{

MessageBox.Show("Не найден файл с вопросами.\n Программа будет закрыта.");

Application.Exit();

}

else

{

Type.Index = 0;

RandomIndex = c.Randomize(c.GetCount);

Results = new int[c.GetCount];

NextQuesion();

}

}

public void Checked(RadioButton r)

{

if (r.Checked == true) { r.Image = pictureBox2.Image; }

else { r.Image = pictureBox1.Image; }

}

private void radioButton1_CheckedChanged(object sender, EventArgs e)

{

Checked(radioButton1);

}

private void radioButton2_CheckedChanged(object sender, EventArgs e)

{

Checked(radioButton2);

}

private void radioButton3_CheckedChanged(object sender, EventArgs e)

{

Checked(radioButton3);

}

public void NextQuesion()

{

c.ReadItem(RandomIndex[Type.Index]);

txtQ.Text = c.Question;

textBox1.Text = c.Answer_1;

textBox2.Text = c.Answer_2;

textBox3.Text = c.Answer_3;

}

public void Report()

{

int h = Type.Index;

RadioButton[] r = { radioButton4, radioButton1, radioButton2, radioButton3 };

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

{ if (r[i].Checked == true) { Results[RandomIndex[h] - 1] = i; } }

}

private void button1_Click(object sender, EventArgs e)

{

if (Type.Index < c.GetCount)

{

Report();

NextQuesion();

radioButton4.Checked = true; Type.Index++;

}

else

{

frmReport f = new frmReport(Results);

f.ShowDialog();

Application.Exit();

}

}

}

}

Листинг 4 - Report

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace tester

{

public partial class frmReport : Form

{

Type c = new Type();

int[] a = new int[0];

public frmReport(int[] ans)

{

InitializeComponent();

a = ans;

Type.ReportDir = Application.StartupPath + "\\reports";

if (System.IO.Directory.Exists(Type.ReportDir) == false)

{ System.IO.Directory.CreateDirectory(Type.ReportDir); }

this.StartPosition = FormStartPosition.CenterScreen;

this.FormBorderStyle = FormBorderStyle.FixedDialog;

this.MinimizeBox = false;

button2.Text = "Подробный отчет";

button1.Text = "Закрыть";

label3.Text = "Тестировался " + Type.FirstName + " " + Type.SecondName;

label1.Text = "Всего вопросов: " + ans.Length.ToString();

int t = 0;

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

{

c.ReadItem(i + 1);

if (c.Answer_V == ans[i]) { t++; }

}

label2.Text = "Верных ответов: " + t.ToString();

Type.ReportDir += "\\" + DateTime.Now.Day.ToString() + "." + DateTime.Now.Month.ToString() + "." + DateTime.Now.Year.ToString();

Type.ReportDir += ";" + DateTime.Now.Hour.ToString() + "." + DateTime.Now.Minute.ToString() + "." + DateTime.Now.Second.ToString();

Type.ReportDir += " " + Type.FirstName + " " + Type.SecondName + ".txt";

Rep();

}

public void Rep()

{

Type c = new Type();

Type.WriteFile(Type.ReportDir, "Тестировался " + Type.FirstName + " " + Type.SecondName);

Type.WriteFile(Type.ReportDir, "Подробные резельтаты:");

int t = 0;

for (int i = 0; i < c.GetCount; i++)

{

c.ReadItem(i + 1);

Type.WriteFile(Type.ReportDir, "Вопрос №" + (i + 1).ToString() + " " + c.Question);

if

(a[i] == c.Answer_V)

{ Type.WriteFile(Type.ReportDir, "Ответ верен"); t++; }

else { Type.WriteFile(Type.ReportDir, "Ответ неверен"); }

}

Type.WriteFile(Type.ReportDir, "Итого: " + t.ToString() + " верных ответов из " + a.Length.ToString());

}

private void button2_Click(object sender, EventArgs e)

{

System.Diagnostics.Process p = new System.Diagnostics.Process();

p.StartInfo.FileName = Type.ReportDir;

p.Start();

}

}

}

Вывод по работе

В результате выполнения данной курсовой работы были получены новые навыки в области объектно-ориентированного программирования (ООП), а также закреплен ранее пройденный материал по данной дисциплине. В ходе работы были пройдены все этапы разработки программного обеспечения, а именно:

1. Анализ;

2. Проектирование;

3. Эволюция;

4. Модификация.

На этих этапах были созданы uml-диаграммы «Прецедентов» и uml-диаграммы «Классов», составлен код программы на языке программирования C#.

Итогом работы является полноценный программный продукт (ПП) - «информационная система для проверки знаний», имеющий простой и понятный любому пользователю графический интерфейс. Приложение обладает следующими функциями: ввод личный данных, выбор ответа на поставленный вопрос, получение результата теста, а также возможность получить более подробный отчет о прохождении теста.

Используемая литература

1. Н. Культин "Microsoft Visual C# в задачах и примерах"-СПб.: БХВ-Петербург,2009.-320с.

2. Уотсон К., Нейгел К, и др. "Visual C# 2008. Базовый курс".:Пер. с англ.-М.: ООО «И.Д. Вильямс»,2009.-1216с.

3. C#. Советы программиста.-СПб.:БХВ-Петербург,2008.-544с.

4. Шильд Г. Полный справочник по C#. Пер. с англ. - М.: "Вильямс", 2004.

5. Рихтер, Д. CLR via С#. Программирование на платформе Microsoft .NET Framework 2.0 на языке С#. Мастер-класс. / Пер. с англ. / Д. Рихтер. -- М.: Издательско-торговый дом «Русская Редакция»; СПб.: Питер, 2007. -- С. 656.

Приложения

Приложение А

1. Выберите правильный вариант объявления класса:

+ public class Custumer;

- class Custumer;

- class public Custumer.

2. Дайте правильное определение классу: «Класс - это логическая структура, позволяющая создавать свои собственные пользовательские типы путем…»

- группирования переменных одного типа;

- группирования методов и событий;

+ группирования переменных других типов.

3. Выберите правильный вариант синтаксиса описания наследования:

- class Manager: Employee;

+ public class Manager: Employee;

- public class Manager; Employee.

4. Дайте правильное определение методу:

- Метод представляет собой совокупность правил и инструкций;

+ метод - это блок кода, содержащий набор инструкций;

- метод - это блок кода, выполняющий определенные функции.

5. Как обозначают параметры метода:

- параметры заключаются в квадратные скобки и разделяются запятыми;

- параметры заключаются в фигурные скобки и разделяются запятыми;

+ параметры заключаются в круглые скобки и разделяются запятыми.

6. Ключевое слово out:

- используется для передачи аргументов по ссылке, в результате все изменения параметра в методе будут отражены в переменной при передаче элемента управления обратно в вызывающий метод;

- используется для передачи аргументов по ссылке, требует инициализации переменной перед ее передачей</answer_2>;

+ прерывает выполнение метода, в котором оно присутствует и возвращает управление вызывающему методу</answer_3>.

7. Укажите правильный вариант объявления методов:</question_text>

+ [модификаторы] тип_возврата ИмяМетода ([параметры])

{

// тело метода

};

- модификаторы] ИмяМетода

{

// тело метода

} тип_возврата ИмяМетода;

- {

([параметры])

// тело метода

}.

8. Как предотвратить наследование класса:

- Для этого воспользоваться ключевым словом «double»;

- Для этого воспользоваться ключевым словом «long»;

+ Для этого воспользоваться ключевым словом «sealed».

9. Укажите неправильный вариант ответа. Отличия static-методом от обычных:

+ методы с модификатором Static имеют ссылки this;

- методы с модификатором Static могут непосредственно (без указания имени объекта) вызывать только другой статический метод;

- методы с модификатором Static имеют только прямой доступ к static-данным.

10. Какой средой вызывается метод Main при запуске программы:

+ CLR;

- CRL;

- SLR.

11. Укажите отличие статического класса от нестатического:

- можно создавать экземпляры статического класса;

- нельзя создавать переменный тип класса;

+ нельзя создавать экземпляры статического класса.

12. Выберите верное утверждение о статических классах:

- статический конструктор вызывается более одного раза;

- статический класс не остается в памяти на время существования домена приложения;

+ программа не может точно указать, когда загружается класс.

13. Укажите НЕВЕРНЫЙ ответ.

Основные характеристики статического класса:

- содержит только статические члены;

- он запечатан;

+ можно создавать его экземпляры.

14. Укажите метод класса Object:

- Clone;

- Concat;

+ ToString.

15. Укажите свойство, относящееся к классу String:

+ Chars;

- Clone;

- CopyTo.

16. Какой статический метод класса Array определяет индекс первого вхождения образца в отсортированный массив, используя алгоритм двоичного поиска:

- Sort;

- Reverse;

+ BinarySearch.

17. Класс Array может создавать свои экземпляры не только с помощью конструктора new, но и при вызове метода:

- Clone;

- GetEnumerator;

+ CreateInstance.

18. Какой динамический метод возвращает или устанавливает значение элемента массива с указанными индексами:

- CreateInstance;

- Initialize;

+ GetValue.

19. Укажите верное утверждение:

- доступ к статическому члену выполняется по имени экземпляра;

+ С# не поддерживает статических локальных переменных;

- существует несколько копий статического члена

20. Укажите НЕВЕРНЫЙ вариант ответа.

Основные отличия статического конструктора:

- вызывается при создании первого экземпляра;

+ может быть описан в классе более одного раза;

- нет возможности вызывать его напрямую.

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.