Лекції >> Програмування, комп’ютери і кібернетика >> Програми з розгалуженнями

У розглянутих раніше прикладах та задачах всі дії виконувались послідовно одна за одною, але насправді таких задач дуже мало.

Багато задач вимагає від виконавця змінити послідовність виконання дій у залежності від певних умов. Під вказаними умовами будемо розуміти логічні вирази, кожен з ких може набувати двох значень: “так” (true) – якщо умова істинна і “ні” (false) – якщо умова хибна. Нагадаємо, що умови можуть бути складними, тобто використовувати логічні операції[1]. Прості умови обмежуються дужками, якщо вони є частинами складної умови. Істинність складних умов визначається за таблицею істинності.

Наприклад, на деякому етапі розв’язку певної задачі виконавцю потрібно послідовно виконати дві дії: обчислити значення виразу x-1, а потім і значення кореня квадратного цього виразу. У цьому випадку необхідно передбачити ність складних умов визначається за таблицею істинності.

Наприклад, на деякому етапі розв’язку певної задачі виконавцю потрібно послідовно виконати дві дії: обчислити значення виразу x-1, а потім і значення кореня квадратного цього виразу. У цьому випадку необхідно передбачити виконання таких дій:

1. обчислити значення виразу x-1;

2. у залежності від результатів перевірки умови змінити послідовність виконання дій, тобто, якщо  умова 0 є істинною, то обчислювати значення , інакше – умова є хибною – виконати інші дії (наприклад, запропонувати користувачу ввести правильні дані).

Алгоритми та відповідні програми, які вимагають від виконавця перевірки деяких умов і зміни послідовності виконання дій у залежності від результатів перевірки, будемо називати алгоритмами (програмами) з розгалуженнями.

1. обчислити значення виразу x-1;

2. у залежності від результатів перевірки умови змінити послідовність виконання дій, тобто, якщо  умова 0 є істинною, то обчислювати значення , інакше – умова є хибною – виконати інші дії (наприклад, запропонувати користувачу ввести правильні дані).

Алгоритми та відповідні програми, які вимагають від виконавця перевірки деяких умов і зміни послідовності виконання дій у залежності від результатів перевірки, будемо називати алгоритмами (програмами) з розгалуженнями.

Розв’язуючи задачі з розгалуженнями, при описанні алгоритмів  обов’язково використовують базову структуру “розгалуження” (див. стор. 8), а у програмах – оператор (вказівку) розгалуження або, як його ще називають, оператор умовного переходу.

Для організації зміни послідовності виконання дій при розв’язу­ван­ні задачі іноді використовують (Basic, Pascal) оператор безумовного переходу GOTO. Зауважимо, що його використання може порушити структурний підхід до розв’язування задачі і призвести до логічних помилок, які важко шукати у текс дії (наприклад, запропонувати користувачу ввести правильні дані).

Алгоритми та відповідні програми, які вимагають від виконавця перевірки деяких умов і зміни послідовності виконання дій у залежності від результатів перевірки, будемо називати алгоритмами (програмами) з розгалуженнями.

Розв’язуючи задачі з розгалуженнями, при описанні алгоритмів  обов’язково використовують базову структуру “розгалуження” (див. стор. 8), а у програмах – оператор (вказівку) розгалуження або, як його ще називають, оператор умовного переходу.

Для організації зміни послідовності виконання дій при розв’язу­ван­ні задачі іноді використовують (Basic, Pascal) оператор безумовного переходу GOTO. Зауважимо, що його використання може порушити структурний підхід до розв’язування задачі і призвести до логічних помилок, які важко шукати у тексті програми. 

Навчальна алгоритмічна мова.

Вказівка розгалуження у НАМ має такий вигляд:

если <умова>

      то <1-ша послідовність дій>

      иначе <2-га послідовність дій>

все 

Якщо умова істинна, то виконується 1-ша послідовність дій, інакше (умова хибна) то виконується 2-га послідовність дій.

Іноді вказівка розгалуження використовується у неповній формі:

если <умова>

      то <послідовність дій>

все 

Узагальненням вказівки розгалуження є вказівка вибору, за допомогою якої ефективно описуються розгалуження, що мають більше як три напрями:

выбор

      при <умова 1>

                         <1-ша послідовність дій>

      при <умова 2>

                         <2-га послідовність дій>

      . . .

      при <умова N>

 

      иначе <серія інших команд>

все

У неповній формі оператора вибору конструкція иначе відсутня.

Basic.

Оператор розгалуження на мові Basic можна подати в повній та неповній формах. Повна форма має вигляд:

