Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.О.П / ооп / 4_кол / К курсовой / Методи побудови алгоритмів та їх аналіз / Інформатика_1 (методи побудови алгоритмівта та їх аналіз).doc
Скачиваний:
87
Добавлен:
30.05.2020
Размер:
2.5 Mб
Скачать

Допоміжні задачі

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

Спосіб створення алгоритму з широким використанням до-поміжних алгоритмів називається структурным підходом до побудови алгоритмів.

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

Якщо поставлена перед вами задача є серйозним великим завданням, то важливість поділу алгоритму на окремі модулі

21

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

Нині можна вже говорити про сформовану індустрію виго-товлення програм. 3 цією метою створюються різноманітні технологи програмування, які увібрали в себе ідеї структурно!' побудови алгоритмів, що базуються на модульному підході до їх створення. При такій побудові алгоритм складається з ок-ремих модулів, що виконують унікальні у даному алгоритмі функції з обробки даних. Зібрані в одну схему модулі із зазначенням усіх переходів між ними й утворюють загальний вигляд алгоритму. Яким чином може йти робота над розробкою алгоритму, що використовує технологію структурного програ­мування? Існують два варіанти: або спочатку розробити каркас алгоритму без деталізації окремих його фрагментів, або надати перевагу розробці окремих модулів, з яких поступово буде фор-муватися основний алгоритм.

Ознайомимося з цими варіантами детальніше.

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

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

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

22

У випадку роботи над алгоритмом цілої групп програмістів найчастіше використовується принцип висхідного програму-вання. Керівник групи розробляє загальну схему алгоритму з визначенням усіх необхідних модулів та обумовленням струк-тури вхідних і вихідних даних для кожного з них. Останній фактор є дуже важливим для наступного стикування модулів у єдине ціле. Розробка модулів доручається окремим членам творчої групи і на кінцевому етапі роботи над алгоритмом усі модулі «збираються» згідно з наперед розробленою схемою.

Реалізація алгоритму мовою програмування

Вибір мови програмування залежить як від уподобань кож­ного, так і від вимог самої задачі. Оскільки алгоритми, які бу-демо розглядати, не вимагають використання можливостей комп'ютера на низькому машинному рівні, тому зупинимо свій вибір на мові програмування Pascal. Хоча слід зазначити, що всі алгоритми, які розглядатимуться далі, можна реалізувати і будь-якою іншою мовою програмування.

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

Для прикладу задачі з пошуком заданого елемента в послі-довності з N елементів вхідними даними повинні бути:

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

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

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

  • послідовність, у якій шуканий елемент відсутній.

Для прикладу задачі з сортуванням за зростанням послідов-ності з N елементів вхідними даними повинні бути:

  • зростаюча послідовність;

  • спадна послідовність;

  • послідовність, у якій елементи розташовані випадковим чином;

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

ЯЗ

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

При тестуванні програм бажано враховувати і перевірку ча-сової складності розробленого алгоритму. Тому ці тести треба виконати для різних значень N. Наприклад, для N = 10, 100, 1000,10 000. Знаючи оцінку ефективності роботи розробленого алгоритму, молена таким чином підтвердити чи спростувати його правильність.

Для фіксації часу роботи програм, що реалізують на ком-п'ютері розроблений алгоритм, можна застосувати таку змінну:

var timer: longint absolute $40: S6c;

Призначенням змінної timer є звернення за адресою $40: $6с. Саме там розміщена чотирибайтова ціла змінна, до

якої раз за с апаратно додається 1. Якщо ми опишемо в

18,2

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

Шд час тестування програм варто фіксувати «чистий» час їх роботи, тобто не враховувати введения вхідної інформації та виведення результату. Тому рекомендується на початку тієї частини програми, яка безпосередньо реалізує сам алгоритм, зафіксувати значения, яке міститься за адресою $40: $6с, а те­ля ЇЇ завершения визначити реальний час виконання програми, знову звернувшись по інформацію за тією самою адресою:

timeold := timer;

<програма>

writeln ((timer - timeold)/18.2);

Для складних і громіздких алгоритмів може застосовува-тися методика використання «заглушок». Тобто замість пере-вірки виконання окремих частин алгоритму тимчасово вико-ристовуються значения, які мають бути отримані в результаті їх виконання. Пізніше, після аналізу основних частин алго­ритму, можна повернутися до пропущених фрагментів і переві-рити їх коректність.

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

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

0 < а[і] < 65 535, то можна зробити висновок, що елементи масиву треба описати типом word.

По-друге, якщо для значень змінної і даються обмеження

1 < N < 100, то можна передбачити, що не виключено застосу-

вання прямих методів, які не дуже оптимізують обробку еле-ментів цього масиву. Якщо ж 1 < N < 32 000, то це підказує, що при використанні середовища програмування з обмеженою пам'яттю, тобто 64 Кб, ми не зможемо розмістити додатковий масив. Тому треба розробляти алгоритм з використанням лише одного заданого масиву значень. Якщо ж 1 < N < 1 000 000, то такий масив елементів неможливо одночасно розмістити у па-м'яті комп'ютера, тому доцільно розробляти алгоритм, який обробляє його елементи покроково під час введения.

По-трете, треба дуже уважно описувати результуючі змінні. Інколи результат обчислення може бути дуже великим числом. Треба оцінити можливе його максимально значения і описати відповідним типом, інакше можна втратити правильне значен­ия результуючої величини. Як це може статися, детальніше розглянемо в розділі II. Тому уважна опднка результату вико-нання алгоритму може підказати, яким типом треба ЇЇ описати: word, longint. А можливо, навіть цей результат виходить за ме-жі стандартних типів і для збереження його значения треба застосовувати спеціальні алгоритми. Прикладом можуть бути задачі на обчислення JV! та aN, де N набуває великих значень.

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

/ Запитання для самоконтролю

  1. Що розуміють під плануванням роботи над алгоритмом?

  2. Який процес називається покроковою деталізацією алгоритму? У чому він полягає? Наведіть власний приклад покрокової дета-лізації алгоритму.

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

  4. Який спосіб розробки алгоритму називають структурним пло­дом до його побудови?

  5. Яку роль у структурному підході до побудови алгоритму ВІДІ-грають допоміжні алгоритми?

  6. Яке програмування носить назву низхідного?

І7. Яке програмування носить назву висхідного? 8. Яку роль у доведены розробленого алгоритму до остаточного варіанта відіграє тестування? Наведіть власний приклад алго­ритму та його тестування. 9. Яким чином можна фіксувати час виконання Pascal-програми? 10. У чому полягає методика використання «заглушок» у програмі?

25

СИСТЕМИ ЧИСЛЕННЯ. ПРЕДСТАВЛЕНИЯ ІНФОРМАЦІЇ У КОМП'ЮТЕРІ

а о

  1. оо

  2. о

У вас, мабуть, виникло запитання: чим можна пояснити зв'язок між комп'ютерами та системами числения? А справа ось у чому. Ми з вами звикли у своему повсякденному житті користуватися числами, що задаються за допомогою десяти цифр - від 0 до 9. Але виявляеться, що комп'ютер безпосе-редньо такі числа сприйняти не може. Справа в тому, що стан електронних елементів будь-яких комп'ютерів залежить від того, проходить чи ні в даний момент через них електричний струм. Ці два стани можна позначити цифрами 0 та 1. Тобто вся інформація, яку обробляє комп'ютер, повинна бути закодована тільки цифрами 0 та 1. Це означав, що комп'ютер оперуе не числами, записаними за допомогою цифр від 0 до 9, а їхніми аналогами, представленими за допомогою цифр 0 та 1. Для то­го щоб представити результат обчислення у зручній для корис-тувача формі, відбувається зворотний процес.

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

Соседние файлы в папке Методи побудови алгоритмів та їх аналіз