А куда без логики ? часть 1

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

Когда во всем известном блокноте печатается текст, постоянно в программе идет сравнение а достигли ли введенные символы конца строки, чтобы сдвинуть ползунок скроллинга или перенести текст на новую строку (зависит от настроек в редакторе).  Представьте себе игру, в которой вы не нажимаете кнопок, а только смотрите на экран, чего то там перемигивающий.  С другой стороны, если вы будете нажимать кнопки, то программе нужно знать когда кнопка нажалась, когда отпустилась, то есть всегда спрашивать систему. Пример:

Кнопка нажалась?

Если да, прыгнуть героем

Если нет, стоять герою

В FreeBasic есть хорошие команды для реализации практически любой логической задачи. Одной из них является команда IF  Есть два способа записи условного блока.

  1. На одной строке (тогда оператор ENDIF не требуется)
  2. На нескольких строчках, тогда в обязательном порядке необходим оператор ENDIF.

Но в любой из этих схем необходимы как минимум оператор IF в связке с THEN Сперва давайте рассмотрим простую блок схему без оператора ENDIF.

IF задаваемое условие  THEN  если условие истинно выполнить это  

Если перевести с английского операторы IF  и  THEN , и чуть переписать по смыслу, мы получаем следующее:

ЕСЛИ условие истинно ТОГДА выполнить это

Забавно правда? Когда бейсик изобретали, упор старались делать именно на простоту и быструю обучаемость языку. Давайте рассмотрим настоящий пример:

 

Dim As Integer VALUE = 55
If VALUE=55 Then  Print "VALUE=55"
Sleep(4000)


В первой строке мы переменной VALUE присвоили значение 55. Во второй строке мы проверяем: равна ли переменная 55. Если равна(а у нас именно так), то напечатать строку "VALUE=55".  Теперь поменяйте значение в первой строчке на любое другое число и снова запустите. Как вы можете заметить ничего напечатано не будет, а будет пустая консоль в течении 4 секунд мозолить нам глаза. А давайте немного перепишем пример:

 

Dim As Integer VALUE = 20
If VALUE=55 Then  Print "VALUE=55" : Sleep(4000)


Как видите теперь даже консоль мы не видим, поскольку сравниваемая переменная не равна 55. Конечно можно в одну строку через оператор :  написать не одну команду, но это сделает наш код уродливым. В том числе именно поэтому, для множества команд в сравнительной операции, лучше использовать связку IF THEN ENDIF. Сейчас давайте вспомним в одной из из прошлых статей, я говорил о неких блоках (Enum - END Enum), которые завершаются связкой команды END и имени завершаемой команды. Так и команда IF тоже использует похожее правило. Давайте рассмотрим блок схему с  использованием оператора ENDIF:

IF задаваемое условие THEN

Если задаваемое условие выше истинно

выполнить все команды,

что будут записаны

в этом блоке

ENDIF

В этой схеме все команды, которые должны выполняться при проверке с помощью оператора IF , должны быть записаны в тело этого блока. Уже писать в строке после THEN ничего не нужно! Пример:

 

Dim As Integer VALUE
Input "Enter value" , VALUE    ' Просим пользователя ввести число
If VALUE <> 20 Then   ' Проверка на неравенство 20
    Print "Variable does not equal 20"  ' переменная не равна 20
    Sleep (2000)
    End  ' выходим из программы
Endif
Print "Variable is 20" ' переменная равна 20
Sleep (2000)

Нам встретился новый оператор не равно  <> Кроме того, мы в середину программы всунули оператор END (конец программы) . Если программа, в каком бы то ни было месте, встретит оператор END она завершит программу!  Исключение составляют составные операторы END ENUM, END SELECT, END FUNCTION и прочие.
Если в прошлых примерах, мы проверяли на равенство = , то в этом обратная операция <> Вы должны понимать, что проверяя на неравенство, мы в любом случае ждем логический ответ от программы. То есть:

A=50
A равно 50? логический ответ ДА
A не равно десяти ? логический ответ ДА
A равно пяти? логический ответ НЕТ
A не равно 50? логический ответ НЕТ

Именно это возвращает нам оператор IF (логический ответ) И во многом от этого ответа зависит, выполнять программе то,  что находится в его блоке, либо нет. Конечно компьютер возвращает не слова ДА или НЕТ.   Как вы помните, все в компьютере представлено в числах. Отсюда простые правила:

1 - ДА  (или как часто пишут программисты TRUE)

0 - НЕТ  (или языком программиста FALSE) 

Поэкспериментируйте с примером. Как вы думаете, в каком случае программа напишет в консоли: Variable is 20 ? Думаю, что вы не задумываясь даже, ответили правильно. А нам пора рассмотреть более мощную конструкцию оператора IF.    Вот его блок схема:

 

IF задаваемое условие THEN

Если задаваемое условие выше истинно

выполнить команды, записанные здесь и выйти из блока

ELSEIF  задаваемое условие THEN

Если задаваемое условие выше истинно

выполнить команды, записанные здесь и выйти из блока

ELSEIF  задаваемое условие THEN

Если задаваемое условие выше истинно

выполнить команды, записанные здесь и выйти из блока

ELSE  если ни одно условие не истинно, тогда

выполнить команды, записанные здесь и выйти из блока

ENDIF

Мне кажется даже по этой схеме для многих станет понятно, как все это дело работает, но я на всякий случай поясню:

