Упражнения с коммутативным ответом


Случай 1 - Числа

Проблема:

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

Алгоритм:

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

Пример - №551.

Условие задачи:

Найдите все простые делители числа: а) 110; б) 210; в) 310; г) 260; д) 990; е) 512; ж) 864; з) 1000.

Решение

Например, для д) ответ - 2, 3, 5, 11 (4! = 24 варианта записи).

Программирование

Главная временная шкала Flash-документа содержит один кадр. Вид рабочего поля документа (с комментариями) показан на рисунке 1.

Рисунок 1
Ключевой кадр основной временной шкалы содержит следующий сценарий:

stop ();
//Объявление пользовательской функции, формирующей ответ задачи
function makeAnswer () {
 //res - массив результатов; элемент res[i] соответствует (i+1)-му тесту
   res = new Array(0, 0, 0, 0, 0, 0,0,0);
 //Каждая из строк a1…a8 разбивается в массив v1…v8
 //Метод split() имеет один параметр - разделитель элементов строки (в данном случае - пробел).
   for (i=1; i<=8; i++) {
      _root["v"+i.toString()] = mc1["a"+i.toString()].split(" ");
   }
 //Каждый из массивов v1…v8 сортируется по возрастанию методом sort()
    for (i=1; i<=8; i++) {
      _root["v"+i.toString()].sort(Sorter);
   }
   for (i=1; i<=8; i++) {
      res[i-1] = _root["v"+i.toString()].join(",");
   }
}
//Объявление функции, служащей параметром метода sort()
function Sorter (a, b) {
   return a-b;
}
//Однократное выполнение функции при запуске фильма.
makeAnswer();

Так как изменение ответа в рассматриваемой задаче может происходить при отпускании клавиши на клавиатуре, сценарий передачи ответа (находится в экземпляре mc1 видеоклипа All) имеет вид:

onClipEvent (keyUp) {
   _root.makeAnswer();
   fscommand ("1", _root.res[0]);
   fscommand ("2", _root.res[1]);
   ...
   fscommand ("8", _root.res[7]); }

Просмотреть результат в новом окне

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


Назад
К оглавлению
Далее


Случай 2 - Геометрические упражнения с коммутативным ответом

Проблема:

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

Пример - №253.

Условие задачи:

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

Алгоритм:

Рисование:

Главная временная шкала Flash-документа содержит один кадр. Вид рабочего поля документа показан на рисунке 2.

Рисунок 2

Программирование

Ключевой кадр основной временной шкалы содержит следующий сценарий:

stop ();
answer = "";
//Определение пользовательской функции создания ответа
function MakeAnswer ()
{
//массивы v1, v2, v3 будут соответствовать строкам ans1, ans2, ans3
   v1 = new Array();
   v2 = new Array();
   v3 = new Array();
//Разбиение строк ans1, ans2, ans3 и занесение отдельных углов в массив
   for (var i = 1; i<=3; i++)   { _root["v"+i.toString()] = mc1["ans"+i.toString()].split(" "); }
//Видоизменение элементов первого массива
   for (i=0; i<v1.length; i++)    { v1[i] = ReBuild(v1[i]); }
// Видоизменение элементов второго массива
   for (i=0; i<v2.length; i++)    { v2[i] = ReBuild(v2[i]); }
// Видоизменение элементов третьего массива
   for (i=0; i<v3.length; i++)   { v3[i] = ReBuild(v3[i]); }
//Сортировка массивов (по алфавиту в порядке возрастания)
   v1.sort();
   v2.sort();
   v3.sort();
//строка answer передаётся на сервер в качестве ответа
   answer = v1.join()+";"+v2.join()+";"+v3.join();
}
//Определение пользовательской функции видоизменения названия угла
function ReBuild (str) {
   var newstr = "";
/*Если первый элемент строки str находится в алфавите после третьего, функция возвращает видоизменённое значение*/
   if (str.charAt(0)>str.charAt(2))   { newstr = str.charAt(2)+str.charAt(1)+str.charAt(0); }
   else    { newstr = str; }
   return newstr;
}

Сценарий формирования и передачи ответа содержится в экземпляре видеоклипа mc1:

onClipEvent (keyUp)
{
   _root.MakeAnswer();
   fscommand ("1", _root.answer);
}

В результате выполнения функции MakeAnswer() любая запись правильного ответа преобразуется к одному и тому же виду, а именно: answer="ASD,ASF,ASL,BSF,BSL,DSK,FSK;ASB,ASC,ASK,BSC,BSD,BSK,CSD,CSF,DSF,DSL,FSL;CSK,CSL"

Просмотреть результат в новом окне


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