{Повторения (Цикли)}

Какво е цикъл (loop) в програмирането

Циклите предлагат бърз и лесен начин да изпълним даден код многократно. При различните видове цикли, програмният код се повтаря докато е в сила определено предварително зададено условие или фиксиран брой пъти, които са упоменати в началото. Цикъл, който никога не завършва, се нарича безкраен цикъл (infinite loop). 

Всеки цикличен процес е съставен от следните елементи:

  1. Инициализация – задава се началната стойност на параметъра на цикъла (управляваща променлива).
  2. Тяло на цикъла – това е кода, който ще се изпълни определен брой пъти.
  3. Актуализация – обновява се стойността на параметъра на цикъла (управляващата променлива).
  4. Прекъсващо условие – логически израз, в зависимост от чиято стойност цикълът ще спре или продължи действието си.

Конструкция for

При този тип цикъл, тялото на цикъла се повтаря докато определено условие е вярно. В момента, в който условието се оцени като НЕВЯРНО, цикълът прекратява действието си.

Синтаксис:

for ([initialExpression]; [condition]; [incrementExpression])
statement

Семантика:
1. Изпълнява се инициализиращия израз (initialExpression), ако има такъв. Този израз инициализира една или повече управляващи променливи на цикъла (наричат се още броячи). В този израз се допуска деклариране на променливи.

2. Оценява се изразът на условието (condition). Ако неговата стойност е true, операторите (statement) се изпълняват. Ако има стойност false, прекратява се изпълнението на цикъла. Ако условието бъде пропуснато, то се приема за ВЯРНО.

3. Изпълнява се initialExpression (ако е наличен). Актуализира се стойността на брояча (броячите) и управлението се предава на стъпка 2.

Ако тялото на цикъла е съставено от повече от един оператор, то трябва да ги групираме като блок посредством { }.

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

Решение:

for (let i = 1; i<21; i++)
  console.log(i);

Задача 2. Да се напише програма, която отпечатва всички нечетни числа от 1 до 17.

Решение:

for (let i = 1; i<18; i++){
   if(i%2 != 0) console.log(i);
}

Задача 3. Да се напише програма, която отпечатва всички числа завършващи на 3 в интервала [a, b]. a и b са цели числа, по-големи от нула и a<b.

Решение:

let a, b;
do{
  a = Math.trunc(prompt('Enter value for a: '));
  b = Math.trunc(prompt('Enter value for b: '));
}while(a>=b || a<1 || b<1 )
console.log('a = ' + a + '; b = ' + b);
for (let i = a; i<=b; i++){
  if(i%10 == 3) console.log(i);
}

Задача 4. Да се напише програма, която отпечатва малките букви от латинската азбука: a, b, c, …, z.
Може да решим задачата като съставим forцикъл, който преминава последователно през кодовете на всички букви от латинската азбука, като съобразим, че кодът (поредният номер в Unicode номерацията на буквите и символите) на ‘a’ е 97, кодът на ‘b’ е 98 и т.н., а кодът на ‘z’ е 122. Преминаването от номер на буква към самата буква става с функцията String.fromCharCode(x)

Решение:

for(let i = 97; i<=122; i++)
  console.log(String.fromCharCode(i));

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

Решение:

let sum = 0;
for(let i = 1; i<=10; i++){
  sum = sum + i;
}
console.log(sum);

Задача 6. Да се напише програма, която отпечатва произведението на числата от 1 до 10.

Решение:

let product = 1;
for(let i = 1; i<=10; i++){
  product = product * i;
}
console.log(product);

Задача 7. Да се напише програма, която въвежда n цели числа и ги сумира.

Задача 8. Да се напише програма, която въвежда n числа и намира най-голямото от тях.
Указания:
1. Въвеждаме броя числа – n
2. Приемаме, че най-голямото число ще бъде
max = Number.NEGATIVE_INFINITY
(свойството NEGATIVE_INFINITY представлява минус безкрайност. Използва се само във формата посочен по-горе.)
3. Създаваме цикъл от 1 до n, в който последователно въвеждаме n на брой числа.
4. При всяко въвеждане, сравняваме въведеното число с max. Ако е по-голямо, max приема стойността на това число.
5. Отпечатваме max.

Задача 9. Да се напише програма, която въвежда n числа и намира най-малкото от тях.
Указания:
Задачата е аналогична на предходната, но при нея трябва да предположим, че най-малкото число e
min = Number.POSITIVE_INFINITY

Конструкция do … while

Синтаксис:

do
statement;
while(condition);

Цикъл с постусловие. При тази конструкция, тялото на цикъла (staement) задължително се изпълнява поне веднъж. В случай, че условието (condition) има стойност true, тялото се изпълнява отново. Ако условието има стойност false, цикъла прекратява своето действие. В случай, че тялото на цикъла е съставено от повече от един оператор, следва да използваме блок { }.

Задача 10. Да се напише програма, която пресмята сумата на числата от 1 до 10. Да се използва конструкция do … while.

Решение:

let sum = 0;
let i = 1;
do{
  sum += i;
  i++;
}while(i<=10);
console.log(sum);

Конструкция while

Синтаксис:

while (condition)
statement;

Цикъл с предусловие. При тази конструкция, тялото на цикъла може да не се изпълни нито веднъж. Първо се проверява условието. В случай, че то има стойност true, изпълнява се тялото на цикъла. В противен случай, изпълнението на програмата се предава на операторите след цикъла. Т.е. се прекратява неговото изпълнение. В случай, че тялото на цикъла е съставено от повече от един оператор, следва да използваме блок { }.

Задача 11. Да се напише програма, която пресмята сумата на числата от 1 до 10. Да се използва конструкция while.

Решение:

let sum = 0;
let i = 1;
while(i<=10){
  sum += i;
  i++;
}
console.log(sum);

Прекъсване (break)

Посредством break; можем да прекъснем изпълнението на switch или на която и да е от цикличните конструкции. break осигурява изход от switch блок, а при цикъл, изход от цикъла (независимо от състоянието на условието му за край) и предаване управлението на оператора след него (ако има такъв).
Идея за използване на break:

for(....){
  [statement1;]
  ...
  if(condition) break;
  ...
  [statement n;]
}

Задача 12: Да се напише програма, която намира най-близката сума на числата от 1 до 10000, която е по-голяма или равна на n (100<n<5000).

Програмата да изведе съобщение от вида:

Най-близката, по-голяма или равна на ___ сума, е сумата на числата от 1 до ___ и e равна на ___