
| Условный оператор и циклы |
|
Введение Представьте, как было бы странно вести автомобиль, который может двигаться только вперед, без возможности повернуть влево или вправо. Также странно было бы иметь телефон, который может звонить только по одному номеру. А как насчет телевизора, на котором невозможно переключать каналы? Нам повезло, что мы только читаем об этих забавных ситуациях, в которых отсутствие выбора может привести к не очень счастливому концу. Все компьютерные программы содержат множество функций, и многие из них реализованы на анализе условий. Создавая возможность выбора, программист делает программу интерактивной. Это значит, что пользователь не просто смотрит "кино", а происходит взаимодействие между программой и пользователем.
Автомобиль доставит вас почти куда угодно, благодаря наличию руля. Чтобы заставить ваше приложение идти по желаемому пути, вы тоже используете "руль" - условные операторы! MMB использует два способа анализа условий - условный оператор If и циклы for..next. Введение
Делать выбор - это предназначение условного оператора. Глядя на дорожные знаки, вы изменяете скорость или направление движения вашего автомобиля. Удар по мячу в нужном направлении приносит футбольной команде гол. Добавляя больше перца, вы делаете пищу острее.
Как видно из рисунка наверху, в зависимости от того, что поместить поверх карточного домика, домик может остаться стоять или разрушиться. Синтаксис условного оператора Условный оператор состоит из: а) открывающей операторной скобки If If b) открывающейся скобки с именем переменной (object$ c) знака равенства = d) затем пишется значение переменной и закрывающая скобка 'камень') e) и в конце первой строки добавляется слово Then Then В общем виде первая строка условного оператора выглядит так: If (object$='камень') Then Эта строка говорит MMB о том, что необходимо выполнить некоторые действия, если содержимое строковой переменной object$ в точности соответствует выражению, указанному в апострофах (в данном случае 'камень'). И что же происходит, если значение переменной действительно совпадает с указанным выражением? Строкой ниже вы пишете строки, которые будут выполнены в случае совпадения выражения и значения переменной: Text$='Объект, помещенный на карточный домик: '+object$ Когда вы закончите написание кода, который должен выполняться в случае соответствия условию, вы можете написать другое зарезервированное слово: Else ...и после этого написать строки, которые будут задействованы в том случае, если заданное условие не выполняется. Например: Text$='На карточный домик помещен неизвестный объект!' Писать слово Else и код для случая несоответствия значения переменной выражению, заданному в строке If..Then необязательно. Но как бы вы не поступили, вы должны указать MMB, где заканчивается условный оператор, добавив закрывающую операторную скобку - end. End Теперь посмотрите, как выглядит условный оператор в полном виде! If (object$='камень') Then Говоря обычным языком: если содержимое переменной object$ - "камень", то текстовой переменной Text$ присваивается значение "Объект, помещенный на карточный домик: камень", и это значение будет отображено в окне сообщения. Но если значением переменной является что-то другое, то переменной Text$ будет присвоено значение "На карточный домик помещен неизвестный объект!", и это значение отобразится в окне сообщения. Все строки, помещенные после Else, выполняются только в случае несоответствия переменной указанному в условии выражению. Использование нескольких условных операторов Для выполнения большого объема вычислений, можно использовать несколько условных операторов: If (TankVolume=10) Then If (TankVolume=50) Then If (TankVolume=100) Then Первое, что бросается в глаза в этом примере - это то, что мы используем числовые переменные. Принцип в точности такой же, как при использовании строковых переменных. Мы рассматриваем числовую переменную TankVolume, которая содержит некоторое значение. Каждый раз, когда в наших условных операторах происходит анализ содержания переменной, мы видим окно сообщения, даже если ни одно из условий if не выполняется (результат анализа равен false). Это происходит потому, что последний условный оператор содержит слово Else, после которого указан код для случая, когда ни одно из условий не выполняется. Использование в условном операторе диапазона значений Использовать в условиях только фиксированные значения было бы не очень удобно:
Нам потребуется слишком много условных операторов, чтобы учесть все случаи. Лучше поступить так:
Итак, существует не только оператор присваивания, но и другие:
Вот как используются эти операторы в программе: If (Volume<10) Then (если значение переменной Volume меньше 10, то появляется соответствующее сообщение) If (Volume<=49) Then (если значение переменной Volume меньше или равно 49, то появляется соответствующее сообщение) If (Volume<>100) Then (если значение переменной Volume не равно 100, то появляется соответствующее сообщение) Множественные условия в операторе If Еще одной удобной особенностью условного оператора является возможность использования нескольких условий в одной строке.
Существует два логических оператора:
Чтобы воспользоваться ими, вы должны написать операторную скобку If: If ...открыть скобки для условий и написать имя первой переменной: (OldUser$ ...затем оператор присваивания: = ...после имени переменной и оператора присваивания указать значение переменной: 'Чак' ...добавить логический оператор & или |: & После этого, не открывая новой скобки, вы пишите следующее условие, начиная с имени переменной: NewUser$ ...затем оператор присваивания: = ...после имени переменной и оператора присваивания указываете значение переменной: 'Тимон' Теперь вы можете добавить еще одно условие, используя логический оператор, или закрыть скобки, содержащие условия: ) ...и не забудьте добавить Then в конце первой строки условного оператора: Then В общем виде первая строка условного оператора с несколькими условиями выглядит так: If (OldUser$='Чак' & NewUser$='Тимон') Then И что же делает эта строка? Сначала проверяется содержимое переменной OldUser$ на соответствие имени "Чак". Если это условие выполняется, то проверяется содержимое переменной NewUser$ на соответствие имени "Тимон". Если и это условие выполнено, то MMB переходит к строкам, записанным после слова Then. Вот пример использования оператора | (или): If (OldUser$='Чак' | NewUser$='Тимон') Then Условие будет считаться выполненным, если значение хотя бы одной из переменных будет соответствовать заданному в условии имени. Если ни одно значение не совпадет, то команды, записанные в составе условного оператора, будут пропущены. Существует множество различных способов применения условных операторов! Переменные могут сравниваться с другими переменными, множественные условия могут задаваться с использованием числовых и строчных переменных одновременно, использование оператора <> возможно не только с числами, но и со строками. Также допускается использование вложенных условных операторов. Давайте посмотрим по порядку, как использовать все перечисленные возможности... Переменная против переменной Во многих случаях значения хранятся в переменных. Можно проверять равенство значений переменных в условном операторе: If (User1$=User2$) Then В этом примере сравниваются две переменные (User1$, User2$), и если они одинаковые, то появляется сообщение, говорящее: "Пользователи одинаковы!". А вот пример использования числовых переменных: If (CurrentLevel>Recommended) Then Этот пример проверяет, не превышает ли значение переменной CurrentLevel значения переменной Recommended. Если это так, то появляется соответствующее сообщение. Использование в условных операторах переменных разного типа Еще одним преимуществом использования множественных условий является возможность задания условий с помощью числовых и строковых переменных в одном операторе. Вот пример: If (UserName$='Чак' & UserHeight>170) Then Этот код проверяет две переменные - строковую переменную UserName$ и числовую переменную UserHeight. Если строковая переменная содержит имя "Чак", и значение числовой переменной больше 170, то будет отображено сообщение: "Рост Чака больше 170 сантиметров". Проверка соответствия с помощью оператора <> В некоторых случаях вы не заинтересованы в том, чтобы значение переменной соответствовало какому-либо выражению или интервалу, а наоборот - оно должно отличаться от заданного условия. Самым обычным примером является проверка пароля, когда ваша программа требует от пользователя ввода определенного выражения (постоянного или изменяемого) в качестве кода доступа. Давайте посмотрим, как это можно сделать: If (UserInput$<>'RegKey') Then Вы уже встречались с оператором <>. Обычно он используется с числовыми переменными, но в MMB вы можете использовать его и для проверки строковых переменных, как это видно из предыдущего примера. Для того чтобы вспомнить, как использовать этот оператор с числовыми переменными, рассмотрим следующий пример: If (MyHeight<>YourHeight) Then В этом примере мы сравниваем две числовые переменные. Если они разные, то появляется сообщение: "У нас разный рост!" Вложенные условные операторы В дополнение к использованию множественных условий существует другой способ проверки соответствия нескольким условиям. Можно поместить один условный оператор внутрь другого и в нем указать код, который будет обрабатываться в случае выполнения обоих условий. If (UserName$='Чак') Then Хотя вы могли заменить этот пример более короткой версией: If (UserName$='Чак' & UserHeight>170) Then ...при использовании вложенных условных операторов можно поместить какой-либо код внутри первого оператора, и он будет выполняться независимо от выполнения второго условия: If (UserName$='Чак') Then В этом примере сначала проверяется соответствие значения переменной UserName$ имени "Чак". Если это условие выполняется, то появляется сообщение с текстом: "Привет, Чак!". После этого во втором (вложенном) условном операторе проверяется значение переменной UserHeight. Если ее значение больше 170, тогда появляется второе сообщение, говорящее: "Твой рост больше 170 сантиметров!". If (UserName$='Тимон') Then Условные операторы выделены различными цветами, чтобы вы могли видеть, к какому из операторов относится закрывающая скобка End. Первое сообщение появляется, если значение переменной UserName$ равно имени "Тимон". Второе сообщение появляется в том случае, если значение переменной UserHeight больше 160. Наконец, третье сообщение особенно интересно - если значение переменной UserWeight больше 60, то появится текст: "Твой вес больше 60 килограмм, пора худеть!" и выполнение всех трех условных операторов будет остановлено с помощью команды Return(). Но если значение переменной UserWeight меньше или равно 60, то будет отображено другое сообщение: "Тимон, твой вес меньше или равен 60 килограммам". Введение Идите дальше. Не могли бы вы повторить? Сделайте 10 кругов вокруг стадиона! Подобные выражения встречаются каждый день, и никто не говорит: Продолжайте циклически переставлять ноги. Не могли бы вы зациклить сказанное? Повторите цикл вокруг стадиона 10 раз! Хотя это звучит смешно, но в то же время это правильно - перемещение ног повторяется циклически, также как и бег вокруг стадиона. В двигателях тоже используется цикл:
Миллионы людей работают у конвейера, используя циклы в своей работе:
И во всех этих случаях ничем нельзя помочь - действия должны выполняться вручную, иногда с помощью автоматизированных машин. И раз мы говорим о машинах, не позаимствовали ли компьютеры эту идею? Правильно! Программисты устали от выполнения сложных действий вручную, повторяя одни и те же функции снова и снова... и они добавили циклы! Циклы и MMB
Вот как это сделано в MMB! Наполняйте программу командами, словно соком, столько сколько нужно! При использовании циклов начало цикла задают словом For: For ...затем добавляют числовую переменную, которая будет играть роль счетчика: Counter ...пишут знак присваивания: = ...и указывают стартовое значение счетного интервала переменной Counter: 1 ...добавляют слово To: To После этого задают конечное значение счетного интервала: 100 Теперь давайте посмотрим, как выглядит первая строка цикла for..next: For Counter=1 To 100 Эта строка говорит MMB о том, что все строки, написанные ниже должны повторяться. И сколько раз? С начального значения числовой переменной до ее конечного значения. После задания параметров цикла вы можете начать написание кода, который должен выполняться в цикле. В нашем примере команды будут повторяться 100 раз (количество повторов определяет переменная Counter). Что ж, давайте напишем несколько уже известных нам команд: var$='Привет из цикла! Это первое сообщение' С помощью этих строк будет отображено два сообщения. Одно сообщение содержит текст "Привет из цикла! Это первое сообщение", второе содержит текст "Привет из цикла! Это второе сообщение". Если эти строки будут выполнены без использования цикла, то каждое из сообщений появится только один раз. Но если мы зададим цикл с помощью выражения For Counter=1 To 100, то тем самым мы скажем MMB: "Повтори каждое сообщение сто раз!" Значение переменной var$ при этом изменится 200 раз. Каждое сообщение появится 100 раз. Как только вы написали команды, которые должны выполняться в цикле, важно обозначить его завершение, иначе MMB не будет знать, что находится в теле цикла, а что вне цикла. Думаю, выполнение всей программы в одном большом цикле вам не подходит. Окончание цикла обозначается словом Next. Помните переменную Counter, выполняющую функцию счетчика? Вы должны указать имя этой переменной после слова Next: Next Counter С помощью этой строки вы указываете MMB: "Как только ты выполнил команды в теле цикла, следует обновить значение числовой переменной, используемой в качестве счетчика (значение может уменьшаться или увеличиваться на 1, об этом чуть ниже), и выполнять команды снова!" В полном виде цикл выглядит следующим образом: For Counter=1 To 100 Числовая переменная Counter выполняет функцию счетчика, ее имя обозначено черным цветом. Интервал значений счетчика от 1 до 100 выделен красным цветом. Все строки, которые повторяются в цикле, выделены коричневым цветом. Счетчик цикла Если вы стоите у дороги и считаете проезжающие автомобили, то когда проезжает первый автомобиль, вы запоминаете число "1". Когда проезжает еще один автомобиль, вы добавляете к этому числу единицу и ждете следующую машину. И так до тех пор, пока вам не станет скучно, и вы не скажете: "Мне надоело делать одно и то же!" Другой пример - секундомер в одной руке, пистолет в другой, и дюжина бегунов на огромном стадионе. Вы начинаете обратный отсчет... 10...9...8...7...6...5...4...3...2...1...БАХ! Оба случая используются в MMB для организации отсчета. Уже упомянутое служебное слово Next определяет, что именно необходимо сделать при счете - оно либо добавляет 1 к некоторому числу (представленному числовой переменной), либо вычитает из этого числа 1. Таким образом, счетчик "запоминает" количество выполненных повторов для команд, заключенных в теле цикла, и как только он достигает конечного значения, цикл завершается, и слышен выстрел (это шутка).
Пример на рисунке использует в качестве счетчика переменную i. Цикл повторяется 5 раз, затем MMB продолжает выполнение кода, указанного после цикла For..Next. Это означает что сообщение "Цикл завершен!" не появится до тех пор, пока цикл не повторится n раз (в данном случае n=5). Примеры отсчета, приведенные выше, используют положительное (+1) и отрицательное (-1) направление счета. Примеры кода с положительным направлением счета нам знакомы, вот еще один такой пример: For MMB=1 To 10 В этом случае отсчет начинается с минимального значения (MMB=1) и завершается максимальным (To 10). Можно использовать и отсчет в обратном направлении: For Seconds=10 To 1 Здесь отсчет начинается с максимального значения (Seconds=10) и заканчивается минимальным (To 1). MMB сравнивает начальное и конечное значение, и автоматически определяет в каком направлении необходимо вести отсчет. Конечно же, необязательно использовать 1 в качестве начального или конечного значения: For MileAge=90 To 100 В этом примере в качестве начального значения используется число 90, а в качестве конечного значения - 100. Так сколько раз повторится цикл? Точно! 10! Но будет не очень интересно, если вы сможете использовать циклы только для повторения фиксированного кода. Поскольку MMB использует для счетчиков числовые переменные, а числовые переменные могут встречаться в любой части вашей программы, то текущее значение счетчика можно использовать для создания динамических действий. Это похоже на то, как если бы вы переходили от одного бегуна к другому перед началом забега, раздавая им номера, и говорили: "Ваш номер 1", "Ваш номер 2", "Ваш номер 23473"... Рассмотрим пример: For Runner=1 To 10 Этот цикл использует числовую переменную Runner для повторения некоторого кода 10 раз. Каков же результат? Цикл отобразит сообщение 10 раз, но содержание каждого сообщения будет соответствовать текущему значению счетчика. Таким образом, сообщение каждый раз будет содержать разные числа: Ваш номер 1 Эта возможность очень полезна для быстрой обработки элементов, имен, записей, файлов... вы только изменяете индекс, и все снова повторяется внутри цикла. Настоящая экономия времени - представьте себе написание и обработку одного и того же блока команд для каждого элемента! Когда вы начнете использовать циклы, вы уже не сможете отказаться от этой возможности ;) СОВЕТ! Также существует возможность динамически изменять конечное значение счетчика внутри цикла. Благодаря этому вы можете досрочно завершить выполнение цикла, не прибегая к командам Return() и Break(). ПРИМЕР: ** Этот цикл завершится на третьем шаге... Время от времени возникает необходимость в цикле неопределенной длины, например, для периодической проверки введенной пользователем информации, когда заранее не известно необходимое число шагов. В таких ситуациях на помощь приходят бесконечные циклы. For Check=1 To Infinity Этот пример использует в качестве конечного значения счетного интервала выражение Infinity - бесконечность, - как если бы цикл был задан словами: "Начни с 1 и никогда не останавливайся". Конечно, в этом случае никогда является условным понятием - цикл повторяется до тех пор, пока работает ваша программа и страница проекта не изменяется. Если пользователь закроет программу, перейдет на другую страницу, или компьютер завершит выполнение программы, то бесконечность закончится ;) Проблема, возникающая при использовании таких циклов - функционирование программы во время выполнения цикла. Неужели все остальные действия будут блокированы во время выполнения бесконечного цикла? Конечно нет, но для этого рекомендуется использовать специальные команды: Refresh() - позволяет другим процессам, происходящим в вашей программе выполнять свои действия Подробности об этих командах вы можете узнать в разделах описаний команд, здесь же мы рассмотрим, как их использовать в циклах: For Check=1 To Infinity Команда Refresh(), помещенная в конце цикла, дает время другим процессам программы для выполнения их задач перед следующим шагом цикла. For Check=1 To Infinity Команда Pause(""), помещенная в конце цикла, останавливает выполнение цикла (в нашем примере на 500 миллисекунд) перед выполнением следующего шага цикла. Это означает что строки, помещенные в цикл, будут выполняться каждые полсекунды. Для задач, в которых частота выполнения цикла не имеет критического значения, рекомендуется использовать даже большее значение задержки. Другая проблема, возникающая при использовании бесконечных циклов, заключается в том, как остановить выполнение цикла при достижении требуемых значений. В таких случаях команда Return() может оказать неоценимую помощь, поскольку она полностью завершает выполнение текущего скрипта. For Check=1 To Infinity Если вы не хотите прерывать выполнение всего скрипта, а только прервать выполнение цикла For..Next, то вместо команды Return() необходимо использовать команду Break(). Выполнение скрипта продолжится со строк, находящихся ниже последней строки цикла, из которого была вызвана команда Break(). В приведенном выше примере цикл повторяется до тех пор, пока значение строковой переменной UserInput$ не станет равным значению "GO". Когда это произойдет, в условном операторе будет выполнена команда Return(), и выполнение цикла, а также всех строк, расположенных ниже, будет прекращено. Такой способ часто применяется для вызова других скриптов с помощью команд RunScript() и ScriptTimer(): For Check=1 To Infinity Познакомиться подробнее с командами RunScript и ScriptTimer можно в соответствующем разделе. Кажется это все, что можно рассказать о циклах! Если вы только начинаете создавать скрипты в MMB, то вероятно, использование циклов будет не первым приемом, который вы освоите, и вместо них вы будете использовать простое повторение строк кода. Но когда вы лучше освоите программирование, циклы окажутся очень удобным решением многих задач. |
MMB Программирование без границ :: dgilmour, перевод на русский язык, 2006 :: Все права защищены :: www.mmbscript.ru