Как написать программу тестирования знаний

0 / 0 / 0

Регистрация: 31.01.2012

Сообщений: 9

1

Как написать программу для тестирования знаний

31.01.2012, 22:34. Показов 31709. Ответов 9


Система тестирования знаний.
Дан текстовый файл с вопросами и верными ответами. Ввести Ф.И.О тестируемого(или выбрать из готового списка). Предусмотреть кнопки на окне программыили пункты меню в текст. режиме: 1,2,3 и т.д. с вариантами ответов. В конце процент верных ответов.
P.S. не могу понять форма это или консольное приложение.
P.S.S буду очень благодарен за выделенное вами время данному вопросу

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



179 / 180 / 54

Регистрация: 01.06.2011

Сообщений: 507

31.01.2012, 22:46

2

Собственно по первому P.S. — это будет то, что Вам хочется (удобнее форму).
Остальное не понял. Где вопрос? Вам программу написать?



0



0 / 0 / 0

Регистрация: 31.01.2012

Сообщений: 9

01.02.2012, 00:25

 [ТС]

3

Если не затруднит, то да, это было бы просто шикарно



0



0 / 0 / 0

Регистрация: 31.01.2012

Сообщений: 9

01.02.2012, 03:14

 [ТС]

4

Ну я надеюсь, что и тут добрые люди имеются



0



717 / 708 / 168

Регистрация: 15.06.2011

Сообщений: 1,704

01.02.2012, 17:42

5

Добрые люди найдуться, но проект вам тут никто делать не будет

Однако помочь мы можем, вы начните создавать проект и по мере накопления проблем спрашивайте, а мы постараемся помочь.

1) Ваш текст говорит сам за себя:

Предусмотреть кнопки на окне программыили пункты меню в текст.

2) Ждем ваших вопросов)))



1



Deathroll1

0 / 0 / 0

Регистрация: 31.01.2012

Сообщений: 9

03.02.2012, 10:58

 [ТС]

6

что то умудлился скопипастить… и посоветоваться с товарищами… Получил следующее:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
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 Тестилка
{
    public partial class Form1 : Form
    {
        string fpath;   //путь файлу к теста
        string fname;   //файл теста
 
        //XmlReader обеспечивает чтение данных xml-файла
        System.Xml.XmlReader xmlReader;
 
        string qw;  //Вопрос
 
        //Варианты ответа
        string[] answ = new string[3];
       
        string pic; //путь к файлу иллюстрации
 
        int right;  //правильный ответ
        int otv;    //выбранный ответ
        int n;      //количество правильных ответов
        int nv;     //общее количетсво вопросов
        int mode;   //состоянине программы
                    //0 - начало работы;
                    //1 - тестирования;
                    //2 - завершение работы
 
        //Конструктор формы
        //(см. также Program.cs)
        public Form1(string[] args)
        {
             InitializeComponent();
 
            radioButton1.Visible = false;
            radioButton2.Visible = false;
            radioButton3.Visible = false;
            radioButton4.Visible = false;
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            fname = "spb.xml";
            try
            {
                //Прочитать xml-файл
                xmlReader =
                    new System.Xml.XmlTextReader(/*fpath + */fname);
                xmlReader.Read();
 
                mode = 0;
                n = 0;
 
                //Загрузить и показать заголовок текста
                this.showHead();
 
                //Загрузить и показать описание текста
                this.showDescription();
            }
            catch (Exception exc)
            {
                label1.Text = "Ошибка доступа к файлу " +
                    exc + fpath + fname;
 
                MessageBox.Show("Ошибка доступа к файлу.n" +
                    fpath + fname + "n",
                    "Экзаменатор",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
 
                mode = 2;
            }
        }
        //Выводит название (заголовок) текста
        private void showHead()
        {
            //ищем узел <head>
            do xmlReader.Read();
            while (xmlReader.Name != "head");
 
            //считываем заголовок
            xmlReader.Read();
 
            //вывести название текста в заголовк окна
            this.Text = xmlReader.Value;
 
            //выходим из узла <head>
            xmlReader.Read();
        }
        private void showDescription()
        {
            //ищем узел <Description>
            do
                xmlReader.Read();
            while (xmlReader.Name != "description");
 
            //считываем описание теста
            xmlReader.Read();
 
            //выводим описание теста
            label1.Text = xmlReader.Value;
 
            //выходим из узла <description>
 
            //ищем узел вопросов <qw>
            do
                xmlReader.Read();
            while (xmlReader.Name != "qw");
 
            //входим внутрь узла
            xmlReader.Read();
        }
        //читает вопрос из файла теста
        private Boolean getQw()
        {
            //считываем тег <q>
            xmlReader.Read();
 
            if (xmlReader.Name == "q")
            {
                //здесь прочитан тег <q>,
                //атрибут text которого содержит вопрос
                //а атрибут src - имя файла иллюстрации
 
                //извлекаем значение атрибутов
                qw = xmlReader.GetAttribute("text");
                pic = xmlReader.GetAttribute("src");
 
//                if (!pic.Equals(string.Empty)) pic = fpath + pic;
 
                //входим внутрь узла
                xmlReader.Read();
                int i = 0;
 
                //считываем данныем из вопроса <q>
                while (xmlReader.Name != "q")
                {
                    xmlReader.Read();
 
                    //вырианты ответа
                    if (xmlReader.Name == "a")
                    {
                        //если есть атрибут right, то это
                        //правильный ответ
                        if (xmlReader.GetAttribute("right") == "yes")
                        right = i;
 
                        //считываем вариант ответа
                        xmlReader.Read();
                        if (i < 3) answ[i] = xmlReader.Value;
 
                        //выходим из узла <a>
                        xmlReader.Read();
 
                        i++;
                    }
                }
                //выходим из узла вопроса <q>
                xmlReader.Read();
 
                return true;
            }
            //если считанный тег не <q>
            else
                return false;
        }
        private void showQw()
        {
            //выводим вопрос
            label1.Text = qw;
 
            //иллюстрация
            if (pic.Length != 0)
            {
                try
                {
//                    pictureBox1.Image = new Bitmap(pic);
 
                    pictureBox1.Visible = true;
 
                    radioButton1.Top = pictureBox1.Bottom + 16;
                }
                catch
                {
                    if (pictureBox1.Visible)
                        pictureBox1.Visible = false;
 
                    label1.Text +=
                        "nnnОшибка доступа к файлу " + pic + ".";
 
                    radioButton1.Top = label1.Bottom + 8;
                }
            }
            else
            {
                if (pictureBox1.Visible)
                    pictureBox1.Visible = false;
                radioButton1.Top = label1.Bottom;
            }
            //Показать варианты ответа
            radioButton1.Text = answ[0];
            radioButton2.Top = radioButton1.Top + 24; ;
            radioButton2.Text = answ[1];
            radioButton3.Top = radioButton2.Top + 24; ;
            radioButton3.Text = answ[2];
 
            radioButton4.Checked = true;
            button1.Enabled = false;
        }
               
        //Щелчок на кнопке выбора ответа
        //функция обрабатывает событие click
        //компонентов radioButton1 - radioButton3
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
        //Щелчок на кнопке ОК
        private void button1_Click(object sender, EventArgs e)
        {
            int j = 1;
            pictureBox1.ImageLocation = String.Format("{0}{1}", j, ".jpg");
            switch (mode)
            {
                case 0:     //начало работы
                    radioButton1.Visible = true;
                    radioButton2.Visible = true;
                    radioButton3.Visible = true;
 
                    this.getQw();
                    this.showQw();
 
                    mode = 1;
 
                    button1.Enabled = false;
                    radioButton4.Checked = true;
                    break;
                case 1:
                    nv++;
                    j = nv + 1;
                    pictureBox1.ImageLocation = String.Format("{0}{1}", j, ".jpg");
                    //правильный ли ответ выбран
                    if (otv == right) n++;
 
                    if (this.getQw()) this.showQw();
                    else
                    {
                        //больше вопросов нет
                        radioButton1.Visible = false;
                        radioButton2.Visible = false;
                        radioButton3.Visible = false;
 
                        pictureBox1.Visible = false;
 
                        //обработка и вывод результата
                        this.showLevel();
 
                        //следующий щелчок на кнопке ОК
                        //закроет окно программы
                        mode = 2;
                    }
                    break;
                case 2:     //завершение работы программы
                    this.Close();   //закрыть окно
                    break;
            }
        }
        //выводит оценку
        private void showLevel()
        {
            //ищем узел <levels>
            do
                xmlReader.Read();
            while
            (xmlReader.Name != "levels");
 
            //входим внуть узла
            xmlReader.Read();
            while (xmlReader.Name != "levels")
            {
                xmlReader.Read();
 
                if (xmlReader.Name == "level")
                    //n - кол-во правильных ответов,
                    //проверяем, попадаем ли в категорию
                    if (n >= System.Convert.ToInt32(
                        xmlReader.GetAttribute("score")))
                        break;
 
            }
 
            //выводим оценку
            label1.Text =
                "Тестирования завершенно.n" +
                "Всего вопросов: " + nv.ToString() + ". " +
                "Правильных ответов: " + n.ToString() + ".n" +
                xmlReader.GetAttribute("text");
        }
 
        private void Form1_Load_1(object sender, EventArgs e)
        {
 
        }
 
        private void pictureBox1_Click(object sender, EventArgs e)
        {
 
        }
 
        private void radioButton1_Click(object sender, EventArgs e)
        {
            if ((RadioButton)sender == radioButton1) otv = 1;
            if ((RadioButton)sender == radioButton2) otv = 2;
            if ((RadioButton)sender == radioButton3) otv = 3;
 
            button1.Enabled = true;
        }
 
        private void radioButton2_Click(object sender, EventArgs e)
        {
            if ((RadioButton)sender == radioButton1) otv = 1;
            if ((RadioButton)sender == radioButton2) otv = 2;
            if ((RadioButton)sender == radioButton3) otv = 3;
 
            button1.Enabled = true;
 
        }
 
        private void radioButton3_Click(object sender, EventArgs e)
        {
            if ((RadioButton)sender == radioButton1) otv = 1;
            if ((RadioButton)sender == radioButton2) otv = 2;
            if ((RadioButton)sender == radioButton3) otv = 3;
 
            button1.Enabled = true;
        }
    }
}

собственно далее пытался запихнуть всё в Visual studio, по какой то не понятной мне причине, не создаётся изначальная форма(
Подскажите что не так..



0



13 / 0 / 0

Регистрация: 03.11.2010

Сообщений: 125

03.06.2013, 16:29

8

А есть конечная версия? И сам файл XML можно посмотреть? в общем,выложите все что у вас есть по этому вопросу? буду очень признателен!!!



0



0 / 0 / 0

Регистрация: 10.09.2014

Сообщений: 1

24.10.2014, 06:40

9

Это очень просто. Я это сделал на Dephi-7.



0



ORLENOK

24.10.2014, 10:34


    Как написать программу для тестирования знаний

Не по теме:

Это какая то традиция, отвечать в теме раз в год?))



