73799

Программирование разветвлений

Лекция

Информатика, кибернетика и программирование

Блок-схема алгоритма Условные операторы Для программирования разветвляющейся структуры на Фортране предусмотрено несколько видов условных операторов: условный логический оператор условный блочный оператор условный структурный оператор. В записи алгоритма эти операторы заменяют шаг ЕСЛИ в блокс-хемах. В этих операторах условие записывается в виде логического выражения которое может принимать лишь два значения...

Русский

2014-12-20

524 KB

0 чел.

Лекция 4. Программирование разветвлений.

Алгоритмы разветвляющейся структуры

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

а) разделение алгоритма на две ветви, каждая из которых предусматривает выполнение некоторых шагов

ЕСЛИ…………ТО………..ИНАЧЕ……

б) разветвление, при котором в одной ветви не предусмотрено никаких шагов (обход)

ЕСЛИ………ТО………

Проверка условия, записанного после слова ЕСЛИ, предполагает два варианта ответа:

ДА (условие выполнено), НЕТ (условие не выполнено).

В зависимости от варианта ответа и выбирается вариант выполнения алгоритма, или, как говорят, выполняется ветвь.

Пример 1. Составить алгоритм нахождения действительных корней квадратного уравнения общего вида ax2+bx+c=0, a≠0, b≠0. В случае, если нет действительных корней, написать «нет действительных корней».

Блок-схема алгоритма

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

Для программирования разветвляющейся структуры на Фортране предусмотрено несколько видов условных операторов: условный логический оператор, условный блочный оператор, условный структурный оператор. В записи алгоритма эти операторы заменяют шаг ЕСЛИ в блок-схемах. В этих операторах условие записывается в виде логического выражения, которое может принимать лишь два значения: .TRUE. (истина) или .FALSE. (ложь).

Определение. Логическое выражение (ЛВ) представляет собой неравенство (или отношение), т.е. сравнение переменных или арифметических выражений. Напомним, как логические операции записываются на Фортране.

Операции сравнения (отношения):

Название операции

Символ операции

(Фортран-90 и Фортран -77)

Больше

>    и   .GT.

Больше или равно

>=  и   .GE.

Не равно

/=   и   .NE.

Меньше

<    и    .LT.

Меньше или равно

<=  и   .LE.

Равно

==  и   .EQ.

Логические операции:

Название операции

Символ операции

Логическое отрицание НЕ

.NOT.

Логическое пересечение И

.AND.

Логическое объединение ИЛИ

.OR.

Логическая эквивалентность

.EQV.

Логическая неэквивалентность

.NEQV.

Примеры логических выражений:

Обычная запись

Фортран

Значение ЛВ

abs(sin(x)) .LE. 1

истина (для любых x)

N кратно 5?

N / 5 * 5 = = N

истина, если N делится на 5 и ложь, если не делится на 5

M **3 / = 64

ложь для M = 4, истина для всех других случаев

(x >= -1) .AND. (x < 2)

Истина, если x принадлежит промежутку

Условный логический оператор

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

IF (ЛВ) оператор S,

где S – любой выполняемый оператор, кроме оператора цикла и другого условного оператора.

Порядок выполнения условного логического оператора:

  1.  Вычисляется значение логического выражения (ЛВ), т.е. проверяется истинно оно или ложно.
  2.  Если ЛВ истинно, то выполняется оператор S. После него выполняется оператор, следующий за условным оператором.
  3.  Если ЛВ ложно, то оператор S не выполняется и управление передается оператору, следующему за условным логическим оператором.

Пример 2. Найти максимальное из двух произвольных не равных друг другу чисел.

Код программы на Фортране:

PRINT *, “Vvedite dva chisla

READ *, A, B

IF (A = = B) PRINT *, “Chisla ravny: A = B !”

IF (A > B) max=A

IF (A < B) max=B

PRINT *, ‘max=’, max

END

Рассмотрим выполнение программы «по шагам», т.е. проследим выполнение каждого оператора компьютером. Известно, что компьютер выполняет все команды (строки программы) последовательно с первой строки до последней. Сначала компьютер выполнит оператор первой строки, т.е. напечатает на экране текст:  Vvedite dva chisla, что означает подсказку для пользователя ввести два числа с клавиатуры. Затем будет выполняться оператор, стоящий во второй строке программы, т.е. пользователь должен ввести два числа: для определенности возьмем, например, A=3.5 и B=7.

