Управление ходом выполнения программы. Блочные операторы. Для управления ходом выполнения программы используют две группы операторов: операторы условных переходов (операторы ветвления) и операторы циклов. Условные переходы позволяют выполнять различные последовательности операций в зависимости от результатов проверки условия. В Visual FoxPro существуют две команды, допускающие условный переход: IF ... ELSE ... ENDIF и DO CASE ... ENDCASE. Если требуется осуществить проверку более чем двух условий, то выгоднее воспользоваться блоком DO CASE ... ENDCASE, который позволяет избежать использования многочисленных выражений IF, за которыми трудно уследить. Вля процедурном программировании применяют два типа операторов цикла: безусловный цикл – FOR … ENDFOR и условный цикл DO WHILE … ENDDO. Существует еще специальный цикл для обработки таблиц – цикл SCAN … ENDSCAN. Организация ветвления. Оператор IF … ELSE … ENDIF Осуществляет условное выполнение группы команд исходя из значения логического выражения. Синтаксис IF lExpression Commands [ELSE Commands] ENDIF Параметры lExpression Задает вычисляемое логическое выражение. Если его значение ѕ "истина" (.T.), будут выполнены все команды, расположенные между IF и оператором ELSE или ENDIF (тем из двух, который стоит раньше). • Если значение lExpression ѕ "ложь" (.F.) и задан оператор ELSE, выполняются все команды между ELSE и ENDIF. • Если значение lExpression ѕ "ложь" (.F.) и оператор ELSE не задан, все команды между IF и ENDIF игнорируются. В этом случае выполнение программы продолжается с первой команды, следующей за оператором ENDIF. Комментарии Блоки IF ... ENDIF можно вкладывать друг в друга. В строках с операторами IF, ELSE и ENDIF можно задавать комментарии. Они будут игнорироваться во время компиляции и выполнения программы. Выполняет первую группу команд, для которых заданное условное выражение имеет значение "истина" (.T.). Множественное ветвление. Оператор DO CASE … ENDCASE Выполняет первую группу команд, для которых заданное условное выражение имеет значение "истина" (.T.). Синтаксис DO CASE CASE lExpression1 Commands [CASE lExpression2 Commands 1 ... CASE lExpressionN Commands] [OTHERWISE Commands] ENDCASE Параметры CASE lExpression1 Commands ... Когда обнаруживается первое выражение CASE, имеющее значение "истина" (.T.), выполняется группа следующих за ним команд. Выполнение продолжается до тех пор, пока не встретится следующее предложение CASE или ENDCASE. После этого управление передается первой команде, следующей за ENDCASE. Если выражение CASE имеет значение "ложь" (.F.), то следующие за ним команды, вплоть до следующего предложения CASE, игнорируются. Выполняется только одна группа команд. Это будет первая группа команд, для которых выражение CASE имеет значение "истина" (.T.). Все последующие выражения CASE игнорируются, даже если они истинны (.T.) . OTHERWISE Commands Если все выражения CASE имеют значение "ложь" (.F.), то в зависимости от предложения OTHERWISE может выполняться альтернативный набор команд: • Если предложение OTHERWISE задано, выполняется группа следующих за ним команд, после чего управление передается первой команде, стоящей после ENDCASE. • Если предложение OTHERWISE опущено, выполнение продолжается с первой команды, следующей за предложением ENDCASE. Комментарии Команда DO CASE используется в тех случаях, когда требуется выполнить группу команд Visual FoxPro в зависимости от значения некоторого логического выражения. При выполнении DO CASE последовательно вычисляются логические выражения; их значения определяют, какой именно набор команд следует выполнить. После команды DO CASE и предложения ENDCASE в одной строке с ними можно задавать комментарии. Эти комментарии игнорируются во время компиляции и выполнения программы. Безусловные циклы. Оператор FOR … ENDFOR. Выполняет группу команд заданное число раз. Синтаксис FOR MemVarName = nInitialValue TO nFinalValue [STEP nIncrement] Commands [EXIT] [LOOP] ENDFOR | NEXT Параметры MemVarName Задает переменную памяти или элемент массива, выступающий в роли счетчика. Эта переменная или элемент массива могут и не существовать до выполнения цикла FOR ... ENDFOR. nInitialValue TO nFinalValue nInitialValue ѕ начальное значение счетчика, а nFinalValue ѕ его конечное значение. 2 STEP nIncrement nIncrement ѕ величина приращения счетчика. Если значение nIncrement отрицательно, счетчик будет уменьшаться. Если предложение STEP опущено, счетчик будет увеличиваться на 1. Commands Задает команды Visual FoxPro, которые нужно выполнять. Аргумент Commands может включать любое число команд. EXIT Передает управление из цикла FOR ... ENDFOR команде, непосредственно следующей за оператором ENDFOR. Можно поставить EXIT в любом месте между FOR и ENDFOR. LOOP Возвращает управление непосредственно предложению FOR, не выполняя операторы, расположенные между LOOP и ENDFOR. Счетчик увеличивается или уменьшается, как если бы был достигнут оператор ENDFOR. Можно поставить LOOP в любом месте между FOR и ENDFOR. Комментарии Переменная памяти или элемент массива используются в качестве счетчика, который задает количество выполнений для команд Visual FoxPro, входящих в тело цикла FOR ... ENDFOR. Команды Visual FoxPro, идущие после FOR, выполняются одна за другой, пока не встретится оператор ENDFOR или NEXT. После этого к счетчику MemVarName прибавляется значение nIncrement. Если предложение STEP опущено, счетчик увеличивается на 1. После этого он сравнивается с величиной nFinalValue. Если значение счетчика меньше или равно nFinalValue, то команды, следующие за предложением FOR, выполняются вновь. Если значение счетчика больше, чем nFinalValue, осуществляется выход из цикла FOR ... ENDFOR и выполнение программы продолжается с первой команды, следующей за ENDFOR или NEXT. Замечание Значения аргументов nInitialValue, nFinalValue и nIncrement считываются только в самом начале. Однако изменение значения счетчика MemVarName внутри цикла влияет на число выполнений цикла. Если значение приращения nIncrement отрицательно и начальное значение nInitialValue больше конечного значения nFinalValue, счетчик при каждом прохождении цикла будет уменьшаться. Условные Циклы. Оператор DO WHILE … ENDDO. Выполняет группу команд, входящих в условный цикл. Синтаксис DO WHILE lExpression Commands [LOOP] [EXIT] ENDDO Параметры lExpression Задает логическое выражение, значение которого определяет, будут ли выполняться команды, размещенные между DO WHILE и ENDDO. Пока значение lExpression остается "истиной" (.T.), команды этой группы будут выполняться. 3 Commands Задает группу команд Visual FoxPro, которые следует выполнять, пока значением выражения lExpression остается "истина" (.T.). LOOP Возвращает управление непосредственно оператору DO WHILE. LOOP можно размещать в любом месте между DO WHILE и ENDDO. EXIT Передает управление из цикла DO WHILE первой команде, стоящей после ENDDO. EXIT можно размещать в любом месте между DO WHILE и ENDDO. ENDDO Обозначает конец оператора DO. Комментарии Группа команд, расположенных между DO WHILE и ENDDO, выполняется, пока значением логического выражения lExpression остается "истина" (.T.). Каждый оператор DO WHILE должен иметь соответствующий ему оператор ENDDO. После операторов DO WHILE и ENDDO в той же строке можно вставлять комментарии. Во время компиляции и выполнения программы комментарии игнорируются. Примеры: 1. Напишем фрагмент программы, выводящий на экран таблицу значений функции f(x)=x^2+4 для x в интервале от –5 до 5. x=-5 do while x<=5 f=x^2+4 ? x, f x=x+0.2 enddo 2. Вычислим сумму числового ряда состоящего из нечетных чисел от 1 до N – 1+3+5+7+…+N для N=50 N = 50 S=0 I=1 Do while I<= N S=S+I I=I+2 Enddo ?S ∞ 3. Вычислим сумму ряда S0=1 S1=0 N=1 Eps=0.001 x=1.1 Do while abs(s1-s0)>eps S0=s1 S1=s1+1/x^n 4 s=∑ 1 n =1 x n , при x=1.1 с точностью 0.001 ?n,abs(s0-s1),s1 N=n+1 Enddo ? "s=",s1 Здесь переменные S1 и S0 служат для хранения текущей величины суммы и величины суммы с предыдущего шага. Текущее значение погрешности определяется выражением abs(s1-s0). Цикл повторяется до тех пор, пока текущая погрешность не станет меньше либо равной точности eps. 5