0



В современном мире эффективным способом проверки знаний считается тестирование. Тесты применяются практически во всех сферах: аттестация, образование, сертификация, психология, подбор персонала и т.д. Тестирование позволяет за короткий срок проверить знания человека и оценить его. Чтобы автоматизировать тестирование, разработчики создают специальное программное обеспечение.

Подготовительная работа

Для написания прототипа простого приложения для тестирования на языке программирования С++ мы создадим два текстовых файла.

В файл под именем test.txt запишем вопросы к тесту. Каждый вопрос в файле находится на двух строчках и состоит из вопроса и вариантов ответа.

При сохранении файла, выбираем пункт меню — Cохранить как, и устанавливаем кодировку символов ANSI для корректного отображения текста в консоли.

Во втором файле, назовём его answer.txt, в каждой строчке пропишем ответ на вопрос файла test.txt, выполняя заранее установленную последовательность.

При сохранении файла, как и ранее, выбираем пункт меню — Cохранить как, и устанавливаем кодировку символов ANSI, для корректного отображения текста в консоли.

Начинаем проектировать

В коде программы используем заголовочные файлы: iostream (обеспечивает ввод — вывод в консоль), fstream (предоставляет интерфейс для чтения или записи данных в файл), string (организовывает работу со строками). Команда using namespace std сообщает компилятору, что мы хотим использовать всё, что находится в пространстве имен std.

Функция void test()

Функция void test() читает из файла test.txt вопросы к тесту и выводит их в консоль. Открывает новый файл myanswer.txt и записывает в него ответы пользователя. По окончанию тестирования закрывает оба файла.

ifstream f — объекты класса ifstream предоставляют возможность для чтения файлов.

f.open("test.txt") — с помощью данного объекта, используя метод open, открываем файл test.txt.

ofstream out —  объекты класса оfstream позволяют нам открывать файлы для записи данных.

out.open("myanswer.txt") — для открытия файла myanswer.txt используется метод open.

Для работы с прочитанными данными из файла test.txt, используем переменную строкового типа str, ответы пользователя будем сохранять в переменную строкового типа otv.

Каждый вопрос теста нумеруем целочисленной переменной z.

Перед началом работы с данными файлов проверяем, что все рабочие файлы открылись корректно — if (f && out) —, в ином случае выводим сообщение об ошибке и покидаем тело функции:

cout << «Ошибка открытия файла !!!»;
return;

При каждой итерации цикла while, с помощью функции getline, читаем построчно данные с файла test.txt. Цикл while будет работать, пока не будут прочитаны все строки файла test.txt.

При каждой итерации цикла while в консоль выводится номер вопроса и запрос на ввод ответа.

После ввода ответа увеличиваем значение переменной z на единицу и очищаем консоль функцией system("cls").

Записываем ответ объектом out < по аналогии вывода данных в консоль инструкцией cout.

По окончании работы цикла while закрываем текстовые файлы f.close(); out.close();

Функция void result()

Функция result() открывает файлы answer.txt и myanswer.txt, сравнивает ответы пользователя с правильными ответами в файле answer.txt и выводит результат на экран.

В коде функции создаём целочисленные переменные для подсчёта правильных ответов — переменная p и ошибочная переменная n.

Для работы с правильными ответами и ответами пользователя используем строковые переменные str и otv.

С помощью классов ifstream f1(«answer.txt»), ifstream f2(«myanswer.txt») открываем файлы для чтения.

if (f1.is_open() && f2.is_open()) — проверяем, что все файлы открылись без ошибок, в ином случае покидаем функцию и сообщаем об ошибке

cout << «Ошибка открытия файла !!!»;
return;

В параметрах цикла while, используя функцию getline, читаем правильные ответы и ответы пользователя в строковых переменных str и otv.

В конструкции if (str == otv) сравниваем ответы и, если они совпадают, выводим ответ с указанием верного в консоль, а также увеличиваем значение переменной p на единицу, если это не так. Сообщаем, что ответ ошибочный и увеличиваем значение переменной n на единицу.

По окончании работы цикла while не забываем закрыть файлы f1.close(); f2.close();.

В конце работы выводим количество правильных и ошибочных ответов и выходим из тела функции.

Функция int main()

В функции main() с помощью функции system("chcp 1251>nul") устанавливаем используемый шрифт — кириллица.

Функция system(«color 1f») устанавливает цвет фона синий, а цвет букв — ярко белый.

Запускаем выполнение функций test() и result(). Устанавливаем паузу в консоли system("pause"), чтобы она не закрывалась, пока не будет нажата любая клавиша. Готово! Скачать код программы можно здесь.

Время на прочтение
7 мин

Количество просмотров 77K

Дайте-ка угадаю: вы согласны с тем, что писать тесты — это хорошо. Это повышает надежность системы, ускоряет разработку, проект с хорошим тестовым покрытием поддерживать легко и приятно, а TDD — это вообще почти идеал процесса разработки. Но не у вас в проекте. То есть, оно клёво, но, к сожалению, сейчас столько работы — просто завал. Куча задач, одних только критических багов — два десятка, плюс надо срочно дописать этот модуль и еще написать письмо заказчику… Так что тесты, наверное, будем прикручивать уже в конце, если время останется. Или в следующем проекте. Нет, ну там точно полегче будет. Скорее всего.

Как, узнали ситуацию?

Так вот — чушь всё это. Сфера ИТ — бесконечна, как вселенная, куча работы будет всегда. Можно или начать писать тесты прямо сейчас, или не сделать этого никогда. Я тут набросал короткий план, как начать это делать за 10 шагов, по шагу в день, по 10 минут на шаг. И когда я говорю «10 минут» я имею в виду не «3 с половиной часа» и не «ну сколько-то времени, лучше побольше», а именно 600 секунд. Если у вас нету в день 600 секунд свободного времени — срочно меняйте проект, работу, профессию, страну проживания (нужное подчеркнуть), потому что это не жизнь, а каторга какая-то. Поехали.

1. Выбираем фреймворк для тестов

Не вздумайте начинать писать собственный фреймворк с нуля — оно вам надо? Тратить неделю на выбор оптимального фреймворка (да, я видел такую оценку времени на это в планах) — тоже глупо. Вот вам рецепт: набирайте в Гугле best test framework for %language% site:stackoverflow.com. Открываете первые 5 ссылок. Закрываете те из них, где рейтинг вопроса или первого ответа около нуля. Из оставшихся вкладок можно смело брать любой рекомендованный фреймворк из первой тройки с максимальным рейтингом. С вероятностью в 99.5% он вам подойдет. Поскольку на данный шаг вы пока потратили минуты 3, то оставшиеся 7 можно потратить на то, чтобы перейти на сайт фреймворка и посмотреть примеры его использования. Скорее всего, там всё будет просто и понятно (иначе он не был бы в топе рекомендаций). Но если вдруг нет — выберите другой по тому же алгоритму.

2. Пишем Hello world!

Написать Hello, world! нам раз плюнуть. Вот, например, на С++.

Hello world!

#include <iostream>

using namespace std;

int main()
{
	cout << "Hello world!" << endl;
	return 0;
}

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

Hello world! после рефакторинга

#include <iostream>
#include <string>

using namespace std;

string GetHello()
{
	return "Hello";
}

string GetAdressat(string adressat)
{
	return adressat;
}

int main()
{
	cout << GetHello() + " " + GetAdressat("world") + "!" << endl;
	return 0;
}

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

HelloFunctions.h

#include <string>
using namespace std;

string GetHello();
string GetAdressat(string adressat);

HelloFunctions.cpp

#include "HelloFunctions.h"

string GetHello()
{
	return "Hello";
}

string GetAdressat(string adressat)
{
	return adressat;
}

HelloWorld.cpp

#include <iostream>
#include "HelloFunctions.h"

using namespace std;

int main()
{
	cout << GetHello() + " " + GetAdressat("world") + "!" << endl;
	return 0;
}

3. Подключаем фреймворк к Hello world!

О подключении фреймворка к проекту наверняка очень хорошо написано на сайте фреймворка. Или на stackoverflow. Или на Хабре. Вот я, к примеру, когда-то описывал подключение Google Test. Обычно всё сводится к созданию нового проекта консольного исполняемого приложения (в скриптовых языках — отдельного скрипта), подключению к нему фрейворка парой include (importusing), подключению к проекту тестируемого кода (включением самих файлов с кодом или подключением библиотеки) — ну и всё. Если вы не верите, что этот шаг можно сделать за 10 минут — откройте Youtube, напишите в поиск название своего фреймворка и пронаблюдайте 20 видеороликов примерно одинакового содержимого, которые это доказывают.

4. Разбираемся с возможностями фреймворка

Для начала нам нужно выяснить:

  • Как написать один юнит-тест
  • Как запустить юнит-тесты

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

Вот, к примеру, пару тестов для нашего Hello world! на упомянутом выше Google Test:

#include "HelloFunctions.h"
#include "gtest/gtest.h"