If <умова> Then <1-ша серія операторів> Else <2-га серія операторів>

Неповна форма оператора розгалуження має наступний вигляд:

If <умова> Then <серія операторів>

Зауважимо, що кожна з вказаних форм має міститися в одному логічному рядку. Враховуючи те, що кількість символів (а значить і кількість операторів серії) логічного рядка обмежена, іноді оператор розгалуження записують у декількох логічних рядках. Такий запис використовують і для більш зручного візуального подання тексту програми, що може полегшити її перегляд та пошук можливих помилок.   При цьому необхідно користуватися оператором безумовного переходу Goto, що без будь-яких умов змінює послідовність виконання команд програми.

Розглянемо  різні способи запису фрагмента програми, в якому спочатку у залежності від істинності умови змінюється послідовність виконання дій - визначається більше із двох чисел, а потім послідовність дій продовжується – на екран виводиться значення більшого числа.

1-й спосіб:

50  if a>b then y=a else y=b         {повна форма розгалуження}

60  print Y     

Спочатку виконується рядок 50: якщо умова істинна, то змінній Y присвоюється значення числа А, інакше змінній Y присвоюється значення числа В. Далі виконується наступний рядок 60.

2-й спосіб:

50  if a>b then 60 else 70             {повна форма розгалуження}

60  y=a : goto 80

70  y=b

80  print Y

Спочатку виконується рядок 50:

якщо умова істинна,

то виконання програми перейде на рядок 60, де змінній Y присвоїться значення числа А і виконання програми перейде на рядок 80,

інакше  (умова хибна) виконання програми перейде на рядок 70, де змінній Y присвоїться значення числа В і виконання програми перейде на наступний рядок.

Далі виконується рядок 80.

3-й спосіб:

50  if a>b then Y=A : goto 70    {неповна форма розгалуження}          

60  y=B

70  print Y

Спочатку виконується рядок 50:

якщо умова істинна, то змінній Y присвоїться значення числа А  і виконання програми перейде на рядок 70,

інакше (умова хибна) виконання програми перейде на наступний рядок, де змінній Y присвоїться значення числа В.

Далі виконується рядок 70.

Якщо після THEN і перед ELSE (1-ша серія операторів) записується декілька операторів, то оператори один від одного відокремлюються двокрапкою. Аналогічно поступають з 2-гою серією операторів. 

Оператор вибору у мові Basic реалізовано командою-перемикачем ON. За допомогою цієї команди можна реалізувати багаторазово розгалужений алгоритм[2]. 

Зауважимо, що доцільно оператор вибору реалізовувати за допомогою неповної форми оператора розгалуження, наприклад:

40 If <умова1>    Then <1-ша послідовність операторів> : GOTO 100

50 If <умова2>    Then <2-га послідовність операторів> : GOTO 100

      . . .

90  If <умоваN>   Then : GOTO 100

Pascal.

Оператор умовного переходу на мові Pascal можна подати в повній та неповній формах. Повна форма має вигляд:

      If <умова> Then <оператор1>

                         Else <оператор2> ;

Якщо умова істинна (True), виконується оператор1, інакше (умова хибна - False) виконується оператор2.

Неповна форма оператора умовного переходу  має вигляд:

      If <умова> Then <оператор1> ;

Якщо умова істинна, виконується оператор1, інакше – пропускається.

Для того, щоб була можливість виконати серію операторів у разі істинності чи хибності умови оператора розгалуження, у мові Pascal існує поняття та конструкція складового оператора.

Складовий оператор є групою із декількох операторів, відокремлених один від одного символами “крапка з комою”, і обмежену оператор ними дужками Begin і End. Його схема така:

Begin 

      < оператор1 ; >

      . . .

      < операторN >    

End;

Складовий оператор сприймається як єдине ціле і може знаходитися у будь-якому місці програми, де можна використовувати простий оператор[3].

Змінити послідовність виконання дій дозволяє оператор безумовного переходу Goto. Він використовується тоді, коли після виконання деякого оператора без будь-якої умови потрібно виконати не наступний, а деякий інший, позначений міткою оператор. Формат оператора безумовного переходу:

GOTO М ;

Цей оператор означає “перейти до” і перенаправляє виконання програми (здійснює перехід) до оператора з міткою М. Міткою можуть бути імена або цифри, які мають бути описані в розділі міток. Мітка ставиться зліва від оператора та відокремлюється від нього символом “двокрапка”. Одна мітка не може використовуватись двічі, але до однієї мітки можна звертатися з різних ділянок програми.

