Програмування циклічних обчислювальних процесів обробки даних. Програмування циклічних обчислювальних процесів. Приклад використання оператора for

У програмуванні часто зустрічаються завдання, що вимагають багаторазового виконання однієї й тієї групи операторів програми з різними значеннями їх операндов. Такі процеси називаються циклічнимиабо просто циклами.Група операторів, що циклічно повторюються, утворює так зване тіло циклу, Яке може бути представлене як простим, так і складовим виразом. Одноразове виконання тіла циклу називатимемо ітерацією.

Тілу циклу у програмі завжди передує заголовок циклу, що містить позначення оператора циклуі вираз, що визначає (прямо чи опосередковано) кількість ітерацій. Зауважимо, що тіло циклу є операндом оператора циклу, отже, заголовок і тіло циклу становлять неподільну структурну одиницю програми. Надалі, використовуючи термін " оператор циклу", Маємо на увазі і заголовок, і тіло циклу.

Для організації циклів у всіх системах програмування існують спеціалізовані оператори циклів, Застосування яких позбавляє програміста необхідності програмувати цикли "вручну". MathCAD підтримує два види таких операторів – цикл із приреченням For (званий також циклом із лічильником) та цикл із передумовою While . Опис структури цих операторів наведено у таблиці 5.

5.4.1 Оператор For

Цей оператор слід використовувати у випадках, коли кількість ітерацій зумовлено, тобто відомо заздалегідь.

Заголовок циклуцього оператора (правий операнд) містить змінну, звану параметром(або лічильником) циклу, і список значеньцього параметра. Число елементів списку визначає і кількість ітерацій – при виконанні кожної ітерації параметр циклу набуває чергового значення зі списку, заданого в заголовку.

Параметр циклумає статус внутрішньої змінної програми та має всі її властивості (описані в параграфі 5.1.4). Як правило, параметр циклу використовується у правій частині виразів, що входять до складу тіла циклу, хоча формально і не заборонено використання його в лівій частині виразів (тобто зліва від оператора локального визначення "f"). При цьому слід пам'ятати, що якщо параметр був змінений у тілі циклу, його змінене значення буде діяти лише до кінця поточної ітерації, оскільки перед початком наступної ітерації параметр все одно отримає чергове значення зі списку, вказаного в заголовку циклу.

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

Після завершення останньої ітерації виконуватиметься оператор програми, наступний після оператора циклу. При цьому змінна, використана як параметр завершеного циклу, зберігає значення, яке вона мала в останній реально виконанійітерації [*]. Зауважимо, що це значення не завжди збігається з останнім значенням зі списку, заданого в заголовку циклу, оскільки можливий "достроковий" вихід із циклу при спрацюванні оператора Break включеного в тіло циклу.

