Генераторы заданий MyTestXPro: различия между версиями
Bas (обсуждение | вклад) |
Bas (обсуждение | вклад) |
||
Строка 8: | Строка 8: | ||
Если задание с вариантами ответа, то в тексте вариантов ответов можно тоже сделать шаблоны. Если задание на ручной ввод ответа и ответ генерируется автоматически, то в поле ответа ничего писать не нужно - им соответствуют уже как бы заданные шаблоны ответов {%answer1%}, {%answer2%}... {%answer10%}, а если ответ только один можно использовать шаблон {%answer%}. | Если задание с вариантами ответа, то в тексте вариантов ответов можно тоже сделать шаблоны. Если задание на ручной ввод ответа и ответ генерируется автоматически, то в поле ответа ничего писать не нужно - им соответствуют уже как бы заданные шаблоны ответов {%answer1%}, {%answer2%}... {%answer10%}, а если ответ только один можно использовать шаблон {%answer%}. | ||
+ | |||
+ | Скрипт-генератор должен вернуть для шаблонов конкретные задания, которые будут подставлены в соответствующие места. | ||
+ | |||
+ | == Скрипт == | ||
+ | |||
+ | Скрипт-генератор пишется на языке программирования JavaScript. | ||
В скрипте может быть несколько функций, для генерации заданий вызывается функция '''main()'''. Она должна вернуть данные в виде объекта - ассоциативный массив (в примере это ''var m = {};''). Заполняем его в формате ''m['шаблон'] = 'значение';''. | В скрипте может быть несколько функций, для генерации заданий вызывается функция '''main()'''. Она должна вернуть данные в виде объекта - ассоциативный массив (в примере это ''var m = {};''). Заполняем его в формате ''m['шаблон'] = 'значение';''. | ||
+ | |||
+ | <pre> | ||
+ | function main(index){ | ||
+ | //... | ||
+ | var m = {}; | ||
+ | m['шаблон'] = 'значение'; | ||
+ | m['answer'] = 3.14; | ||
+ | //... | ||
+ | return m; | ||
+ | } | ||
+ | </pre> | ||
У функции main() есть параметр, например, если написать main(index), то при создании 10 заданий переменная index будет последовательно принимать значения 0, 1, ... 9 для каждой генерации. Вы можете использовать и другое имя параметра. Для возврата значений можно использовать и переменную _result (её объявлять ну нужно, это делается автоматически), тогда возвращаемое значение будет return _result. Если функция main() возвращает false (или не возвращает нужных данных), то задание не создается. | У функции main() есть параметр, например, если написать main(index), то при создании 10 заданий переменная index будет последовательно принимать значения 0, 1, ... 9 для каждой генерации. Вы можете использовать и другое имя параметра. Для возврата значений можно использовать и переменную _result (её объявлять ну нужно, это делается автоматически), тогда возвращаемое значение будет return _result. Если функция main() возвращает false (или не возвращает нужных данных), то задание не создается. |
Версия 17:48, 31 января 2020
В редактор тестов версии 11.0.0.41 добавлен генератор заданий (Задания → Генератор), который позволяет на основе задания-шаблона, используя скрипт на JavaScript, создать большое количество заданий. В процессе развития программы генератор изменялся, текущая страница описывает генератор в актуальной версии программы.
Шаблоны
Сначала необходимо создать задание-шаблон на основе которого будут создаваться новые задания автоматически. От обычного задания оно отличается тем, что вместо конкретных чисел или слов указаны шаблоны-подстановки. Шаблоны записываются в тексте как {%шаблон%}.
Например, вопрос может быть записан так: "Переведите десятичное число {%число%} в двоичную систему счисления.".
Если задание с вариантами ответа, то в тексте вариантов ответов можно тоже сделать шаблоны. Если задание на ручной ввод ответа и ответ генерируется автоматически, то в поле ответа ничего писать не нужно - им соответствуют уже как бы заданные шаблоны ответов {%answer1%}, {%answer2%}... {%answer10%}, а если ответ только один можно использовать шаблон {%answer%}.
Скрипт-генератор должен вернуть для шаблонов конкретные задания, которые будут подставлены в соответствующие места.
Скрипт
Скрипт-генератор пишется на языке программирования JavaScript.
В скрипте может быть несколько функций, для генерации заданий вызывается функция main(). Она должна вернуть данные в виде объекта - ассоциативный массив (в примере это var m = {};). Заполняем его в формате m['шаблон'] = 'значение';.
function main(index){ //... var m = {}; m['шаблон'] = 'значение'; m['answer'] = 3.14; //... return m; }
У функции main() есть параметр, например, если написать main(index), то при создании 10 заданий переменная index будет последовательно принимать значения 0, 1, ... 9 для каждой генерации. Вы можете использовать и другое имя параметра. Для возврата значений можно использовать и переменную _result (её объявлять ну нужно, это делается автоматически), тогда возвращаемое значение будет return _result. Если функция main() возвращает false (или не возвращает нужных данных), то задание не создается.
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 country = ['России', 'Китая', 'Франции', 'Японии', 'США']; var capital = ['Москва', 'Пекин', 'Париж', 'Токио', 'Вашингтон']; _result['страна'] = country[index]; _result['answer'] = capital[index]; return _result; }
Можно сделать еще проще - списки как строки:
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) В командах для Чертежника задать случайные значения, вычислить результат... Можно использовать генератор и для заданий с вариантами заданий, т.к. если включить перемешивание вариантов, то можно считать что первый (или другой) верный, все равно перемешаются...
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; }
В версии 11.0.0.44 добавлена функция function _randomInteger(min, max), поэтому свою описывать не обязательно.
Файлы-примеры (для версии .44 еще не адаптированы) с этой страницы доступны по ссылке https://yadi.sk/d/y25HEFmXrKqPL
Команды Открыть, Сохранить скрипты доступны в контекстном меню (правой кнопкой) поля скрипта.
Для обмена данными между запусками (в пределах одной сессии, например, создавая 100 заданий) можно использовать глобальный массив gData.
Видео-примеры:
- https://vk.com/mytestxpro?z=video-57959169_456239018%2F8e199bcebd99bf9ac6%2Fpl_wall_-57959169
- https://vk.com/video-57959169_456239019
Создавая множество заданий с помощью генератора, вы, скорее всего, желаете что бы задавались не все задания, а только часть из них. В настройках группы заданий не забываем ставить ограничение по количеству заданий и перемешивание.
Сохранение данных между итерациями генератора.
Имитация генератора с вложенным циклом.
function main(index){ 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(index){ 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; }