В одном блоке IF - THEN - ENDIF может быть неограниченно много дополнительных сравнений с помощью команды ELSEIF и лишь одна команда ELSE. Все условия проверяются сверху вниз по порядку. Если хоть в одном из сравнений условие  истинно (TRUE) ,  то выполняется те команды, которые идут непосредственно за сравнением до следующей команды блока, которая может быть одна из трех: ELSEIF или ELSE или ENDIF, и после выполнения происходит выход из этого блока. В строке с командой ELSE  оператор THEN ставить не надо! Команда ELSE это команда по умолчанию, когда ни одно из верхних условий не является истинным, тогда выполняются команды, идущие сразу за командой ELSE. Вообще говоря команды ELSEIF и ELSE являются не обязательными. То есть вы можете использовать их вместе, можете использовать только ELSEIF или только ELSE. Все зависит от той задачи, которую вам нужно решить в программе.

 А теперь, как бы в подтверждение примеры:


Dim NameS As String = "Richard"
If NameS = "Kristina" Then
    Print "Hello Kristina"
Elseif NameS = "Richard"  THEN
    Print "Hello Richard"
Endif
Sleep (2000)

Как вы уже наверно догадались, программа выведет в консоль надпись Hello Richard, поскольку условие сравнения  NameS = "Kristina"  является ложным, а NameS = "Richard" истинным. Пример можно переписать проще:

 

Dim NameS As String = "Richard"
If NameS = "Kristina" Then
    Print "Hello Kristina"
Else
    Print "Hello Richard"
Endif
Sleep (2000)

Как видите программа выполнила ту же задачу, только чуть по другому. А теперь пример с использованием всех рассмотренных команд блока IF:

 

Dim Alpha As Short = 1000
If Alpha > 2000 THEN     'если Alpha больше 2000
    Print "Alpha>2000"
Elseif Alpha < 800 Then   'если Alpha меньше 800
    Print "Alpha<800"
Elseif Alpha <= 1000  THEN   'если Alpha  меньше или равно 1000
    Print "Alpha<=1000"
Else
    Print "Unknown"    'неизвестно
Endif
Sleep (3000)

Здесь три операции сравнения и одна введенная по умолчанию. Сработает третье сравнение (Alpha<=1000 ). В этом примере, вы увидели три новых оператора < , > , <=.  Ниже представлены все подобные операторы:

<     меньше

>     больше

<=   меньше или равно

>=   больше или равно

<>   не равно

=     равно

Я представил именно синтаксис записи этих операторов, все остальное вам известно из начальных курсов математики.

У блока команд IF - THEN - ENDIF есть еще "некие помощники", которые существенно расширяют возможности, это OR и AND. Если их перевести с английского языка то: OR - или , AND - и . Есть правда еще некоторые другие, но их используют реже для этого блока. В любом случае, в одной из глав, мы их рассмотрим. А пока давайте посмотрим как могут пригодится OR и AND:


Dim Alpha As Short = 4
If Alpha < 5 And Alpha >3 THEN     'если Alpha меньше 5 и больше 3
    Print "Alpha=4"
    Sleep (3000)
Endif


В данном примере мы использовали оператор AND для объединения условий в одно условие. Принцип его таков: если оба условия истинны , тогда общее условие истинно. Я написал два, поскольку в примере 2 условия объединяются в одно, но можно задавать для объединения столько сколько нужно, при том разной сложности. Пример:

 

Dim As Ubyte Alpha = 2, Beta=5, Gamma=10, Delta=50
If Gamma/Alpha=Beta And Delta/Gamma=Beta And Beta=5 THEN  
    Print "All the conditions are fulfilled" 'все условия истинны
    Sleep (3000)
Endif


Чтобы лучше запоминалось, еще раз как работает оператор AND :

 

IF A=5 AND B=6 AND C=7 THEN   Print  "все условия выполнены"


ЕСЛИ (A=5)  а так же (B=6) а так же (С=7) тогда печатаем  "все условия выполнены"

 

Оператор OR (или) используется так же , как оператор AND, но в отличии от него, ему не нужна истинность всех условий. Для него важно хотя бы одно истинное, все остальные ему до лампочки. Пример:
 

Dim Alpha As Short = 4
If Alpha < 5 Or Alpha <>4 Then     'если Alpha меньше 5 или не равно 4
    Print "Alpha=4"
    Sleep (3000)
Endif

Как видите я задал два условия и лишь одно из них истинное. Во втором условии я явно задаю условие о неравенстве 4, но надпись все равно выводится, поскольку оператор уже нашел в одном из условий истину. Чтобы лучше запоминалось, еще раз как работает оператор OR :

 

IF A=5 OR B=6 OR C=7 THEN Print  "одно или несколько условий выполнены"


ЕСЛИ (A=5) или  (B=6) или (С=7) тогда печатаем  "одно или несколько условий выполнены"

 

А теперь следует запомнить: проверка условий идет слева направо. Операторы AND и OR прекращают проверку, если:

  •  оператор AND нашел ложное условие
  •  оператор OR нашел истинное условие

Вот пожалуй и все что мне хотелось рассказать об блоке IF - THEN - ENDIF. В следующей статье мы рассмотрим блок SELECT CASE  - END SELECT. Тоже очень мощный, но правда менее гибкий чем IF - ENDIF и все же у него есть свои плюсы.

И напоследок хотелось бы рассказать почему я для русских пользователей использую английские тексты в примерах для вывода в консоль. Дело в том, что консоль не понимает русских символов кодировки ASCII по умолчанию. Чтобы консоль начала выводить русские буквы , нужно выводить в нее текст в другой кодировке (например ASCII с кодовой страницей 866 или UNICODE). На данном этапе , не стоит забивать этим голову. Всего доброго!

содержание | назад | вперед