Список значеньпараметр циклу записується в заголовку циклу після символу " Î ", що позначає приналежність множині (цей символ не потрібно вводити "вручну" – він буде автоматично відображений при введенні оператора") For ). MathCAD допускає використання трьох формзапису цього списку: пряме перерахування- Елементи списку явно вказуються через кому, параметр отримує значення зі списку в порядку їх прямування; у стилі ранжованої змінної –елементи списку утворюють відповідний арифметичний ряд; масив- Елементи списку послідовно отримують значення елементів масиву в порядку прямування їх індексів (спочатку - стовпці зліва направо, потім - рядки зверху вниз).

Три програми, наведені малюнку 21, ілюструють різні варіанти використання оператора For .

Програма Fact(n) обчислює факторіал числа n . Оператор циклу в цій програмі входить до складу складового виразу, який, своєю чергою, є операндом умовного оператора Otherwise. Параметр циклу k отримує значення з цілого арифметичного ряду.

Програма Ch(V,N,p) обробляє вхідний вектор V , замінюючи у ньому значення p елементи, індекси яких задані елементами другого вхідного вектора N . У цьому прикладі перелік значень параметра циклу i заданий безліччю елементів вектора N . Зауважимо, що ці програми здійснюють вхідний контроль даних і блокують виконання основного алгоритму у разі, якщо фактичні аргументи програми задані некоректно.

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

Рисунок 21 – Приклади програмування циклів For


Малюнок 22 ілюструє використання операторів Break і Continue у тілі циклу. Як правило, ці оператори самі є операндами. умовних операторів If або Otherwise .

Оператор Break ("перервати") перериваєвиконання циклу та передає управління оператору, наступному після перерваного оператора циклу. Зауважимо, що якщо оператором Break перерваний вкладений цикл, виконання зовнішнього циклу буде продовжено.

Оператор Continue ("продовжити") діє інакше - він перериває лише поточну ітерацію циклуі передає керування заголовку цього циклу, після чого виконання циклу продовжуєтьсяз наступної ітерації (якщо, звісно, ​​перервана ітерація була останньої).

Оператор Break допускається використовувати та позатіла циклу. У цьому випадку переривається виконання всієї підпрограми, і повертається результат обчислення останнього фактично виконаного виразу.

Рисунок 22 – Приклади використання операторів Break і Continue

Функція SumN(V) підсумовує ті елементи вектора, які містять скалярні дані числового типу, а інші елементи пропускаються. Функція Inverse(V) формує вектор, елементи якого значення, зворотні значенням відповідних елементів вихідного вектора. При цьому якщо черговий елемент містить число "0" або не є скаляром числового типу, цикл переривається. Зауважимо, що оператор Break в останньому прикладі не перериває роботи програми, а передає управління оператору Return , наступному безпосередньо після оператора For .

5.4.3 Оператор While

На відміну від оператора For , заголовок оператора While (в перекладі - " Бувай") не містить явних вказівок на кількість ітерацій - він містить логічний вираз, значення якого автоматично обчислюється перед початкомвиконання кожної чергової ітерації [†]. Поки цей вислів "істинно", ітерації циклу продовжуватимуться; як тільки після завершення чергової ітерації вираз стане "хибним", наступна ітерація циклу не буде виконана, і управління отримає оператор програми, наступний після оператора While .

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

Приклади використання оператора While наведено на малюнку 23. Наведено три варіанти вирішення однієї і тієї ж задачі: кожна з програм F0 , F1 і F2 повертає індекс першого з елементів вихідного вектораV , що перевищує задане значенняz .

Перша програма (приклад а ) додає одиницю до лічильника k у тілі циклу While доки черговий k -й елемент вихідного вектора не перевищить заданого значення z . Після цього цикл завершується, і програма повертає останнє змінене значення змінної k , яке є рішенням задачі. Зазначимо, що на відміну від циклу For , лічильник k тут необхідно обробляти окремими операторами: ініціалізувати (тобто надавати йому початкове значення) перед оператором циклу та змінювати його значення в тілі циклу.

Неважко помітити, що варіант а ) програми має суттєвий недолік: він не запобігає зацикленню програми у разі, коли завдання не має рішення, тобто коли параметр z перевищує значення найбільшого елемента вектора V . У цьому прикладі зациклення в такій ситуації реально не відбудеться – але це заслуга не нашої програми, а системи MathCAD, яка проконтролює вихід індексу вектора V за межі допустимих значень та видасть повідомлення про помилку.

Вільним від цього недоліку є варіант б ) програми, в якому тіло циклу містить додаткову перевірку допустимості чергового значення індексу та примусово перериває цикл оператором Break у відповідній ситуації із видачею текстового повідомлення.

Можливо, найбільш ефективним варіантом вирішення цього завдання є варіант в ), який взагалі не використовує оператор While . У цій програмі змінна k використана тільки для дотримання "чистоти стилю" – щоб унеможливити обробку параметра циклу i поза оператором For .

Рисунок 23 – Приклади програмування циклів While

Мета роботи:

Вивчити циклічні оператори for, while, do – while, навчитися складати та програмувати циклічні алгоритми.

Короткі теоретичні відомості

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

Оператор циклу for

Основна форма оператора циклу має вигляд

for (вираз_1; вираз_2; вираз_3)

оператор;

де вираз_1- Початкове значення параметра циклу;

вираз_2- Перевірка умови на продовження циклу;

вираз_3- Зміна параметра циклу (корекція);

оператор- Простий або складовий оператор мови С.

Схема роботи оператора наступна: лише один раз спочатку обчислюється вираз_1, потім перевіряється вираз_2, і якщо воно - «істина», то виконується циклічна ділянка програми, потім проводиться корекція параметра, і так доти, поки вираз_2 не набуде значення «брехня».

Наприклад: for (k=1; k<5; k++)

printf(“\n%d”, k);

