Проблема:
В учебнике нередко встречаются задания, в которых требуется представить число в виде произведения двух и более множителей, записать сумму, перечислить несколько значений или выбрать из списка все элементы, удовлетворяющие данному условию. Поскольку с точки зрения программы ответом является строка, в упомянутых случаях количество вариантов ответа может быть очень большим.Алгоритм:
В простейшем случае можно осуществить следующее:Пример - №551.
Условие задачи:
Найдите все простые делители числа: а) 110; б) 210; в) 310; г) 260; д) 990; е) 512; ж) 864; з) 1000.Решение
Например, для д) ответ - 2, 3, 5, 11 (4! = 24 варианта записи).Программирование
Главная временная шкала Flash-документа содержит один кадр. Вид рабочего поля документа (с комментариями) показан на рисунке 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() в качестве параметра передавался бы знак умножения или плюс. Усложнение задачи происходит при необходимости записывать отрезки или углы.
Назад | К оглавлению |
Далее |
Проблема:
Буквы в обозначениях фигур могут быть переставлены несколькими способами, и если в ответе требуется привести несколько обозначений, количество вариантов значительно возрастает. Если в случае перечисления чисел можно потребовать, например, "записать числа в порядке возрастания", буквенные обозначения не всегда удаётся упорядочить "естественным" для пользователя образом.Пример - №253.
Условие задачи:
Запишите отдельными строчками тупые, острые, прямые углы, изображённые на рисунке. Пользоваться можно только угольником. | ![]() |
Алгоритм:
Рисование:
Главная временная шкала Flash-документа содержит один кадр. Вид рабочего поля документа показан на рисунке 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;
}
onClipEvent (keyUp)
{
_root.MakeAnswer();
fscommand ("1", _root.answer);
}
Просмотреть результат в новом окне