Генераторы заданий MyTestXPro
Информация для версии 11.0.0.62, для версии 11.0.0.61 смотрите Генераторы заданий (старая версия).
Генератор заданий позволяет быстро на основе задания-шаблона создать большое количество подобных заданий.
Содержание
Шаблоны
Сначала необходимо создать задание-шаблон на основе которого будут автоматически создаваться новые задания. От обычного задания оно отличается тем, что вместо конкретных чисел или слов указаны шаблоны-подстановки. Шаблоны записываются в тексте как {%шаблон%}. Имя шаблона может содержать русские и латинские буквы, цифры и символ подчеркивания.
Например, вопрос может быть записан так: "Переведите двоичное число {%дв_число%}2 в десятичную систему счисления."
Если задание на ручной ввод ответа и ответ генерируется автоматически, то в поле ответа ничего писать не нужно - ему соответствуют шаблон {%answer%}. Если вариантов ответа несколько, то каждому {%answer1%}, {%answer2%}...{%answer10%}.
Если задание с вариантами ответа, то в тексте вариантов ответов можно тоже сделать шаблоны.
Для заданий с вариантами ответов шаблоны answer1, answer2... answer10 позволяют указать отмечен (значение 1 или true или +) или нет вариант ответа, а для типа сопоставление, с чем сопоставить.
Генератор вместо шаблонов подставит конкретные значения и получится готовое задание.
Для открытия генератора выберите задание-шаблон и дайте команду Задания → Генератор...
Скрипт
Скрипт позволяет подготовить данные для создания заданий. Он пишется на языке программирования JavaScript.
Также вы можете подготовить данные другим способом (например, написав программу на другом языке программирования) и просто их вставить в соответствующее поле.
В скрипте может быть несколько функций, при запуске вызывается функция main(). Она должна подготовить данные для постановки и передать их функции generator(). В контекстном меню (правой кнопкой) поля скрипта есть несколько заготовок, облегчающих понимание и написание своих скриптов.
function main(){ var m = {}; m['шаблон'] = 'значение'; m['answer'] = 3.14; //... generator(m); }
Этот скрипт подготовит данные только для одного задания.
Примечание: если при нажатии кнопки Запустить скрипт удерживать клавишу Shift, то данные будут добавлены к уже имеющимся. Данные для разных заданий отделяются пустой строкой.
Для подготовки данных для нескольких заданий (ведь в этом смысл генератора) нужен цикл.
function main(){ var m = {}; for(var i = 0; i < 3; i++){ m['шаблон'] = 'значение'; m['answer'] = 3.14; //... generator(m); } }
Теперь мы получили данные (правда, один и те же) для 3 заданий, т.к. цикл выполнился 3 раза и 3 раза была вызвана функция generator(). Как получить различные данные смотрите ниже.
Генерация
Когда данные подготовлены можно создавать задания. Выберите группу для новых заданий и нажмите кнопку Создать задания.
Пример скриптов
Вернемся к первому шаблону и напишем рабочий скрипт.
function main(){ var m = {}; var a10, a2; for(var i = 0; i < 5; i++){ a10 = randint(25, 50); a2 = a10.toString(2); m['дв_число'] = a2; m['answer'] = a10; generator(m); } }
или
function main(){ var m = {}; var a; for(var i = 0; i < 5; i++){ a = randint(25, 50); m['дв_число'] = a; m['answer'] = a.toString(2); generator(m); } }
Примечание: функция randint(a, b) возвращает случайное целое число N из интервала a <= N <= b. Она использует функцию Math.random и для удобства уже прописана в генераторе.
При таком использовании можно получить одинаковые данные (хотя дубликаты заданий и не сложно удалить). Давайте сделаем чтобы мы получили задания для чисел от 25 до 50.
function main(){ var m = {}; var a; for(var i = 25; i <= 50; i++){ m['дв_число'] = i; m['answer'] = i.toString(2); generator(m); } }
Перед генерацией следует выполнить проверку Проверить скрипт. Если не будет обнаружено ошибок, то в поле "Результат работы скрипта" появятся вычисленные значения. Например,
дв_число=11001 answer=25
Выбираем группу для новых заданий. Указываем количество итераций (в этом примере это 100) и нажимаем Создать задания. Запускается процесс генерации заданий.
В указанной группе получили 100 новых заданий на основе задания-шаблона. При этом затратили всего пару минут.
Скорее всего, тестируемому из этих заданий будет предложено выполнить только несколько случайно выбранных, для этого не забудьте указать этот параметр в свойствах группы (настроить выборку).
Так же не забудьте удалить из готового теста файлы заданий-шаблонов или переместить их в отдельную группу и настроить выборку 0.
Для повторного использования скрипта его можно не только скопировать и куда-либо вставить как текст, но и сохранить в файл. Команды Открыть, Сохранить как... доступны в контекстном меню (правой кнопкой) поля скрипта. Так же из этого меню можно вставить название шаблона.
Еще несколько примеров
1) Например, нужно сделать задания типа для какой-то страны указать её столицу. В одном массиве пишем страны, в другом столицы. Переменная index изменяется от 0 до N-1 (где N - сколько заданий сделать). Берем из массива нужные элементы и заполняем данные для замены.
function main(index){ var country = ['России', 'Китая', 'Франции', 'Японии', 'США']; var capital = ['Москва', 'Пекин', 'Париж', 'Токио', 'Вашингтон']; var m = {}; m['страна'] = country[index]; m['answer'] = capital[index]; return m; }
Можно сделать списки как строки:
function main(index){ var countrys = 'России, Китая, Франции, Японии, США'; var capitals = 'Москва, Пекин, Париж, Токио, Вашингтон'; var country = countrys.split(', '); var capital = capitals.split(', '); var m = {}; m['страна'] = country[index]; m['answer'] = capital[index]; return m; }
2) Переведите десятичное число {%дес_число%} в двоичную систему счисления. Нужно получить задания для числа от 25 до 125.
function main(index){ var a10 = 25 + index; var a2 = a10.toString(2); var m = {}; m['дес_число'] = a10; m['answer'] = a2; return m; }
Можно сделать с тремя полями для ответа:
function main(index){ var a10 = 25 + index; var a2 = a10.toString(2); var a8 = a10.toString(8); var a16 = a10.toString(16).toUpperCase(); var m = {}; m['дес_число'] = a10; m['answer1'] = a2; m['answer2'] = a8; m['answer3'] = a16; return m; }
Т.к. в шестнадцатеричной системе счисления могут быть буквы от A до F, то тип задания ввод текста, а то потеряется третий вариант ответа.
3) Пример с шаблонами в вариантах заданий. Можно использовать генератор и для заданий с вариантами заданий, т.к. если включить перемешивание вариантов, то можно считать что первый (или другой) верный, все равно перемешаются... Так же с помощью шаблонов 'answer1'... указывать верный вариант из скрипта.
function randomInteger(min, max){ var rand = min + Math.random() * (max + 1 - min); rand = Math.floor(rand); return rand; } function main(){ var n = randomInteger(2, 4); var x1 = randomInteger(-5, 5); var y1 = randomInteger(-5, 5); var x2 = randomInteger(-5, 5); var y2 = randomInteger(-5, 5); var x = x1 + x2; x = n * x; var y = y1 + y2; y = n * y; var m = {}; m['n'] = n; m['x1'] = x1; m['y1'] = y1; m['x2'] = x2; m['y2'] = y2; m['x'] = x; m['y'] = y; m['mx'] = -x; m['my'] = -y; return m; }
В данном примере скрипт содержит еще одну дополнительную (вспомогательную) функцию для получения случайного значения. Правда, делать было не обязательно, т.к. уже имеется функция function _randomInteger(min, max), поэтому свою описывать не обязательно.
Сохранение данных между итерациями генератора
Для передачи данных между итерациями можно использовать встроенный объект _o или массив _a. Объявлять их не нужно, они объявляются автоматически как var _o = {} и var _a=[]. Можно проверить, есть ли там нужный ключ, получить значение, записать значение.
function main(index){ if('k' in _o){ _o['k'] = _o['k'] + 10; }else{ _o['k'] = 5; } var m = {}; m['шаблон'] = 'значение'; m['answer'] = _o['k']; //... return m; }
Выше уже было сказано, что используя параметр index функции main() можно перебирать значения. Что аналогично коду:
для index от 0 до n-1 генерировать задание (index)
Но как быть если нужно перебрать, например, все пары значений двух переменных? Т.е. имитировать код:
для i от a до b для j от c до d генерировать задание (i, j)
Ответ ниже - пример генерации теста для проверки таблицы умножения. Нужно создать 100 заданий от 1*1=... до 10*10=.
function main(){ var i = 1; var j = 1; if ('i' in _o) {i = _o['i']} if ('j' in _o) {j = _o['j']} var ij = i * j; var m = {}; m['i'] = i; m['j'] = j; m['answer'] = ij; if (j == 10) { i++; j = 1; }else{ j++ } _o['i'] = i; _o['j'] = j; return m; }
function main(){ var i = 1; var j = 1; if (_a[0] > 0) {i = _a[0]} if (_a[1] > 0) {j = _a[1]} var ij = i * j; var m = {}; m['i'] = i; m['j'] = j; m['answer'] = ij; if (j == 10) { i++; j = 1; }else{ j++ } _a[0] = i; _a[1] = j; return m; }
Про работу с объектами и массивами на JavaScript можно почитать, например, на сайте