Внаслідок виконання цього оператора друкуються у стовпчик цифри від 1 до 4.

Як параметр циклу можна використовувати змінну будь-якого базового типу.

Наприклад:

for(ch='a'; ch<=’z’; ch++) // Вывод на экран букв

printf(“%c”,ch); // Латинський алфавіт

Необхідно ретельно контролювати структуру циклів for у програмі, щоб не вийшов нескінченний цикл (з якого немає виходу).

Наприклад:

for(k=10; k>6;k++)

printf(“нескінченний цикл \n”);

Вийти із циклудостроково можна наступними способами:

За додатковою умовою;

Використовуючи такі оператори:

break;- вихід із циклу, в якому знаходиться break, управління передається на перший після циклу виконуваний оператор;

exit(int Kod);- вихід із програми;

return;- вихід із функції;

За допомогою оператора безумовного переходу goto<метка>;

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

Передавати керування ззовні всередину циклу забороняється.

Будь-який вираз циклу for у круглих дужках може бути відсутній, але символ «;» опускати не можна.

Наприклад:

for(; i<3; i++)

puts(“Hello!”);

Циклічні оператори while та do–while

Основна форма циклічного оператора while:

While (умова)

оператор;

де оператор

Цикл виконується до того часу, поки умова набуває значення «істина», тобто. вираз у дужках повертає ненульовий результат. Це цикл із передумовою – спочатку перевіряється умова, потім виконується оператор. Тому цикл while не виконається жодного разу, якщо спочатку результат обчислення умови дорівнюватиме 0.

Основна форма оператора do – while:

оператор;

while (умова);

де оператор– це простий, складений чи порожній оператор.

Оператор dowhile- Оператор циклу з постумовою, тобто. спочатку виконується оператор, а потім перевіряється умова істинності. Оскільки циклі do–while умова перевіряється наприкінці циклу, цикл буде виконано хоча б один раз.

У циклах типу while і do–while допустимі самі способи дострокового виходу з циклу і дострокове завершення поточного кроку циклу, як й у операторі for, але у разі на відміну циклу for управління передається на перевірку умови. Для запобігання безкінечному циклу всередині циклів while і do–while потрібно передбачити зміну змінних, що входять до умови.

Наприклад:

for (i=1;i<=300;i++) // Печать целых чисел, кратных 5

if (i%5!=0) continue;

printf("%5d",i);

Приклади нескінченних циклів:

оператор;

2) while (число_не_0) // Завжди істинно!

оператор;

оператор;

while(число_не_0); // Завжди істинно!

Серед операторів циклу обов'язково має бути умова виходу.

Вкладені цикли

У разі вкладених циклів один цикл знаходиться всередині іншого, наприклад:

