додати матеріал


Цикли в Паскалі

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

При вирішенні переважної більшості завдань (у тому числі й досить нескладних) в програмі практично неможливо задати в явному вигляді всі операції, які необхідно виконати. Справді, нехай необхідно обчислити суму перших n членів гармонійного ряду:
Y = 1 + 1 / 2 + 1 / 3 + ... + 1 / n
Очевидно, що з використанням тільки розглянутих вище типів операторів можна скласти програму лише для фіксованого значення n. Наприклад, при n = 5 необхідні обчислення можна задати за допомогою оператора присвоєння види:
Y: = 1 +1 / 2 +1 / 3 +1 / 4 +1 / 5
Якщо ж значення n не фіксується, а є вихідним даним, що вводиться в процесі виконання програми (і навіть константою, описаної в програмі), то аналогічний оператор присвоювання записати неможливо. Бо запис виду Y: = 1 +1 / 2 +1 / 3 + ... +1 / n в мовах програмування неприпустима.
Для усунення виникаючих труднощів служать оператори циклу. Вони дозволяють повторювати виконання окремих частин програми. Можна виділити чотири про імператором циклу, присутніх у тому чи іншому вигляді у всіх мовах програмування: простий арифметичний оператор циклу (цикл з параметром з кроком 1), складний арифметичний оператор циклу (цикл з параметром довільного кроку), ітераційний оператор циклу з передумовою, ітераційний оператор циклу з постусловіем.
Простий арифметичний оператор циклу Паскаля (цикл з параметром)
Повернемося до розглянутої вище задачі обчислення суми перших n членів гармонічного ряду, правила якої неможливо задати у вигляді арифметичного виразу, якщо значення n заздалегідь не фіксоване.
Насправді обчислення цієї суми можна здійснити за дуже простим і компактному алгоритмом: попередньо покладемо y = 0 (за допомогою оператора присвоєння y: = 0), а потім виконаємо оператор присвоювання y: = y +1 / i для послідовних значень i = 1 , 2, ..., n. При кожному черговому виконанні цього оператора до поточного значення y буде додаватися чергове складова. Як видно, в цьому випадку процес обчислень буде носити циклічний характер: оператор y: = y +1 / i повинен виконуватися багаторазово, тобто циклічно, при різних значеннях i.
Цей приклад циклічного обчислювального процесу є досить типовим; його характерні особливості полягають в тому, що
· Число повторень циклу відомо до початку його виконання (у даному випадку воно дорівнює значенню n, яке передбачається заданим до цього часу);
· Управління циклом здійснюється за допомогою змінної порядкового типу, яка в цьому циклічному процесі бере послідовні значення від заданого початкового до заданого кінцевого значень (в нашому випадку - це цілочисельна мінлива i, приймаюча послідовні значення від 1 до n).
Для компактного завдання подібного роду обчислювальних процесів і служить оператор циклу з параметром. Найчастіше використовується такий вигляд цього оператора У Паскалі:
For V: = E1 to E2 do S,
де for (для), to (збільшуючись к) та do (виконувати, робити) - службові слова, V - мінлива порядкового типу, звана параметром циклу, Е1 і Е2 - вираження того ж типу, що й параметр циклу, S - оператор, який і виконується багато разів у циклі, званий тілом циклу.
Зауважимо, що в Паскалі після do повинен стояти один оператор, якщо необхідно виконати декілька дій, то вони повинні бути об'єднані в один складений оператор шляхом укладення в операторні дужки.
Цей оператор циклу Паскаля передбачає присвоювання параметру циклу V послідовних значень від початкового значення, рівного значенню виразу Е1, до кінцевого значення, рівного значенню виразу Е2, тобто при кожному повторенні виконується оператор присвоювання V: = succ (V), і виконання оператора S при кожному значенні параметра циклу V. При цьому значення виразів Е1 і Е2 обчислюються один раз, при вході в оператор циклу, а значення параметра циклу V не повинно змінюватися в результаті виконання оператора S. Якщо заданий кінцеве значення менше початкового значення (що допустимо), то оператор S не виконується жодного разу.
У Паскалі вважається, що при нормальному завершенні виконання оператора циклу значення параметра циклу не визначено.
З використанням оператора циклу з параметром алгоритм обчислення суми перших n членів гармонійного ряду може бути заданий таким чином:
Приклад коду програми для підсумовування перший n членів гармонічного ряду
Readln (n);
Y: = 0;
For i: = 1 to n do y: = y +1 / i;
У деяких випадках буває зручно, щоб параметр циклу Паскаля брав послідовні, але не зростаючі, а спадні значення. Для таких випадків у Паскалі передбачений оператор циклу з параметром такого вигляду:

