Кафедра версия 3.1

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

Цели проекта:
  • Предоставить преподавателям неограниченное количество неповторяющихся контрольных работ
  • Объяснить необходимость обязательного увеличения числа контрольных
Система Orphus

Разработчикам

Список задач в "Кафедре" я постоянно наращиваю. Однако в виду прочей занятости эта работа идёт не так быстро, как хотелось бы. Поэтому для пользователей я предусмотрел возможность относительно легко добавить в программу свои собственные задачи. Быть профессиональным программистом для этого не обязательно. Чтобы иметь возможность написать свою задачу достаточно поверхностно знать:

  • несколько базовых тэгов HTML (i, b, sup, sub, крайне редко другие)
  • основные программные конструкции и элементы любого языка программирования (лучше - PHP): цикл, ветвление с условием, переменная, массив

Если все эти требования уже выполнены (или будут выполнены уже в ходе работы), то с чего начать?

  1. Сочините условие задачи. Условие должно быть кратким, но самодостаточным - избегайте условностей и подразумеваний неочевидных фактов. В качестве образца можете воспользоваться формулировками задач из школьных учебников, как это делаю я. Я предпочитаю использовать учебники следующих авторов: Козел, Мякишев, Синяков, Лукашик и Трофимова.
  2. Придумайте название для задачи. Название задачи должно отражать её суть - какой физический процесс иллюстрирует задание, к какому разделу оно относится. Например: "Плавление металла в тигле".
  3. Предварительно решите эту задачу сами. Лучше всего решите её несколькими возможными способами. Помните, даже от перестановки местами "слагаемых" сумма меняется, поэтому два с виду почти идентичных алгоритма решения могут на деле оказаться совершенно разными по скорости выполнения веб-сервером.
  4. Реализуйте выбранный вами алгоритм на языке PHP. Учитывая, что специфические особенности этого языка в задаче не задействованы, опыт работы с ним вообще не обязателен, так же как и многодневные изучения соответствующей литературы. Если вы дружите с головой, то для уверенной работы вам хватит всего несколько примеров, которые есть на этой странице.
  5. Полученный код скопируйте в специальный бланк (см. ниже) и сохраните полученное в виде файла с расширением "php".

Быстрый старт

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

<?php
#В эту строчку нужно вставить название вашей задачи
#===эту строчку пока оставьте пустой, к ней вы вернётесь чуть позже. Назовём её "Строчка Z"===
#Здесь напишите формулировку вашей задачи. Напоминаю, что условие задачи довольно короткое. 
#Однако каким бы коротким оно ни было, оно может в одну строчку не поместиться. 
#Поэтому разбейте его на несколько строчек. Вам главное соблюсти всего три ограничения: 
#- каждая строчка не должна быть больше 120 символов 
#- каждая строчка должна заканчиваться пробелом! 
#- каждая строчка условия начинается с символа "#" 
#Когда вы всё условие сюда записали, сосчитайте: сколько у вас получилось строчек? 
#Допустим, у вас получилось одиннадцать, так же как вышло здесь у меня. 
#Тогда возвращаемся к "Строчке Z", стираем оттуда весь текст кроме первого символа "#" 
#Сразу, без пробелов, после "#" пишем туда цифру 11 
#В "Строчке Z" кроме одной-единственной циферки и "#" не должно быть ни одного символа! 



И вот тут можете писать свой алгоритм решения задачи. Это самая сложная часть.
Для её осуществления лучше ознакомтесь с примерами.


//вот здесь, когда ваше решение закончилось, напишите:
$otvet = имя_переменной,_в_которой_у_вас_сохранился_искомый_ответ;

print("А вот тут вы снова напишите условие вашей задачи, но только вместо цифр подставляйте имена переменных в стиле PHP: $skorost, $vremya, $temperatura и т. п. Соответствующие именам значения сами подставятся вместо этих имён");
?>

И вот, наконец, парочка примеров с комментариями после них:

<?php
#Перевод из байтов и мегабайтов в килобайты
#1
#Перевести в килобайты: 8346 байт и 2.38 Мб. 

do {
	//итак, генерируем килобайты:
	$KiloOfByte = mt_rand(456, 37890)/100;
	$Byte = $KiloOfByte*1024;//и тут же перевели их в байты

	//будем отбраковывать те случаи, когда число байтов получилось нецелым:
	$d = $Byte - round($Byte);

} while ( $d <> 0);//как только получили целое число - заканчиваем подбор.

//аналогично поступим теперь и с мегабайтами
do {
	$KiloOfMega = mt_rand(1500,490000);
	$Mega = $KiloOfMega/1024;

	$d = $Mega*100 - round($Mega*100);

} while ( $d <> 0);

$otvet = $KiloOfByte.' и '.$KiloOfMega;

print("Перевести в килобайты: $Byte байт(а) и $Mega Мб.<br>Ответ:_______");
?>

Как видите, здесь всё соответсвует образу: в первой строчке открывающий php-тэг. Затем строчка, в которой после символа "#" идёт название задачи: "Перевод из байтов и мегабайтов в килобайты". Затем строчка, где написано "#1" - это означает, что условие всей задачи умещается в одну строчку. И следующей строчкой как раз написано это самое условие. Цифры 8346 и 2.38 в нём мною взяты с потолка. Именно этот текст будет выводиться во всплывающей подсказке в основной гармошке.

А вот дальше идёт код поинтересней - там два цикла. Вот какую стратегию решения задачи я придумал: я сначала выберу два случайных числа (функция mt_rand), которые и являются будущими ответами, а потом первое из них переведу в байты, второе - в мегабайты. Вот и всё - эти два новых числа я и помещу в условие задачи. Вдобавок, я наложил ограничения: число в байтах всегда должно получаться целым: $d = $Byte - round($Byte);, а количество мегабайт с точностью до двух знаков после запятой: $d = $Mega*100 - round($Mega*100);.

Обратите внимание, случайное число в первом случае я ищу в диапазоне от 456 до 37890 (делённые на сто каждое), а во втором - от 1500 до 490000 (ровно). Почему именно эти цифры? Сначала я поставил туда цифры с потолка - лишь бы работало. А когда заработало, начал с ними играться - то больше поставлю, то меньше. Таким путём я подобрал интервалы, в которых скорость работы скрипта была не слишком медленной.

Напоследок я скажу вам последние ограничения, о которых вы должны помнить:

  1. Сервер ограничивает время выполнения любого скрипта тридцатью (30) секундами. Поэтому не забывайте выбирать оптимальный способ генерации задач. Ведь если генерация одного экземпляра занимает полторы секунды, то больше 20 штук за раз не сгенерировать!
  2. В имени задачи нельзя использовать символ вертикальной черты - "|". Все остальные символы разрешены.

См. также:
Образцы всех задач (pdf) | Генератор задач по математике (+экономика) | Проект EduMandriva

Старые версии: 2.х | 1.х