for(i=nn;i

for(j=mn;j

оператор;

де оператор– це простий, складений чи порожній оператор. Внутрішній цикл виконуватиметься для кожного значення параметра i, що відповідає умові зовнішнього циклу.

Приклад:

for(i=1;i<10;i++) // Печать таблицы умножения

for(j=1;j<4;j++)

printf(“\n %d*%d=%2d”, i, j, i*j);

printf(“\n”);

Приклад використання оператора for

Обчислити. На друк програма повинна виводити проміжні та остаточні результати.

Текст програми може мати вигляд

#include

#include

puts(“Введіть N”);

scanf(“%d”,&N);

for (s=0, k=1; k<=N; k++) // В заголовке цикла можно выпол-

( // няти і подвійне присвоєння

printf("\nk=%ds=%f", k,s);

printf("\n ВІДПОВІДЬ: s=%f, Press any key...",s);

Варіанти індивідуальних завдань

Скласти програму визначення таблиці значень функції уу довільному діапазоні [ a,b] зміни аргументу хз довільним кроком h. Значення a, b, hвводяться із клавіатури. Таблиця має містити такі стовпці: порядковий номер, значення аргументу x, значення функції, повідомлення про зростання або зменшення функції, різницю двох сусідніх значень функції.

Визначити максимальне та мінімальне значення функції.

1. a=-p; b = p; h = 0,4.

2. a=0,7; b = 1,8; h = 0,1.

3. a=-0,5; b = 2,5; h = 0,2.

4. a=-0,9; b = 2,7; h = 0,3.

5. a=-2; b = 0,8; h = 0,2.

6. a=-1,9; b = 2,7; h = 0,3.

7. a = -0,4 p; b = 0,4 p; h = 0,5.

8. a=-0,3p; b = 1,3p; h = p/10.

9. a=-p/2; b = p/2; h=p/10.

10. a=-3; b = 3; h = 0,5.

"Програмування циклічних обчислювальних процесів"

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

Теоретична частина

4.1.1. Циклічні алгоритми.

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

Циклічний алгоритм – це алгоритм, що містить один чи кілька циклів.

Є 3 види циклів:

Цикл із передумовою;

Цикл із постумовою;

Цикл із лічильником (лічильний цикл).

Якщо виконання циклу пов'язане з будь-якою логічною умовою, то використовуються цикли з передумовою або постумовою.

Цикли з лічильником представляють такий клас, у якому виконання тіла циклу має повторюватися заздалегідь кілька разів.

Блок-схеми циклічних алгоритмів виглядають так:

1. Цикл із лічильником.

2. Цикл із передумовою. 3. Цикл із постумовою.

4.1.2 Оператори циклу у мові програмування C++.

У C++ кожному за виду циклу є відповідний оператор:

Цикл типу while (з передумовою);

Цикл типу do ... while (з постумовою);

Цикл типу for (лічильний).

1.Оператор циклу типу while

Форма запису:

while (умова) оператор;

де: (Умова) - логічний вираз;

оператор – виконуваний у циклі оператор чи тіло циклу.

Якщо тіло циклу є складовою оператор, його потрібно укласти в операторні дужки(...):

while (умова)

група операторів

Схема роботи такого циклу: доки умова є істинною (true), виконується тіло циклу і знову перевіряється умова тощо. Коли умова стане хибним (false) цикл завершує роботу.

2. Оператор циклу типу do…while

Форма запису:

оператор;

while (умова);

Схема роботи такого циклу: спочатку виконується оператор, потім перевіряється умова, якщо умова є істинною, виконується оператор і знову перевіряється умова тощо. Коли умова стане хибною, цикл завершує роботу.

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



група операторів

while (умова);

3. Оператор циклу типу for

Форма запису:

оператор;

A – початковий вираз, який задає початкові значення параметру циклу та за необхідності початкові значення іншим параметрам. Наприклад:

i=0, x=0.5, p=1, s=0

B – умовний вираз, що перевіряє умову продовження роботи циклу. Наприклад:

C – вираз збільшення, яке задає збільшення параметру циклу і при необхідності іншим параметрам, тоді вони записуються списком. Наприклад: x+=0.1, i++

4.1.3 Приклад складання алгоритму та програми мовою C++ для циклічного обчислювального процесу.

Обчислити значення виразу:

b- Вихідна величина, її значення вводяться з клавіатури і не змінюється;

a- Змінюється в діапазоні з кроком 1;

y– результат, його значення відображаються на екрані.

Виходячи з умови завдання змінна a є цілою, тому може бути використана як лічильник у рахунковому циклі.

Блок-схема алгоритму розв'язання цієї задачі з використанням рахункового циклу виглядає так:

#include

#include

#include

printf(“Введіть b: “);

scanf(“%f”,&b);

printf(“a y\n”);

for (a=0;a<=10;a++)

printf(“%3d”,a);

printf(“%8.2f\n”,y);

y=(a-b)/sqrt(a);

printf(“%8.2f\n”,y);

Блок-схема алгоритму розв'язання цієї задачі з використанням циклу з передумовою виглядає так:

Текст програми мовою C++, відповідної даному алгоритму, виглядає так:

#include

#include

#include

printf(“Введіть b: “);

scanf(“%f”,&b);

printf(“a y\n”);

printf(“%3d”,a);

printf(“%8.2f\n”,y);

y=(a-b)/sqrt(a);

printf(“%8.2f\n”,y);

else printf(“y не існує\n”);

Блок-схема алгоритму розв'язання цієї задачі з використанням циклу з постумовою виглядає так:

Текст програми мовою C++, відповідної даному алгоритму, виглядає так:

#include

#include

#include

printf(“Введіть b: “);

scanf(“%f”,&b);

printf(“a y\n”);

printf(“%3d”,a);

printf(“%8.2f\n”,y);

y=(a-b)/sqrt(a);

printf(“%8.2f\n”,y);

else printf(“y не існує\n”);

while(a<=10);

Практична частина

4.2.1 Вимоги до виконання роботи:

Виконати завдання з лабораторної роботи № 3 для діапазону значень однієї із змінних. Змінна змінна, діапазон її зміни та крок зазначені в таблиці 4. Скласти блок-схеми алгоритмів та програми для двох типів циклів, зазначених в індивідуальному завданні (таблиця 4).

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

Порядок виконання.

1. Виконати аналіз завдання, сформулювати постановку завдання.

2. Скласти блок-схеми алгоритмів.

3. Скласти програму мовою C++. Передбачити введення вихідних даних із клавіатури та виведення результатів на екран.

4. Виконати перевірку працездатності програми на різних вихідних даних.

5. Виконати аналіз одержаних результатів.

Варіанти індивідуальних завдань.

Варіанти індивідуальних завдань вибираються з таблиці 4 відповідно до номера студента у списку групи у журналі викладача.

Таблиця 4. Варіанти індивідуальних завдань

№ п/п Змінна змінна Типи циклів
10 ≤ a ≤ 10,Δ a=1
-4 ≤ d ≤ 4, Δ d = 0.5
-6 ≤ x ≤ 3, Δ x = 0.5
0 ≤ b ≤ 3 0, Δ b = 1.5 1. З передумовою, 2. Рахунковий
-15 ≤ j ≤ 1 0, Δ j = 0.5 1. З передумовою; 2. З постумовою
5 ≤ e ≤ 35,Δ e = 2 1. Рахунковий, 2. З постумовою
-5 ≤ m ≤ 15,Δ m = 1 1. З передумовою, 2. Рахунковий
1 ≤ c ≤ 70,Δ c = 3 1. З передумовою; 2. З постумовою
1.5 ≤ c ≤ 15,Δ c = 0.5 1. Рахунковий, 2. З постумовою
-8 ≤ b ≤ 28,Δ b = 2 1. З передумовою, 2. Рахунковий
-4.5 ≤ x ≤ 11.5,Δ x = 0.5 1. З передумовою; 2. З постумовою
-7 ≤ k ≤ 2,Δ k = 0.3 1. Рахунковий, 2. З постумовою
-1 ≤ m ≤ 21,Δ m = 1 1. З передумовою, 2. Рахунковий
-2 ≤ e ≤ 34,Δ e = 2 1. З передумовою; 2. З постумовою
-11 ≤ c ≤ 23,Δ c = 2 1. Рахунковий, 2. З постумовою
-13 ≤ p ≤ 50,Δ p = 3 1. З передумовою, 2. Рахунковий
3.3 ≤ b ≤ 9.3,Δ b = 0.3 1. З передумовою; 2. З постумовою
3.5 ≤ y ≤ 12.3,Δ y = 0.4 1. Рахунковий, 2. З постумовою
-7.5 ≤ a ≤ 5.7,Δ a = 0.6 1. З передумовою, 2. Рахунковий
-1.5 ≤ h ≤ 1.2,Δ h = 0.1 1. З передумовою; 2. З постумовою
0 ≤ h ≤ 10,Δ h=0.5 1. Рахунковий, 2. З постумовою
-15 ≤ b ≤ 15, Δ b =2 1. З передумовою, 2. Рахунковий
-7 ≤ l ≤ 3, Δ l = 0.5 1. З передумовою; 2. З постумовою
-5.5 ≤ b ≤ 6.5, Δ b = 0.5 1. Рахунковий, 2. З постумовою
1 ≤ k ≤ 9, Δ k = 0.4 1. З передумовою, 2. Рахунковий
0 ≤ b ≤ 6.9,Δ b = 0.3 1. З передумовою; 2. З постумовою
-3 ≤ v ≤ 9,Δ v = 0.6 1. Рахунковий, 2. З постумовою
-2 ≤ p ≤ 2.6,Δ p = 0.2 1. З передумовою, 2. Рахунковий

4.3 Контрольні питання та практичні завдання:

1. Як працює оператор while?

2. Як працює оператор do...while?

3. Як працює оператор for?

4. Підкреслити у програмі оператори, які утворюють цикл.

5. У чому полягає відмінність операторів while та do...while?

6. Замінити у програмі один оператор циклу іншим.

У програмуванні ми часто стикаємося із завданнями, в яких зустрічаються повторювані процеси. Тому ми повинні знати та вміти користуватися таким поняттям як « циклічні обчислювальні процеси».

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

Що таке цикл у програмуванні?

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

З поняттям цикл ми зустрічаємося у програмуванні. У багатьох сферах нашого життя існують цикли.

Наприклад - кругообіг води в природі, це природний цикл у нашому житті.

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

Етапи циклічного процесу

У загальному випадку цикл має бути реалізований за 4 етапи:
  • 1 етап – підготовка циклу (ініціалізація).
    Завдання початкового значення параметру та змінної циклу.
    Параметр циклу- Ця величина, яка вважає число кроків циклу (число повторень циклу).
    Змінна циклу- Це величина, яка змінює своє значення на кожному етапі циклу.
    Ініціалізація– це завдання початкових значень параметра та змінної циклу.
  • 2 етап – тіло циклу.
    Це багаторазове повторення дія в циклі або обчислень за одним і тим самим математичним залежностям з різними значеннями змінних.
  • 3 етап – модифікація (зміна) циклу.
  • 4 етап – управління циклом.
    Це перевірка умови продовження чи початок циклу.
У pascal існує 3 оператори циклу, які можуть реалізувати будь-яку алгоритмічно – циклічну структуру :
  1. Оператор циклу із параметром
  2. Оператор циклу з передумовою
  3. Оператор циклу з постумовою
Детально їх ми розглянемо у наступних статтях.

1. Способи побудови циклічних обчислювальних процесів у програмах.

2. У комп'ютер вводитьсяNдійсних чисел. Скласти програму, що видає на екран середнє арифметичне значення набору.

Вступ

Циклічні програми використовуються практично у будь-якому програмному забезпеченні. При цьому цикли можуть бути явними та неявними. Зокрема, неявний цикл присутній в обробниках переривань, які фактично працюють у нескінченному циклі, чиє тіло ініціюється перериванням. Циклічними є і підпрограми - віконні функції програм Windows. Далі розглядаються програми із циклом, тіло якого містить функціональні модулі.

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

Програми, що реалізують циклічний процес називають циклічними програмами.

У організації циклу можна назвати такі этапы:

підготовка (ініціалізація) циклу (І);

виконання обчислень циклу (тіло циклу) (Т);

модифікація параметрів (М);

перевірка умови закінчення циклу (У).

Порядок виконання цих етапів, наприклад Т і М, може змінюватися. Залежно від розташування перевірки умови закінчення циклу розрізняють цикли з нижнім та верхнім закінченнями. Для циклу з нижнім закінченням тіло циклу виконується щонайменше один раз, оскільки спочатку виробляються обчислення, а потім перевіряється умова виходу з циклу.


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

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

Тіло циклу- Це ділянка програми, що багаторазово повторюється.

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

Загальний вид циклу n разів

У загальному вигляді цикл n разів записується так:

нц число повторень раз

Службове слово нц (початок циклу) і кц (кінець циклу) пишуться строго одне під одним і з'єднуються вертикальною межею. Правіше за цю рису записується повторювана послідовність команд (тіло циклу).

Число повторень – довільне ціле число.

При виконанні алгоритму послідовність команд у тілі циклу повторюється вказане число разів. Правила алгоритмічної мови допускають завдання будь-якого цілого числа повторень. Воно може бути нульовим і навіть негативним. Ці випадки не вважаються помилковими, просто тіло циклу не буде виконано жодного разу, а комп'ютер відразу перейде до виконання команд, записаних після кц

Загальний вид циклу поки

У загальному вигляді цикл поки що записується так:

нц поки умова

| тіло циклу (послідовність команд)

Під час виконання циклу комп'ютер повторює такі дії:

а) перевіряє записану після службового слова поки що умову;

б) якщо умова не дотримується, виконання циклу завершується і комп'ютер починає виконувати команди, записані після кц. Якщо ж умова дотримується, комп'ютер виконує тіло циклу, знову перевіряє умову тощо.

Загальний вид циклу для

нц для i від i1 до i2

| тіло циклу (послідовність команд)

Тут i – ім'я величини цілого типу, i1, i2 – довільні цілі числа чи вирази із цілими значеннями. Тіло циклу послідовно виконується для i = i1, i = i1 + 1, i1 + 2, … i = i2.

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

Цикл n разів і цикл поки

Цикли n разів і поки що оформляються в алгоритмічній мові майже однаково. Це не дивно, адже обидві ці команди задають цикл – послідовність команд, що повторюється. Службові слова нц і кц вказують, що виконується цикл, а заголовок циклу задає конкретний механізм виконання.

Однак у цих двох циклів є одна істотна відмінність. Починаючи виконувати цикл n разів, комп'ютер знає, скільки разів доведеться повторити тіло циклу. При виконанні циклу це не так: комп'ютер щоразу перевіряє умову циклу і не може заздалегідь визначити, коли виконання закінчиться. Дізнатися кількість повторень циклу поки що можна тільки після завершення циклу.

Звідси зрозуміло, у яких випадках який цикл слід використати. Якщо на момент початку циклу кількість повторень відома, зручно скористатися циклом n разів. Якщо кількість повторень заздалегідь визначити не можна, необхідний цикл поки.

Наприклад, програма автоматичного управління має структуру, зображену на рис. 1. Модулі, що входять до циклу(а також модулі обробки переривань), з одним входом і одним виходом кожен зазвичай мають характерну особливість: модулі містять статичні змінні, яким присвоюється значення в поточному циклі, а аналіз цих змінних виконується в наступному циклі. Таким чином, згадані змінні характеризують стан модуля на кінець поточного або початок наступного циклу програми. Надалі розглядатимемо лише такі модулі циклічних програм і позначатимемо їх коротко МЦП.


Рис.1. Типова структура керуючої програми із нескінченним циклом.

МЦП мають різноманітну структуру, складність якої необхідно оцінювати за спеціальними критеріями. В.В.Ліпаєвим запропоновано зручний та об'єктивний критерій складності програмних модулів, а саме: число та сумарна довжина шляхів у керуючому графі модуля. При цьому враховуються лише умовні оператори та оператори вибору. Однак цього критерію явно недостатньо для МЦП зі статичною пам'яттю, тому що при аналізі МЦП необхідно пам'ятати значення всіх статичних змінних, встановлених у попередньому циклі. Крім цього, жодних рекомендацій щодо стандартизації алгоритмів та програм, крім давно відомого структурного програмування загальноуживаними мовами програмування типу Сі та Паскаль – немає. У цій статті пропонується заповнити ці прогалини стосовно МЦП.

2. Фрагменти модулів циклічних програм

Двополюсним фрагментом, або просто фрагментом, вважатимемо ділянку програми з одним входом і одним виходом (включаючи оператори циклів) у припущенні, що МЦП структуровані. Найпростіший фрагмент включає єдиний оператор. Послідовність фрагментів є також фрагментом. МЦП своєю чергою є фрагментом і складається з послідовності фрагментів.

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


Рис.2. Варіанти реалізації модуля із незалежними фрагментами:

а) та б) - послідовна реалізація,

