АЛГОРИТМИ И БС (Задачи)

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

Най-разпространени са два алгоритъма. В единия разменяме променливите, използвайки свойствата за събиране и изваждане в математиката. Ето как изглежда псевдокодът на този алгоритъм:

начало
нека а и b са целочислени числа
въведи а и b
a:=a+b {а получава стойност а+b}
b:=a-b {b получава стойност а-b}
край.

Можеш ли вече да направиш сам блок-схемата?


Всъщност третият блок (блокът за елементарни операции) е "обединение" на два такива блока с по една операция във всеки. На практика обаче е важна последователността на операциите и самите операции.

Време е да тестваме алгоритъма си :)

Въвеждаме a:=5 и b:=3
a:=a+b   a:=5+3 => а=8 (а има стойност 8)
b:=a-b   b:=8-3 => b=5
a:=a-b  a:=8-5 => a=3


В крайна сметка въведохме a:=5 и b:=3, а алгоритъмът извърши размяната, така че на края имаме a=3 и b=5. 

Другият, може би по-масово използван алгоритъм поради по-лесната си логика, е алгоритъмът за размяна на две променливи чрез допълнителна променлива (помощна).

Псевдокод:

начало
нека a, b и с са целочислени числа
въведи a и b
c:=a
a:=b
b:=a
край.

Ето я и съответната блок-схема:


Ще използваме същия пример и за този алгоритъм:

Въвеждаме a:=5 и b:=3
Въвеждаме a:=5 и b:=3
a:=a   c:=5 => c=5
a:=b   a:=3 => a=3
b:=c  a:=5 => b=5

Резултат: a=3 и b=5
Кой от двата метода ще използваш - зависи от теб!

ЦИКЛИ

Нека се върнем на една от задачите от последния урок - ако си направил блок-схемата за намиране на най-голямото от четири числа, си се убедил колко сложно изглежда. А какво ще стане с 5,6 или 7 числа? Как изобщо ще реализираме задача с n числа?

Отговорът се крие в използването на цикли. Цикълът е част от програма (алгоритъм), която трябва да се повтори определен брой пъти, за да се реши задачата. Цикълът се състои от тяло и условие. Тялото е съвкупността от операции, която трябва да се изпълни за една итерация. Условието се състои от условен блок, чийто резултат определя дали тялото трябва да се изпълни още един път или не. В зависимост от условието, циклите се делят на два вида:

-с предусловие - условието се намира преди тялото. Това означава, че първо се проверява условието и после тялото МОЖЕ да се изпълни. Характерна черта на този вид цикли е, че тялото може и да НЕ се изпълни нито веднъж! 
-с постусловие - условието се намира след тялото. Това означава, че тялото на цикъла винаги ще се изпълни поне веднъж, преди да се провери условието му.

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

-Предусловие:

ВАЖНО: Блоковете за инструкция и въвеждане/извеждане НЕ са задължителни! Това означава, че може да се използват двата заедно, само един от тях или никой (последното е малко безсмислено), както и комбинации - например въвеждане, две инструкции, извеждане . Също така е важно да се забележи, че за езикът С, който ще учим, цикълът с предусловие се изпълнява при резултат от условието ДА! В моментът, в който условието е с резултат НЕ програмата "излиза" от цикъла и той спира да се изпълнява.

-Постусловие

Както при другия вид условие, така и тук, тялото се изпълнява ДОКАТО условието е вярно. Единствената особеност е, както вече казах и вероятно тук е по-нагледно, че при постусловие, тялото се изпълнява поне веднъж!

А сега малко примери и задачи:

Нека развием алгоритъма за намиране на най-голямото от n числа чрез псевдокод:

начало
нека n,a и max и i са целочислени числа
въведи n
max:=0
i:=0 
докато i<n
      въведи а
      ако a>max
            max:=a
      i:=i+1
край.

Блок-схема:



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

Стана малко по-сложно, нали? Ами.. вземи един лист и си "разиграй" няколко примера :) 

Намери ли случай, в който нашият алгоритъм няма да работи? Замисли се какво ще стане ако въвеждаме само отрицателни стойности. От началото, нашата променлива max е със стойност нула, така че връщайки нейния резултат накрая ще получим нула, докато най-голямото въведено число може и да е отрицателно. Как ще се реши този проблем? Един от начините е да прочетем първото число преди тялото на цикъла и да присвоим стойността му на max. Внимавай с брояча, тъй като числата трябва да са n на брой, а не n+1!

ЗАДАЧИ:

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

Успех!

ПП: Ако имаш затруднение - не се стеснявай да оставиш коментар или да ми изпратиш email!

0 коментара:

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