4.5.4. Вложени оператори за цикъл

Тялото на кой де е от операторите за цикъл е произволен оператор. Възможно е да е оператор за цикъл или блок, съдържащ оператор за цикъл. В тези случаи се говори за вложени оператори за цикъл.
Пример: Програмният фрагмент
for (int i = 1; i <= 3; i++)
for (int j = 1; j <= 5; j++)
cout << “(“ << i << “, “ << j << “)\n”;
съдържа вложен оператор for и се изпълнява по следния начин: Променливата i получава последователно целите стойности 1, 2 и 3. За всяка от тези стойности, променливата j получава стойностите 1, 2, 3, 4 и 5 и за тях се изпълнява операторът
cout << “(“ << i << “, “ << j << “)\n”;
В резултат се конструират и извеждат на отделни редове всички двойки от вида (i, j), където i = 1, 2, 3 и j = 1, 2, 3, 4, 5.

При влагането на цикли, а също при използването на блокове, възникват проблеми, свързани с видимостта на дефинираните променливи.

Област на променлива

Общото правило за дефиниране на променлива е, дефиницията й да е възможно най-близко до мястото където променливата ще се използва най-напред.
Областта на една променлива започва от нейната дефиниция и продължава до края на блока, в който променливата е дефинирана. На Фиг. 12 за променливите a, b и c са определени областите им.

int main()
{…
double a;

for ( … )
{…
double b; област на a

for ( … ) област на b
{ …
int c;
… област на c
}
}
return 0;
}

Фиг. 12

Променлива, дефинирана в някакъв блок, се нарича локална променлива за блока.
Променлива, дефинирана извън даден блок, но така, че областта й включва блока, се нарича нелокална променлива за този блок.
Всяка променлива е видима – може да се използва в областта си. Така b и c не могат да се използват навсякъде в тялото на main, а само с означените области.

Възниква въпросът: Може ли променливи с еднакви имена да бъдат дефинирани в различни блокове на програма?
Ако областите на променливите не се припокриват, очевидно няма проблем. Ако обаче те са вложени една в друга, пак е възможно, но е реализирано следното правило: локалната променлива “скрива” нелокалната в областта си.
Пример:
int main()
{…
double i;

for ( … )
{… област на
int i; double i
… област на int i;
}

}
Според правилото, в тялото на оператора for е видима цялата променлива i (локална за тялото), а не нелокалната double i.
Ако това води до конфликт с желанията ви, преименувайте например локалната за тялото на for променлива int i.

Задачи върху вложени оператори за цикъл

Задача 42. Да се напише програма, която намира всички решения на деофантовото уравнение a1.x1 + a2.x2 + a3.x3 + a4.x4 = a, където a1, a2, a3, a4 и a са дадени цели числа, а неизвестните x1, x2, x3 и x4 приемат стойности от интервала [p, q] / p и q са дадени цели числа, p<q /.

Програма Zad42.cpp решава задачата.
Program Zad42.cpp
#include <iostream.h>
#include <iomanip.h>
int main()
{cout << "a1= ";
int a1;
cin >> a1;
if (!cin)
{cout << "Error, Bad Input!\n";
return 1;
}
cout << "a2= ";
int a2;
cin >> a2;
if (!cin)
{cout << "Error, Bad Input!\n";
return 1;
}
cout << "a3= ";
int a3;
cin >> a3;
if (!cin)
{cout << "Error, Bad Input! \n";
return 1;
}
cout << "a4= ";
int a4;
cin >> a4;
if (!cin)
{cout << "Error, Bad Input!\n";
return 1;
}
cout << "a= ";
int a;
cin >> a;
if (!cin)
{cout << "Error, Bad Input!\n";
return 1;
}
cout << "p= ";
int p;
cin >> p;
if (!cin)
{cout << "Error, Bad Input!\n";
return 1;
}
cout << "q= ";
int q;
cin >> q;
if (!cin)
{cout << "Error, Bad Input!\n";
return 1;
}
if (p>=q)
{cout << "Error!\n";
return 1;
}
for (int x1 = p; x1<= q; x1++)
for (int x2 = p; x2 <= q; x2++)
for (int x3 = p; x3 <= q; x3++)
for (int x4 = p; x4 <= q; x4++)
if (a1*x1 + a2*x2 + a3*x3 + a4*x4 == a)
cout << setw(5) << x1 << setw(5) << x2
<< setw(5) << x3 << setw(5) << x4 << "\n";
return 0;
}