Наведемо приклад фрагмента програми з використанням оператора умовного переходу, складового оператора та оператора безумовного переходу:

M1 : Readln ( X ) ;

         If   ( Х - 1) >= 0  Then Y := Sqrt ( X – 1 )

         Else Begin

             Writeln ( ‘ Неправильні дані. Повторіть ввід Х. ’ ) ;

             Goto M1

         End ;      

Оператор вибору CASE дозволяє здійснити вибір із довільної кількості існуючих варіантів. Він складається з виразу (селектору) та списку параметрів (операторів), кожному з яких передує список констант вибору. Список констант може складатися з однієї константи). При цьому тип констант має бути сумісним з типом селектора. Для селектора заборонені типи real, string.

Формат оператора вибору:

CASE <вираз> OF

      <1-й список констант> : <оператор1 ;>

         . . .

      : <операторN >

   ELSE < оператор >

END ;

При виконанні оператора  <вираз> обчислюється і його значення шукається в одному із списків констант. Після цього виконується оператор, що відповідає знайденому списку.

 Приклад 1.  Знайти найбільше з трьох даних чисел.

І етап. Математична модель: спочатку знайдемо найбільше з двох перших чисел, а потім порівняємо знайдене число з третім. Таким чином знайдемо найбільше.

ІІ етап. Складемо алгоритм у вигляді блок-схеми (мал. 9).

 початок

 

A, B, C

 

 

A > B

 

Mx:= B                Mx:= A

 

 

C>Mx

 

                             Mx:= C 

 

 

Mx

 

кінець                       

мал. 9

алг БЗТ (вещ a, b, c, mx)

   арг a, b, c

   рез mx

нач

      если a > b

         то mx := a

         иначе mx := b

      все

      если c > mx

         то mx := c

      все

mx := mx

кон

НАМ-програма 3

ІІІ етап. Запишемо текст програми.

 

 

 

10 REM БЗТ

20 INPUT “Введіть три числа” ; A, B, C

30 IF A>B THEN MX=A ELSE MX=B

40 IF C>MX THEN MX=C

50 PRINT”Найбільшим є “;MX

60 END

Basic-програма 3

 

Program Max3;

   Var

      A, B, C, Mx : Real;

Begin

   Write ( ‘Введіть три числа’ ) ;

         ReadLn (A, B, C) ;

   If A > B Then Mx := A Else Mx := B;

   If C > Mx Then Mx := C ;

   WriteLn ( ‘Найбільшим є’, Mx :10 :4 )

 End.

 

 

Pascal-програма 3

ІV етап. Виконаємо повне тестування (за всіма лініями потоку).

Тест1. Вхідні дані : А=5, B=0, С= 7. Результат: 7.

Тест2. Вхідні дані: А=5, B=0, С= -1. Результат: 5.

Тест3. Вхідні дані: А=0, B=6, С= -1. Результат: 6. n

 

Приклад 2.  Обчислити значення функції .

І етап. Математична модель: значення даної функції обчислюється за формулами як значення одного із трьох виразів у залежності від значення аргумента.

ІІ етап. Складемо алгоритм у вигляді блок-схеми (мал. 10).

 початок

 

 

 х

 

 

 

X < 0

 

X > 1

 

 

 

 

 

Y

 

кінець

мал. 10

ІІІ етап. Запишемо текст програми.

 

 

 

 

алг Функц (вещ x, y)

   арг x

   рез y

нач

   если x < 0

      то y := x + cos(2*x)

      иначе

             если x > 1

               y := ln ( x -1) / ln (3)

                иначе y := ( x - 1 )**2

             все

   все

   y := y

кон

НАМ-програма 4

 

 

 

10 REM Функція

20 INPUT “Введіть значення для x=” ; X

30 IF X < 0 THEN Y=X + COS(2*X)  ELSE IF X>1 THEN Y=LOG(X-1)/LOG(3) ELSE Y=(X-1)^2

40 PRINT “При x=”;X, ”y=”;Y

50 END

Basic-програма 4

 

Program FNF;

   Var

      X, Y : Real;

Begin

   Write ( ‘Введіть значення для x=’ ) ;

         ReadLn (X) ;

   If X<0 Then Y := X + Cos(2*X)

   Else

      If X>1 Then Y := Ln(X-1)/Ln(3)

      Else Y := Sqr(X-1);      

  WriteLn ( ‘При x=’, X :10 :4, ‘ y=’,Y:10:4 )

 End.

 

 

Pascal-програма 4

ІV етап. Виконаємо повне тестування (за всіма лініями потоку).

