- •Основи програмування мовою Паскаль
- •Часть 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. Рекомендована література
10. Цикл із лічильником і дострокове завершення циклів
Перш, ніж перейти до прикладів, обговоримо ще ряд проблем, пов'язаних із циклами. Як для while, так і дляrepeat, по-перше, ніде в явному виді не задається число кроків циклу (хоча його звичайно можна обчислити), по-друге, при використанні обох циклів програміст повинен опікуватися про зміну керуючої змінної. Тим часом, досить поширені завдання, де обсяг послідовно оброблюваних даних відомий заздалегідь (а виходить, відомо й необхідне число кроків циклу), а керуюча змінна міняється із кроком, рівним одиниці. Розглянутий вище приклад із двадцятьома значеннями x ставиться саме до таких завдань. Томудля обробки заздалегідь відомого обсягу даних із кроком по керуючій змінній, рівним одиниці, замість циклуwhileвикористовуєтьсяцикл із лічильником(цикл for). Його загальний вид наступний:
for лічильник := початкове_значення to кінцеве_значення do begin
{оператори тіла циклу}
end;
Тут лічильник – цілочисельна змінна, початкове й кінцеве значення – Цілочисельні вирази або константи. Тіло циклу утворене не менш, чим одним оператором, якщо цей оператор єдиний, операторные дужки можна не писати. Працює цикл forу такий спосіб:лічильник автоматично міняється від початкового значення до кінцевого включно, для кожного значення лічильника виконується тіло циклу. Після кожного кроку циклу значення лічильника автоматично збільшується на одиницю. Якщо потрібно, щоб значення лічильниказменшувалося, а не збільшувалося, замість ключового словаtoвикористовуєтьсяdownto.
Подібно while, циклforможе не виконатися й жодного разу – якщо початкове значення керуючої змінної відразу ж більше кінцевого ( при використанніto) або менше ( при використанніdownto).
Запишемо розглянутий вище цикл по змінній xза допомогою оператораfor:
for x:=1 to 20 do begin
{оператори тіла циклу}
end;
Зручності очевидні – границі зміни xзадані відразу ж при вході в цикл, а виконувати крок поxокремим оператором не потрібно. Зрозумілі й обмеження –xповинен бути описаний з типомinteger, а у випадку зміниxіз кроком, не рівним одиниці, використовуватиforзамістьwhileне вдалося б.
Друга проблема пов'язана з тим, що при виконанні програми досить часто виникає необхідність завершити цикл достроково – наприклад, якщо шукане в ньому значення вже знайдене або виникла помилка, через якої подальші кроки стають безглуздими. Теоретично цикл можна було б завершити, привласнивши керуючої змінної значення, що виходить за межі її зміни:
x:=1;
while x<10 do begin
y:=ln(x);
if y>2 then x:=10; { При y>2 цикл потрібно завершити}
x:=x+0.5;
end;
Однак, щоб уникнути трудноуловимых помилок, що управляє змінну не прийнято міняти інакше, чому для виконання кроку циклу. Наприклад, після оператораif y>2 then x:=10; у нашім лістингу виконання поточного кроку продовжиться, що чревате зайвими або неправильними обчисленнями. Крім того, текст такої програми сприймається нелегко.
Тому для дострокового виходу із циклуіснує операторbreak ( від англ. "to break" - перервати), що негайно припиняє його виконання:
x:=1;
while x<10 do begin
y:=ln(x);
if y>2 then break; { При y>2 цикл потрібно завершити}
x:=x+0.5;
end;
Breakтут передасть керування на оператор, що випливає безпосередньо за циклом. На відміну від попереднього прикладу, тут не буде виконуватися частина тіла циклу, що випливає заbreak;.
Для негайного продовження циклу з наступного крокувикористовується операторcontinue( від англ. "to continue" – продовжити):
var n:integer;
begin
repeat
writeln ('Уведіть позитивне число:');
read (n);
if n<1 then continue; {Якщо введене n<1, знову запросити число}
{Тут розташовані оператори обробки позитивного числа}
break; {Вихід із циклу обробки}
until false;
end.
У цьому прикладі оператор continueвикористаний для повторного перехід до введенняn, якщо введенеn<1. Тому що цикл обробки тут – нескінченний, для виходу з нього необхіднийbreak;. Крім того, приклад показує одну з можливостей контролю правильності введення даних. Указавши директиву{$I-}, вивчену в главі 8, ми могли б захистити програму й від уведення користувачем нечислових значень у якостіn.
У темі "Кратні цикли" другої частини курсу буде розглянутий оператор goto, також здатний розв'язати проблему аварійного завершення циклів.