Задача 43. Да се напише програма, която проверява дали съществува решение на деофантовото уравнение a1.x1 + a2.x2 + a3.x3 + a4.x4 = a в интервала [p, q], където a1, a2, a3, a4, a, p и q са дадени цели числа, p<q.

Програма Zad43.cpp решава задачата. Ще пропуснем дефинициите на променливите a1, a2, a3, a4, a, p и q. Те са аналогични на тези от задача 42. Условието p < q прави подходящ оператора do/while.
Program Zad43.cpp
#include <iostream.h>
int main()
{…
if (p>=q)
{cout << "Error!!\n";
return 1;
}
int x1 = p;
bool b;
do
{int x2 = p;
do
{int x3 = p;
do
{int x4 = p;
do
{b = a1*x1 + a2*x2 + a3*x3 + a4*x4 == a;
x4++;
} while (!b && x4 <= q);
x3++;
} while (!b && x3 <= q);
x2++;
} while (!b && x2 <= q);
x1++;
} while (!b && x1 <= q);
if (b) cout << "yes\n";
else cout << "no\n";
return 0;
}


Задачи

Задача 1. Да се напише програма, която по дадено реално число x намира стойността на y:
а) y = ( ...((( x + 2) x + 3) x + 4) x +... + 10) x + 11
б) y= ( ...(((11x + 10)x + 9)x + x + ... + 2)x +1.
Задача 2. Да се напише програма, която намира сумата от кубовете на всички цели числа, намиращи се в интервала (x + lnx, x2 + 2x + ex), където x > 1.
Задача 3. Дадено е естественото число n (n ≥ 1). Да се напише програма, която намира броя на тези елементи от серията числа i3 - 7.i.n + n3 , i = 1, 2, ..., n, които са кратни на 3 или на 7.
Задача 4. Да се напише програма, която по дадено реално число x, намира стойността на сумата
а) y = sinx + sinx2 + sinx3 + ... + sinxn;
б) y = sinx + sin2x + sin3x + ... + sinnx;
в) y = sinx + sinsinx + sinsinsinx + ... + sinsin ...sinx

n пъти

Задача 5. Да се напише програма, която намира

Задача 6. Да се напише програма, която по дадено естествено число n ( n >= 1 ) намира стойността на f:
а) f = (2n)!! = 2.4.6. ... .2n;
б) f = (2n-1)!! = 1.3.5. ... .(2n-1);
в) f = n!!.


Задача 7. Дадено е естественото число n (n ≥ 1). Да се напише програма, която пресмята сумата:



(Да не се използват функциите exp и lоg).
Задача 8. Да се напише програма, която извежда в нарастващ ред всички трицифрени естествени числа, които не съдържат еднакви цифри (/ и % да не се използват).
Задача 9. Да се напише програма, която намира и извежда броя на точките с цели координати, попадащи в кръга с радиус R (R > 0) и център - координатното начало.
Задача 10. Да се напише програма, която извежда таблицата на истинност за булевата функция f = (a and b) or not (b or c) в следния вид
a b c f
------------------------------------
true true true true
true true false true
. . .
false false false true

Задача 11. Да се напише програма, която извежда върху екрана следната таблица:
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6
1 2 3 4 5 6 7

Задача 12. Дадено е естествено число n (n ≥ 1). Да се напише програма, която намира и извежда първите n елемента от серията числа

