Базы данныхИнтернетКомпьютерыОперационные системыПрограммированиеСетиСвязьРазное
Поиск по сайту:
Подпишись на рассылку:

Назад в раздел

ГЛАВА4
| << | < | > | >>

ГЛАВА4
УПРАВЛЯЮЩИЕСТРУКТУРЫ


В режиме диалога с системой Paradox вы сами задаете последовательность действий системы. В процессе сеанса вы несколько раз выбираете различные режимы системы Paradox и команды PAL.В зависимости от результатов предыдущих действий вы сами решаете, что необходимо изменить и в какой последовательности решать те или иные задачи.

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

Управляющие структуры PAL включают:

  • команды ветвления, выполняющие различные группы команд, в зависимости от того, выполнены ли некоторые условия;
  • команды циклов, вызывающие повторение группы команд до тех пор, пока не выпролнены некоторые условия;
  • команды завершения, обспечивающие выход из процедур и скриптов.

В настоящей главе содержится обзор управляющих структур PAL и способов их применения. Полный синтаксис каждой команды описан в справочнике команд в главе 20.

УСЛОВИЯ


Для определения, какие команды выполнять следующими, несколько управляющих команд PAL включают проверку условия, которое является обычным логическим выражением. Напрпример, следующие выражения могут рассматриваться как условия:

     x = 4                          ; проверка,  x = 4
     Age  > 21                      ; проверка, больше ли Age
                                    ; чем 21
     [Date  Hired]  < TODAY() - 90  ; проверка, был  ли  рабочий
                                    ; нанят  ранее чем  за  90
                                    ; дней  до  сегодняшнего

Условная часть управляющей команды сообщает системе, надо ли выполнять определенную последовательность команд, например:

IF Condition

THEN Commands ; команды выполняются, если

; Condition=True ENDIF

или какую из последовательностей команд выполнять:

SWITCH

CASE Condition1 : Commands1 ; выполняется Commands1 при

; условии Condition1 CASE Condition2 : Commands2 ; выполняется Commands2 при

; условии Condition2 ...
ENDSWITCH

Другие управляющие команды выполняются немедленно и не требуют условий как RETURN и QUITLOOP.

КОМАНДЫ ВЕТВЛЕНИЯ


Команда ветвления дает возможность скрипту PAL выбрать из нескольких определенных вами групп команд ту, которую необходимо выполнить. Выбор зависит от условия, которое выполняется или не выполняется к моменту обработки команды ветвления. Меню системы Paradox являются хорошими примерами команд ветвления, так как ваш выбор определяет, какая из процедур системы Paradox будет выполняться. Например, если вы выбрали Modify/Sort, то система Paradox начнет выполнять команды сортировки таблиц.

Команды ветвления PAL работают таким же образом: вы определяете условия, а команда действует в зависимости от того верно оно или не верно. В языке PAL есть две команды ветвления:

  • IF, разделяющая выполнение программы на две ветви, как разветвление дороги, при этом PAL должен выбрать одно напрвление.
    • SWITCH, разделяющая выполнение программы на несколько ветвей.

На практике различие между IF и SWITCH является более сложным, чем отличие двух ветвей от многих, так как вы можете вкладывать управляющие структуры друг в друга. Например, если одна из команд выполняемая внутри структуры IF, также является струкрурой IF, то это приводит к разделению на три ветви. PAL поддерживает неограниченное количество вложений управляющих структур. Команда SWITCH более подходит для разделения на несколько ветвей, а вложенные команды IF удобнее моделируют иерархическое ветвление.

Если вы программировали на Бейсике или любом другом языке программирования, то вы, наверное, заметили отсутствие команды GOTO. Не волнуйтесь: вы можете достигнуть тех же результатов, используя команды IF и SWITCH, при этом текст вашей программы будет более удобен для чтения.

Команда IF


Команда IF является простым переключателем из двух альтернатив. Она действует так: ЕСЛИ выполнены некоторые условия, ТО выполняются некоторые команды, ИНАЧЕ выполняется другая группа команд. Структура IF выглядит так:

IF Condition

THEN Commands1
ELSE Commands2
ENDIF

причем команды ELSE может и не быть.

Если вы опустите эту команду, а условие Condition не выполнено, то PAL перейдет к выполнению команды ENDIF. Предложение ENDIF должно завершать каждую структуру IF.

Предположим, вы хотите запустить определенный скрипт, если пользователь нажал клавишу {Enter}, и другой скрипт, если пользователь нажал другую клавишу. Пример, приведенный на рис 4-1, демонстрирует ветвление с помощью структуры IF.