For V: = E1 downto E2 do S,
де downto (зменшуючись к) - службове слово, а всі інші слова та вирази мають колишній сенс. Зміна параметра циклу від більшого значення до меншого відбувається при виконанні присвоювання V: = divd (V). Зауважимо, що початкове значення може бути менше кінцевого значення. У цьому випадку оператор S не виконається жодного разу. Значення параметра циклу по завершенні виконання такого циклу так само вважається невизначеним.
Слід запам'ятати і те, що для обох варіантів запису циклу з параметром справедливо: якщо початкове і кінцеве значення рівні, то тіло циклу (оператор S) виконається один раз.
Зауважимо також, що параметр циклу може і не використовуватися в тілі циклу, так що основне його призначення - це управління числом повторень циклу. Наприклад, значення y = xn, де n> = 0 - ціле, можна обчислити за наступним алгоритмом: попередньо покласти y = 1, а потім n раз домножити це значення на x:
Приклад коду програми циклу Паскаля
Readln (n);
Readln (x);
Y: = 1;
For i: = 1 to n do y: = y * x;
Як видно, тут параметр циклу i служить лише для того, щоб тіло циклу (оператор y: = y * x) виповнилося потрібну кількість разів.
Арифметичний оператор циклу Паскаля з довільним кроком
Природним ускладненням простого арифметичного циклу Паскаля, є цикл, у якому параметр циклу змінюється не на 1, а на довільну величину - крок збільшення. При цьому в процесі виконання циклу крок змінюється за заданим законом. Стандартні оператори для реалізації такого циклу є в Форте, в інших мовах їх доводиться організовувати з найпростішого арифметичного циклу.
Ітераційні оператори циклу Паскаля
Ітераційні цикли відрізняються від циклів з параметром тим, що в них наперед невідома кількість повторень.
Нехай ми вирушаємо за грибами і повертаємося додому, коли корзина наповниться. Всі грибники діляться на 2 категорії:
· Дивляться, чи є місце в кошику, а вже потім зривають гриби, якщо їх можна помістити в корзину. (Щоправда, у житті таких грибників зустрічати не доводилося)
· Спочатку зривають гриби, а вже потім думають, як їх покласти у кошик.
Звідси виходять два варіанти реалізації ітераційних циклів:
з передумовою і з постусловіем.
У циклі з передумовою спочатку перевіряється умова, а потім робиться крок. Грибник прийде з повною або майже повним кошиком. У циклі з постусловіем - спочатку крок, а потім перевірка. Як кожен нормальний грибник, цей принесе повну або злегка переповнену кошик.
Який алгоритм вибрати? Це залежить від конкретного завдання.
Якщо, зробивши крок без перевірки, можна впасти у яму, то краще перевірка спочатку (як сліпий з паличкою). Ну, а якщо крок без перевірки вас не лякає, то можна відкласти її до завершення кроку.
Потрібно також проаналізувати подія, якої ми очікуємо. Якщо воно може трапитися до першого кроку, то потрібен цикл з передумовою. А якщо подія не може статися до першого кроку, то потрібен цикл з постусловіем.
Оператор циклу Паскаля з постусловіем
Розглянемо тепер математичну задачу. Нехай нам необхідно обчислити суму перших членів гармонічного ряду, що задовольняють умові 1 / i> = e, де 0 <e <1, а i = 1,2,3 ... ... Це завдання можна вирішити за наступним алгоритмом: покласти попередньо y = 0 і i = 0, а потім у циклі збільшувати i на 1, до значення y додавати чергове доданок 1 / i до тих пір, поки поточне значення 1 / i вперше виявиться більше заданого значення 0 <e <1.
Очевидно, що кількість повторень цього циклу заздалегідь не відомо. У подібного роду випадках ми можемо лише сформулювати умову, при виконанні якого процес додавання до суми чергового доданка повинен завершитися.
Для завдання таких обчислювальних процесів і служить оператор циклу Паскаля з постусловіем. Цей оператор має вигляд:
Repeat S1; S2; ...; Si until B,
де repeat (повторювати) і until (до) - службові слова, через Si позначений будь-який оператор Паскаля, а через В - логічне вираження.
При виконанні цього оператора циклу послідовність операторів, що знаходяться між словами repeat і until, виконається один або більше разів. Цей процес завершується, коли після чергового виконання заданої послідовності операторів логічне вираз У прийме (вперше) значення true. Таким чином, за допомогою логічного виразу У задається умова завершення виконання оператора циклу. Оскільки в даному випадку перевірка умови проводиться після виконання послідовності операторів (тіла циклу), цей оператор циклу і називається оператором циклу з постусловіем.
З використанням цього виду оператора циклу Паскаля задача про підсумовуванні перших членів гармонічного ряду, що задовольняють заданій умові, може бути реалізована наступним чином:
Приклад коду оператора циклу Паскаля з постусловіем
readln (e);
i: = 0;
y: = 0;
Repeat
i: = i +1;
y: = y +1 / i;
Until 1 / i <e;
Зауважимо, що оператор циклу з постусловіем є більш загальним, ніж оператор циклу з параметром - будь-який циклічний процес, що задається за допомогою циклу з параметром можна представити у вигляді циклу з постусловіем. Зворотне твердження невірне. Наприклад, задача про підсумовуванні перший n членів гармонічного ряду, розглянута раніше, з оператором циклу з постусловіем буде виглядати так:
Приклад коду оператора циклу Паскаля з постусловіем
Readln (n);
i: = 0;
y: = 0;
Repeat
i: = i +1;
y: = y +1 / i;
Until i> n;
Оператор циклу Паскаля з передумовою
У разі оператора циклу Паскаля з постусловіем входить до нього послідовність операторів свідомо буде виконуватися хоча б один раз. Тим часом досить часто зустрічаються такі циклічні процеси, коли кількість повторень циклу теж невідомо заздалегідь, але при деяких значеннях вихідних даних передбачені в циклі дії взагалі не повинні виконуватися, і навіть одноразове виконання цих дій може призвести до невірних або невизначеним результатами.
Нехай, наприклад, дано дійсне число М. Потрібно знайти найменше ціле невід'ємне число k, при якому 3 k> M. Це завдання можна вирішити за наступним алгоритмом: попередньо покласти y = 1 і k = 0; потім у циклі домножать значення y на 3 та збільшувати значення k на 1 до тих пір, поки поточне значення y вперше виявиться більше значення М. На перший погляд, тут можна скористатися оператором циклу з постусловіем:
Приклад коду оператора циклу Паскаля з постусловіем
y: = 1; k: = 0;
Repeat
y: = y * 3;
k: = k +1;
Until y> M;
Проте неважко переконатися в тому, що при M <1 буде отриманий неправильний результат k = 1, тоді як має бути отримано k = 0: в цьому випадку попередньо сформований значення k = 0 є остаточним результатом і дії, передбачені в циклі, виконуватися не повинні .
Для завдання подібного роду обчислювальних процесів, коли кількість повторень циклу заздалегідь невідомо й дії, передбачені в циклі, можуть взагалі не виконуватися, і служить оператор циклу з передумовою. Цей оператор циклу має в Паскалі наступний вигляд:
While B do S,
де while (поки), do (робити, виконувати) - службові слова, В - логічне вираження, S - оператор. Тут оператор S виконується нуль або більше разів, але перед кожним черговим його виконанням обчислюється значення виразу В, і оператор S виконується тільки в тому випадку, коли значення виразу У true. Виконання оператора циклу завершується, коли вираз У вперше приймає значення false. Якщо це значення вираз У приймає при першому ж його обчисленні, то оператор S не виконається жодного разу.
У розглянутій нами задачі правильне значення k при будь-якому значенні М може бути отримане в такий спосіб:
Приклад коду оператора циклу Паскаля з передумовою
y: = 1; k: = 0;
While y <= M do
Begin
y: = y * 3;
k: = k +1;
End;
Оператор циклу Паскаля з передумовою можна вважати найбільш універсальним - з використанням таких операторів можна задати і циклічні процеси, зумовлені операторами циклу з параметром і постусловіем.
Відзначимо відмінності та особливості хорошого стилю роботи з розглянутими циклічними операторами.
Цикл з передумовою While (поки умова істинна)
Цикл з постусловіем Repeat (до істинності умови)
1. До початку циклу повинні бути зроблені початкові установки змінних, керуючих умовою циклу, для коректного входу в цикл
2. У тілі циклу повинні бути присутніми оператори, що змінюють змінні умови так, щоб цикл через деяке число ітерацій завершився
3. Цикл працює поки умова істинна (поки True)
3. Цикл працює поки умова помилкова (поки False)
4. Цикл завершується, коли умова стає помилковим (до False)
4. Цикл завершується, коли умова стає істинним (до True)
5. Цикл може не виконатися жодного разу, якщо початкове значення умови при вході в цикл False
5. Цикл обов'язково виконається як мінімум один раз
6. Якщо в тілі циклу потрібно виконати більше одного оператора, то необхідно використовувати складений оператор
6. Незалежно від кількості операторів у тілі циклу, використання складеного оператора не потрібно
Цикл з лічильником (з параметром) For
· Початкова установка змінної лічильника циклу до заголовка не потрібно
· Зміна в тілі циклу значень змінних, що стоять у заголовку не допускається
· Кількість ітерацій циклу незмінно і точно визначається значеннями нижньої і верхньої меж і кроку збільшення
· Нормальний хід роботи циклу може бути порушений оператором goto або процедурами Break і Continue
· Цикл може не виконатися жодного разу, якщо крок циклу буде змінювати значення лічильника від нижньої межі в напрямку, протилежному верхній межі
Оператор, який виконується в циклі, сам може бути циклом. Це відноситься до всіх видів циклів. У результаті ми отримуємо вкладені цикли. Механізм роботи вкладених циклів зручніше за все розглянути на прикладі вкладених циклів з параметром. Нехай нам потрібно описати роботу електронних годин, починаючи з моменту часу 0 годин, 0 хвилин, 0 секунд. Значення хвилин стане рівним 1 тільки після того, як секунди «пробіжать» всі послідовні значення від 0 до 59. Годинники змінять своє значення на 1 тільки після того, як хвилини «пробіжать» всі послідовні значення від 0 до 59. Таким чином, виведення всіх значень часу від початку доби до кінця доби може бути представлений наступним фрагментом програми:
For h: = 0 to 23 do
For m: = 0 to 59 do
For s: = 0 to 59 do
Writeln (h ,':', m ,':', s);

