Уроки
Написать нам

Урок 2. Числовые переменные и вычисления - Уроки мастерства

Как уже говорилось, с числовыми переменными можно производить простейшие математические расчеты: сложение, вычитание, умножение и деление. Если для первых двух действий используются знаки "плюс" и "минус", то для умножение используется знак * (звёздочка), а для деления - знак / (прямой слэш).

Давайте сделаем для начала простейший калькулятор. Создадим два эдитбокса, тип переменной выберем "Плавающее" - это числовая переменная с возможностью ввода чисел с запятой (не забывайте, что в Америке и западных странах вместо запятой используется точка!). В поле "К переменной" нужно указать имя получаемой из эдитбокса переменной. В верхнем окне указывается имя строковой переменной, а в нижнем - числовой. Нас интересует нижнее поле, где мы введем имя x1. Во втором эдитбоксе укажем имя x2. Это будут два числа, которые нужно будет складывать, вычитать и т.д.

Ещё создадим простой текстовый объект и дадим ему имя "Результат". В этот текстовый объект будем выводить результаты вычислений. Под все три созданных текстовых объекта подложим прямоугольники с утопленной границей.

Теперь сделаем четыре длинные кнопки с названиями "Сложить", "Вычесть", "Умножить" и "Разделить". Начнем с кнопки "Сложить". Первое, что мы должны сделать - сложить x1 и x2 и записать это в переменную, например, y. То есть просто написать строку:

MMB Script
y=x1 + x2

Теперь нужно вывести полученное значение в текстовый объект "Результат" с помощью команды LoadText(). Однако эта команда "понимает" только строковые переменные, а у нас имеется числовая. Для перевода числовой переменной в строковую в программе есть функция CHAR(). А для обратного преобразования - функция VAL().

В итоге скрипт для кнопки "Сложить" получится таким:

MMB Script
y=x1 + x2
y$=CHAR(y)
LoadText("Результат","y$")

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

Осталось сделать только кнопку "Сброс". В её скрипте нужно создать пустую строковую переменную и командой LoadText() загрузить её во все три текстовых объекта. Сделайте это сами.

