- •Основи алгоритмізації
- •Машина Тьюринга (мт)
- •Перші еом
- •Частина 1. Основи програмування Розділ 1. Архітектура сучасних пк
- •1.1. Структурна схема пк
- •1.2. Загальні|загальні| принципи роботи комп'ютера
- •1.3. Позиційні системи числення
- •Завдання для самостійної роботи
- •Розділ 2. Історія розвитку мов|язиків| програмування високого рівня
- •Розділ 3. Загальні|загальні| принципи програмування
- •3.1. Вимоги до професії
- •3.2. Мови|язики| програмування і програмне|програмова| середовище|середовище|
- •3.3. Структура програмних комплексів
- •3.4. Структура програми
- •3.5. Технологія програмування і налагодження програм на мвр
- •3.6. Техніка обчислень|підрахунків|
- •3.7. Типи обчислювальних процесів
- •3.8. Цикли в обчислювальному процесі
- •3.9. Загальна структура прикладної програми
- •3.10. Типи підпрограм
- •Завдання для самостійної роботи
- •Кодування Windows-1251 (синоним cp1251)
- •Двобайтне кодування стандарту unicode – utf-8,utf-16
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. На блок-схемах гілка, що створює цикл, змальовується лінією із стрілкою.
Циклічне виконання одних і тих же операцій (ітерація) – характерна ознака автоматів, як механічних, так і електронних (комп'ютерів). У програмуванні цикли використовуються в ітеративних алгоритмах чисельного аналізу, а також при обробці масивів даних. Приклади масивів даних:
Табель обліку|урахування| відпрацьованого|відробляти| часу, що складається з рядків-записів з|із| табельним номером працівника і кількістю відпрацьованих|відробляти| годин; табель використовується при нарахуванні місячної зарплати працівникам з|із| погодинною оплатою праці.
Одновимірний|одномірний| масив числових даних (вектор), двовимірний масив числових даних (матриця); вектори і матриці широко використовуються в інженерно-технічних і наукових розрахунках.
У циклі за допомогою одного і того ж програмного блоку відбувається послідовна обробка елементів масиву. Як індекс (номер) елементу масиву найчастіше використовується так звана змінна циклу, що модифікується при кожному повторенні циклу.
Найбільш поширена помилка починаючих програмістів – вихід значення змінної циклу за допустимий діапазон зміни індексу масиву. При цьому непередбаченим чином спотворюються дані сусідніх масивів. Виникає найнеприємніша з помилок програмістів – назвемо її ‘мерехтливою помилкою’, коли при одному поєднанні вхідних даних програма дає правильний результат (наприклад, число працівників цеху менше максимально передбаченого), а при іншому – неправильний (на роботу прийняли ще декілька працівників, що перевершило ліміт масиву).
У сучасних трансляторах передбачена можливість включення автоматичного (без участі програміста) контролю індексу масиву на діапазон допустимих змін. Природно, ця опція (додаткова можливість) з прихованим від програміста програмним кодом вимагає від комп'ютера додаткових обчислювальних витрат, але вони, як показує практика, не настільки великі. Тому настійно рекомендуємо користуватися цією опцією у всіх випадках, виключаючи, можливо, програми з надвеликим об'ємом обчислень, наприклад, при програмуванні вирішення тривимірних завдань матфізики або візуалізації рухомих тривимірних зображень.
Цикл може бути утворений чотирма способами:
Цикл з|із| умовним переходом на мітку
Рахунковий цикл
Цикл з|із| передумовою
Цикл з|із| постумовою.
Цикл з умовним переходом на мітку утворюється в результаті виконання умовного оператора, що перевіряє деяку умову (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).
При роботі з матрицями виникає два (при складанні матриць) або три (при множенні матриць) вкладених один в одного рахункових циклів: у блоці операторів головного циклу зустрічається оператор рахункового циклу другого порядку, а в його блоці – оператор рахункового циклу третього порядку. Детальніше це питання розглянемо в подальших розділах.
У тих випадках, коли заздалегідь невідоме число циклів повторення, використовуються два інших сучасних ‘безміткових|’ типів циклу.
Цикл з передумовою спочатку перевіряє умову чергового виконання блоку операторів циклу, і при невиконанні умови передає управління першому операторові за циклом.
Цикл з постумовою спочатку виконує блок операторів циклу, а в кінці циклу перевіряє умови. При порушенні умови виконання циклу управління передається першому операторові за циклом.
Цикл з|із| постумовою завжди виконується як мінімум один раз, а цикл з|із| передумовою може не виконатися жодного разу. Поширеніший цикл з|із| передумовою, де він використовується при читанні рядків-записів з|із| файлу на зовнішньому носієві. Якщо при черговій спробі читання запису з|із| файлу виникає умова-ситуація ‘кінець файлу’, то програма припиняє виконання циклу читання. Файл може мати нульову довжину (є ім'я, але|та| немає даних). В цьому випадку команди циклу не виконуються жодного разу.
Цикл з|із| постумовою застосовується в основному в алгоритмах ітеративних методів чисельного аналізу.