Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основи програмування Паскаль.docx
Скачиваний:
51
Добавлен:
12.05.2015
Размер:
511.7 Кб
Скачать

16.2 Оператор безумовного переходу

Із завданням дострокового виходу із кратних циклів зв'яжемо вивчення раніше невикористовуваного нами оператора безумовного переходу. Його загальний вид наступний:

Goto Мітка;

Тут Мітка– спеціальним образом зазначене місце в програмі. ДіяGotoдуже просто:незалежновідяких-небудь умоввін здійснює передачу керування на оператор, що випливає за міткою (звідси назва оператора). Кожна мітка має вигляд

m:

де m– ім'я, побудоване за звичайними правилами або цілочисельна константа від 0 до 9999 включно. Мітку недостатньо поставити перед потрібним оператором – її потрібно ще й оголосити в розділі описів оператором

label m;

Можна оголосити й кілька міток відразу, розділивши їх імена комами. Прийнято розташовувати оператор опису міток до оператора var. Таким чином, мітки й операторgotoдозволяють розв'язати завдання швидкого безпосереднього перехід до потрібного місця в програмі:

Label 10,20;

Var i,j:integer;

Begin

Write ('Уведіть значення I (i>2)');

Readln (i);

If i<3 then goto 10;

j:=2;

20:

if i mod j = 0 then write (j,' ');

j:=j+1;

if j<i then goto 20;

10:

End.

Ця нескладна програма дозволяє користувачеві ввести число i, більше двох, після чого друкує всі числа від2доi-1, на якіiділиться без залишку (перевірка залишку від розподілуiнаjвиконана операцієюmod). У випадку введення користувачем неприпустимого значенняi(меншого трьох) відбувається перехід на мітку10:, розташовану перед закриваючим операторомend.– таким чином, програма відразу ж завершується. Мітка20:дозволяє організувати циклбезвикористання операторівwhile,repeatабоfor. Дійсно, перед міткою20:зміннаjодержує початкове значення2, потім, якщоiділиться наjбез залишку, значенняjвиводиться на екран, потім збільшується на одиницю й, якщо значення iне досягнуте, відбувається перехід на мітку20:, що перевіряє вже нове значенняj. Однак, і тієї, і іншої мети можна було досягтися без використанняgoto, застосовуючи тільки оператори циклу йbreak;.

Із правомірністю використання простого оператора gotoзв'язані складні й багаторічні суперечки. Безсумнівно, що програмузавждиможна написати, не прибігаючи доgoto(іноді структурне програмування називають навіть "програмуванням безgoto"), не викликає сумніву також, що використання міток іgotoпорушує й ускладнює сприйняття структури програми людиною. Однак авторові представляється надмірним вимога вигнатиgotoзовсім – у ряді ситуацій він просто зручніше, чим інші засоби. Представимо, що нам потрібно достроково вийти з подвійного (або взагалікратного) циклу. Операторbreak;, розташований у внутрішньому циклі, перерве його виконання, але виконання зовнішнього циклу продовжиться з наступного кроку. Безgotoвийти " із усіх циклів відразу" можна хіба що із застосуванням спеціальних змінних-прапорів:

Var flag:boolean; {описали змінну-прапор}

. . .

Flag:=false; { до подвійного циклу прапор установлений в "неправду"}

While true do begin {почали зовнішній цикл}

While true do begin {почали внутрішній цикл}

. . .

If Умова then begin

{трапилося щось, що вимагає виходу з обох циклів відразу!}

Flag:=true; {ставимо прапор, повідомляючи зовнішньому циклу, що

потрібне завершення}

Break; {вихід із внутрішнього циклу}

End;

End;

If Flag=true then break;

{зовнішній цикл на кожному кроці повинен відслідковувати стан прапора!}

End;

Якщо цикл потрійний – при такому підході знадобиться вже два прапори, і так далі. Альтернативний шлях – установити максимальні значення керуючих змінних зовнішніх циклів – також не відповідає канонам структурного програмування. З gotoусе виглядає простіше й естественней:

Label go1;

. . .

While true do begin {почали зовнішній цикл}

While true do begin {почали внутрішній цикл}

. . .

If Умова then goto go1; {вийшли із двох циклів відразу!}

End;

End;

Go1:

. . .

Другий аспект можливого використання gotoпов'язаний з написанням складнихпідпрограм (див. главу 18), здатних завершуватися в різні моменти свого виконання. Найчастіше зручніше, щоб підпрограма мала всього одну "крапку виходу" – свій останній оператор, а достроковий вихід здійснюється установкою значення, що вертається, і переходом на останній оператор задопомогою goto.

Обмеження на використання gotoнаступні: мітка повинна перебувати в тому ж блоці програми, що й операторgoto. Таким чином, не можна перейти з однієї частини складної програми (такий, якпроцедураабофункція, досліджувані в главі 18) в іншу. Безсумнівно, що ці обмеження введені розроблювачами, щоб не ускладнювати й без того складне сприйняття програм, що зловживають даним оператором.