Далее выполняется 3 строка, т.е. происходит сравнение двух чисел A и B, и если они равны, то на экране пользователь увидит текст: Chisla ravny: A = B !. Это означает, что вы сделали ошибку и ввели два одинаковых числа, что не соответствует условию задачи. Но так как наши значения переменных A и B не равны, условный логический оператор передаст управление на следующую строку, и, значит, оператор PRINT *, “ A = B !” не будет выполняться.

В 4 строке стоит условный логический оператор, и, в соответствии с порядком его выполнения, если логическое выражение A > B - истина, а в данном случае это не так, следовательно, управление будет передано на следующую строку. Переходим к 5 строке, опять проверяем работу следующего условного логического оператора. Если условие A<B – истина, что соответствует нашему случаю, следовательно, выполняется стоящий за логическим выражением оператор, т.е. переменной max присваивается значение переменной B, в результате переменная max принимает значение равное 7. В следующей строке записан оператор вывода на экран, это значит, что на экране мы увидим текст: max= 7. Программа заканчивается оператором конца программы END.

Пример 3. Найти минимальное из трех произвольных вещественных чисел x1, x2, x3, не равных между собой.

Заметим, что такой алгоритм часто используется в программировании. Опишем его. Допустим, что значение переменной x1 является минимальным. Сохраним это значение в переменной Xmin. Тогда, сравнивая Xmin с другими переменными x2 и x3, в случае, если оказывается, что Xmin больше x2, то переменной Xmin присваиваем значение переменной x2. Затем также сравниваем переменную x3 и Xmin. Если оказывается, что Xmin больше x3, то переменной Xmin присваиваем значение переменной x3.

Реализуем этот алгоритм. Код программы на Фортране:

PROGRAM MINIMUM

print *, “Vvod x1, x2, x3”

read *, x1, x2, x3

Xmin = x1

if (Xmin > x2) Xmin = x2

if (Xmin > x3) Xmin = x3

print *, “Xmin =”, Xmin

END

Попробуйте самостоятельно изменить код программ в примерах 2 и 3, если в условиях задач надо найти минимум в примере 2 и максимум – в примере 3.

Заметим, что в примере 3 программа написана с использованием строчных букв. Вспомните, что в Фортране можно использовать прописные (большие) и строчные (маленькие) буквы латинского алфавита, при этом не делается разницы между ними, т.е. буква B и b воспринимается компилятором Фортрана как одна и та же буква.

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

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

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

IF (ЛВ) THEN

………………

………………

ELSE

……………

……………

……………

END IF

В этом операторе условие разветвления записывается в виде логического выражения (ЛВ), которое может принимать лишь два значения: .TRUE. (ИСТИНА) или .FALSE. (ЛОЖЬ) в зависимости от значений величин, входящих в логическое выражение. Т.е. правила те же, что и в условном логическом операторе. В вычислительных задачах условие чаще всего представляет сравнение числовых величин или арифметических выражений.

Блочный оператор применяется, если по алгоритму задачи требуется разделение вычислений на две ветви. Если ЛВ истинно (или как еще говорят, ЛВ выполняется), то выполняются операторы ветви 1, а операторы ветви 2 пропускаются. Если ЛВ ложно (или как еще говорят, ЛВ не выполняется), то выполняются операторы ветви 2, а операторы ветви 1 пропускаются.

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

IF (ЛВ) THEN

……………

……………

……………

END IF

Перепишем программы примеров 2 и 3 с использованием условного блочного оператора:

Пример 2.

PRINT *, “Vvedite dva chisla”      ! поясняющий текст

READ *, A, B                                ! ввод значений переменных A и B 

! начало условного блочного оператора 1 (обход)

IF (A = = B) THEN

   PRINT *, “Chisla ravny: A = B !”

   EXIT                                           ! досрочное завершение программы

ENDIF                                            ! конец условного блочного оператора 1

! начало условного блочного оператора 2 (разветвление)

