Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
инфа / Vse_voprosy_po_infe.docx
Скачиваний:
52
Добавлен:
31.03.2015
Размер:
263.56 Кб
Скачать

3.1.2 Условный оператор

Для задания разветвляющихся вычислительных процессов обычно используются условные операторы, которые относятся к структурированным операторам языка Zonnon. Синтаксис условного оператора приведен на рис. 3.3.   

IfStatement =    if Expression then StatementSequence                          {elsif Expression then StatementSequence}                           [else StatementSequence]                         end.

Рис. 3.3. Синтаксис условного оператора

Условный оператор в стандартной форме состоит из условия (логического выражения) и двух последовательностей операторов, размещенных после символа then и после символа else. Действие всего такого условного оператора совпадает (если при вычислении условия не возникают побочные эффекты, или ,что тоже, самое изменения в состоянии памяти -- см. п. 6.1.5) с действием одной из двух составляющих его последовательностей операторов, выбор которой для исполнения осуществляется по значению условия, вычисление которого начинает выполнение условного оператора. Условный оператор назначает к исполнению первую последовательность операторов (он стоит непосредственно после символа then), если на текущем состоянии памяти ВМ условие принимает истинное значение, либо вторую последовательность операторов (она находится за символом else), если условие ложно.

Рис. 3.4. Пример блок-схемы   

Например, условный оператор if Ythen Z := X else Z := Y end присваивает переменной максимальное из значений переменныхии описывается блок-схемой рис. 3.4.

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

module Корни3;      var A,B,C,X1,X2,D,E : Real;  begin      read(A,B,C);      D := sqrt(Sqr(B) - 4AC);      if B>= 0 then X1 := -(B+D)/(2A) else X1 := (-B+D)/(2A) end ;      X2 := C/(X1A);      write(X1,X2)  end Корни3.

Предусматривается возможность сокращенной записи вложенности одного условного оператора в другой. Например, оператор

if E1 then S1 else if E2 then S2 else S3 end end,

где E1, E2, E3 - произвольные последовательности операторов, можно записать в виде

if E1 then S1 elsif E2 then S2 else S3 end.

В этом случает говорят, что условный оператор содержит не одну, а две охраняемые последовательности операторов (E1и E2), первая из которых охраняется выражением E1, а вторая - выражением  E2. Действие всего такого условного оператора совпадает (если при вычислении условия не возникают побочные эффекты, или ,что тоже, самое изменения в состоянии памяти -- см. п. 6.1.5) с действием одной из трех составляющих его последовательностей операторов, выбор которой для исполнения осуществляется по значению условий E1и E2, вычисление которых  происходит, начиная с E1. Условный оператор назначает к исполнению первую последовательность операторов S1, если на текущем состоянии памяти ВМ условие E1 принимает истинное значение, вторую последовательность операторов S2, если условие E1 ложно, а E2 истинно, и третью последовательность S3, если условия E1и E2 ложны.

Например, программа распознавания -- равно ли данное натуральное число некоторому нечетному числу, умноженному на два (печатает "ДА", если ответ положительный, и "НЕТ" -- в противном случае) -- может иметь следующий вид:

module Проверка;      var N : integer;  begin read(N);      if odd(N) then write('НЕТ')      elsif N mod 4# 0 then write ('ДА')      else write ('НЕТ')      end  end Проверка.

Ее управляющая структура описывается блок-схемой рис. 3.5.

Рис. 3.5. Блок-схема программы Проверка

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

Рис. 1.13. Алгоритм решения биквадратного уравнения

Еще раз обратимся к алгоритмам на рис. 1.5, 1.12, 1.13. Нетрудно заметить, что если a принимает значение 0, алгоритмы не работают (ведь на 0 делить нельзя). Это - недостаток алгоритмов. Его можно избежать, если проверять значение переменной a сразу после ввода. Алгоритмы такой проверки приведены ниже. В первом случае (рис. 1.14), если введенное значение переменной a = 0, выполнение вычислительного процесса сразу же прекращается. Алгоритм, изображённый на рис. 1.15, позволяет при нулевом значении а повторить ввод переменной. Этот процесс будет продолжаться до тех пор, пока а не станет отличным от нуля. Подобные алгоритмы называются циклическими.

Внимание!!! Перед вычислением значения математического выражения это выражение следует проанализировать: для всех ли значений переменных его можно вычислить. В алгоритме необходимо предусмотреть предварительную проверку переменных на значения, для которых выражение не может быть определено. Если, например, требуется вычислить корень четной степени, то нужно перед вычислением проверить подкоренное выражение - оно не должно принимать отрицательные значения, а в случае с дробью - проверить знаменатель на 0. В блок-схеме такие проверки реализуются с помощью условного блока. Отсутствие таких проверок в программе может привести к критическим ошибкам.

Рис. 1.14. Проверка входных данных

Рис. 1.15. Повторение ввода переменной а

ПРИМЕР 1.7. Решить кубическое уравнение ax3+ bx2 + cx + d=0. Кубическое уравнение имеет вид

Вопрос №13

Разработка алгоритмов циклической структуры. Варианты построения циклической структуры.

Соседние файлы в папке инфа