Теперь насладитесь работой калькулятора! Запустите и проверьте его работу (для тех, кто ничего не понял :-( - есть возможность взять готовый проект).

* * *

Владимир Степанов из Красноярска спрашивал, как сделать, чтобы запущенный проект работал определенное время, например 5 минут, а потом закрывался.

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

Второй путь гораздо проще. 5 минут - это 300 секунд. Значит, нам нужно создать счетчик, задав его начальное значение, равное 300, и каждую секунду уменьшать это значение на единицу. И всё время сравнивать его значение с нулем. Когда оно станет равно нулю, дать команду Exit().

Создаем строковую переменную i и задаем её значение в старте первой страницы проекта:

MMB Script
i=300

Там же, в скрипте первой страницы, нужно сразу запустить скрипт, который будет отсчитывать и контролировать время:

MMB Script
RunScript("Script")

А вот и сам этот скрипт:

MMB Script
i=i - 1
If (i=0) Then
  Exit()
End
ScriptTimer("Script","1000")

Поскольку значение ScriptTimer выбрано равным 1000, то значение i будет уменьшаться на единицу один раз в секунду.

Это уже будет работать. Но давайте представим, что мы хотим уведомлять пользователя, сколько времени осталось до конца работы программы. И выводить ему это время в минутах и секундах. Значит, нам придется преобразовать общее время, заданное в секундах, в минуты и секунды.

Для этого введем две числовых переменных - min и sec. Число минут можно узнать, если общее число секунд разделить на 60:

MMB Script
min=i/60

Однако это число будет содержать целую и дробную части. Нас же интересует только целое число минут. И в ММВ есть такая функция, позволяющая выделить из числа только целую часть. Это функция INT(). Поэтому далее пишем:

MMB Script
min=INT(min)

А теперь можно рассчитать и секунды. Для этого из общего количества секунд надо вычесть число минут, умноженное на 60:

MMB Script
sec=i - min*60

Теперь надо получить две строковые переменные, которые можно будет выводить для отображения в программе:

MMB Script
min$=CHAR(min)
sec$=CHAR(sec)

Впоследствие вы заметите, что когда число секунд станет меньше 10, оно будет выводиться как 9, 8, 7 и т.д. А хотелось бы, чтобы это значение выводилось как 09, 08, 07 и т.д. Это нетрудно сделать. Введем в скрипт следующее условие:

MMB Script
If (sec$='9') Then
  sec$='09'
End

И точно такие же для всех однозначных чисел. Теперь осталось только вывести переменные min$ и sec$ в какой-нибудь текстовый объект. Можно сделать для этих значений пару окошек в программе, а можно и просто вывести на экран всю информацию одной строкой. Так и поступим. Создадим переменную text$ и запишем ее значение:

MMB Script
text$='До завершения работы программы осталось ' + min$ + ' мин ' + sec$ + ' сек.'

И дадим команду вывода ее куда-нибудь на окно приложения (в текстовый объект Text):

MMB Script
LoadText("Text","text$")

Поскольку в конце скрипта у нас имеется запись ScriptTimer("Script","1000"), содержание текстового объекта Text будет обновляться каждую секунду. Что нам и требуется.

Ну и в конце скрипта ставим условие, что если i=0, то программа завершает работу. Можно еще вывести сообщение об этом. А целиком скрипт Timer будет выглядеть так:

MMB Script
i=i - 1
min=i/60
min=INT(min)
sec=i - min*60
min$=CHAR(min)
sec$=CHAR(sec)
If (sec$='0') Then
  sec$='00'
End
If (sec$='1') Then
  sec$='01'
End
If (sec$='2') Then
  sec$='02'
End
If (sec$='3') Then
  sec$='03'
End
If (sec$='4') Then
  sec$='04'
End
If (sec$='5') Then
  sec$='05'
End
If (sec$='6') Then
  sec$='06'
End
If (sec$='7') Then
  sec$='07'
End
If (sec$='8') Then
  sec$='08'
End
If (sec$='9') Then
  sec$='09'
End
text$='До завершения работы программы осталось ' + min$ + ' мин ' + sec$ + ' сек.'
LoadText("Text","text$")
If (i=0) Then
  Message("Всё, до свидания!","")
  Exit()
End
ScriptTimer("Script","1000")

Проект с этим примером можно взять в готовом виде отсюда.

* * *

Например, вы делаете прайс-лист для вашей фирмы (эко на что замахнулся! взял бы Excel, что ли... А то на ММВ). С картинками, ценами, может быть даже с поиском, всё так красиво. И хотите сделать страничку "Расчет цены", где учитывались бы скидки, рассчитывался бы процент по кредиту, первоначальный взнос, ежемесячные выплаты. И всё автоматически. Удобно? Бесспорно. Трудно? Вряд ли. Давайте попробуем.

Очевидно, что мы должны создать пять объектов вводимого текста. В первый пользователь будет вводить цену, во второй - скидку, в третий - кредитную ставку, в четвертый - количество месяцев кредита, и в пятый - первоначальный взнос (это разумно, ведь покупатель может заплатить сразу и 10 процентов стоимости, и 50). Создадим четыре эдитбокса, а получаемые из них числовые переменные назовём соответственно "цена", "скидка", "ставка", "месяцы" и "аванс". Да, да, вот так прямо по-русски, чтобы нам не запутаться и чтобы понятнее было. Всё будет работать, но в своих проектах старайтесь все-таки давать все имена по-английски. Кстати, там же задайте и имена строковых переменных, получаемых из этих эдитбоксов - такие же, только со знаком $ в конце. Они нам потом пригодятся.

Не забудьте подложить под эдитбоксы утопленные прямоугольники, для красоты.

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

Итак, глаза боятся - руки делают. Для вывода результатов нам эдитбоксы не нужны - достаточно простых текстовых объектов. Сделаем их в каждом окне, всего пять штук. Я назвал эти объекты так: "цена2" - для вывода цены с учетом скидки, "накрутка" - процент по кредиту в рублях, "итого" - общая цена с учетом кредитной накрутки, "осталось" - сумма, которую клиенту осталось выплатить после внесения первоначального взноса, и "платеж" - размер ежемесячных выплат.

Уф-ф... Еще две кнопки нужны. Внизу. Одна - "Вычислить", и вторая "Сброс". Давайте создадим две простые кнопки и сразу нарисуем в проекте два скрипта (пока пустых) с названиями Calculate и Reset. А кнопкам назначим выполнение этих скриптов. Которой какой скрипт, и так ясно.

Вот, всё готово для работы :))) Теперь начинаем написание скрипта Calculate. Рассчитываем величины, которые будут выводиться в нижние пять окон:

MMB Script
цена2=цена - (цена*скидка)/100
накрутка=(цена2*ставка)/100
итого=цена2 + накрутка
осталось=итого - аванс
платеж=осталось/месяцы

Эта часть скрипта пояснения не требует. Далее из числовых переменных создаем строковые (выводить ведь можно только их):

MMB Script
цена2$= CHAR(цена2)
накрутка$=CHAR(накрутка)
итого$=CHAR(итого)
осталось$=CHAR(осталось)
платеж$=CHAR(платеж)