IF (GETCHAR()=13) ; следующий символ - возврат каретки?

THEN PLAY "Cr" ; да, запускается скрипт Cr ELSE PLAY "Nocr" ; нет, запускается скрипт Nocr ENDIF

Рис 4-1. Ветвление IF/THEN/ELSE.

Вы можете вкладывать структуры IF друг в друга, например:

IF Condition1

THEN

             IF Condition2        ;  начало  вложенного  IF
                 THEN Commands1
                 ELSE  Commands2
             ENDIF                ;  конец  вложенного IF

ELSE Commands3
ENDIF

Хотя приведенный пример показывает, что вложение происходит после команды THEN, его можно делать и после команды ELSE. Каждая команда ENDIF воспринимается как конец ближайшей команды IF, то есть первая команда ENDIF является окончанием второй структуры IF, а вторая - завершает первую структуру.

Заметьте, что отладчик PAL не будет сообщать вам о пропуске команды ENDIF. Вместо этого вы можете увидеть сообщение о неожиданной ( not expected) команде. Мы рекомендуем вам выделять структуры IF отступлением от начала строки, как показано в примерах, для дополнительной проверки, завершили ли вы структуры IF.

В случае ветвления с многими альтернативами более удобной является команда SWITCH. Однако, если ветвление является иерархической цепью ветвлений с двумя альтернативами, предпочтительно использование вложенных команд IF. Например:

IF A

THEN

          IF B
            THEN  Commands1
            ELSE Commands2
          ENDIF
        ELSE
          IF B
            THEN Commands3
            ELSE  Commands4
          ENDIF

ENDIF

является более предпочтительным, чем:

SWITCH

CASE (A AND B) :Commands1
CASE (A AND NOT B) :Commands2 CASE (NOT A AND B) :Commands3 CASE (NOT A AND NOT B) :Commands4 ENDSWITCH

В примере, использующем вложенные команды IF при выполнении скрипта проверяется максимум два условия. Напротив, в примере, использующем SWITCH, при выполнении может быть проверено до восьми условий.

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

IF (A AND B )

THEN Commands
ENDIF

следует использовать вложененые структуры IF:

IF A

THEN

          IF B
            THEN  Commands
          ENDIF

ENDIF

Первая структура всегда проверяет оба условия A и B. Вторая структура, если A оказывается ложным, не проверяет второе условие и выполняется быстрее.

Команда SWITCH


Команда SWITCH моделирует несколько предложений IF/THEN и используется для ветвления с несколькими альтернативами. Команда часто используется вместе с командами меню. При этом команде SWITCH предшествует команда SHOWMENU, высвечивающая меню типа того, что появляется в системе Paradox.

Команда SWITCH включает одно предложение CASE для каждой альтернативы. Предложение CASE содержит условие, за которым следует ":" и группа команд, выполняемых, если это условие верно. Вы можете использовать также предложение OTHERWISE, выполняемое, если ни одно из условий CASE не верно. При обработке команды SWITCH выполняется лишь одна из альтернативных групп команд. Синтаксис команды:

SWITCH

CASE Condition1 : Commands1
CASE Condition2 : Commands2
...
CASE Condition_n : Commands_n
OTHERWISE Commands
ENDSWITCH

Предположим, вы хотите представить меню в стиле системы Paradox с шестью альтернативами - добавление данных, удаление данных, изменение данных, сохранение данных, выборка данных и выход. Вы можете использовать команду SHOWMENU, с помощью которой высвечивается меню, и команду SWITCH для выбора соответствующей процедуры. В примере на рис 4-2 предложение OTHERWISE учитывает возможность, что пользователь может нажать {Esc}, что является отказом от выбора. Заметьте, как использование абзаца делает понятным, какие команды выполняются в каждом случае. Так как меню является действительно выбором из многих альтернатив, то использование команд IF не удобно. Если бы вы это сделали, у вас бы получилось:

IF response = "Add"

THEN PLAY "adddat"
ELSE

            IF response =  "Delete"
               THEN  PLAY "Deldat"
               ELSE
                  IF  ...

При этом не только получается запутанная структура, но и возрастает вероятность несогласованности между IF и ENDIF.

; Высвечивание меню

SHOWMENU

"Add" : "Add data"
"Delete" : "Delete data"
"Change" : "Change data"
"Save" : "Save data"
"Load" : "Load data"
"Exit" : "Leave the program" TO response ; выбор запоминается в response

; выбор происходит в зависимости от response

SWITCH

CASE response = "Add" :

PLAY "adddata"
CASE response = "Delete" :

PLAY "deldat"
CASE response = "Change" :

