Дострочное пересдача экзамена
|
Манипулирование данными
Манипуляция с числовыми данными с помощью объекта Math
Математические операторы, С которыми мы познакомили вас в этом уроке, позволяют строить выражения с использованием простых арифметических действий. Для более сложных манипуляций с числами во Flash имеется объект Math с его методами. Здесь мы познакомим вас лишь с некоторыми, наиболее часто используемыми методами объекта Math; в других уроках этой книги вам встретятся и многие другие методы.
Наиболее часто применяемые методы объекта Math:
- Math.abs() Метод возвращает абсолютное значение (модуль) числа. Пример: distance = Math.abs(here – there) ; – если результатом вычитания there из here будет отрицательное число (например, -375), метод Math.abs преобразует его в абсолютное значение – положительное (375).
- Math.round() Этот метод округляет число до целого. Если после десятичной запятой стоит число 5 или более, то округление происходит в большую сторону, если меньше 5 – в меньшую. Пример: cupsOfCoffee = Math.round(3.7); – поскольку после запятой стоит 7 (больше 5), число округляется в большую сторону, результатом будет 4.
- Math.floor() Метод действует подобно Math.round(), но в этом случае округление всегда производится в меньшую сторону.
- Math.ceil() Метод тоже действует подобно Math.round(), но округление всегда производится в большую сторону.
- Math.sqrt() Метод извлекает из числа квадратный корень. Пример: answer = Math.sqrt(9); – здесь answer получит значение 3.
В этом упражнении мы, используя операторы, выражения и методы объекта Math, напишем несложный алгоритм преобразования значений температуры по шкале Фаренгейта в значения по шкале Цельсия. Заодно запрограммируем изображение термометра с соответствующим уровнем ртути.
- Откройте файл tempConverter1.fla из папки Lesson08/Assets.
Все символы и текстовые поля уже созданы и размещены на сцене, нам остается сосредоточиться на ActionScript. Основной монтажный стол состоит из четырех слоев: Actions, Thermometer, Temperature Input и Background.
Слой Background содержит основное фоновое изображение. В слое Temperature Input находится текстовое поле для ввода, его имя – temperature. Сюда будут вводиться значения температур для преобразования. Кроме этого поля, в данном слое имеется еще два: fahrenheit и celsius – в них будут отображаться соответствующие значения температур. В этом же слое находится кнопка с надписью "Convert". Слой Thermometer содержит экземпляр фильма-символа с именем mercury, он будет иллюстрировать уровень ртути в термометре. Мы же сейчас займемся слоем Actions.
- Откройте панель Действия, выделите кадр 1 слоя Actions и введите следующий скрипт:
function changeTemp() { }
Это – начало описания функции. Функция эта будет вызываться при нажатии кнопки Convert, и выполнять она должна будет следующие задачи:
- Перевести значение по Фаренгейту в шкалу Цельсия.
- Убедиться, что введенное значение (по Фаренгейту) укладывается в диапазон термометра.
- Установить "уровень ртути" в термометре на нужную высоту.
- Внутри описания функции создайте две переменные:
boilingPoint = 212; absoluteZero = -460;
Наш термометр работает в большом диапазоне температур – от абсолютного нуля (примерно -460 градусов Фаренгейта) до точки кипения воды (212 градусов Фаренгейта), это будут максимально и минимально возможные значения для нашего конвертера.
- После строки absoluteZero = -460; поместите блок, проверяющий, укладывается ли введенное значение в установленные пределы:
if (temperature.text > boilingPoint) { temperature.text = boilingPoint; } else if (temperature.text < absoluteZero) { temperature.text = absoluteZero; } fahrenheit.text = temperature.text;
Эта часть функции – оператор if/else if – будет работать "фильтром" данных. Если значение, введенное пользователем ( temperature.text ), больше, чем значение boilingPoint (которое равно 212), то вместо введенного пользователем будет автоматически установлено значение boilingPoint. В противном случае, если пользователь ввел значение, меньшее, чем absoluteZero (-460), вместо него автоматически устанавливается значение absoluteZero. После фильтрации значение temperature.text отображается в экземпляре текстового поля fahrenheit.
Подобные фильтры часто используются в программировании – ведь далеко не всякая функция может принимать абсолютно любые значения параметров.
- После строк, добавленных на предыдущем шаге, вставьте следующее выражение, переводящее значения по Фаренгейту в шкалу Цельсия:
celsius.text = Math.round((5 / 9) * fahrenheit.text - 17.777);
Выражение справа от знака равенства переводит значение температуры из одной шкалы в другую. Результат выражения присваивается свойству text текстового поля celsius ; таким образом, данная строка отображает преобразованное значение в текстовом поле.
Обратите внимание на использование скобок в этом выражении. Выполняя эту строку кода, Flash начнет производить вычисления с самой внутренней пары скобок – в данном случае (5 / 9). Затем будет выполнено умножение, затем – вычитание. Метод Math.round() будет вызван только после того, как будет окончательно вычислено числовое значение аргумента. Это значение метод округлит до ближайшего целого числа.
- После предыдущей строки добавьте следующие:
scalePercent = (Math.abs(absoluteZero - fahrenheit.text) / Math.abs(absoluteZero - boilingPoint)) * 100; mercury._yScale = scalePercent;
В этих двух строках создается переменная, содержащая процентное значение для масштабирования экземпляра фильма-символа mercury, затем устанавливается такой масштаб.
Значение scalePercent вычисляется на основе отношения двух значений: превышения введенной температуры над абсолютным нулем и полного температурного диапазона. Чтобы вы лучше это поняли, давайте предположим, что пользователь ввел в текстовое поле fahrenheit значение 56. Мы знаем, что absoluteZero равняется -460, boilingPoint равняется 212. Вычисления будут происходить следующим образом:
(Math.abs(-460 - 56) / Math.abs(-460 - 212)) * 100;
далее
(Math.abs(-516) / Math.abs(-672)) * 100;
далее
((516) / (-672)) * 100;
далее
(.767) * 100;
далее
76.7
Примененный здесь метод объекта Math, вычисляющий абсолютное значение дает нам уверенность в том, что мы получим в итоге положительное процентное значение (отрицательное значение в контексте нашего скрипта не имело бы смысла).
Вторая строка скрипта устанавливает масштаб по вертикали для экземпляра фильма-символа mercury равным значению scalePercent. Так, если оно равно 76,7, то экземпляр mercury уменьшится до 76,7 процента от своего нормального размера (100 процентов).
- Выделите кнопку Convert и введите в панели Действия следующий скрпит:
on (release, keyPress "<Enter>") { changeTemp(); }
При нажатии этой кнопки или клавиши Enter будет вызвана функция changeTemp(), которую мы только что создали.
- Выполните команду Управление > Проверить фильм (Control > Test Movie). Введите значение температуры и нажмите кнопку.
После нажатия кнопки вы увидите, что высота фильма-символа mercury соответствующим образом уменьшилась. Текстовые поля celsius и fahrenheit заполнились данными. Если вы попытаетесь ввести температуру, выходящую за установленные нами пределы, то сработает фильтр – оператор if/else if, и значение будет "обрезано" по верхней или нижней границе.
- Закройте тестовый фильм и сохраните свою работу как tempConvert2.fla.
Итак, мы разобрались с арифметическими операторами и научились пользоваться методами объекта Math.