class CHelloTest : public ::testing::Test {
};

TEST_F(CHelloTest, CheckGetHello) 
{
    ASSERT_TRUE(GetHello() == "Hello");
}

TEST_F(CHelloTest, GetAdressat) 
{
    ASSERT_TRUE(GetAdressat("world") == "world");
	ASSERT_FALSE(GetAdressat("not world") == "world");
}

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}
5. Подключаем фреймворк к настоящему проекту

Мы уже умеем подключать фреймворк к проекту. Помните, делали на шаге №3? Всё получилось. Теперь давайте сделаем это для боевого проекта. Положите все необходимые файлы фреймворка себе под SVNGitTFSчего-у-вас-там. Сделайте тестовый проект. Подключите к нему фреймворк. Включите сборку тестового проект в процесс сборки вашего продукта. Проверьте сборку в дебаг и релиз-конфигурациях. Комитните тестовый проект, запустите сборку на билд-сервере. Всё должно быть ок. Не нагружайте пока ваших коллег появлением тестового проекта — во-первых, вы ничего не сломали, во-вторых, хвастаться вам тоже пока нечем.

6. Тестируем что-нибудь простое

Вы помните, каким образом мы выше вынесли из Hello world! часть функционала во внешний код? Обратите внимание, какими получились эти функции: они не зависят ни от глобальных переменных, ни от состояния каких-то объектов, ни от внешних данных из файлов или баз данных. Резальтат зависит только от переданных аргументов. Найдите в своём проекте что-то аналогичное. Наверняка ведь у вас есть какие-нибудь функции конвертации чего-то куда-то, сериализациидесериализации, упаковкираспаковки, шифрованиядешифрования и т.д. Не думайте пока о том, насколько нужный и полезный функционал вы тестируете. Ваша задача — написать простой тест, но для боевого проекта. Запустить, увидеть «1 тест успешно пройден».

Кстати, именно на этом этапе очень часто к скептикам приходит озарения. Вдруг оказывается, что самый простой тест, на самую элементарную функциональность — вдруг провалился. Лезем в код — и вдруг находим что-то типа

return 12; // TODO: implement later 

И оказывается, что основной код просто пока вызывал эту функцию с такими аргументами, что всё было ок, но в любой момент это могло измениться.

7. Тестируем что-нибудь посложнее

Вы уже умеете тестировать простые вещи. Теперь разберитесь как тестировать что-то, имеющее внешние зависимости. Посмотрите, как ваш фреймворк предлагает делать подготовку к запуску теста и очистку после него. Разберитесь, что такое моки и стабы. Подумайте как протестировать какой-нибудь ваш код, читающий данные из файла или из базы. Легко ли подменить источник входных данных? Может быть стоит слегка изменить код, чтобы это стало легче? Сделайте это, если нужно. Напишите для этого кода тест.

8. Пишем тест на баг

Как обычно выглядит ваша работа над багом? Вы берёте его из багтрекера, пробуете воспроизвести, если не получается — возвращаете тестеру, если получается, занимаетесь отладкой для понимания его местоположения, находите кусок кода с ошибкой, исправляете, тестируете, отдаёте тестеру. Отлично. А теперь попробуйте при работе над следующим багом между шагами «находите ошибку» и «исправляете» добавить ещё один шаг — написать тест на эту ошибку. Такой, чтобы он падал для текущего кода. Это огромное кайф, исправить код — и не лезть тестировать его руками, а запустить падавший пару минут назад тест и увидеть «успешно» на его выходе. Кроме этого эстетического удовольствия, этот тест можно отдать тестеру и использовать в дальнейшем для регрессионного тестирования (а ещё — для тестирования побочных веток продукта, проекта «в поле», и т.д.). Конечно, не всё и не всегда можно так протестировать, бывает тяжело с UI, с кроссбраузерностью, с многопоточностью. Не заморачивайтесь в случае, если написание теста займёт у вас много-много часов. В конце-концов, эта технология ведь призвана облегчить вашу жизнь, а не заставить плясать под свою дудку.

9. Первый раз TDD

Как обычно выглядит ваша работа при разработке нового функционала? Наверное, вы сначала думаете. Потом проектируете то, что будете делать — набрасываете названия интерфейсов, классов, потом названия методов, наполняете их реализацией, запускаете, отлаживаете. Отлично, менять почти ничего не надо. Просто в тот момент, когда у вас уже есть интерфейсы, классы и названия методов, но еще нет их реализации — напишите для них тесты. Простенькие — вызвали метод — проверили результат. Обратите внимание, как уже на этом этапе вы заметите нелогичность некоторых имён, недостаток или излишество аргументов в методах, ненужные или отсутствующие зависимости и т.д.. При этом сейчас пока что это исправить — почти ничего не стоит (ведь реализация ещё не написана). Подправили архитектуру, дописали тесты, запустили — увидели кучу проваленных тестов. Отлично, так и должно быть. Написали реализацию, запустили тесты — увидели большинство из них пройденными, исправили ошибки, добились успешного прохождения всех тестов — отлично, дело сделано. Вы чувствуете, как хорошо стало, какое моральное удовлетворение вы получили? Оно слегка напоминает удовольствие от получения какой-то ачивки в игре. А почему? А потому, что его можно измерить! «Код проходит 18 тестов при тестовом покрытии в 90%» — это звучит круче, намного круче чем «ну, фича вроде бы реализована, я так потыкал немножко, кажется, не падает». Это даёт право гордится. Идешь домой — и чётко понимаешь, что-то за день сделал полезное, это «что-то» измеримо, ощутимо, реально.

10. Прикручиваем запуск тестов к CI-серверу

В тестах мало смысла, если их не запускать. Запускать их вручную — долго и бессмысленно. Наверняка у вас есть билд-сервер с каким-нибудь TeamCity или CruiseControl, где собирается ваш продукт. Так вот, большинство хороших билд-серверов сразу, из коробки, поддерживают запуск тестов и даже парсят их логи и рисуют красивые отчёты. Соответствие тут, конечно, не «все совместимы со всеми», но если вы взяли тестовый фреймворк по совету в начале статьи — шансы на то, что всё заработает очень высоки. К примеру, упомянутые мною TeamCity и Google Test прекрасно дружат между собой.

Послесловие

Дотошный читатель может заметить, что пункты начиная где-то с седьмого-восьмого скорее всего не впишутся в заявленные в заголовке «10 минут на шаг». Что тут можно сказать? Считайте, что я, нехороший человек, вас слегка наколол. Однако, если вы на практике с праведным негодованием прошли эти пункты, то:

  1. У вас уже есть проект, к которому прикручены тесты. Они запускаются, работают, их больше нуля и они уже приносят вам пользу.
  2. Вы получили опыт во всём этом деле.
  3. Во второй раз у вас получится серьёзно быстрее.

Вот и решайте, стоило оно того или нет.

Где-то пункта после 8-го — хорошее время чтобы представить тестовый проект вашей команде. Объясните в 2-3 абзаца что и как, покажите простенький пример теста, заметьте, что, мол, «feel free to add your own tests», но особо не напирайте пока. Если у вас писать тесты было не принято, скорее всего первым впечатлением будет осторожный скепсис и непонимание. Это быстро лечится после второго-третьего упоминания на совещании о том, что, мол «а этот баг мы нашли благодаря тесту» или «а вот тут написан тест и мы сразу узнаем, если оно сломается снова». Программисты — народ рациональный, они поймут и подтянутся.

МУНИЦИПАЛЬНОЕ ОБЩЕОБРАЗОВАТЕЛЬНОЕ
УЧРЕЖДЕНИЕ СРЕДНЯЯ ОБЩЕОБРАЗОВАТЕЛЬНАЯ ШКОЛА

«ПЕРСПЕКТИВА»

ГОРОДСКОГО ОКРУГА  ВЛАСИХА МОСКОВСКОЙ
ОБЛАСТИ

143010, МОСКОВСКАЯ ОБЛАСТЬ, ПОСЕЛОК
ВЛАСИХА,

МКР. ШКОЛЬНЫЙ, Д.10,

PERSPECTIVASCHOOL@YANDEX.RU

Проектная работа на тему:

«Создание программы для
тестирования обучающихся»

Выполнила ученица 10 «Б»

Стариченко Ольга

Руководитель
проекта

учитель информатики и ИКТ

Зеленченко Иван
Алексеевич

2022г.

Оглавление

Введение

Глава
1

1.1.
Компьютерное тестирование

1.2.
Delphi
7

Глава
2 Код программы

Глава
3 Форма эксель

Заключение

Список
литературы

Введение

В 21 веке учителям
требуется оптимизировать свою работу. Одним из направлений совершенствования
процесса обучения является разработка оперативной системы контроля знаний,
умений и навыков, позволяющей объективно оценивать знания обучающихся, выявляя
имеющиеся пробелы и определяя способы их ликвидации. Для этого используются
различные цифровые среды. Большинство из них работают только в определенных
условиях и характеристиках компьютера. Рассмотрев все существующие на данный
момент среды, я решила разработать универсальное программное обеспечение,
которое может работать на любом компьютере с ОС windows. Единственным условием
является наличие программного обеспечения
MicrosoftExcel 2007 и новее. Данная среда позволяет один раз запрограммировать
тест, который потом можно использоваться множество раз без необходимости
создавать его заново. Для практической работы выбран язык программирования
Delphi 7, так как это в настоящее время наиболее простой сервис, имеющий все
необходимые функции.

Цель
проекта
— Создание электронного
теста, с помощью языка программирования
Delphi 7, для промежуточной аттестации уровня знаний обучающихся
нашей школы.

Задачи проекта

– Изучить литературу по данной
тематике;

– Ознакомиться с интерфейсом
программы «Delphi 7»;

– Внести соответствующие вопросы в
программу;

– Выставить параметры оценивания заданий;

– Апробировать созданный тест;

– Устранить выявленные недоработки