PLAY "cngdat"
CASE response = "Save" :

PLAY "savdat"
CASE response = "Load" :

PLAY "loddat"
CASE response = "Exit" :

           Quit
        OTHERWISE  :                 ;  в  случае нажатия {Esc}
            BEEP
            MESSAGE  "If you want to exit, select EXIT"

ENDSWITCH

Рис 4-2. Ветвление с помощью меню.

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

SWITCH

CASE Number < 0 : Number = ABS(Number) CASE Number = 0 :
MESSAGE " Can't perform operation with value of Zero" QUIT
ENDSWITCH

В этом примере команда SWITCH использована для проверки величины переменной Number, от которой зависит дальнейшее выполнение программы.

ЦИКЛЫ


Циклом называется группа команд, выполнение которой осуществляется до тех пор, пока не будет выполнено определенное условие. PAL поддерживает три структуры циклов:

  • FOR - выполняет цикл пока переменная-счетчик не достигнет определенного верхнего предела;
  • WHILE - выполняет цикл, пока справедливо определенное условие;
  • SCAN - выполняет цикл для определенных записей таблицы системы Paradox.

Кроме того, с помощью команд LOOP и QUITLOOP можно прервать цикл или выйти из него. Как и команды ветвления, циклы могут быть вложены один в другой. Можно также комбинировать циклы с командами ветвления, создавая сложные структуры, такие как: "выполнять данный цикл N раз, если выполнено некоторое условие, и M раз в противном случае":

IF Condition = True

THEN FOR i FROM 1 TO 10 ? i ENDFOR ELSE FOR i FROM 1 TO 5 ? i ENDFOR ENDIF

Команда FOR


Цикл FOR использует счетчик, управляющий тем, сколько раз выполняется цикл. В начале счетчику присваивается начальная величина и цикл выполняется первый раз. Затем счетчик возрастает на определенную величину (заданную вами), и выполнение команд цикла повторяется. Это продолжается до тех пор, пока значение переменной - счетчика не превзойдет определенную вами максимальную величину. Синтаксис цикла:

FOR Counter

          FROM expression
          TO   expression
          STEP expression
          Commands

ENDFOR

Причем FROM и STEP необязательны.

Counter является численной переменной, а ENDFOR должно завершать структуру. Цикл FOR особенно полезен, когда:

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

FOR j FROM 0 TO 4

@ j,0
?? SPACES(80)
ENDFOR

  • вы хотите использовать равномерно изменяющуюся величину в цикле. Например, когда нужно напечатать квадраты первых десяти цифр:

FOR Counter FROM 1 TO 10

?? (Counter * Counter) ; печать квадратов чисел ENDFOR

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

x = 1
y = 10
FOR Counter FROM x TO y STEP x

?? (Counter * Counter) ; печать квадратов чисел ENDFOR

Команда WHILE


Цикл WHILE используется для повторения группы команд неопределенное число раз. Цикл выполняется до тех пор, пока верно заданное в заголовке цикла условие. Синтаксис его таков:

WHILE Condition

Commands
ENDWHILE

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

Несколько простых примеров, иллюстрирующих работу цикла WHILE:

WHILE True ; программа зацикливается, так как условие

; всегда истинно
? " Hello there"
ENDWHILE

WHILE False ; цикл ни разу не выполняется, так как усло

; вие всегда ложно
? " Hello there"
ENDWHILE

x = True
WHILE x ; цикл выполняется один раз ? " Hello there"
x = False
ENDWHILE

В примере, приведенном на рис.4-2, высвечивалось меню и, в зависимости от выбора пользователя, запускался соответствующий скрипт. При этом, когда завершалась работа этого скрипта, PAL переходил к обработке команды, следующей за ENDSWITCH. Если вы хотите, чтобы после завершения скрипта снова высвечивалось меню, следует включить команды, приведенные на рис 4-2, в цикл. Цикл, приведенный на рис 4-3, высвечивает меню каждый раз после завершения скрипта, выбранного пользователем. Выполнение цикла завершается выбором из меню опции Exit. Заметьте, что предложение OTHERWISE исключено. То есть, если пользователь нажимает {Esc}, то выполнение цикла заканчивается и PAL переходит к обработке ко манд, следующих за ENDWHILE.

WHILE (response <> "Esc")

; Высвечивание меню

SHOWMENU

             "Add"   :  "Add data"
             "Delete"   :  "Delete data"
             "Change"   :  "Change data"
             "Save"   :  "Save data"
             "Load"   :  "Load  data"
             "Exit"   :  "Leave  the program"