Тест1: x=0.5, Y=0.25. Тест2: x=10, Y=2. Тест3: x= - 3.14, Y= - 2.14. n

 Приклад 3.  Обчислити значення функції:.

І етап. Математична модель. Дана функція подібна раніше розглянутій ( Приклад 4. ): вираз  замінено на .

Тоді дану функцію доцільно подати як:   

ІІ етап. Складемо алгоритм у вигляді блок-схеми (мал. 11).

алг Функц (вещ x, y)

   арг x

   рез y

нач

      если x<0 или x>1

         то y := x + cos(2*x)

         иначе y := (x-1)**2

      все

кон

НАМ-програма 5

ІІІ етап. Запишемо текст програми.

 початок

 

X

 

 

x<0 або x>1

 

 

 

 

Y

 

кінець                       

мал. 11

 

 

 

 

 

10 REM Функція

20 INPUT “Введіть значення для x=” ; X

30 IF X<0 OR X>1 THEN Y=X+COS(2*X)

ELSE Y=(X-1)^2

40 PRINT “При x=”;X, ”y=”;Y

50 END

Basic-програма 5

 

Program FNF ;

   Var

      X, Y : Real ;

Begin

   Write ( ‘Введіть значення для x=’ ) ;

         ReadLn (X) ;

   If (X<0) Or (X>1) Then Y := X + Cos(2*X)

   Else Y := Sqr(X-1) ;  

   WriteLn ( ‘При x=’, X :10 :4, ‘ y=’,Y:10:4 )

 End.

 

 

Pascal-програма 5

ІV етап. Виконаємо повне тестування.

Тест1: x=0.5, Y=0.25.

Тест2: x= - 3.14, Y= - 2.14. n



[1] див. порівняльну таблицю логічних операцій  у п. 1.3.

[2] Ця команда може бути також використана для обробки переривань, викликаних натисканням функціональної клавіші, “пропуск”, одночасним натискан­ням клавіш Сtrl+Stop, вичерпанням заданого інтервалу часу тощо. При цьому команда ON має інший синтаксис.

[3] Оператори, що не містять ніяких інших операторів, називають простими. До них відносяться оператори присвоєння, безумовного переходу, порожній оператор тощо.

Схожі матеріали
05.10.2012 Введення та виведення даних, розробки та опису лінійних програм.
20.12.2011 Pascal - лабораторні роботи - для студентів III-го курсу (лекції Ляшенко Б.М.)
12.12.2010 Робота з підпрограмами
12.12.2010 Робота з рядковими та символьними величинами.
12.12.2010 Робота з циклічними програмами
12.12.2010 Робота з масивами даних.
12.12.2010 Розробка та описання програм з розгалуженнями
12.12.2010 Початки програмування
12.12.2010 Етапи розв’язання задач з використанням ЕОМ
12.12.2010 Поняття про алгоритм

Тести даної категорії
12.12.2010 ПОЧАТКИ АЛГОРИТМІЗАЦІЇ. ВСТУП ДО ПРОГРАМУВАННЯ

Останні створені тести
16.11.2015 Олімпійські ігри Стародавньої Греції. Відродження олімпійських ігор. Олімпійський рух сучасності.
28.10.2015 British Writers. Тест для студентів 4 курсу ННІ педагогіки
27.10.2015 The Passive Voice. Тест для студентів 2 курсу ННІ педагогіки
27.10.2015 Articles. Тест для студентів 1 курсу неспеціальних факультетів
27.10.2015 The Active Voice. Тест для студентів 2 курсу ННІ педагогіки
08.10.2014 INTEL
22.10.2012 Цивільний захист
26.09.2012 Мовнокомунікативна компетентність. Орфографічна складова
21.09.2012 OC Windows
31.05.2012 Lexikalisch-grammatischer Test. Тест для студентів 1 курсу неспеціальних факультетів.
Рекомендовані лекції
12.12.2010 ЕОМ як виконавець алгоритму. Мови програмування
12.12.2010 Вирази, операції. Числові функції
12.12.2010 Робота з рядковими та символьними величинами
12.12.2010 Робота з масивами даних
27.09.2012 Літературознавство як наука
12.12.2010 Використання підпрограм та функцій користувача
12.12.2010 Порядковий тип даних
28.09.2014 Лекції з курсу "Сучасні підходи у психології особистості" для студентів VІ курсу спеціальностей 8.03010201 Психологія та 8.03010301 Практична психологія
12.12.2010 Структурний підхід до алгоритмізації
22.02.2016 ОС та СП. Тема 2. Процеси та потоки. Тези