Актуальность
проекта
— Актуальность проекта
обусловлена тем, что растёт интерес к тестированию в качестве метода оценки
качества образования.Каждый преподаватель стараясь усовершенствовать методы
опроса своих учеников, приходит к мысли об электронном тестировании. В целях
экономии времени преподавателя можно пользоваться данной платформой, которая
автоматически будет выставлять баллы за тестирование. Старые методы
тестирования уже не настолько эффективны в оценивании. Ведь компьютерный тест
может выдавать вопросы не по порядку, разграничивать степень сложности, а также
отсылать результат прохождения прямо на компьютер преподавателя.

Продукты проекта
— Приложение для проверки знаний учащихся

Глава 1

1.1. Компьютерное тестирование

Тесты давно стали неотъемлемой частью
рабочих будней любого педагога. Раньше приходилось печатать их на бумаге,
собирать листочки или тетради у каждого ученика, вручную проверять и
анализировать результаты. Сейчас в нашем распоряжении существуют
онлайн-сервисы, которые серьезно экономят время и ресурсы. Мы получаем новые
возможности: дистанционный сбор ответов, автоматическую оценку результатов,
мгновенное редактирование материалов.

Компьютерное
тестирование
– разновидность
тестирования с использованием современных технических средств, имеющее ряд
преимуществ по сравнению с традиционным бланочным тестированием

(получение мгновенного результата, исключение предвзятости, нормирование
трудности и объёма тестовых заданий, массовость, лёгкость обработки
результатов, возможность тестирующих программ работать в режиме обучения).

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

Компьютерное
тестирование имеет ряд преимуществ:

• Моментальное  получение
отметки каждым обучающимся после выполнения теста;

• Обучающиеся самостоятельно
могут оценить свои знания, возможности;

• Одновременную
проверку знаний всех обучающихся;

• Формировать у
обучающихся мотивацию для подготовки к каждому занятию, дисциплинирует их,
развивает у обучающихся добросовестность и аккуратность;

• Проверить большой
объем изученного материала;

• Избежать затрат
на бумагу.

Недостатки тестовых
форм контроля:

• Данные,
получаемые преподавателем в результате тестирования, хотя и включают в себя
информацию о пробелах в знаниях по конкретным разделам, но не всегда позволяют
судить о причинах этих пробелов;

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

• В тестировании
присутствует элемент случайности. Например, обучающийся, не ответивший на
простой вопрос, может дать правильный ответ на более сложный.

• Изначальные
затраты времени на изготовление пакета тестов по дисциплине очень большие;

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

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

1.2. Delphi 7

Мечта программистов о среде
программирования, в которой бы простота и удобство сочетались с мощью и
гибкостью, стала реальностью с появлением среды
Delphi. Она обеспечивала визуальное проектирование пользовательского
интерфейса, имела развитый объектно-ориентированный язык
ObjectPascal (позже переименованный в Delphi) и уникальные по своей простоте
и мощи средства доступа к базам данных. Язык
Delphi по возможностям значительно превзошел язык Basic и даже в чем-то язык C++, но при этом он оказался
весьма надежным и легким в изучении. В результате, среда
Delphi позволила программистам легко
создавать собственные компоненты и строить из них профессиональные программы.
Среда оказалась настолько удачной, что по запросам любителей
C++ была позже создана среда C++Builder — клон среды Delphi на основе языка C++ (с расширенным синтаксисом).Среда Delphi стала, по сути, лучшим средством программирования для операционной
системы
Windows.

У языка Delphi есть
одно очень важное преимущество перед остальными коммерчески успешными языками —
он великолепно подходит для обучения программированию. Поэтому многие рекомендуют
его в качестве первого языка для всех учеников и студентов, собирающихся стать
профессиональными программистами. Единственная проблема в освоении среды Delphi
— это ее гигантский объем. Новичок просто теряется в этом море поистине
безграничных возможностей.

Подпрограммы:

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

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

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

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

Все процедуры и функции языка Delphi
подразделяются на две группы: встроенные и определенные программистом.
Встроенные процедуры и функции являются частью языка и могут вызываться по
имени без предварительного описания. Процедуры и функции программиста пишутся
программистом, т.е. вами, в соответствии с синтаксисом языка и представляют
собой локальные блоки. Предварительное описание процедур и функций программиста
обязательно.

Процедуры программиста:

Очевидно, что встроенных процедур (Рис.1.
Код процедуры) и

Рис.1. Код процедуры

функций
для решения большинства прикладных задач недостаточно, поэтому приходиться
придумывать собственные процедуры и функции. По своей структуре они очень
напоминают программу и состоят из заголовка и блока. Заголовок процедуры
состоит из зарезервированного слова procedure, имени процедуры и
необязательного заключенного в круглые скобки списка формальных параметров. Имя
процедуры — это идентификатор, уникальный в пределах программы. Формальные
параметры — это данные, которые вы передаете в процедуру для обработки, и
данные, которые процедура возвращает (подробно параметры описаны ниже). Если
процедура не получает данных извне и ничего не возвращает, формальные параметры
(в том числе круглые скобки) не записываются. Тело процедуры представляет собой
локальный блок, по структуре аналогичный программы:

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

Параметры процедур

Параметры
служат для передачи исходных данных в подпрограммы и для приема результатов
работы этих подпрограмм. Исходные данные передаются в подпрограмму с помощью
входных параметров (
const),
а результаты работы подпрограммы возвращаются через выходные параметры(
out).
Параметры могут быть входными и выходными одновременно(
var).

Рекурсивные подпрограммы:

В ряде приложений алгоритм решения
задачи требует вызова подпрограммы из раздела операторов той же самой
подпрограммы, т.е. подпрограмма вызывает сама себя. Такой способ вызова
называется рекурсией. Рекурсия полезна прежде всего в тех случаях, когда
основную задачу можно разделить на подзадачи, имеющие ту же структуру, что и
первоначальная задача. Подпрограммы, реализующие рекурсию, называются рекурсивными.
Для понимания сути рекурсии лучше понимать рекурсивный вызов как вызов другой
подпрограммы. Практика показывает, что в такой трактовке рекурсия
воспринимается значительно проще и быстрее. При написании рекурсивных
подпрограмм необходимо обращать особое внимание на условие завершения рекурсии,
иначе рекурсия окажется бесконечной и приложение будет прервано из-за ошибки
переполнения стека.

Процедурные типы данных

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

Компонент Delphi Button— стандартная кнопка
делфи, кнопка имеет на поверхности надпись, описывающую её назначение при
нажатии. Основное событие для кнопки является OnClick, выполняемое при нажатии,
при этом кнопка меняет внешний вид, подтверждая этим происходящее действие
визуально. Сразу после отпускания кнопки, выполняется действия в обработчике
OnClick. Кнопку можно нажать не только щелчком мыши, но и комбинацией клавиш,
чтобы задать комбинацию необходимо перед символом используемым в комбинации
поставить символ амперсанта «&». После чего пользователь вместо щелчка мыши
может использовать сочетание клавиш Alt и клавишей выделенного символа.

Компонент Delphi Label предназначен
для показа текста на форме нашей программы, которые не будут меняться в течение
работы программы. Текст надписи компонента Label можно изменить, но делается
это только программно. Текст, отображаемый в компоненте, определяется значением
свойства Caption. Он прописывается в процессе проектирования или задается
программно во время выполнения программы.

Компонент DelphiImage
предназначен для отображение на форме графических изображений по умолчанию
выводит на поверхность формы изображения представленных в
bmp
формате. Для вывода изображений в
jpg
формате необходимо в дерективе
uses
подключить модуль
JPEG. После
размещения  на форме компонента
Image,
он принимает вид выделенной прямоугольной области.

Загрузить картинку можно в коде
программы, добавив строку (Рис.2. Загрузка изображения):

Image1.Picture.LoadFromFile(<имя_файла>);

Рис.2. Загрузка
изображения

Кроме этого, загрузить изображения
можно с помощью Object Inspector. Для этого находим свойство Picture и слева от
него нажимаем на три точки. Открывается окно Picture Editor и в нем выбираем
загрузить(Load), в раскрывшемся окне выбираем файл изображения.

Глава 2 Код
программы

Для программы было придумано
несколько форм:

·       
Start (Рис.3 Forma start):
отвечает за внос ФИО участника тестирования, которое вносится в поле
FIO,
тип
Edit, после нажимается кнопка
«Приступить», тип
Button,
которое выполняет следующую функцию:

(Рис.3 Forma start):

procedure TStart.Button1Click(Sender:
TObject);

begin

xl:=CreateOleObject(‘Excel.Application’);

xl.Workbooks.Open[ExtractFilePath(paramstr(0))+’/infa.xlsx’,0,false,
password:=’06061996′];

xl.Visible:=false;

xl.Range[‘F2’]:=FIO.Text;

xl.activeWorkbook.save;

nom:=xl.Range[‘A2’];

usl:=xl.Range[‘B2’];

z:=Strtoint(xl.range[‘m2’]);

Form2.nomer.Caption:=nom;

Form2.zadanie.Caption:=usl;

xl.ActiveWorkbook.Close;

start.Hide;

form2.showmodal;

end;

Согласно коду программы «xl.Range[‘F2’]:=FIO.Text» ФИО участника заносится в ячейку «F2» Excel файла infa.xlsx.  После чего программа переходит на 2 основную форму Form2.

·       
Form2 (Рис.4. Form2):
основная форма на которой присутствуют несколько полей:

o  
Tlabel: отвечающий за
отображения (загрузку) вопроса из
excel
файла,
согласно строке  «Zadanie.capion:=usl»,

Рис.4. Form 2

usly:=(‘B’+a);

xl.Range[‘C’+a]:=otvet.Text
;

otvet.Text:=»;

z:=z+1;

a:=Inttostr(z);

xl.Range[‘M2’]:=a;

nomy:=(‘A’+a);

usly:=(‘B’+a);

nom:=xl.Range[nomy];

usl:=xl.Range[usly];

nomer.Caption:=nom;

zadanie.Caption:=usl;

xl.activeWorkbook.save;

xl.ActiveWorkbook.Close;

