Наредба бројачког циклуса¶
Наредба циклуса for
користи се за петље са коначним, унапред одређеним бројем
понављања. Свако понављање, односно свако извршавање петље назива се
итерација. Наредба циклуса for
има следећи општи облик:
for(izraz1; izraz2; izraz3)
naredba
izraz1
извршава се само једном и то по уласку у петљу. Користи се за
иницијализацију или доделу почених вредности. Ако их има више, почетне
вредности се међусобно одвајају оператором ,
. izraz2
представља управљачки
израз тј. услов изласка из петље, а његова тачност проверава се у свакој
итерацији петље. izraz3
извршава се у свакој итерацији петље и служи за
ажурирање вредности бројача. Вредност бројача утиче на тачност управљачког
израза, а операција ажурирања бројача најчешће је инкрементација. naredba
представља тело петље које чини или једна наредба или блок наредби сачињен
од појединачних наредби записаних између витичастих заграда.
По уласку у for
петљу извршава се додела почетних вредности, након чега се
проверава тачност управљачког израза. Ако је управљачки израз тачан (различит
од нуле), извршава се тело петље. Након тога врши се ажурирање вредности
бројача, па се ток програма враћа на проверу тачности управљачког израза.
Описани процес се понавља све док је управљачки израз тачан (различит од нуле).
Када управљачки израз постане нетачан (једнак нули), излази се из петље.
Напиши програм у програмском језику C који на стандардни излаз исписује цифре од 0 до 9.
Алгоритам за решавање овог задатка представљен дијаграмом тока изгледао би овако:
Програм у програмском језику C изгледао би овако:
#include <stdio.h>
int main(void)
{
for (int i = 0; i < 10; i++)
printf("%d ", i);
return 0;
}
На стандардном излазу исписаће се:
0 1 2 3 4 5 6 7 8 9
Уласком у петљу иницијализована је бројачка променљива i = 0
. Затим се
проверава 0 < 10
и извршава се тело петље - на стандардном излазу исписује се
тренутна вредност променљиве i
која износи 0
. Потом се ажурира вредност
бројача изразом i++
, чиме се i
ажурира на 1
. Ток програма се враћа на
проверу тачности израза 1 < 10
. Пошто је и тај израз тачан, на стандардном
излазу исписује се 1
. Вредност променљиве i
ажурира се на 2
и тако
редом. Поступак се понавља све док је израз i < 10
тачан.
Након извршавања петље променљива i
има вредност 10
, али је та вредност у
овом случају неупотребљива ван петље јер је променљива i
декларисана у оквиру
петље - каже се да је област видљивости променљиве i
само у оквиру петље. То
значи да се следећи програм не би компајлирао…
#include <stdio.h>
int main(void)
{
for (int i = 0; i < 10; i++)
printf("%d ", i);
printf("%d", i);
return 0;
}
…јер је променљива i
у седмој линији недефинисана. Ако је неопходно да
област видљивости променљиве буде и ван петље, онда се она мора
декларисати пре уласка у петљу, на пример, овако:
#include <stdio.h>
int main(void)
{
int i;
for (i = 0; i < 10; i++)
printf("%d ", i);
printf("%d", i);
return 0;
}
На стандардном излазу исписаће се:
0 1 2 3 4 5 6 7 8 9 10
Сада је програм исправан, па ће се након последње итерације петље, на
стандардни излаз исписати и вредност променљиве i
која износи 10
.
Оба начина декларације бројача (ван петље и у петљи) су исправна, а када ћеш који користити зависи од ситуације, односно потребе.
Бројач је могуће декларисати и као променљиву реалног типа, али то није препоручљиво. Вредности променљивих реалног типа могу бити приближне, односно непрецизне, што може проузроковати много проблема који се односе на непрецизну промену бројача која обично условљава тачност провере управљачког израза. То може довести до нежељених и неочекиваних резултата, превремених излазака из петље или бесконачних петљи у којима се никад не испуњава услов за излазак из петље.
Бесконачне петље¶
Сви изрази у заглављу for петље заправо су опциони. Само су знаци ;
који их
раздвајају обавезни. То значи да ће наредба for(;;)
формирати бесконачну
петљу јер нема дефинисан управљачки израз за излазак из петље.
Програм који на стандардни излаз исписује цифре од \(0\) до \(9\) можеш написати на следећи начин:
#include <stdio.h>
int main(void)
{
int i = 0;
for (;;)
if (i < 10)
{
printf("%d ", i);
i++;
}
else
break;
return 0;
}
Управљачки израз у петљи не постоји, па се из петље искаче наредбом break
.
Овај програм написан је само ради демонстрације, а о искакањима из петље и
сличним темама учићеш на крају овог поглавља.
Угнежђене петље¶
Унутар тела једне петље може се налазити једна или више других угнежђених
петљи. Петља која је угнежђена назива се унутраша петља, док је спољашња петља
она у којој се угнежђава. Спољашња и унутрашња петља чине двоструку петљу. Број
петљи које ће се угнездити једна у другу није ограничен и зависи од потреба и
конкретног случаја. Тако се могу имплементирати и вишеструке петље. Дозвољено је
комбиновати петље написане било којом наредбом циклуса for
, while
или
do-while
- и наравно, унутар петљи дозвољено је користити наредбе гранања.
Напиши програм који на стандардном излазу исписује таблицу множења бројева од
1
до 5
. Резултат треба да буде пет табела. У првој табели број 1
множи
бројеве од 1
до 5
, у другој број 2
множи бројеве од 1
до 5
и тако
редом до пете табеле где број 5
множи бројеве од 1
до 5
. Елегантно решење
овог задатка захтева само једну двоструку петљу…
#include <stdio.h>
int main(void)
{
for (int i = 1; i <= 5; i++)
{
for (int j = 1; j <= 5; j++)
printf("%d * %d = %d\t", i, j, i * j);
printf("\n");
}
return 0;
}
…а резултат извршавања програма на стандардном излазу изгледа овако:
1 * 1 = 1 1 * 2 = 2 1 * 3 = 3 1 * 4 = 4 1 * 5 = 5
2 * 1 = 2 2 * 2 = 4 2 * 3 = 6 2 * 4 = 8 2 * 5 = 10
3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 3 * 4 = 12 3 * 5 = 15
4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16 4 * 5 = 20
5 * 1 = 5 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 25
У спољашњој петљи бројач i
има почетну вредност 1
. Пошто је 1 <= 5
креће
се са извршавањем наредби у телу спољашње петље, где је прва наредба угнежђена
тј. унутрашња петља са бројачем j
који има почетну вредност 1
. Пошто је
1 <= 5
исписује се 1 * 1 = 1
и табулатором \t
прави се одређени размак.
Инкрементира се вредност j
на 2
, па како 2 <= 5
, исписује се 1 * 2 = 2
и прави се размак. Поступак се понавља све док је j <= 5
, након чега се
излази из унутрашње петље и извршава наредба за прелазак у нови ред у спољашњој
петљи. Овим је завршена анализа прве итерације спољашње петље. Пошто је
извршено тело прве петље, врши се инкрементирање вредности бројача i
на два.
Како је и даље тачан израз у спољашњој петљи 2 <= 5
, из почетка се извршава
унутрашња петља чиме се на излазу исписује и други ред. Поступак се понавља све
док је израз у спољашњој петљи i <= 5
тачан.