IF (A > B) THEN              

   max=A                                        ! операторы ветви 1

ELSE 

   max=B                                        ! операторы ветви 2

ENDIF                                           ! конец условного блочного оператора 2

PRINT *, ‘max=’, max                   ! вывод результата

END                                               ! конец программы

Пример 3.

PROGRAM MINIMUM               ! название программы

print *, “Vvod x1, x2, x3”              ! поясняющий текст

read *, x1, x2, x3                            ! ввод значений переменных 

Xmin = x1

if (Xmin > x2) then                         ! начало 1 ветви условного блочного оператора

  Xmin = x2

else                                                  ! начало 2 ветви условного блочного оператора

  Xmin = x3

endif                                               ! конец условного блочного оператора

print *, “Xmin =”, Xmin                ! вывод результата

END                                               ! конец программы

Заметим, что в приведенных примерах 2 и 3 операторы отделены друг от друга пустыми строками и строки сдвинуты по горизонтали на несколько позиций в операторах, которые расположены внутри ветвей. Это допускается и, более того, можно использовать для улучшения читаемости программы, т.е. лучше видна ее структура.

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

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

IF (ЛВ1) THEN

………………

………………

ELSE IF (ЛВ2) THEN

……………

……………

……………

ELSE

……………

……………

……………

END IF

Порядок выполнения условного структурного оператора:

  •  если ЛВ1 – истинно, то выполняются операторы ветви 1, если ложно – операторы не выполняются;
  •  если ЛВ2 – истинно, то выполняются операторы ветви 2, если ложно – операторы не выполняются;
  •  если ЛВ1 и ЛВ2 – ложны, то выполняются операторы ветви 3.

Пример 4. Для произвольного вещественного значения x составить программу вычисления .

Чтобы правильно составить программу вычисления y, надо предварительно определить знак подкоренного выражения, из правил математики известно, что

Код программы на Фортране:

   PROGRAM PRIM_4

   read *, x

   t = x ** 3 – sin(x)

      if (t > 0) then

         y = t **(1./3.)

      else if (t < 0) then

         y = t **(1./3.)

      else

         y = 0

      end if

print *, ‘ y =’,y

END

Заметим, что в программе начала и концы ветвей условного структурного оператора показаны прямоугольной скобкой. Такой способ используется при написании «бумажного» варианта программы для удобного выделения ветвей.

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

IF (ЛВ) THEN

  S

ELSE IF(ЛВ1) THEN

  S1

ELSE IF(ЛВ2) THEN

  S2

...............................

ELSE IF(ЛВN) THEN

  SN

ELSE

  SN+1

END IF

где ЛВ, ЛВ1, ЛВ2, ..., ЛВN - логические выражения; S, S1, S2,...,SN, SN+1 - блоки операторов. Оператор работает следующим образом:

Вычисляется логическое выражение ЛВ, если оно истинно, то выполняется блок операторов S, после чего управление передается оператору следующему за END IF; иначе вычисляется логическое выражение ЛВ1, если оно истинно, то выполняется блок операторов S1, после чего управление передается оператору, следующему за END IF, и т.д. Если все логические выражения ЛВ, ЛВ1, ЛВ2, ..., ЛВN ложны, то выполняется блок операторов SN+1. Таким образом, выполняется ближайший блок операторов Si, для которого логическое условие ЛВi принимает значение истина, после чего происходит выход из блока.

Оператор выбора

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

SELECT CASE (key)

CASE (Lkey1)

 S1

CASE (Lkey2)

 S2

 ...

CASE (LkeyN)

 SN

CASE DEFAULT

 SN+1

END SELECT

где key - управляющий параметр типа integer, logical или character*1. Lkey1, Lkey2, ... , LkeyN - список значений, которые могут быть константными выражениями.

S1, S2, ... , SN, SN+1 - блоки операторов.

CASE DEFAULT является необязательным.

Список значений Lkeyi можно задавать либо одним значением, либо списком отдельных значений, разделенных запятыми, либо диапазоном значений, разделенных двоеточием.

Например: CASE (5,12,19) - блок выполняется, если управляющий параметр равен либо 5, либо 12, либо 19.

