Тема №19: Описание на циклични алгоритми

Тема №19: Описание на циклични алгоритми

1. Циклични алгоритми.
При цикличните алгоритми дадена част от алгоритъма се повтаря многократно. При някои алгоритми предварително е зададен броят на повторенията, а при други зависят от някакво условие.
Групата от повтарящи се действия в цикличните алгоритми се нарича тяло на цикъла.
Всяко изпълнение на тялото на цикъла се нарича итерация.
Кога ще завърши цикълът, се определя от т. нар. условие за край (или когато не е изпълнено условие за продължаване на цикъла).
За да сме сигурни, че цикълът наистина ще завърши е необходимо в тялото на цикъла да се включи действие, което ще предизвика удовлетворяването на условието за край или продължаване (напр. промяна в стойността на променлива, въвеждане на нова стойност на променлива). Това действие се нарича управление на повторенията.
Често пъти преди началото на цикъла са необходими действия с цел подготвяне на правилното му изпълнение (задаване на начални стойности на променливи), които се наричат инициализация на цикъла.
В езикът С++ има три оператора за цикъл - оператор for, оператор while и оператор do/while.
2. Цикли с предусловие и с постусловие.
а) оператор while

Оператора while се използва при цикли с предусловие. При тях след инициализацията най-напред се проверява условие за продължаване на цикъла. Ако то е изпълнено (true), се изпълняват действията в тялото на цикъла. Ако не е изпълнено (false), настъпва край на цикъла и се изпълняват действията след него.
При този вид цикъл е възможно да не се изпълни тялото на цикъла нито веднъж, ако при първата проверка на условието за продължаване на цикъла стойността е false.
Синтаксисът е следният:
while (<условие за продължаване на цикъла>) <оператор>;
Ако стойността на логическото условие е true, се изпълнява операторът, а ако е false, цикълът завършва.
Ако трябва да се изпълнят повече оператори, то те се задават в блок от оператори.
Пример (програма за въвеждане на цели числа и пресмятане на тяхната сума, като въвеждането се преустановява при срещане на първото неположително число):

#include <iostream>
using namespace std;
int main()
{
   int n;
   int s = 0;
   cout << "Namirane sumata na vyvedeni polojitelni celi chisla" << endl;
   cout << "Za krai vyvedete nepolojitelno cialo chislo." << endl;
   cout << "Vyvedete chislo: ";
   cin >> n;
   while (n>0)
   {
     s+=n;
     cout << "Vyvedete chislo: ";
     cin >> n;
   }
   cout << "Sumata na chislata e " << s << endl;
   system ("pause");
   return 0;
}

б) оператор do/while
Оператора do/while се използва при цикли с постусловие. При тях след инициализацията най-напред се изпълняват действията в тялото на цикъла, а след това се проверява условие за продължаване на цикъла. Ако то е изпълнено (true), отново се изпълняват действията в тялото на цикъла. Ако не е изпълнено (false), настъпва край на цикъла и се изпълняват действията след него.
При този вид цикъл задължително тялото на цикъла ще се изпълни поне веднъж.
Синтаксисът е следният:
do
   <оператор>;
while (<условие за продължаване на цикъла>);

Ако стойността на логическото условие е true, се изпълнява операторът, а ако е false, цикълът завършва.
Ако трябва да се изпълнят повече оператори, то те се задават в блок от оператори.
Често пъти този оператор се използва за осигуряване валидност на входни данни. Въвеждането на стойност на променлива се повтаря, докато бъде зададена валидна стойност.
Пример за програма за пресмятане лицето на правоъгълник по въведени дължини на двете му страни, като се прецизира входът (т. е. тук въвеждането на данните ще продължи, ако едното от двете въведени числа е по-малко или равно на 0):

#include <iostream>
using namespace std;
int main()
{
   float a,b,s;
   do
   {
     cout << "a = ";
     cin >> a;
     cout << "b = ";
     cin >> b;
   }
   while ((a<=0)||(b<=0));
   s=a*b;
   cout << "Liceto na pravoygylnika e " << s << endl;
   system ("pause");
   return 0;
}

3. Цикъл с управляваща променлива.
При този цикъл предварително се знае броят на повторенията на цикъла. Тези повторения се отброяват от променлива-брояч, която се инициализира и се записва начинът, по който тя се променя.
Синтаксис:
for (<инициализация на брояча>; <условие за продължаване на цикъла>; <промяна на брояча>)
  <оператор>;

При инициализация или промяна на брояча могат да се поставят няколко оператора за присвояване, разделени със запетая. Ако трябва да се изпълнят повече оператори, то те се задават в блок от оператори.
Пример (програма за пресмятане сумата на първите n естествени числа):

#include <iostream>
using namespace std;
int main()
{
   int n,i,s;
   do
   {
     cout << "Vyvedete broiat na chislata: ";
     cin >> n;
   }
   while (n<=0);
   s=0;
   for (i=1; i<=n; i++)
     s=s+i;
   cout << "Sumata e " << s << endl;
   system ("pause");
   return 0;
}

Операторът break може да се използва за прекъсване на цикъл.

4. Вложени цикли.
Циклите могат да се влагат един в друг, когато в тялото на един цикъл се постави друг. Тогава при всяка итерация на външния цикъл се извърта вътрешния. Могат да се влагат един в друг и цикли, които не са от един и същи вид (напр. в цикъл с предусловие да се вложи цикъл с управляваща променлива).
Примери (програма за извеждане на таблицата за умножение до 5). В първия пример таблиците с всяко число се извеждат вертикално, а във втория – хоризонтално).
Пример 1:

#include <iostream>
using namespace std;
int main()
{
   int i,j,s;
   cout << "TABLICA ZA UMNOZHENIE DO 5" << endl;
   for (i=1; i<=5; i++)
   {
     cout << "Tablica s " << i << endl;
     for (j=1; j<=10; j++)
     cout << i <<" x " << j << " = " << i*j << endl;
   }
   system ("pause");
   return 0;
}

Пример 2:

#include <iostream>
using namespace std;
int main()
{
   int i,j,s;
   cout << "TABLICA ZA UMNOZHENIE DO 5" << endl;
   for (i=1; i<=10; i++)
   {
     for (j=1; j<=5; j++)
     {
       cout <<setw(4)<< j <<" x" <<setw (2)<< i << " =" <<setw(3)<< i*j;
     }
     cout << endl;
   }
   system ("pause");
   return 0;
}