Упражнения с неизвестным заранее конечным числом правильных ответов

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

Пример - №476.

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


а) Делимое равно 2525, делитель - 20. Найдите неполное частное и остаток.
б) Делимое равно 2525, неполное частное - 126. Найдите делитель и остаток.
в) При делении числа 2236 на определённое число получили остаток 66. Назовите возможные делители и соответствующие им неполные частные. Сколько решений имеет задача?
г) При делении определённого числа на 5 получили неполное частное 31. Назовите возможные остатки и соответствующие им делимые.
д) При делении определённого числа на 7 получили остаток 3. Приведите примеры возможных неполных частных и соответствующих им делимых. Сколько решений имеет задача?
е) При делении определённого числа на второе число получили неполное частное 31 и остаток 30. Приведите примеры делителей и соответствующих им делимых. Сколько решений имеет задача?

Решение

а) 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.

Рисунок 1

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

На рисунке 2 показан фрагмент документа, относящийся к пункту в) задачи.

Рисунок 2
Для определения количества решений задачи используются Radio-кнопки. Подробнее об их создании написано здесь.

Остановимся на добавлении полей ввода.

Алгоритм:

В рассматриваемом примере поля ввода одиночного ответа содержатся в видеоклипе InputField (рисунок 3). Экземпляры видеоклипа, размещённые в рабочей области, носят имена n31...n61 (для пунктов в) - е))

Рисунок 3

Кнопка "Добавить поле ввода" содержит вызов функции 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;
}

Все экземпляры кнопки AddButton (подпись: "Добавить поле ввода") содержат сценарии вида:


on (release) {      //Для пункта в)
   Add(3)
}

Все экземпляры кнопки ResetButton (подпись: "Убрать поле") содержат сценарии вида:


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);
}

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


Назад
К содержанию
Далее