CASE (2:10) - блок выполняется, если управляющий параметр заключен в диапазоне от 2 до 12.

CASE (‘A’:’z’) - блок выполняется, если управляющий параметр символьного типа является латинской буквой.

Покажем применение структурного оператора и оператора выбора на примерах.

Пример 5. Вычислить значение функции:

Программа:

program ifelsefun

print *,’Введите аргумент функции’

read *,x

! начало условного структурного оператора

 if (x.lt.-1.) then

     y=0

 else if ((x.ge.-1.).or.(x.lt.0.)) then

     y=cos(3.14159*x)

 else if ((x.ge.0.).or.(x.lt.2.)) then

     y=x**2+1.

 else if ((x.ge.2.).or.((x.lt.7.)) then

     y=7.-x

 else

    y=0.

 end if

! конец условного структурного оператора

print *,’y=’,y

end

Пример 6. По введенному номеру единицы измерения (1 – кг, 2 – мг, 3 – г, 4 – т, 5 – ц) и массе M вывести на экран соответствующее значение массы в килограммах.

Код программы:

program Perevod_v_Kg

! Поясняющая информация

print *, ‘Programma perevodit massu M v kilogrammy’

print *, ‘Vvedite massu M

! Ввод значения переменной М

read *, M

! Поясняющая информация

print *, ‘Vvedite nomer edinitsy izmereniya massy M’

print *, ‘ 1 – kg, 2 – mg, 3 – gr, 4 – ton, 5 – centner’

! Ввод номера единицы измерения n 

read *, n

SELECT CASE(n)               ! оператор выбора

case (1)

 m=m

case (2)

 ! Перевод миллиграммов в kg

 m=m*10**6   

case (3)

   ! Перевод граммов  в kg

  m=m*10**3   

case (4)

   ! Перевод тонн в kg

   m=m*10**(-3)   

case (5)

   ! Перевод центнеров в kg

  m=m*10**(-2)   

case default                        ! если не один из случаев не сработал

  print *, ‘ Net takogo nomera, 1 ≤ N ≤ 5 !’

END SELECT                   ! конец оператора выбора

print *, ‘ M=’,m,’ kg’         ! вывод результата

end

Вопросы к Лекции 4:

  1.  Что собой представляет алгоритм разветвляющейся структуры?
  2.  Что такое «ветвь» алгоритма?
  3.  Какая ситуация в задаче приводит к разветвлению?
  4.  Как называется ветвление, при котором в одной ветви не предусмотрено никаких шагов?
  5.  Каким образом реализуется разветвление в блок-схеме алгоритма?
  6.  Какие виды условных операторов предусмотрены на Фортране?
  7.  Что называется логическим выражением?
  8.  Что означают слова .TRUE. и .FALSE.?
  9.  Перечислите обозначения операций сравнения на Фортране.
  10.  Как обозначаются логические операции на Фортране?
  11.  Приведите примеры логических выражений.
  12.  Что собой представляет условный логический оператор?
  13.  Назовите правила выполнения условного логического оператора.
  14.  Приведите примеры использования условного логического оператора.
  15.  В каких случаях необходимо использовать в программе условный логический оператор?
  16.  Можно ли в Фортран-программе оставлять пустые строки?
  17.  Как можно структурировать программу, используя сдвиг начала строки в записи оператора?
  18.  Запишите общий вид условного блочного оператора. Объясните, как это работает в программе.
  19.  Сколько ветвей может быть в условном блочном операторе?
  20.  Приведите пример программы с условным блочным оператором.
  21.  Опишите алгоритм нахождения максимального/минимального из двух вещественных чисел. Приведите пример.
  22.  Опишите алгоритм нахождения максимального/минимального из трех вещественных чисел. Приведите пример.
  23.  В каких задачах используется условный структурный оператор?
  24.  Сколько ветвей может содержать условный структурный оператор?
  25.  Запишите общий вид оператора выбора. Как выполняется этот оператор?
  26.  Для чего служит ветвь CASE DEFAULT в операторе выбора?
  27.  Какого типа переменные могут быть использованы в качестве управляющего параметра в операторе выбора?
  28.  Приведите пример применения оператора выбора.