o  
Блок otvet имеет тип Edit – вносится ответ ученика и
записывается в
excel файл, чтобы учитель мог перепроверить или выяснить «пробелы» в
знаниях ученика.

o  
2 кнопки типа Button: «Следующий» и «назад», которые
отвечают за переключения вопросов, параллельно согласно коду сохранять и
подгружает предыдущие ответы ученика:

o  
Кнопка «Закрыть» типа Button закрывает тестирование, не
завершив само тестирование, но промежуточные ответы ученика сохраняются в файл,
тем самым предотвращает потерю ответов – есть возможность восстановить варианты
ответов.

o  
Beta-тестирование присутствует
кнопка «Загрузить рисунок», которая позволяет учителю подгрузить фото/картинку
(например: графики функция, географические задание и т.д.), что позволяет
разнообразить типы заданий:

z:=Strtoint(xl.range[‘m2′]);
 копирует название

В
завершении тестирование ученику выводится сообщение с его результатом.

Глава
3 Форма эксель

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

·       
Столбец A отвечает за то, какой номер
вопроса задается учащемуся. В последующих ячейках столбца
A идут номера вопросов.

·    
Столбец B отвечает за то, какое условие
ставится учащемуся. В последующих ячейках столбца
B перечисляются условия, т.е.
вопрос и варианты ответа. (Рис.3. Образец заполнения формы
Excel (1)).

Рис.3. Образец заполнения формы Excel (1)

·       
Столбец C прописывает, какой ответ выбрал
ученик.

·       
Столбец D прописывает правильный ответ.

·       
Столбец E прописывает количество баллов,
набранное учеником, после сравнения столбцов
C и D.

·       
В столбце F прописывается фамилия
обучающегося.

·       
Столбец G прописывает количество номеров
в тесте, заданное преподавателем.

·       
В столбце H выводится итоговая оценка, на
основании набранных баллов. (Рис.4. Образец заполнения формы
Excel (2))

Рис.4. Образец
заполнения формы
Excel (2)

Рис.5. Общий
образец заполнения формы
Excel

Заключение

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

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

В программе на мой взгляд
имеется упрощённый интерфейс, что не вызовет трудностей и большинство обучающих
справятся с прохождением теста. Небольшая сложность оказалась в поиске нужной
информации для данного теста. Я самостоятельно изучала программу. Так же
ознакомилась с литературой, устранила некоторые недочёты и выявленные ошибки
при прохождении тестирования.

В результате проделанной
работы цель достигнута: создан тест в программной оболочке Delphi 7 для проведения
контроля знаний у обучающихся.

Конечным результатом моего
проекта является электронный тест, который в дальнейшем будет использоваться
для проведения итогового оценивания качества знаний у обучающихся. Цель которая
была поставлена в начале создания была успешно достигнута.

Список литературы

1.     Основы
программирования в
Delphi
7 / Автор: Н.Б.Культин

2.     Программирование
на языке Delphi Учебное пособие / Авторы: А.Н.Вальвачев, К.А.Сурков,
Д.А.Сурков, Ю.М.Четырько

3.     Информатика.
10 класс. Углубленный уровень / Авторы: К.Ю.Поляков, Е.А.Еремин

4.     НОУ
ИНТУИТ Лекция “Подпрограммы”  https://intuit.ru/studies/courses/3488/730/lecture/25789

5.     Процедуры
https://studfile.net/preview/9763175/page:16/

6.     Встроенные
процедуры и функции с вещественными аргументами
https://poisk-ru.ru/s39971t8.html

7.     Компонент
Button
https://www.h-delphi.ru/button/

Кто помог нам разобраться

Научный сотрудник лаборатории измерения новых конструктов и дизайна тестов в Центре психометрики и измерений в образовании Института образования ВШЭ. Руководитель проекта «4К: измерение критического мышления, креативности, коммуникации и кооперации». Преподаёт в Институте образования психометрику и методологию измерений в психологии и образовании.

В этой статье речь пойдёт о разработке образовательных тестов — заданий по проверке предметных знаний и навыков. Но в целом описанные правила универсальны: тесты для оценки психологических качеств или софт-скиллов разрабатываются аналогично.

Вы узнаете:

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

Психометрики называют тестом любой инструмент измерения — и ролевую игру, и эссе, и оценку портфолио. Мы подробно разберём инструмент, за которым в русском языке закрепилось слово «тест» в узком значении, — вопросы с выбором ответа из предложенных вариантов.

У стандартизированных тестов в образовании не лучшая репутация. Но психометрики по-прежнему отстаивают такой способ измерения: тесты с выбором ответа масштабируемы, справедливы и объективны. Это значит, что по одному и тому же тесту можно проверить сколько угодно учащихся, причём все будут в равных условиях, а на результат не повлияет ничьё постороннее мнение.

Но в то же время любой психометрик скажет вам, что тесты с выбором ответа — не универсальный инструмент. Способ проверки знаний выбирают с учётом того, какой именно конструкт необходимо измерить. Конструктом в психометрике называют свойство психики или способность, которые нельзя наблюдать напрямую, но можно измерить по внешним поведенческим признакам.

Фото: BublikHaus / Shutterstock

Для каких конструктов подходят тесты с выбором ответа? Это практически идеальный инструмент для оценки знания фактов и сугубо технических навыков. Например, для проверки знания о том, как отделить команды друг от друга при программировании на определённом языке.

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

Такие тесты способны выявить не любые знания. В любой дисциплине есть простые факты, и по ним легко написать вопросы с несколькими вариантами ответа. Например, спросить, в каком году Колумб открыл Америку.

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

Каждый преподаватель хочет, чтобы студенты не только помнили факты, но и понимали материал. Но, увы, понимание как таковое пока невозможно измерить. Может быть, нейронауки в отдалённом будущем дадут возможность следить за всем, что происходит внутри черепной коробки каждого ученика. Но сейчас психометрика работает с тем, что можно наблюдать, с поведенческими проявлениями. У понимания таких универсальных проявлений нет.

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

Если ваша задача — проверить усвоение фактологических знаний или отдельных навыков, тест с выбором ответов вполне подойдёт. Чтобы составить и распространить такой тест, не нужны сложные цифровые сервисы. Для базовых задач вполне достаточно форм Google или «Яндекса».

В этом разделе статьи разберёмся с основными вопросами о том, как составить хороший тест. А если нужно узнать по этой теме больше, советую книгу: Haladyna T. M., Rodriguez M. C. Developing and validating test items (Routledge, 2013) — и другие работы её авторов. Правда, на русском языке она, к сожалению, не выходила.

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

Но и коротким он быть не может — у небольших тестов ниже надёжность. На какой-то вопрос учащийся даст неверный ответ по невнимательности, а где-то, наоборот, случайно угадает правильный вариант. Если тест будет достаточно объёмным, больше шансов, что такого рода ошибки уравновесят друг друга и итоговый результат будет достоверен.

Фото: Achira22 / Shutterstock

Так как определить, какой длины должен быть тест? Нужно отталкиваться от времени на решение одного задания. Оно зависит от трудности и может составлять от нескольких десятков секунд до пяти минут. Также стоит учитывать возраст учащихся:

  • Детям до подросткового возраста нельзя давать задание дольше, чем на 20 минут, — или нужно предусмотреть возможность перерыва в тесте.
  • Для старших подростков и студентов, а также взрослых лучше исходить из продолжительности привычного занятия. Например, для старшеклассника нормально посвятить тесту урок в 45 минут (или два урока с переменой между ними). А для студентов уже можно написать тест и на 80 минут.
  • В дополнительном образовании взрослых следует учитывать, что взрослый человек уже не считает себя обязанным участвовать ни в каких тестах. Ему нужна дополнительная мотивация. Например, можно пообещать индивидуальную обратную связь по результатам теста (и потом обязательно её предоставить!).

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

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

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

А сложность — отдельное психометрическое понятие. Оно характеризует, сколько действий и когнитивных операций нужно выполнить в процессе решения. Возьмём математический пример. Задание разделить 0,219 на 0,365 трудное, но не сложное: оно состоит всего из одного действия.

И начинать тест следует с более лёгких заданий, то есть с нетрудных. В начале теста уровень стресса всегда выше, что искажает результаты. Если вопросы в тесте распределены по тематическим блокам, можно в каждом из них располагать задания от лёгких к трудным.

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

Фото: roibu / Shutterstock

Как именно поступить, решают в зависимости от дисциплины и задач теста. Но важно ставить всех тестируемых в одинаковые условия, чтобы результаты были сопоставимы.

В целом делить на блоки тест правильно: так тестируемый увидит, что тест не бесконечен. В ситуации компьютерного тестирования, когда нельзя пролистать задания и понять, сколько ещё осталось, это важно. И, конечно, нужно предупредить, если время на ответы ограничено.

Наиболее привычны сегодня тесты как в ЕГЭ — с четырьмя вариантами ответа. Иногда можно услышать, что это связано с объёмом рабочей памяти: якобы четыре варианта появились, потому что именно такое количество элементов средний человек способен одновременно удерживать в уме.

Психологи-когнитивисты такое обоснование считают ненаучным. Скорее всего, к четырём вариантам ответа практики пришли случайно, и ничего биологически или психологически заданного в этой цифре нет. Вариантов может быть и меньше — например, три.

А вот придумать больше неверных ответов обычно затруднительно.

Создание неправильных вариантов ответа — на самом деле сложное психометрическое мастерство. Не зря их называют дистракторами, то есть отвлекающими внимание от верного варианта.

Суть в том, что неправильные ответы должны быть похожи на правильный и привлекательны. Очевидно неправильных ответов нужно избегать, как и ответов из другой области. Например, если в вопросе стоит формулировка «В каком году?», все ответы должны быть датами примерно из одного диапазона.

Но неверные варианты не должны содержать в себе правильный ответ или какую-то его часть — иначе нужно в вопросе объяснить, что тестируемый должен выбрать самый правильный ответ.