Для зручності реалізації циклічних структур на Паскалі в останніх версіях мови введені оператори break та continue, застосовувані всередині циклів. Вони розширюють можливості використання циклів і покращують структуру програми.
У процесі виконання тіла циклу до повного завершення циклу можуть виникнути додаткові умови, що вимагають завершення циклу. У цьому випадку цикл може бути припинений оператором break.
У ході виконання циклу може виникнути умова, при якому необхідно пропустити всі або деякі дії, передбачені в циклі, не припиняючи роботу циклу зовсім. Для цього використовується оператор continue, що передає контроль в ту точку програми, де перевіряється умова продовження або припинення циклу.
Циклічний обчислювальний процес (ЦВП) характеризується повторенням одних і тих же обчислень над деяким набором даних. Числом повторень циклу управляє спеціальна змінна, звана його лічильником або керуючої змінної циклу. На лічильник накладається умова, що визначає, до яких пір слід виконувати цикл.
Повторюваний блок обчислень називають тілом циклу. У тілі циклу має бути забезпечено зміна значення лічильника, щоб він міг завершитися. Якщо тіло циклу складається більш ніж з одного оператора, воно полягає в операторні дужки begin ... end;. Одноразове виконання тіла циклу називають його кроком.
Таким чином, для програмування циклу досить визначити умова, що управляє числом його повторень і описати оператори, що утворюють тіло циклу. З цієї точки зору, теоретично можливі всього два види циклів - перевірка умови або передує виконання тіла циклу, або відбувається після нього. Зобразимо ці цикли у вигляді блок-схем (рис. 9.1).
У циклі з передумовою спочатку перевіряється умова, потім, в залежності від того, істинно воно або помилково, або виконується тіло циклу, або слід перехід до оператора, наступного за тілом циклу. Після завершення тіла циклу управління знову передається на перевірку умови. Природно, передбачається, що в тілі циклу було забезпечено деяка зміна входять в умову змінних - в іншому випадку відбудеться зациклення і програма "зависне".