И выводим эти значения:

MMB Script
LoadText("цена2","цена2$")
LoadText("накрутка","накрутка$")
LoadText("итого","итого$")
LoadText("осталось","осталось$")
LoadText("платеж","платеж$")

В принципе это всё. Уже можно считать. Но желательно предусмотреть еще некоторые мелочи. Например, если скидки на товар нет, то в это окно могут не ввести значение. Поэтому в начале скрипта лучше добавить вот что:

MMB Script
If (скидка$='') Then
  скидка=0
  скидка$=CHAR(скидка)
End
LoadText("скидка","скидка$")

И тогда в этом случае в поле будет автоматически подставляться ноль, он же будет учитываться и в расчетах. То же самое можно сделать и для поля кредитной ставки (если будет беспроцентный кредит и цифру в поле не введут):

MMB Script
If (ставка$='') Then
  ставка=0
  ставка$=CHAR(ставка)
End
LoadText("ставка","ставка$")

Если пользователь, специально или случайно, введет в какое-нибудь поле отрицательное число, расчеты естественно будут неверными. Значит, надо запретить ему вводить отрицательные числа. Давайте сделаем так. В свойствах всех пяти эдитбоксов в поле "При замене текста выполнять следующий скрипт" напишем имя скрипта - "Нельзя". А теперь сделаем это скрипт "Нельзя". Вот условие для переменной цена$ (ведь при вводе в это окно мы получаем сразу две переменных - числовую "цена" и строковую "цена$"):

MMB Script
If (цена$='-') Then
  Message("Нельзя!","")
  цена$=''
  LoadText("цена","цена$")
End

То есть если будет введен минус, сразу выскочит сообщение "Нельзя!", и окно эдитбокса очистится. Точно так же напишите еще четыре условия для остальных четырех переменных. Строго говоря, пользователь сможет сначала вписать число, а затем приписать ему минус в начале, и наш скрипт не сможет ему это запретить. Но и это можно обойти, если немного подумать (предоставляю сделать это вам самим).

Вы можете предусмотреть еще кучу маленьких, но приятных мелочей - например, при вводе суммы первого взноса, превышающей итоговую цену товара, выводить сообщение "Вы что, собираетесь заплатить чаевые?" И даже указать эту сумму. А что, неплохая идея! Я так увлекся, что решил помочь вам написать такой сценарий. Его надо поместить в скрипт Calculate перед последними пятью строками вывода текстовых объектов. Вот этот сценарий:

MMB Script
If (аванс > итого) Then
  чаевые=аванс - итого
  чаевые$=CHAR(чаевые)
  ошибка$='Похоже, вы собираетесь заплатить ' + чаевые$ +' рублей чаевых!'
  Message("ошибка$","")
  Return()
End

Словом, простор для творчества! Больше идей и подсказок давать не буду. Осталось лишь написать сценарий для кнопки "Сброс". Он очень простой и никаких пояснений не требует:

MMB Script
цена=0
скидка=0
ставка=0
месяцы=0
аванс=0
цена2=0
накрутка=0
итого=0
осталось=0
платеж=0
цена$=''
скидка$=''
ставка$=''
месяцы$=''
аванс$=''
цена2$=''
накрутка$=''
итого$=''
осталось$=''
платеж$=''
LoadText("цена","цена$")
LoadText("скидка","скидка$")
LoadText("ставка","ставка$")
LoadText("месяцы","месяцы$")
LoadText("аванс","аванс$")
LoadText("цена2","цена2$")
LoadText("накрутка","накрутка$")
LoadText("итого","итого$")
LoadText("осталось","осталось$")
LoadText("платеж","платеж$")

Готовый, так сказать, к употреблению файл проекта можно, в принципе, и скачать. Берите люди, пользуйтесь, но учитесь всё делать сами. Для этого мы здесь и стараемся.

Продолжение следует
03 Апреля 2006
5774

Всего комментариев: 2


2. DoXeR

22:00, 12 Мая 2011Спам


а как можно закрыть в третьем примере не себя,а другую программу?

Ответ: Все вопросы на форум, пожалуйста.

1. HawaiiGuy E-mail

00:48, 30 Октября 2009Спам


Спасибо за статью. Но тута нашел маленькую ошибочку, или правельней сказать опечатку..
------
А вот и сам скрипт Timer:
i=i - 1
If (i=0) Then
Exit()
End
ScriptTimer("Script","1000") - в слове Script
------

Ответ: Не совсем корректно Вы написали, но ошибку нашёл и исправил. Спасибо :)

Добавлять комментарии могут только зарегистрированные пользователи
[ Регистрация | Вход ]