Высший пилотаж — неправильные варианты на основе типичных ошибок студентов. Это позволяет давать более глубокую обратную связь: не просто показывать, где учащийся ошибся, а анализировать, почему он выбрал именно такой неправильный вариант.

Кроме надёжности, у любого теста есть ещё одно важное качество — валидность. По классическому определению, валидность — свойство теста измерять то, на что он направлен. Более современное определение гласит, что результаты валидного теста можно интерпретировать в той логике, в которой он создан.

И иногда на валидность может повлиять просто то, что тестируемый иначе (но не неправильно!) смотрит на ситуацию в задании.

Возьмём пример из теста на критическое мышление, разработанного в ВШЭ. Это тест‑симуляция онлайн-среды, в ней нужно общаться с ботом. Одна из задач — получить недостающую информацию для рецепта торта.

По идее, тестируемый должен задать боту конкретный вопрос, например: «Сколько яиц нужно добавить?» Но человек может начать с приветствия, и не потому, что не понял задание. Сказать «Привет, как дела?» перед тем, как уточнять рецепт, вообще‑то нормально. Но если об этом не подумать при составлении теста, такой ответ будет оцениваться как ошибочный.

Одно из частых опасений по поводу тестов и причин, почему в них предлагают добавлять больше вариантов ответа, — «угадайка». Кажется, что в задании с двумя вариантами ответа вероятность угадать составляет 50%. Но это верно только в случае, когда весь тест состоит из одного вопроса с двумя вариантами ответа.

Фото: roibu / Shutterstck

Если добавить второй вопрос, в котором не будет подсказок к первому и наоборот, вероятности просто перемножатся. И шанс случайно угадать правильные ответы составит уже 25%. В случае с тестом из десяти заданий вероятность ответить на всё правильно случайно пренебрежимо мала.

Но такой расчёт справедлив только для тестов с хорошо написанными неправильными ответами.

На магистерской программе Института образования психометриков учат проверять работоспособность тестов все два учебных года. Попробуем коротко разобрать, что именно они изучают.

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

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

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

Понятно, что для каждого курса такую проверку не проведёшь, обычно достаточно интервью. Но количественная оценка обязательна, если по результатам теста принимается какое-либо решение — о зачислении на курс, о сертификации.

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

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

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

Результаты
автоматизированной проверки лучше
поддаются анализу, чем субъективно
выставляемые оценки.

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

2.1 Реализация программы

Программа
реализована на языке программирования
C#. Интерфейс программы
представляет собой поле с вопросом и 4
варианта ответа (Рисунок 1).

Рисунок 1 ­–
Интерфейс программы

2.2 Метод ReadQuestions()

Программа читает
вопросы из файла, который находится в
основном директории. Вопросы составлены
по форме:

Криптография-
это наука, изучающая вопросы … #Обеспечение
секретности сообщений с использованием
различных методов #защита информации
от вирусов #ТБ при работе с компьютером
#шифрование информации

Алгоритм
чтения вопросов:

  1. Символы до первого
    знака #– считаются вопросом;

  2. После первого
    символа # – правильный ответ на заданный
    вопрос;

  3. Последующие ответы
    считаются ложными.

Замечание: алгоритм
составлен по форме «1x4»,
что означает один вопрос и четыре
варианта ответа, один из которых
правильный.

void
ReadQuestions
()

{StreamReader
reader =
new
StreamReaderqstns.txt«);

questions.Clear();

try

{string
line = «»;

do

{line
= reader.ReadLine();

string[]
splitResult
= line.Split(‘#’);

QuestionAndAsnwer
temp = new
QuestionAndAsnwer();

temp.Questeion
= splitResult[0];

temp.Answer1
= splitResult[1];

temp.Answer2
= splitResult[2];

temp.Answer3
= splitResult[3];

temp.Answer4
= splitResult[4];

questions.Add(temp);

}
while
(reader.Peek()
!= -1);

OverallCount
= questions.Count;

Complteted
= 0;

CorrectAnswered
= 0;

GetRandomQuestion();

}

Заключение

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

В базу вопросов
внесены вопросы по дисциплине
«Математические основы защиты информации».

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

Разработка программы проверки знаний для тестирования студентов по программированию с кодом на языке Delphi

Содержание

Введение

Цель работы

. Анализ технического задания и постановка задачи
проектирования

. Разработка экранных форм и алгоритма программы

. Описание программных модулей

.1 Описание переменных и объектов

.2 Описание процедуры BitBtn1Click

. Инструкция оператору

Заключение

Список используемой литературы

Приложения

Введение

Данный курсовой проект был разработан в среде Delphi. Среди множества
языков, является наиболее универсальным и легко изучаемым языком. При этом его
удобно использовать для создания сложных приложений, базами данных, приложения
масштаба предприятия. Delphi позволяет использовать все современные возможности
объектно-ориентированного программирования.- это среда быстрой разработки, в
которой в качестве языка программирования используется язык Delphi. Язык Delphi
— строго типизированный объектно-ориентированный язык.прост и логичен. Основные
конструкции языка четко выделяются в программе, что способствует хорошему
восприятию написанного кода. Графический интерфейс Delphi отлично продуман,
среда разработки предоставляет доступ только к тем участкам кода, с которыми
необходимо работать, скрывая основную часть программы, которая создается
автоматически самой разработкой.

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

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

Цель работы

Цель работы: разработать программу проверки знаний для тестирования
студентов по программированию с кодом на языке Delphi, для ввода и вывода
данных использовать компоненты Delphi.

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

1. Анализ технического задания и постановка задачи проектирования

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

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

Дадим определение понятиям, которые используются в данной работе.
Определим следующие понятия: строка, файл, массив, запись.

Тип STRING (строка) в «Borland Delphi» широко используется для обработки
текстов. Он во многом похож на одномерный массив символов ARRAY [0..N] OF CHAR,
однако, в отличие от последнего, количество символов в строке-переменной может
меняться от 0 до N, где N — максимальное количество символов в строке.

Под файлом понимается либо именованная область внешней памяти ПК
(жесткого диска, гибкой дискеты, электронного «виртуального» диска), либо
логическое устройство — потенциальный источник или приемник информации.

Запись представляет собой совокупность компонент различных типов.

«Borland Delphi» может использовать объекты, содержащее множество
однотипных элементов, которые называются массивами. Массив — это формальное
обледенение нескольких однотипных объектов (чисел, символов, строк и т.п.),
рассматриваемое как единое целое. Для хранения содержимого типизированного
файла и обработки удобно использовать массивы с элементами типа запись.
Удобство массивов заключается в том, что можно обращаться к отдельному элементу
массива по номеру. Дополнительное удобство привносят динамические массивы,
отличительной особенностью которых является возможность динамического изменения
размерности массива, то есть динамическое выделение или освобождение памяти под
требуемое в данный момент количество элементов массива.

Поскольку данная программа является приложением Windows, то для ее
реализации будем использовать стандартный подход при написании программ под
Windows с использованием графического интерфейса. Так отдельно создадим форму с
визуальными компонентами, для различных визуальных компонент сопоставляем
процедуры — обработчики. Далее, как только происходит событие на каком-то из
визуальных компонент, (щелчок мыши, нажатие на кнопку или пункт меню),
операционная система посылает приложению соответствующее сообщение, и
запускается соответствующий обработчик именно для этого события. Тогда решение
задачи можно разбить на 3 этапа:

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

)        Разработка обработчиков событий от элементов экранных форм,
разработка алгоритмов и программных кодов действий обработки текстового файла
согласно заданию.

)        Подготовка тестовых исходных данных и отладка программы.

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

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

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

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

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

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

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

запрашивать фамилию, имя и группу учащегося;

выводить поочередно вопросы из базы;

принимать ответы учащегося;

анализировать правильность ответов и рассчитывать итоговый балл
пропорционально количеству правильных ответов;

вести протоколирование ответов и записывать их в файле на жестком диске;

по окончании тестирования выводить правильную оценку;

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

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

2. Разработка экранных форм и алгоритма программы

В предыдущем разделе было сказано, что процесс решения поставленной
задачи разбивается на 3 этапа, первый из которых заключается в построении
интерфейса с пользователем на основе экранных форм и визуальных объектов
проектирования.

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

Таблица 2.1 — Объекты экранной формы FormAvto

Имя

Тип

Назначение

Label1

TLabel

надпись «Задайте фамилию,
инициалы и группу учащегося»

Label2

TLabel

надпись «Фамилия»

Label3

TLabel

надпись «Имя»

Efam

TEdit

поле для вода фамилии
учащегося

EGroup

TEdit

поле для ввода группы
учащегося

BitBtnStart

TBitBtn

Для начала теста предусмотрена кнопка типа TBitBtn, который в отличие от
обычных кнопок типа TButton позволяет задавать не только текст, но и
изображение. В обработчике нажатия на эту кнопку должна выводиться форма с
вопросами. Внешний вид спроектированной формы приведен на рисунке 2.1

Рисунок 2.1 — Внешний вид формы FormAvto

Для вывода вопросов, ввода ответов пользователя предусмотрим отдельную
форму FormTest. Список объектов, используемых в форме приведен в таблице 2.2, а
внешний вид приведен на рисунке 2.2.

Таблица 2.2 — Объекты экранной формы FormTest

Имя

Тип

Назначение

Label1

TLabel

надпись «Текущий вопрос»

LbNom

TLabel

надпись, в которой будет
выводиться номер текущего вопроса

StaticText1

TStaticText

поле, в котором будет
выводиться очередной вопрос

RGroup1

TRadioGroup

поля для вывода вариантов
ответов и их указания студентом

BitBtn1

TBitBtn

кнопка «Принять ответ» для
анализа ответа и перехода к следующему вопросу

BNewTest

TButton

кнопка для закрытия формы
тестов и перехода на форму авторизации (для новой попытки тестирования)

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

Рисунок 2.2 — Внешний вид формы FormTest

Во избежание кратковременного завершения теста скроем системное меню
окна, установив параметр формы FormTest. BorderIcons biSystemMenu равным false.
Также в алгоритме следует предусмотреть, что в начале тестирования кнопка с
надписью «Начать заново» должна быть невидимой, и должна появляться только
после ответа на все вопросы и вывода итоговой оценки.