Рис. 9.1. Блок-схеми циклів з ​​передумовою і постусловіем
Для циклу з постусловіем спочатку виконується тіло циклу, потім управління передається на перевірку умови. У залежності від істинності чи хибності умови, тіло циклу виконується повторно або ж відбувається перехід до оператора, наступного за тілом циклу. Все, сказане про можливе зациклення для циклу з передумовою, справедливо і для циклу з постусловіем.
Виходячи з наведених блок-схем, очевидно основна відмінність двох циклів: цикл з постусловіем гарантовано виконується хоча б раз, а цикл з передумовою може не виконуватися жодного разу, якщо умова відразу ж виявиться помилковим.
У мові Паскаль реалізовані обидва види циклів. Цикл з передумовою має наступний загальний вигляд:
while логіческое_вираженіе do begin
{Оператори тіла циклу}
end;
Роботу циклу можна описати словами: "поки логічне вираження істинно, повторюється тіло циклу".
Логічний вираз будується за правилами, вивченими в гол. 7. Тіло циклу можуть утворювати будь-які оператори Паскаля. Якщо в циклі знаходиться лише один оператор, операторні дужки, що показують початок і кінець тіла циклу, можна не писати.
Загальна запис циклу з постусловіем наступна:
repeat
{Оператори тіла циклу}
until логіческое_вираженіе;
Працює цикл з постусловіем наступним чином: "тіло циклу повторюється до тих пір, поки логічне вираження не стане справжнім". Зверніть увагу, що, на відміну від while, цикл repeat в Паскалі працює, поки умова помилкова. Ця відмінність підкреслюється використанням ключового слова until ("до тих пір, поки не") замість while ("до тих пір, поки"). Крім того, у вигляді виключення, тіло циклу repeat, навіть якщо воно складається з декількох операторів, можна не укладати в операторні дужки.
Досить часто цикли взаємозамінні. Уявімо, наприклад, що для кожного із значень змінної x = 1, 2 ,..., 20, потрібно виконати певний розрахунок (математично цей закон зміни x можна записати як або ). Це можна зробити як у циклі while:
x: = 1;
while x <= 20 do begin
{Оператори розрахунку}
x: = x +1;
end;
так і за допомогою repeat:
x: = 1;
repeat
{Оператори розрахунку}
x: = x +1;
until x> 20;
Як видно з лістингу, що управляє змінною x в обох випадках присвоєно початкове значення 1, обидва циклу змінюють значення x і, відповідно, умова циклу, оператором x: = x +1;, але для циклу repeat умова "перевернуто" ("поки x НЕ стане більше 20 "), а тіло не укладено в операторні дужки.
Найчастіше використання одного з циклів виглядає краще. Наприклад, обробка вводу користувача з клавіатури зручніше за допомогою repeat (спочатку користувач повинен натиснути клавішу, потім слідують перевірки та обробка).
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Реферат | 42.6кб. | скачати

Схожі роботи:
Закінчення і дроселювання водяної пари Прямі термодинамічні цикли цикли паротурбінних
Біогеохімічні цикли структура загальна характеристика цикли вуглецю азоту кисню сірки
Галуження в Паскалі
Арканоід на Паскалі
Програмування на Паскалі
Типи даних в Паскалі
10 завдань з рішеннями програмуванням на Паскалі
Робота з редакторами Word і Excel Програмування в Паскалі
Економічні цикли
© Усі права захищені
написати до нас
Рейтинг@Mail.ru