в) - паралельна реалізація: подвійна горизонтальна лінія означає розпаралелювання програми, жирна горизонтальна характеристика означає завершення паралельних процесів.

Залежним фрагментом є такий, розташування якого залежить від розташування іншого (інших) фрагмента в модулі. Розрізнятимемо зверху- і знизу залежні фрагменти. Зверху-залежний фрагмент повинен бути розташований завжди нижче за деякий фрагмент, в якому формуються змінні, що використовуються в даному (залежному) фрагменті. Знизу-залежний фрагмент повинен розміщуватися завжди вище фрагмента, в якому використовуються змінні, що формуються в даному фрагменті. Два залежні фрагменти, один з яких є зверху залежним від другого, а другий знизу залежним від першого, називатимемо взаємно залежними фрагментами. Їх не можна міняти місцями та не можна реалізовувати паралельно. На рис. 3 наведено приклад модуля із взаємно залежними фрагментами. Між взаємно залежними фрагментами можуть бути інші, залежні чи залежні від них. Рис.3. Модуль із залежними фрагментами.

Фіксованим називатимемо залежний фрагмент, місце розташування якого в модулі строго визначено. Наприклад, у модулі розпізнавання символу, введеного з клавіатури, першим має бути знизу залежний фрагмент безпосередньо введення символу. Оператори "початок" і "кінець" модуля мають фіксовані фрагменти.

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




Top