(Да не се използват функциите exp и log).
Задача 13. Едно естествено число е съвършено, ако е равно на сумата от своите делители (без самото число). Например, 6 е съвършено, защото 6 = 1+2+3. Да се напише програма, която намира всички съвършени числа ненадминаващи дадено естествено число n.
Задача 14. Да се напише програма, която намира всички трицифрени числа от интервала [m, n], на които като се задраска цифрата на десетиците, намаляват цяло число пъти (m и n са дадени естествени числа, m < n).
Задача 15. Да се напише програма, която намира всички четирицифрени числа от интервала [m, n], на които като се задраска цифрата на стотиците, се делят на 11 (m и n са дадени естествени числа, m < n).
Задача 16. Да се напише програма, която намира всички четирицифрени числа от интервала [m, n], в записа на които участва цифрата 5 (m и n са дадени естествени числа, m < n).
Задача 17. Да се напише програма, която намира всички четирицифрени числа от интервала [m, n], цифрите на които образуват намаляваща редица (m и n са дадени естествени числа, m < n).
Задача 18. Да се напише програма, която намира всички петцифрени числа от интервала [m, n], цифрите на които са различни (m и n са дадени естествени числа, m < n).
Задача 19. Дадено е естествено число n (n > 1). Да се напише програма, която намира всички прости числа от интервала [2, n].
Задача 20. Да се напише програма, която намира всички прости делители на дадено естествено число n.

Задача 21. Да се напише програма, която по дадени реални числа x, a и e,e>0, приближено пресмята сумата.

Събирането да продължи докато бъде добавено събираемо, абсолютната стойност на което е по-малка от e (e > 0 е дадено реално достатъчно малко число).
Задача 22. Да се напише програма, която намира броя на цифрите в десетичния запис на дадено естествено число.
Задача 23. Да се напише програма, която проверява дали дадено естествено число е щастливо, т.е. едно и също е при четене отляво надясно и отдясно наляво.
Задача 24. Да се напише програма, която проверява дали сумата от цифрите на дадено естествено число е кратна на 3.
Задача 25. Да се напише програма, която намира всички естествени числа, ненадминаващи дадено естествено число n, които при преместване на първата им цифра най-отзад, се увеличават k пъти (k е дадено естествено число, k > 1).
Задача 26. Да се напише програма, която намира всички естествени числа от интервала [m, n], на които като се задраска k – тата цифра (отляво надясно), намаляват цяло число пъти (m, n и k са дадени естествени числа, m < n).
Задача 27. Да се напише програма, която намира всички естествени числа от интервала [m, n], на които като се задраска k – тата цифра (надясно наляво), намаляват цяло число пъти (m, n и k са дадени естествени числа, m < n).
Задача 28. За дадено естествено число да се провери дали цифрите му, гледани отляво надясно, образуват монотонно растяща редица.
Задача 29. За дадено естествено число да се провери дали цифрите му са различни.
Задача 30. Да се намерят всички прости делители на дадено естествено число.
Задача 31. Числата на Фибоначи се дефинират по следния начин:



Да се напише програма, която намира сумата на числата на Фибоначи от интервала [a, b] (a и b са дадени естествени числа).
Задача 32. За естествените числа n и m операцията ++ се определя по следния начин: n oo m = n + m + n%m. Да се напише програма, която намира всички двойки (n, m) от естествени числа, за които е в сила
n oo m = m oo n (m и n са естествени числа от интервала [a, b]).
Задача 33. За естествените числа n и m операцията ++ се определя по следния начин: n oo m = n + m + n%m. Да се напише програма, която проверява дали съществува двойкА (n, m) от естествени числа, за която е в сила релацията n oo m = m oo n (m и n са естествени числа от интервала [a, b]).


Допълнителна литература

К. Хорстман, Принципи на програмирането със C++, С., СОФТЕХ, 2000.
Ст. Липман, Езикът C++ в примери, “КОЛХИДА ТРЕЙД” КООП, С. 1993.
B. Stroustrup, C++ Programming Language. Third Edition,Addison – Wesley, 1997.