- •Основи програмування мовою Паскаль
- •Часть 1. Основы языка Паскаль 2
- •Часть 2. Элементы профессионального программирования на Паскалі 62
- •Частина 1. Основи мови Паскаль
- •1. Алгоритм і програма
- •1.1. Алгоритм
- •1.2. Властивості алгоритму
- •1.3. Форми запису алгоритму
- •1.4. Програма й програмне забезпечення
- •1.5. Етапи розробки програми
- •2. Дані в мові Паскаль
- •2.1 Константи
- •2.2 Змінні й типи змінних
- •3. Арифметичні вирази
- •4. Лінійний обчислювальний процес
- •4.1 Оператор присвоювання
- •4.2 Оператор уведення
- •4.3 Оператор виведення
- •4.4 Керування виводом даних
- •4.5 Вивід на друк
- •5. Структура простої програми на Паскалі
- •6. Компілятор і оболонка Turbo Pascal
- •7. Обчислювальний процес, що розгалужується, і умовний оператор
- •7.4. Короткий умовний оператор
- •If логічний_вираз then оператор1;
- •7.5. Повний умовний оператор
- •If логічний_вираз then оператор1
- •7.7. Вкладені умовні оператори
- •7.9. Приклади програм з умовним оператором
- •8. Директиви компілятора й обробка помилок уведення
- •9. Оператор циклу. Цикли із передумовою і після-умовою
- •10. Цикл із лічильником і дострокове завершення циклів
- •11. Типові алгоритми табулювання функцій, обчислення кількості, суми й добутку
- •11.1 Алгоритм табулювання
- •11.2 Алгоритм організації лічильника
- •11.3 Алгоритми нагромадження суми й добутку
- •12. Типові алгоритми пошуку максимуму й мінімуму
- •13. Розв'язок навчальних завдань на цикли
- •14. Одномірні масиви. Опис, уведення, вивід і обробка масивів на Паскалі
- •15. Розв'язок типових завдань на масиви
- •Частина 2. Елементи професійного програмування на Паскалі
- •16. Кратні цикли
- •16.1 Подвійний цикл і типові завдання на подвійний цикл
- •16.2 Оператор безумовного переходу
- •17. Матриці й типові алгоритми обробки матриць
- •18. Підпрограми
- •18.1 Процедури
- •18.2 Функції
- •18.3 Масиви як параметри підпрограми
- •18.4 Відкриті масиви
- •19. Безлічі й перечислимые типи
- •20. Обробка символьних і строкових даних
- •20.1. Робота із символами
- •20.2 Робота з рядками
- •21. Текстові файли
- •21.1 Загальні операції
- •21.2 Приклади роботи з файлами
- •21.3 Робота з параметрами командного рядка
- •22. Записи. Бінарні файли
- •23. Модулі. Створення модулів
- •23.1. Призначення й структура модулів
- •Implementation
- •23.2. Стандартні модулі Паскаля
- •24. Модуль crt і створення простих інтерфейсів
- •25. Модуль Graph і створення графіки на Паскалі
- •Додаток 1. Таблиці Ascii-Кодів символів для операційних систем dos і Windows
- •Додаток 2. Основні директиви компілятора Паскаля
- •Додаток 3. Основні повідомлення про помилки Паскаля
- •Додаток 4. Додаткові лістинги програм
- •Додаток 5. Розширені коди клавіатури
- •Ascii‑ коди
- •Розширені коди
- •Додаток 6. Правила гарного коду
- •Додаток 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) в іншу. Безсумнівно, що ці обмеження введені розроблювачами, щоб не ускладнювати й без того складне сприйняття програм, що зловживають даним оператором.