2.   Цикли
Прости цикли - оператор while
while (условие) оператор
* Удвояване на влог
Внасяме 10000 лв. в банкова сметка с 6% год. лихва при месечно олихвяване. След колко години сумата в сметката ще се удвои?
#include <iostream>
using namespace std;
int main()
{  double rate = 6;
   double balance = 10000;
   int month = 0;

   while (balance < 20000)
   {  month++;
      balance = balance * (1 + rate/12/100);
   }
   cout << "The investment doubled after "
      << month / 12.0 << " years.\n";
   return 0;
}
* Факториел
#include <iostream>
using namespace std;
long factorial(int n)
{  int factor = 1;
   long product = 1;

   while (factor <= n)
   {  product = product * factor;
      factor++;     }
   return product;
}

int main()
{  cout << "Please enter a number: ";
   int n;
   cin >> n;
   cout << n << "! = " << factorial(n) << "\n";
   return 0;
}

* Максимална стойност
#include <iostream>
using namespace std;
int main()
{  double next;
   double highest;

   cout << "Please enter the temperature values:\n";
   if (cin >> next)   highest = next;
   else
   {  cout << "No data!\n";
      return 1;    }

   while (cin >> next)
       if (next > highest)   highest = next;

   cout << "The highest temperature is " << highest << "\n";
   return 0;
}

Цикъл for

for (инициализация; условие; корекция) оператор

      for (i=начало; i<=край; i++)
      {
       тяло на цикъла
      }
#include <iostream>
using namespace std;
long factorial(int n)
{  long product = 1;
   int factor;

   for (factor = 1; factor <= n; factor++)
   {  product = product * factor;   }
   return product;
}

int main()
{  cout << "Please enter a number: ";
   int n;
   cin >> n;
   cout << n << "! = " << factorial(n) << "\n";
   return 0;
}

Цикъл do/while

do оператор while (условие);

* Алгоритъм на Херон за намирана на корен квадратен:
 x_0 = a;
 x_(n+1) = (x_n + a/x_n)/2;
 - получаваме безкрайна редица, спираме пресмятанията
когато |x_(n+1) - x_n| < eps

#include <iostream>
#include <cmath>
using namespace std;

bool not_equal(double x, double y)
{  const double EPSILON = 1E-14;
   double dmax = fabs(x);
   if (fabs(y) > dmax) dmax = fabs(y);
   return fabs(x - y) > dmax * EPSILON;
}
double squareroot(double a)
{  if (a == 0) return 0;
   double xnew = a;
   double xold;
   do
   {  xold = xnew;
      xnew = (xold + a / xold) / 2;
   }
   while (not_equal(xnew, xold));
   return xnew;
}

int main()
{  cout << "Please enter a number: ";
   double x;
   cin >> x;
   cout << "The square root is " << squareroot(x) << "\n";
   return 0;
}

Безкрайни цикли

for (i=1; i>0; i++) cout << i;

double squareroot(double a)
{
 if (a == 0) return 0;
 double xnew = a;
 while (true)
 {
  double xold = xnew;
  xnew = (xold + a/xold)/2;
  if (equal(xnew, xold)) return xnew;
 }
}

Конструкции с цикъл: четене на данни и извеждане на таблици
* Четене на данни:
#include <iostream>
#include <string>
using namespace std;
int main()
{  int count = 0;
   string word;
   while (cin >> word)  count++;
   cout << count << " words.\n";
   return 0;
}

* Пренасочване на входния и изходния потоци
C:\my\>myprog < a_cin.txt
C:\my\>myprog > a_cout.txt

* Извеждане на таблици със стойности
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

double future_value(double initial_balance,  double p, int nyear)
/*
ЦЕЛ:       Пресмята стойността на влог със сложна лихва
ПОЛУЧАВА:  initial_balance - начална стойност на влога
           p - годишен лихвен процент
           nyear - броя на годините
ЗАБЕЛЕЖКИ: Лихвата се начислява всеки месец
*/
{  double b = initial_balance*pow(1 + p/12/100, 12*nyear);
   return b;
}
int main()
{ cout << "      Rate   Balance\n\n";
  double rate;
  double initial_amount = 10000;
  int nyear = 10;

  cout << fixed << setprecision(2);
  for (rate = 5; rate <= 10; rate = rate + 0.5)
  { double balance = future_value(initial_amount, rate, nyear);
    cout << setw(10) << rate << setw(10) << balance << "\n";     }
   return 0;
}

 Rate   Balance

 5.00  16470.09
 5.50  17310.76
 6.00  18193.97
 6.50  19121.84
 7.00  20096.61
 7.50  21120.65
 8.00  22196.40
 8.50  23326.47
 9.00  24513.57
 9.50  25760.55
10.00  27070.41