TO response ; выбор запоминается в response

; выбор происходит в зависимости от response

SWITCH

            CASE response  =  "Add"  :
               PLAY "adddata"
            CASE response  =  "Delete"  :
               PLAY "deldat"
            CASE response  =  "Change"  :
               PLAY "cngdat"
            CASE response  =  "Save"  :
               PLAY "savdat"
            CASE response  =  "Load"  :
               PLAY "loddat"
            CASE response  =  "Exit"  :
               Quit

ENDSWITCH
ENDWHILE

Рис 4-3. Использование цикла для возврата в меню.

Команда SCAN


Команда SCAN является уникальной в системе Paradox. Она предназначена для выполнения группы операций над полями текущей таблицы рабочей области каждый раз, когда обрабатываемая запись удовлетворяет определенному условию.

Синтаксис цикла SCAN таков:

SCAN [FOR Condition]
Commands
ENDSCAN

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

Предположим, вы обнаружили, что, внося имена в лист рассылки вашей компании, оператор, не знающий код штата Невада, ввел "Nevada" в поле "State" 147 раз. Можно использовать цикл SCAN для решения этой проблемы (См. рис.4-4).

EDIT "maillist"
SCAN FOR [State]="Nevada"

[State]="NV"
ENDSCAN
DO_IT!

Рис 4-4. Просмотр таблицы.

Прерывание цикла


Для управления продолжением или завершением циклов предназначены команды LOOP и QUITLOOP.

  • команда LOOP предназначена для перехода к оператору заголовка цикла, минуя команды, остающиеся после нее в теле цикла. В цикле FOR обработка этой команды приводит к увеличению счетчика, а в цикле WHILE - к проверке условия цикла.
  • команда QUITLOOP приводит к немедленному завершению цикла, независимо от истинности условия цикла.

В примере на рис.4-5 описан цикл, который никогда не завершился бы, если бы не команда QUITLOOP в его теле. Этот пример (отнюдь не пример хорошего тона в программировании!) предназначен для печати квадратов четных чисел от двух до десяти. Заметьте, что цикл не исполняется предписанные десять раз, а завершается после пятого раза обработкой команды QUITLOOP. Команда MESSAGE никогда не будет выполнена, так как она находится после команды LOOP.

FOR Num
FROM 2 TO 20 STEP 2
?? (Num*Num)
IF (Num=10)

          THEN QUITLOOP   ; если 10, то останов
          ELSE LOOP       ; усли не 10, то возврат в начало

ENDIF
MESSAGE "This line never gets displayed!" ENDFOR

Рис 4-5. Прерывание цикла.

ВОЗВРАТ И ВЫХОД


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

  • RETURN, команда возврата из скрипта или процедуры;
  • QUIT, команда, завершающая выполнение скрипта и передающая управление системе Paradox;
  • EXIT, команда, завершающая выполнение скрипта и передающая управление DOS.

Команда RETURN


Команда RETURN предназначена для завершения процедуры или скрипта. PAL игнорирует все команды текущего скрипта или процедуры, следущие за командой RETURN.

Вы можете также с помощью команды RETURN передать значение вызывающему скрипту, так как:

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

Побочным эффектом команды RETURN является присваивание возвращаемой величины системной переменной retval. Предположим, вы хотите, чтобы процедура возвращала величину True, если входная строка является заглавной буквой, и False - в противном случае:

PROC IsCapLetter (Str)

IF (Str >= "A" AND Str <= "Z")

           THEN RETURN True
           ELSE RETURN False

ENDIF
ENDPROC

RETURN является весьма полезной командой, когда вы разбиваете вашу прикладную систему на набор модулей - скриптов и процедур.

Команды QUIT и EXIT


Команды QUIT и EXIT завершают выполнение скрипта любого уровня. Разница между ними в том, что QUIT передает управление системе Paradox, а EXIT передает управление DOS. Использование QUIT продемонстрировано на рис. 4-2 и 4-3.




  • Главная
  • Новости
  • Новинки
  • Скрипты
  • Форум
  • Ссылки
  • О сайте




  • Emanual.ru – это сайт, посвящённый всем значимым событиям в IT-индустрии: новейшие разработки, уникальные методы и горячие новости! Тонны информации, полезной как для обычных пользователей, так и для самых продвинутых программистов! Интересные обсуждения на актуальные темы и огромная аудитория, которая может быть интересна широкому кругу рекламодателей. У нас вы узнаете всё о компьютерах, базах данных, операционных системах, сетях, инфраструктурах, связях и программированию на популярных языках!
     Copyright © 2001-2024
    Реклама на сайте