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

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).

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

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

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

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

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

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