Алгоритми и блок-схеми

АЛГОРИТМИ

Алгоритъмът е съвкупност от разбираеми инструкции, които водят до решението на даден проблем/задача. Алгоритъмът не е задължително термин в програмирането. Пример за алгоритъм извън програмирането е ходенето на работа или училище. За мен този алгоритъм изглежда по следния начин:

1. Излизам от вкъщи в 7:00ч
2. Пътувам с автобус, метро, автобус
3. Пристигам в училище

Всъщност това е доста суров пример - в програмирането тези три стъпки ще трябва да се разбият на повече по-прости команди. Вероятно най-прост алгоритъм в програмирането е алгоритъмът за намиране на по-голямото от две числа. В псевдокод (код на "несъществуващ език за програмиране", който обяснява инструкциите, нужни за решаването на задача - за повече информация) алгоритъмът би изглеждал така:

начало
Нека а и b са целочислени числа
Въведи а и b
Ако a е по-голямо от b:
        изведи а
иначе:
        изведи b
край.


Всъщност този алгоритъм, макар и много прост, в някой ситуации може и да не върне очакваният от нас резултат, но за това по-късно.


БЛОК-СХЕМИ

Съществуват и други начини за представяне на даден алгоритъм. Може би най-нагледният от тях, макар и по-трудоемък за изготвяне, са блок-схемите. Това са схеми от различни блокове, изобразяващи графично инструкциите на нашия алгоритъм, които компютърът може да изпълни. Всички инструкции, които компютърът може да изпълни, се свеждат до следните блокове:



1. БЛОК ЗА НАЧАЛО/КРАЙ
Всеки алгоритъм и всяка програма имат начало и край. Първият блок се използва за обозначаване на начало и край на алгоритъма. Блокът за НАЧАЛО няма вход и има само 1 изход, а блокът за край - има само един вход  и няма изходи.

2. БЛОК ЗА ВХОД/ИЗХОД
Както вече знаем, алгоритъмът е сбор от инструкции. За да получим решението на нашата задача, трябва да имаме входни данни и резултат (изходни данни). Този блок има 1 вход и един изход.

3. БЛОК ЗА ЕЛЕМЕНТАРНИ ОПЕРАЦИИ
Споменахме, също че компютърът изпълнява инструкции (операции), които може да разбере. С този блок изобразяваме самата инструкция, в която извършваме например изчисленията в нашия алгоритъм. 1 вход, 1 изход

4. УСЛОВЕН БЛОК
Условният блок е единственият блок, който ни дава възможност да "разклоним" алгоритъма - с други думи, в зависимост от информацията, която подаваме на входа му, да очакваме различен резултат в края му. Блокът е чисто и просто сравнителна функция или сбор от такива. 1 вход, 2 изхода!!! Единият изход "връща" резултат ДА на сравнителната функция, а другия - НЕ

5. БЛОК ЗА ПОДАЛГОРИТЪМ
При създаване на блок-схеми на по-обемни и сложни алгоритми имаме нужда от "съкращение" на записа. Веднъж създали блок-схема, която решава дадена задача, можем да използваме нейния алгоритъм като един единствен самостоятелен блок. 1 вход, 1 изход

ПРИМЕР:
Нека визуализираме алгоритъма за намиране по-голямото от две числа (препоръчвам ви да опитате сами преди да видите резултата.)



Успя ли сам? БРАВО!
Ако пък сгреши - не се притеснявай, това е само първият опит, има още много време! Сега е време да си обясниш сам с примери алгоритъма и неговата блок-схема. Да, тази може и да е лесна, но има доста по-сложни и разклонени главоблъсканици!

ОБЯСНЕНИЕ:
1) Начало на програмата
2) Въвеждаме а и b
3) Сравняваме а и b
4) Извеждаме a ИЛИ b, в зависимост от стойностите, които сме въвели
4) Край на програмата

ПРИМЕР:
1) Начало
2) въвеждаме а по следния начин: a:=5   Знакът := (двоеточие равно) се чете получава стойност. За начало е по-лесно да прочетем израза а получава стойност 5, за да сме сигурни, че лявата страна получава стойността на дясната! По същия начин въвеждаме b:=3
3) Питаме a>b, еквивалентно на 5>3 - отговорът е ДА
4) Извеждаме а
5) Край на програмата

Нашият алгоритъм работи - БРАВО!

Както казах по-горе обаче има случай, в зависимост от условието на задачата, която трябва да решим, когато този алгоритъм няма да работи. Какво ще стане ако въведем a:=5 и b:=5?

По настоящия алгоритъм условният блок ще даде резултат НЕ и ще изпишем b, чиято стойност е 5. Ами ако целта е не само да изведем число, а да "върнем" резултат самата променлива a или b? По настоящия алгоритъм ще имаме резултат b, което обаче може и да не е по-голямото a => нашият алгоритъм не изпълнява коректно задачата си.

Ето едно възможно решение:
След като сравним a и b, в случай, че a>b върне резултат НЕ правим още една проверка b>a. Ако блокът ни върне резултат ДА - извеждаме b. Ако блокът ни върне резултат НЕ следва, че двете числа са равни и извеждаме (например) "Числата са равни". Можете ли сами да направите съответната блок-схема?


Стана ли ясно? Надявам се, че да! Това е всичко за днес :) В следващият урок ще разменяме стойностите на две променливи, може би ще видим какво са циклите и за какво ги използваме. До тогава затвърди знанията си дотук и се опитай да изпълниш следните задачи:

1) Измисли алгоритъм за намиране на най-голямото от три числа, реализирай неговата блок схема. Можеш ли да разгледаш и специалния случай, когато числата са равни?
2) Направи ли задача 1? Да, значи е време за алгоритъм за намиране на най-голямото от четири числа. Струва ти се трудно или невъзможно? Има и по-лесен начин, за който ще си говорим другия път, но все пак опитай, за да се убедиш защо трябва да използваш този "по-лесен начин".
3) Въведи две числа. Ако те са равни, въведи трето число и изпиши всички числа. Ако не са - изведи първото въведено число.

УСПЕХ!

0 коментара:

Публикуване на коментар