Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСНОВИ АЛГОРИТМІЗАЦІЇ.doc
Скачиваний:
9
Добавлен:
09.11.2019
Размер:
511.49 Кб
Скачать

3.7. Типи обчислювальних процесів

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

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

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

Постановка завдання під цей алгоритм може виглядати так: “ Після запуску програми діждатися запрошення (блок 2) і ввести з клавіатури два числа (блок3). Якщо перше число більше другого (блок 4), то викликати підпрограму A (блок 5), інакше – викликати підпрограму B (блок 6). Залежно від результатів u і w роботи цих підпрограм (блок 7 аналізу), виконується один з блоків лінійних обчислень (блоки 8, 9), або програма повертається до введення запрошення (блок 2). Результати роботи блоку 8 (9) роздруковуються на принтері (блок 10). Блоки 1,11 – пуск і зупинка програми ”.

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

Як видно|показний| з|із| блок-схеми рис.3.2., програма складається з операторів вводу/виводу|виведення| (блоки 2,3,10), операторів аналізу і вибору однієї з двох або з|із| декількох гілок обчислювального процесу (блоки 4,7), операторів виклику підпрограм (блоки 5,6), блоків операторів лінійних обчислень|підрахунків| – 8, 9.

3.8. Цикли в обчислювальному процесі

При роботі програми часто виникає необхідність повторного виконання якоїсь ділянки (блоку) програми. На рис.3.2. – це гілка повторень, що йде від блоку аналізу 7 до блоку введення початкових даних 2. Цикл виконання блоків 2-7 повторюватиметься поки змінні u і w будуть рівні. При нерівності цих змінних програма завершиться виводом на друк якихось результатів обчислень в одному з блоків 8,9. На блок-схемах гілка, що створює цикл, змальовується лінією із стрілкою.

Циклічне виконання одних і тих же операцій (ітерація) – характерна ознака автоматів, як механічних, так і електронних (комп'ютерів). У програмуванні цикли використовуються в ітеративних алгоритмах чисельного аналізу, а також при обробці масивів даних. Приклади масивів даних:

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

  • Одновимірний|одномірний| масив числових даних (вектор), двовимірний масив числових даних (матриця); вектори і матриці широко використовуються в інженерно-технічних і наукових розрахунках.

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

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

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

Цикл може бути утворений чотирма способами:

  1. Цикл з|із| умовним переходом на мітку

  2. Рахунковий цикл

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

  4. Цикл з|із| постумовою.

Цикл з умовним переходом на мітку утворюється в результаті виконання умовного оператора, що перевіряє деяку умову (u=w, в прикладі рис 3.2.) і, при виконанні умови, передає управління на відміченого оператора. На рис 3.2. міткою L1: відмічений перший оператор блоку 2. Спосіб організації циклу з передачею управління ‘далеко назад’ на відміченого оператора – природний апарат машинних команд, застосовується в сучасному Асемблері. Він широко застосовувався у Фортрані і Бейсику, що вело до структурної непрозорості, заплутаності створюваної програми. Мірою боротьби із структурною плутаниною було виникнення технології структурного програмування [13], де основний принцип - мінімізація використання в програмуванні відмічених операторів. Цей тип циклу вважається застарілим, і в сучасному програмуванні розцінюється як ‘ознака поганого смаку’. Проте, сучасні МВР зберегли апарат передачі управління на мітку, і в деяких випадках, коли цикл охоплює багато обчислювальних блоків, буває зручнішим скористатися цією фортранівсько-асемблерною архаїкою.

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

Нижче наведений приклад фрагмента програми на мові|язиці| Паскаль і мові|язиці| Сі рахункового циклу, де обчислюється|вичисляє| і виводиться на екран сума членів арифметичної прогресії:

Приклад|зразок| 3.1а. Мова|язик| Паскаль:

.....

1) var| i,s,n:integer|;

.....

2) s:=0|;

3) n:=10|;

4) for| i:=1| to| n do|

5) begin|

6) s:=s+i|;

7) write|(s:3|);

8) end|;

.....

Приклад|зразок| 3.1б. Мова|язик| Сі:

.....

1) int| i,s,n|;

.....

2) s=0|;

3) n=10|;

4) for| (i=1|; i<=n|; i++|)

5) {

6) s=s+i|;

7) printf|(“%3d”,s);

8) }

.....

Рядки з крапками показують, що Приклад 3.1 – лише фрагмент програми на відповідному МВР, нумеровані рядки – оператори цього фрагмента (в справжній програмі нумерація не застосовується, тут нумерація наведена для пояснення дії окремих операторів). Програма накопичує суму членів простої арифметичної прогресії у комірці з ім'ям s. Змінна циклу зберігається у комірці i . Число членів арифметичної прогресії задається у комірці n.

Рядок 1 описує тип використовуваних змінних, в даному випадку i,s,n – змінні цілого типу. Рядки 2,3 задають початкові значення – очищують комірку підсумовування s і задають число n. Рядки 4-8 - рахунковий цикл. Рядок 4 – оператор рахункового циклу, рядки 5,8 – операторні дужки, що обмежують складеного оператора, що складається з двох простих операторів - накопичення суми (рядок 6) і роздруку її значення (рядок 7).

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

У тих випадках, коли заздалегідь невідоме число циклів повторення, використовуються два інших сучасних ‘безміткових|’ типів циклу.

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

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

Цикл з|із| постумовою завжди виконується як мінімум один раз, а цикл з|із| передумовою може не виконатися жодного разу. Поширеніший цикл з|із| передумовою, де він використовується при читанні рядків-записів з|із| файлу на зовнішньому носієві. Якщо при черговій спробі читання запису з|із| файлу виникає умова-ситуація ‘кінець файлу’, то програма припиняє виконання циклу читання. Файл може мати нульову довжину (є ім'я, але|та| немає даних). В цьому випадку команди циклу не виконуються жодного разу.

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