Анализируя все вышеизложенные предположения и разработанные формы, можем
составить словесные алгоритмы приложения.

.        Запустить экранную форму авторизации FormAvto

.        При нажатии на кнопку «Начать» следует выполнить действия:

.1      Сгенерировать базу вопросов, и перемешать их случайным образом;

.2      Сформировать имя файла из имени студента и его группы и открыть
файл для записи;

.3      Обнулить количество правильных ответов;

.4      Установить номер текущего вопроса на первый вопрос;

.5      Скрыть форму FormAvto и показать форму с тестами FormTest;

.6      Показать первый вопрос и варианты его ответов на форме FormTest;

.7      Ожидать нажатия на кнопку «Принять ответ».

.        При нажатии на кнопку «Принять ответ» следует выполнить
действия:

.1      Проанализировать выбранный вариант ответа и сравнить его с
правильным, и если ответ правильный, то нарастить количество правильных ответов
на 1;

.2      Записать в файл протокола текущий вопрос и вариант, который
выбрал пользователь в качестве ответа;

.3      Если номер текущего вопроса меньше общего количества вопросов в
базе, то нарастить номер на 1, вывести очередной вопрос на форму и перейти к
началу пункта 3.

.4      Если номер текущего вопроса равен количеству вопросов в базе, то:

.4.1.  подсчитать оценку пропорционально количеству правильных ответов;

.4.2.  показать сообщение с оценкой;

.4.3.  сделать кнопку «Начать заново» видимой

.        При нажатии кнопки «Начать заново» закрыть форму с тестами
FormTest и показать форму авторизации FormAvto.

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

)        Генерация базы вопросов;

)        Перемешивание базы вопросов случайным образом;

)        Анализ текущего ответа и переход на следующий вопрос, если
вопрос не последний либо вывод результатов тестирования при достижении
последнего вопроса;

)        Модули перехода между экранными формами авторизации и
тестирования.

Каждый из вышеприведенных модулей реализуем при помощи процедуры. Модуль
1 целесообразно запускать один раз при создании формы с тестами. Модуль 2
следует запускать каждый раз при начале нового теста, то есть при активизации
формы с тестами. Модель 3 должен запускаться каждый раз при нажатии на кнопку
«Принять ответ». Модули 4 должны быть обработчиками нажатий на кнопку «Начать»
экранной формы авторизации и кнопку «Начать заново» экранной формы
тестирования.

Составим алгоритм приложения, который представлен в приложении на рисунке
A.1. На алгоритме приведены основные события экранных форм. В этом алгоритме:

Блок №4 реализован процедурой FormAvto, BitBtnStartClick,

блок №5 — процедурой FormTest. FormCreate,

блок №6 — процедурой FormTest. FormActivate,

блок №7
— процедурой FormTest BNewTestClick,

блок №8
реализован процедурой FormTest. BitBtn1Click.

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

3. Описание программных модулей

.1 Описание
переменных и объектов

В программе используется переменная FormAvto, которая представляет собой
экранную форму. Объекты экранной формы были приведены в таблице 2.1. У формы
имеется лишь один обработчик нажатия на кнопку BitBtnStart. Текст обработчика
приведен в строках 26-32 листинга из приложения Б. В теле обработчика
происходит считывание введенных имени и фамилии учащегося и его группы в
переменные, после чего исходная форма скрывается и активизируется форма тестирования.

Переменная FormTest, представляет собой экранную форму, объекты которой
приведены в таблице 2.2.

В разделе var опишем переменные, приведенные в таблице 3.1

Таблица 3.1 — Переменные программы

Наименование

Тип

Назначение

String

хранение фамилии и группы
учащегося

fName

String

имя текстового файла для
записи протокола

f

TextFile

переменная для работы с
текстовым файлом

BasaV

CVoprosi

класс, хранящий базу
вопросов и ответы

CurN

byte

номер текущего вопроса из
базы

Ratio

byte

количество правильных
ответов

Для хранения базы вопросов разработаем пользовательский класс CVoprosi. В
классе содержится одно поле и два метода. Поле test — это динамический массив,
в котором хранятся вопросы и ответы. При это каждый тест храниться в виде
записи типа TTest со следующими полями:

         Vopr: string — содержит вопрос теста;

         ans: array [0..3] of string — содержит 4 варианта ответов;

         korans: byte — содержит вариант правильного ответа (его номер в
массиве ans).

Для формирования базы ответов создан метод AddTest (_vopr, _ans0, _ans1,
_ans2, _ans3:string; _korans:byte), которому в качестве параметров передаются
вопрос, четыре варианта ответов и номер правильного ответа, а в теле метода
происходит увеличение длины массива с тестами на единицу и текущий тест записывается
в конец массива.

Второй метод класса CVoprosi. Mix предназначен для перемешивания базы
вопросов. В нём организован цикл, в теле которого генерируются два произвольных
числа i1 и i2 в интервале от 0 до количества вопросов в базе каждое. После чего
вопросы с номерами i1 и i2 меняются местами.

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

Таблица 3.2. Пользовательские процедуры и обработчики событий

Наименование

Обр-к

Назначение

Строки

BitBtnStartClick

+

переход на форму тестов
после нажатия «НАЧАТЬ»

26-32

FormCreate

+

формирование базы вопросов
при создании фомры тестирования

108-156

FormActivate

+

инициализация тестирования
(перемешивание, сброс количества ответов и номера текущего вопроса, вывод
первого вопроса) при активизации формы тестирования

157-182

BitBtn1Click

+

анализ введенного ответа и
вывод очередного вопроса или итоговой оценки

183-228

BNewTestClick

+

закрытие формы тестов и
переход на форму авторизации при нажатии на «Начать заново»

229-235

AddTest

добавление нового теста в
базу

78-90

Mix

перемешивание базы тестов
случайным образом

91-107

3.2 Описание
процедуры BitBtn1Click

Процедура BitBtn1Click предназначена для анализа ответа и вывода очередного
вопроса или итоговой оценки. Алгоритм выполнения процедуры приведен на рисунке
А.2 приложения А.

В теле процедуры выполняются следующие действия: Если текущий номер
вопроса меньше общего количества вопросов, то формируется строка S c вопросом и
выбранным ответом и записывается в файл протоколов f. Сравнивается выбранный
номер ответа (RGroup1. ItemIndex) с номером правильного ответа
(BasaV.test[curN].Korans) и, если он совпадает, то наращивается количество
правильных ответов Ratio. Наращивается номер текущего вопроса curN. И очередной
вопрос с вариантами ответов выводится на форму.

Если все вопросы были заданы (curN равно количеству вопросов), то
рассчитывается итоговая оценка как (Ratio*12)/(общее количество вопросов) и
записывается в файл протокола, а также выводится сообщение в виде диалогового
окна с оценкой. Также становится видимой кнопка BNewtest c надписью «Начать
заново», позволяющая перейти на форму авторизации. Во избежание подбора ответов
выводится только последняя итоговая оценка без указания в каких вопросах были
сделаны ошибки.

4. Инструкция оператору

Разработанная программа представляет собой исполняемый файл Tester.exe
размером 422912 байт. В программе выполняется тестирование пользователя основам
языка Pascal.

После запуска программы появляется окно, изображенное на рисунке 4.1.

Рисунок 4.1 — Окно авторизации

В этом окне учащийся должен задать свою фамилию и группу, после чего
нажать на кнопку с надписью «НАЧАТЬ». После этого появится вторая форма с тестовыми
вопросами, изображенная на рисунке 4.2. Заметим, что порядок вопросов при
каждом новом запуске случайный, поэтому содержание поля вопроса и ответом может
быть иным.

Рисунок 4.2 — Окно тестирования

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

После этого следует нажать на кнопку .

Появится новый вопрос, ответ на который реализуется аналогичным способом.
Если были пройдены все вопросы, выводится сообщение с оценкой, которая
пропорциональна количеству правильных ответов. Все ответы правильные — оценка
равна 12. Все ответы неправильные — оценка равна 0. Пример окна с сообщением об
оценке приведено на рисунке 4.3.

После этого можно вернуться на окно авторизации, чтобы пройти тест
заново, нажав на кнопку .

Протокол с вариантами ответов, которые были введены учащимся заносятся в
текстовый файл на жестком диске с именем «<фамилия>+<группа>.txt» в
том же каталоге, где находится исполняемый файл. Пример протокола с правильными
вариантами ответов приведен в приложении В.

Заключение

Данный курсовой проект был выполнен в полном соответствии поставленному
заданию и отлажен в среде DELPHI 7.0. В ходе выполнения курсовой работы была
разработана программа для тестирования студентов по программированию с
графическим интерфейсом. База содержит 20 вопросов. Программа может бать
использована в образовательных целях.

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

В результате выполнения данной курсовой работы, я убедился в широких
возможностях языка программирования Delphi 7.

Список используемой литературы

1. Валентин Озеров «Советы по Delphi», 1999

2.      Зуев Е.А. Программирование на языке Turbo Pascal 6. 0,7.0.
— М.: Радио и связь, Веста, 1993.

.        Фаронов В.В. Turbo Pascal 7.0. Начальный курс. — М.: Нолидж, 2000.

.        Фаронов В.В. «DELPHI. Программирование на языке
высокого уровня». — Питер, 2005.

.        Дятченко Д.А. Методические указания к выполнению
курсовой работы по дисциплине «Программирование и алгоритмическе языки» —
Северодонецк, 2005.

Приложение 1

Алгоритм программы

Рисунок А.1 — Обработка событий экранных форм программы

Рисунок А.2 — Алгоритм процедуры BitBtn1Click

программа delphi алгоритм

Приложение 2

Модуль формы авторизации

unit Unit2;

interface, Messages,
SysUtils, Variants, Classes, Graphics,, Forms, Dialogs, StdCtrls, Buttons;=
class(TForm): TLabel;: TLabel;: TLabel;: TEdit;: TEdit;:
TBitBtn;BitBtnStartClick (Sender: TObject);

