При реализации упражнений с априорно неизвестным числом ответов количество полей ввода не должно быть известно решающему задачу заранее. Это означает, что человек, решающий задачу, должен получить возможность добавлять и удалять поля ввода.
Пример - №476.
Условие задачи:
Решение
а) 126 и 5
б) 20 и 5
в) 1085 и 2, 434 и 5, 310 и 7, 217 и 10, 155 и 14, 70 и 31. Всего 6.
г) 0 и 155, ..., 4 и 159
д) 1 и 10, 2 и 17, ... (бесконечно много)
е) 100 и 3130, 1000 и 31030, ... (бесконечно много)
Рисование
Главная временная шкала Flash-документа содержит один кадр. Вид рабочего поля показан на рисунке 1.Программирование
На рисунке 2 показан фрагмент документа, относящийся к пункту в) задачи.Остановимся на добавлении полей ввода.
Алгоритм:
Кнопка "Добавить поле ввода" содержит вызов функции Add(), описанной в ключевом кадре основной временной шкалы.
Ниже приводится сценарий, содержащийся в ключевом кадре главной временной шкалы. Он исполняется при загрузке фильма.
stop (); //Остановка воспроизведения
num3 = 1; //Количество полей ввода в пункте в) задания
num4 = 1; //Количество полей ввода в пункте г) задания
num5 = 1;
num6 = 1;
for (i=2; i<=3; i++) { //Определяется вид переключателей: выбран вариант "ни одного"
_root["c3"+i]._visible = false;
_root["c5"+i]._visible = false;
_root["c6"+i]._visible = false;
}
ch3 = 1; //Переменные, отвечающие за выбор переключателя
ch5 = 1;
ch6 = 1;
//Функция для создания многомерного массива
function makeArrayElem (n1, n2) {
this.one = n1;
this.two = n2;
}
//Функция преобразования "табличного" ответа в строку
function makeArray (nt) {
var array = new Array(); //array[i] соответствует одной колонке таблицы
for (var i = 0; i<_root["num"+nt.toString()]; i++) {
array[i] = new makeArrayElem(_root["n"+nt.toString()+(i+1).toString()].a1,
_root["n"+nt.toString()+(i+1).toString()].a2);
}
array.sort(Sorter2); //сортировка по первому полю
var str = array[0].one+","+array[0].two; //str - строка ответа
for (var i = 1; i<_root["num"+nt.toString()]; i++) {
str += ";"+array[i].one+","+array[i].two;
}
return str;
}
/*Функция обработки результата выбора переключателей. Если выбран первый или второй, возвращает номер переключателя,
если третий - номер и указанное количество ответов*/
function makeNumber (nt) {
if (_root["ch"+nt.toString()]<3) {
return _root["ch"+nt.toString()].toString();
} else {
return _root["ch"+nt.toString()].toString()+"("+_root["d"+nt.toString()].toString()+")";
}
}
//Функция обработки ответа пункта д)
function makeEternal5 () {
var str = ""; //содержит строку ответа
if (ch5 != 2) { //Если не выбран переключатель "бесконечно много ответов"
str = makeArray(5); //ответ - преобразованная "таблица"
} else { //Если выбран переключатель "бесконечно много ответов"
total = 0; //количество правильных ответов
if (areDifferent(5)) { //Если все варианты - разные,
for (var i = 0; i<num5; i++) {
//Проверка правильности вариантов
if (Correct(_root["n5"+(i+1).toString()].a2, 7,
_root["n5"+(i+1).toString()].a1, 3)) {
total++;
}
}
}
if ((total == num5) && (total>=3)) {
str = "__3__"; //Если все варианты
правильные и их не менее трёх
}
}
return str;
}
//Функция обработки ответа пункта е)
function makeEternal6 () {
var str = "";
if (ch6 != 2) {
str = makeArray(5);
} else {
total = 0;
if (areDifferent(6)) {
for (var i = 0; i<num5; i++) {
if (Correct(_root["n6"+(i+1).toString()].a2,
_root["n6"+(i+1).toString()].a1, 31, 30)) {
total++;
}
}
}
if ((total == num6) && (total>=3)) {
str = "__3__";
//Если все варианты правильные и их не меньше трёх
}
}
return str;
}
//Функция, определяющая параметр сортировки двумерного массива
function Sorter2 (a, b) {
return a.one-b.one;
}
//Функция, формирующая ответ задачи
function MakeAnswer () {
a = a1.toString()+","+a2.toString();
b = b1.toString()+","+b2.toString();
c = makeArray(3)+";"+makeNumber(3);
d = makeArray(4);
e = makeEternal5()+";"+makeNumber(5);
f = makeEternal6()+";"+makeNumber(6);
}
//Функция переключения радиокнопок
function Checking (a, b) {
_root["c"+a.toString()+_root["ch"+a.toString()].toString()]._visible = false;
_root["ch"+a.toString()] = b;
_root["c"+a.toString()+_root["ch"+a.toString()].toString()]._visible = true;
}
//Функция добавления "колонки" ввода в "таблицу" пункта номер a
function Add (a) {
if (_root["num"+a.toString()]<8) { //если полей ввода меньше восьми
_root["num"+a.toString()]++;
//Создание нового экземпляра видеоклипа InputField
_root["n" + a.toString() + "1"].duplicateMovieClip("n" + a.toString() +
_root["num"+a.toString()].toString(), _root["num"+a.toString()] + a*9-27);
//Определение его координат
_root["n"+a.toString()+_root["num"+a.toString()].toString()]._x =_root["n"+a.toString()+
"1"]._x+(_root["num"+a.toString()]-1)*(_root["n"+a.toString()+"1"]._width+2);
_root["n"+a.toString()+_root["num"+a.toString()].toString()]._y =_root["n"+a.toString()+
"1"]._y;
}
//Передача фокуса ввода полю a1 последнего в ряду экземпляра видеоклипа
Selection.setFocus(_root["n"+a.toString()+_root["num"+a.toString()].toString()]+".a1");
}
//Функция проверки утверждения "m - делимое, p - делитель, q - неполное частное, r - остаток"
function Correct (m, p, q, r) {
var res = false;
if ((m == p*q+r) && (r<p)) {
res = true;
}
return res;
}
//Функция проверки отсутствия совпадающих "колонок" в "таблице" номер nt
/*если в первой "строке" нет совпадений, то и в "таблице" их нет; если в первой "строке" есть совпадения, то в "таблице"
есть либо совпадения, либо ошибки. Ответ можно не засчитывать в любом случае, значит, достаточно рассмотреть первую "строку"*/
function areDifferent (nt) {
var v = new Array(); //v соответствует первой "строке" "таблицы"
var k = true;
for (var i = 0; i<_root["num"+nt.toString()]; i++) {
v[i] = _root["n"+nt.toString()+(i+1).toString()].a1;
}
v.sort();
for (i=1; i<_root["num"+nt.toString()]; i++) {
if (v[i-1] == v[i]) {
k = false;
i = _root["num"+nt.toString()];
}
}
return k;
}
on (release) { //Для пункта в)
Add(3)
}
on (release) { //Для пункта в)
if (num3>1) {
_root["n3"+num3.toString()].removeMovieClip();
num3--;
}
}
Сценарий передачи ответа содержится в экземпляре с31 видеоклипа Checked и имеет вид:
onClipEvent (mouseMove) {
_root.MakeAnswer();
fscommand ("1", _root.a);
fscommand ("2", _root.b);
fscommand ("3", _root.c);
fscommand ("4", _root.d);
fscommand ("5", _root.e);
fscommand ("6", _root.f);
}
Просмотреть результат в новом окне
Назад | К содержанию |
Далее |