{Private declarations}

{Public declarations};:
TFormAvto;Unit1;

{$R *.dfm}TFormAvto.
BitBtnStartClick (Sender: TObject);:=EFam. Text+ ‘ ‘;:=EGroup. Text;;. Show;;.

Модуль формы тестирования

unit Unit1;, Messages,
SysUtils, Variants, Classes, Graphics,, Forms, Dialogs, StdCtrls, ExtCtrls,
Buttons;= class(TForm): TBitBtn;: TLabel;: TLabel;: TStaticText;: TRadioGroup;:
TButton;FormCreate (Sender: TObject);BitBtn1Click (Sender:
TObject);BNewTestClick (Sender: TObject);FormClose (Sender: TObject; var
Action: TCloseAction);FormActivate (Sender: TObject);

{Private declarations}

{Public declarations};=
record:string; // вопрос:array [0..3] of string;
// ответы

korans:byte; // номер правильного
ответа;

CVoprosi = class: array of
TTest;AddTest (_vopr,_ans0,_ans1,_ans2,_ans3:string;_korans:byte);Mix;;,
Sgr:string; // фамилия и группа учащегося:string;: TEXTFILE;: TFormTest;:CVoprosi;:byte; // номер текущего вопроса

Ratio:byte; // количество правильных
ответовUnit2;

{$R *.dfm}

// метод для добавления нового теста
в базу

Procedure CVoprosi.
AddTest (_vopr,_ans0,_ans1,_ans2,_ans3:string;
_korans:byte);ln:integer;:=Length(test);(test, ln+1);[ln].vopr:= _vopr;[ln].ans[0]:=
_ans0;[ln].ans[1]:= _ans1;[ln].ans[2]:= _ans2;[ln].ans[3]:= _ans3;[ln].korans:=
_korans;;

// перемешивание базы
вопросовCVoprosi. Mix;, i1, i2, ln:byte;:TTest;:=Length(test);i:=1 to 20 do:=Random(ln); //
случайный №1

i2:=Random(ln); // случайный №2

// меняем местами вопросы №1 и №2

TestTmp:=test[i1];[i1]:=test[i2];[i2]:=TestTmp;;;TFormTest.
FormCreate (Sender: TObject);

begin

// формирование базы
вопросов:=CVoprosi. Create;. AddTest (‘Что выведет следующая
программа?’+#10+#13+’var i, sum:sіnglе;’+#10+#13+

‘bеgin’+#10+’sum:=1;’+#10+

‘ for і:=2 to 10 dо sum:=sum+i;’+#10+

‘ WrіtеLn(sum);’+#10+’еnd.’,

’10’, ’55’, ‘9’, ‘произойдет ошибка
компиляции’, 3);. AddTest (‘Какое значение вернет выражение?’+#10+’ chr
(ord(«A»)+3)’,

‘A3′, ’68’, ‘ «D» ‘, ‘ «C»
‘, 2);

BasaV. AddTest (‘С чего не может
начинаться идентификатор?’,

‘с малой латинской буквы’, ‘с большой
латинской буквы’, ‘с подчеркивания’, ‘с цифры’, 3);. AddTest (‘Что из
нижеперечисленного может быть использовано как идентификатор?’,

‘ord’, ‘for1’, ‘cardinal’,
‘C#21’, 1);

BasaV. AddTest (‘Какой из приведенных
типов целочисленный?’,

‘real’, ‘byte’, ‘double’,
‘single’, 1);. AddTest
(‘Какой из приведенных типов можно использовать для хранения дробных чисел?’,

‘byte’, ‘word’, ‘double’,
‘integer’, 2);. AddTest
(‘Какая из приведенных инструкций является циклом с заданным числом
повторений?’,

‘while <…> do ‘,
‘for <…> do ‘, ‘repeat until <…>’, ‘if <> then ‘, 1);

BasaV. AddTest (‘Какая из приведенных
инструкций является циклом с предусловием?’,

‘for <…> do ‘,
‘while <…> do ‘, ‘repeat until <…>’, ‘if <> then ‘, 1);

BasaV. AddTest (‘Какая из приведенных
инструкций является циклом с постусловием?’,

‘for <…> do ‘,
‘while <…> do ‘, ‘repeat until <…>’, ‘if <> then ‘, 2);

BasaV. AddTest (‘Какая из приведенных
инструкций является инструкцией ветвления?’,

‘for <…> do ‘,
‘while <…> do ‘, ‘repeat until <…>’, ‘if <> then ‘, 3);

BasaV. AddTest (‘Какая из приведенных
инструкций целочисленного деления?’,

‘MOD’, ‘DIV’, ‘/’, ‘ODD’,
1);

BasaV. AddTest (‘Какая из приведенных
инструкций — остаток от деления?’,

‘MOD’, ‘DIV’, ‘/’, ‘ODD’,
0);

BasaV. AddTest (‘Какая из приведенных
инструкций вещественного деления?’,

‘MOD’, ‘DIV’, ‘/’, ‘ODD’,
2);

BasaV. AddTest (‘Какая из приведенных
инструкций проверка на четность?’,

‘MOD’, ‘DIV’, ‘/’, ‘ODD’,
3);

BasaV. AddTest (‘Укажите функцию
округления по правилам арифметики:’,

‘TRUNC()’, ‘FRAC()’,
‘ROUND()’, ‘INT()’, 2);

‘TRUNC()’, ‘FRAC()’,
‘ROUND()’, ‘INT()’, 1);

BasaV. AddTest (‘Укажите функцию
округления к нулю с целочисленным результатом:’,

‘TRUNC()’, ‘FRAC()’,
‘ROUND()’, ‘INT()’, 0);

BasaV. AddTest (‘Укажите функцию
округления к нулю с вещественным результатом:’,

‘TRUNC()’, ‘FRAC()’,
‘ROUND()’, ‘INT()’, 3);

BasaV. AddTest (‘Укажите функцию
открытия существующего файла:’,

‘ASSIGNFILE()’,
‘REWRITE()’, ‘RESET()’, ‘CLOSEFILE()’, 2);

BasaV. AddTest (‘Укажите функцию
создания нового файла и открытия его для записи:’,

‘ASSIGNFILE()’,
‘REWRITE()’, ‘RESET()’, ‘CLOSEFILE()’, 1);

randomize;;

// ***************************

// активизация формы с тестами

// ***************************

procedure TFormTest.
FormActivate (Sender: TObject);

var ln:integer;

fName:=SFam+’
(‘+SGr+’)’+’.txt’;

assignfile (f, fName);(f);.
Visible:=false;

// перемешивание базы вопросов. Mix;

// количество правильных ответов:=0;

// текущий вопрос 0:=0;

// отображаем первый вопрос на форме

StaticText1.
Caption:=BasaV.test[curN].vopr;. Items[0]:=BasaV.test[curN].ans[0];.
Items[1]:=BasaV.test[curN].ans[1];. Items[2]:=BasaV.test[curN].ans[2];.
Items[3]:=BasaV.test[curN].ans[3];

RGroup1. ItemIndex:=0;:=Length
(BasaV.test);

LbNom. Caption:= IntToStr
(curN+1) + ‘ из ‘ + IntToStr(Ln);

end;

// ***************************

// обработчик нажатия на кнопку
«Принять ответ»

// ***************************

procedure TFormTest.
BitBtn1Click (Sender: TObject);

var, S:string;:byte;

// проверка ответа:=Length
(BasaV.test);(CurN<ln) then

// записываем лог ответов в файл

S:= BasaV.test[curN].vopr
+ ‘ (ответил: — ‘+.test[curN].ans
[RGroup1. ItemIndex]+’)’;(f,
S);

// проверяем, правильно ли был сделан
ответ

if (RGroup1. ItemIndex =
BasaV.test[curN].Korans) then

Ratio:= Ratio +1;:=CurN+1;CurN=ln
then // была последняя запись

// сообщение с результатом:=
‘Итоговая оценка: ‘+FloatToStr (Ratio*12/ln);

// запись результа в файл(f,
Sfam+Sgr);(f, sRes);(f);;;CurN>=ln then:= ‘Итоговая оценка: ‘+FloatToStr
(Ratio*12/ln);

Application. MessageBox
(PAnsiChar(sRes), PAnsiChar (SFam+Sgr));

BNewtest. Visible:=true;;;

// отображаем следующий вопрос на
форме

StaticText1.
Caption:=BasaV.test[curN].vopr;. Items[0]:=BasaV.test[curN].ans[0];.
Items[1]:=BasaV.test[curN].ans[1];. Items[2]:=BasaV.test[curN].ans[2];.
Items[3]:=BasaV.test[curN].ans[3];

RGroup1. ItemIndex:=0;

LbNom. Caption:= IntToStr
(curN+1) + ‘ из ‘ + IntToStr(Ln);

end;

// ***************************

// закрыте формы с тестами

// ***************************

procedure
TFormTest.BNewTestClick (Sender: TObject);

begin;;

// ***************************

// активизация формы с авторизации

// ***************************

procedure TFormTest.
FormClose (Sender: TObject; var Action: TCloseAction);

Приложение 3

Моя программа выполняет тестирование студентов по программированию. При
открытии программы появляется окно (рис В.1), тестирования в котором нужно
вести Фамилию Имя и Группу. Тестирование состоит из 20 вопросов, в каждом
вопросе четыре варианта ответа необходимо выбрать один правильный (рис В.2). В
конце тестирования появляется окно в котором выводится бал за количество
ответов по 12 бальной системе (рис В.3).

Рисунок В.1 — Окно авторизации

Рисунок В.2 — Внешний вид формы FormTest

Рисунок В.3 — Итог

Понравилась статья? Поделить с друзьями:
  • Как написать программу случайных чисел на питоне
  • Как написать программу семинара
  • Как написать программу развития школы
  • Как написать программу психолого педагогического сопровождения
  • Как написать программу под андроид на питоне