For петља — разлика између измена

Садржај обрисан Садржај додат
Нема описа измене
Autobot (разговор | доприноси)
м ciscenje; козметичке измене
Ред 1:
{{ФИН2015}}
[[FileДатотека:For-loop-diagram.png|thumb|right|диjаграм протока for петље]]
{{Helpbox <!-- NOTE: Please don't remove. Discuss naviagation concept at [[Talk:Do_while_loop#Helpbox_experiment] -->
|name = Конструкције петљи
Ред 18:
У [[Фортран|FORTRAN]] и [[PL/I]], се користи кључна реч DO, а петља се зове '''do петља''', и пошто је скоро идентична for петљи описаној овде, нећемо је користити како је не би мешали са [[Do while петља|do while петљом]].
 
== Врсте for петљи ==
Изјаве For петљи су доступне у већини [[Императивно програмирање|императивних програмских]] језика. Чак и игноришући мање разлике у [[Синтакса|синтаксама ]] постоји много разлика у томе како ове изјаве раде и какав ниво изражајности подржавају. Генерално for петље се могу поделити на:
=== Традиционалне for петље ===
Традиционалне for петље у [[C (програмски језик)|C ]] / [[C++]] састоје се из 3 дела: [[увођење]], [[Булова алгебра|услов]] и [[Накнадна мисао|накнадна мисао]] и сва 3 дела су опциона.<ref>{{cite web|url=https://www.tutorialcup.com/cplusplus/for-loop.htm|title=C++ For Loop}}</ref><ref>{{cite web|url=http://www.learncpp.com/cpp-tutorial/57-for-statements/|title=For loops in C++}}</ref>
<source Lang="java">
for (УВОЂЕЊЕ; УСЛОВ; НАКНАДНА МИСАО)
Ред 32:
Ево примера традиционалне for петље у [[Јава (програмски језик)|Јави]].
<source Lang="java">
for (int i = 0; i < 100; i++) // Штампа бројеве од 0 до 99 (не и 100), сваки одвојен размаком.
{
System.out.print(i);
Ред 40:
</source>
 
=== For петље засноване на понављању ===
{{Main|Форич петља}}
Овај тип for петље је копија for петље засноване на нумеричким опсезима; јер омогућава бројање скупова ставки који не морају бити низови бројева. Обично се одликује употребом имплицитног или експлицитног [[Итератор|итератора]], у којој променљива петље преузима вредност из секвенци или из друге могће колекције. Репрезентативан пример у [[Пајтон (програмски језик)|Пајтону]] је:
Ред 65:
Да ли је изражена у стилу for петље, for all петље или неке друге можда неће бити тачно описано у упутству.
 
=== Спојене for петље ===
 
Уведене у [[ALGOL 68]] и испраћене са [[PL/I]], омогућавају да понављање петље буде спојено са испитивањем, као у
Ред 71:
То јест, вредност је додељена променљивој ''i'' и само ако је израз '''тачан''' тело петље ће се извршити. Ако је вредност '''нетачна''' израчунавање се завршава. Под претпоставком да је вредност променљиве дефинисана након завршетка петље, горња наредба ће пронаћи први не позитиван елемент низа А (ако такав не постоји, негова вредност ће бити N+1) или, са одговарајућим варијантама, први не празан карактер у ниској, итд.
 
== Додатне семантике и конструкције ==
 
=== Коришћење бесконачне петље ===
Овај С-стил for петљи је још од основних корака понављања је потпуно у контроли програмера. У ствари, када су [[Бесконачна петља|бесконачне петље]] намерно створене, ова врста for петљи се може користити (са празним изразима) као:
<source lang=C>
Ред 82:
Овај стил се користи уместо бесконачне {{code|while (1)}} петље да би се избегло упозорење у неким С/С++ комплајерима.<ref>{{cite web |title=Compiler Warning (level 4) C4127 |url=http://msdn.microsoft.com/en-us/library/6t66728h.aspx |publisher=Microsoft |accessdate=29 June 2011}}</ref> Неки програмери воле више језгровиту {{code|for (;;)}} форму него семантички еквивалентну али опширнију {{code|while (тачно)}} форму.
 
=== Рани излаз и наставак ===
Неки језици такође могу да пруже и друге пратеће изјаве, којe када су присутне могу да мењају понављање for петље. Заједничке међу њима су [[break изјава|break]] и [[Контрола протока|continue]] изјаве које се налазе у C програмском језику и његовим изданцима. Изјава break прекида петљу одмах након задатог услова. Изјава continue ће одмах кренути на следећу итерацију без даљег напретка кроз тело петље за текућу итерацијy. Остали језици могу имати сличне изјаве или да на други начин обезбеде средства за мењање for петље ; на пример у FORTRAN-у 95:
 
Ред 92:
IF (катастрофа) EXIT !Напушта петљу.
изјаве !Све док је добро, док није катастрофа.
END DO !Треба да се усклади са "DO".
</source>
 
=== Обим променљиве у петљи и семантика ===
Различити језици наводе различита правила за оно што ће вредност променљиве у петљи имати након завршетка петље. Ово дозвољава [[Компилатор|преводиоцу]] да генерише код који не оставља никакву вредност променљивој из петље, или можда чак и оставља, али је то непромењена вредност петље и никада се не чува у меморији. Стварно понашање може чак да варира у складу са поставкама оптимизације компајлера, као са Honywell Fortran66 компајлерoм.
 
Ред 107:
PRINT (A(I), B(I), I = 1, N, 2) !Користи петљу да одштампа непарне елементе низа А и В, поново користећи "I"…
PRINT I !Која вредност ће бити одштампана?
END DO !Колико пута ће петља бити рачуната?
</source>
 
Ред 113:
 
Још једна могућност је да је код генерисан и може се користити помоћну променљиве као променљива петље, вероватно сачуваном у регистару, чија вредност може или не може бити копирана у <code>I</code> на сваком понављању. Опет, модификације <code>I</code> неће утицати на контролу петље, али сада је на раскрсници могуће: у оквиру петље, референце вредности <code>I</code> могу бити (евентуално измењене) садашње вредности <code>I</code> или помоћне променљиве <code>I</code> па су збуњујући резултати загарантовани. На пример, у оквиру петље референцу на елемент <code>I</code> низа вероватно ће запослити помоћну променљиве (поготово ако је одржана у регистару), али ако је параметар на неку рутину (на пример, штампање изјава открива своју вредност), вероватно би позивало на одговарајуће променљиве <code>I</code>. Најбоље је да се избегну такве могућности.
==== Прилагођавање граница ====
Баш као што индекс променљиве може бити модификован у оквиру for петљи, тако се могу мењати и границе и праваци. Али са неизвесним ефектима. Преводилац може спречити такве покушаје, јер они можда немају никакав ефекат, или чак можда након тога неће радити исправно, мада би многи рекли да је погршно то урадити. Размотрите изјаву као
'''for''' i := first : last : step '''do'''
Ред 119:
Ако приступ састављању такве петље треба да буде процена првог, последњег члана, броја корака и обрачун понављања са нечим као (''последњи''-''први'')/''корак'' само на почетку, и онда ако те ставке буду једноставне променљиве и њихове вредности су некако увећане током понављања, то неће имати никаквог ефекта на интерацију count иако је елемент изабран за поделу са ''А (последњи)'' промењен.
 
=== Листа вредности опсега ===
PL/I и ALGOL 68 омогућава петљама у којима се налази променљива да се понављају изван опсега вредности уместо у једном опсегу. Следи PL/I пример који израчунава петљу са 6 вредности за i:1,7,12,13,14,15:
<source lang="pli">
Ред 127:
</source>
 
== Еквивалентност са while петљом ==
For петља се може конвертовати у еквивалентну while петљу дописивањем бројача променљиве директно. Следећи [[Псеудокод|псеудокод]] показује ову технику:
faktorijel = 1
for broj from 1 to 5
Ред 140:
broj = broj + 1
 
Овај превод је мало компликован за језике који дозвољавају скакање до новог понављања у петљи (као continue изјава у С-у). Ове изјаве ће обично имплицитно повећавати број петље, али не и еквивалент while петље (јер у овом другом случају број није саставни део конструкције петље). Било који превод ће морати да стави све изјаве унутар блока који експлицитно повећава број пре покретања изјаве.
 
== Хронологија синтаксе for петље у разним програмским језицима ==
На основу акције која мора бити поновљена, на пример, пет пута, различити језици ће for петљу написати другачије. Синтакса за три израза for петље је скоро идентична у свим језицима који га имају, након различитих стилова блока-крај петље и тако даље.
=== 1957: FORTRAN ===
Док користите кључну реч do уместо for, овај тип [[Фортран|FORTRAN]]-ове do петље се понаша слично као троаргументна for петља у осталим језицима. Овај пример се понаша исто као остали, иницијализујући број променљиве на 1, увећавајући је за 1 у свакој интерацији петље и стопирати када достигне вредност 5.
<source lang=FORTRAN>
Ред 167:
IF (SUM SQ.GT.1000) GO TO 109
SUM SQ = SUM SQ + I**2
101 CONTINUE
109 CONTINUE
END
</source>
 
=== 1958: Algol ===
[[Алгол]] је први пут формализован у извештају Algol58.
=== 1960: COBOL ===
COBOL је формализован крајем 1959 год. И имао је много елаборација. Користи PERFORM реч која има много опција, уз касније додавање „саставних“ изјава као што су END-PERFORM. Игнорисањем потребе за декларисањем и иницијализацијом променљиве, еквиваленто са for петљом ће бити:
<source lang=COBOL>
Ред 183:
Ако реч PERFORM има опциони додатак TEST AFTER, добијена петља је нешто другачија: тело петље извршава се најмање једном, пре било каквог теста.
 
=== 1964: BASIC ===
Петље у [[Бејсик|BASIC]] понекад се називају for next петље.
<source lang="freebasic">
Ред 192:
Обратите пажњу да маркер краја петље наводи име индекса променљиве, која мора да одговара имену индекса променљиве на почетку for петље. Неки језици (PL/I, FORTRAN 95 и касније) омогућавају ознаку изјаве на почетку for петље тако да може бити ухваћена од стране компајлера у односу на исти текст на одговарајућој изјави end. Фортран такође омогућава EXIT и CYCLE изјаве да би означили име овог текста; у гнезду петље ово чисти петљу која је намењена. Међутим, на овим језицима етикете морају да буду јединствене, тако узастопне петље које укључују исти индекс променљиве не могу да користе исти текст, нити може етикета бити иста као име променљиве, као што је индекс променљиве у for петљи.
 
=== 1964: PL/I ===
<source lang=PLI>
do broj = 1 to 5 by 1; /* "by 1" је подразумевано ако ништа није наведено */
Ред 201:
Изјава ''LEAVE'' може да се користи за излазак из петље. Петља може бити означена, и ''leave'' ће можда оставити посебну петљу у групи гнезда петљи. Неки PL/I дијалекти укључују изјаву ''ITERATE'' да прекине тренутну интерацију петље и да почне следећа.
 
=== 1968: Algol 68 ===
[[Алгол68]] има оно што је сматрано универзалном петљом, пуна синтакса је:
<source lang=Algol68>
Ред 207:
</source>
Даље, један опсег понављања може бити замењен листом таквих опсега. Постоји неколико необичних аспеката конструкције.
* само "'''do ~ od'''" део је обавезан, у овом случају петља ће се понављати у недоглед.
* тако ће се део "'''to''' 100 '''do''' ~ '''od'''" поновити тачно 100 пута.
* елемент "'''while'''" ће дозволити програмеру да прекине '''for''' петљу раније, као у:
Ред 222:
</source>
 
=== 1970:Pascal ===
<source lang=Pascal>
for Broj := 1 to 5 do
Ред 236:
Нумерички опсег for петље варира нешто више.
 
=== 1972: C/C++ ===
{{further|C синтаксе#Наредбе понављања}}
<source lang=C>
Ред 250:
</source>
 
=== 1972: Smalltalk ===
<source lang=Smalltalk>1 to: 5 do: [ :broj | "изјаве" ]</source>
За разлику од других језика, у [[Smalltalk]]-у for петља није [[језикичка конструкција]], али је дефинисана у класи Број као метод са два параметра, на крају вредности и [[Затварање (Програмирање)|затварања]], користећи себе као почетну вредност.
 
=== 1980: Ada ===
<source lang="ada">
for Broj in 1 .. 5 loop
Ред 274:
</source>
 
=== 1980: Maple ===
 
Maple има два облика for петљи, један за понављање опсега вредности, а други за понављања садржаја контејнера. Вредност опсега је следећи:
Ред 291:
For петља може се раскинути са '''od''', '''end''', или '''end do'''.
 
=== 1982: Maxima CAS ===
У [[Maxima CAS]]-у могу се користити и не целобројне вредности:
<source lang=Lua>
Ред 298:
</source>
 
=== 1982: PostScript ===
For петља, написана као <code>[почетна] [прираст] [лимит] {...}for</code> започиње са унутрашњом променљивом, и извршава тело док унутрашња променљива није вишa од лимита (или не мањa, ако је негативан прираштај ) и, на крају сваке итерације, повећава унутрашњу променљиву. Пре сваког понављања, вредност унутрашње променљиве је пребачена у стек.<ref>{{cite book|title=PostScript Language Reference|publisher=Addison-Wesley Publishing Company|page=596|isbn=0-201-37922-8}}</ref>
<source lang=AppleScript>
1 1 6 {ИЗЈАВЕ} for
</source>
Ту је такође и проста repeat петља. Repeat петља, написана са Х { ... } repeat понавља тело тачно Х пута.<ref>{{cite web|url=http://pscript.dubmun.com/tutorial4.html|title=PostScript Tutorial - Loops}}</ref>
<source lang=AppleScript>
5 { ИЗЈАВЕ } repeat
</source>
 
=== 1983: Ada 83 и изнад ===
<source lang=ADA>
procedure Main is
Ред 321:
</source>
 
=== 1984: MATLAB ===
<source lang=MATLAB>
for i = 1:5
Ред 327:
end</source>
 
=== 1987: Perl ===
<source lang=Perl>
for ($broj = 1; $broj <= 5; $broj++) { # садашње или претходно дефинисане променљиве
Ред 344:
</source>
 
=== 1988: Mathematica ===
 
Конструкција for петље која одговара већини других језика у Mathematica се назива Do.
Ред 359:
</source>
 
=== 1989: Bash ===
<source lang="bash">
# прва форма
Ред 380:
Имајте на уму да се празна петља (тј једна без команди између <code>do</code> и <code>done</code>)третира као синтаксна грешка. Ако изнад петље садржи само коментаре, извршење ће резултирати поруком "<code>синтаксна грешка код неочекиваног знака 'Done'</code>".
 
=== 1990: Haskell ===
Уграђени императив ''forM_'' мапира израз у листу, као<source lang="haskell">
forM_ [1..5] $ \indx -> do изјаве
Ред 405:
</source>
 
=== 1991: Oberon-2, Oberon-07, or Component Pascal ===
<source lang=Oberon2>
FOR Broj := 1 TO 5 DO
Ред 413:
Имајте на уму да је у оригиналном језику Oberon for петља изостављена у корист генералног конструкта Oberon петље. For петљa је поново уведенa у Oberon 2.
 
=== 1991: Python ===
<source lang=Python>
for broj in range(1, 6): # опсег (1, 6) даје вредност од 1 до 5 (али не 6)
# изјаве
</source>
 
=== 1993: AppleScript ===
<source lang=AppleScript>
repeat with i from 1 to 5
Ред 435:
Такође можете користити "exit repeat" да изађете из петље у било ком тренутку. За разлику од других језика, AppleScript тренутно нема никакву наредбу да настави до следеће наредбе у петљи.
 
=== 1993: Lua ===
<source lang=Lua>
for i = почетак, крај, интервал do
Ред 455:
end</source>
 
=== 1995: [[CFML]] ===
 
==== Скрипт синтакса ====
Једноставан индекс петље:
<source lang=CFM>
Ред 479:
</source>
 
==== Таг синтакса ====
Једноставан индекс петље:
<source lang=CFM>
Ред 510:
</source>
 
За продужену for петљу, погледајте [[Foreach петља|Foreach петљу ]]
 
=== 1995:JavaScript ===
JavaScript подржава С стил "троизразних" петљи. <code>Вreak</code> и <code>continue</code> изјаве су подржанe у петљи.
<source lang=JavaScript>
Ред 522:
Алтернативно, могуће је поновити преко свих кључевa једног низа.
<source lang=JavaScript>
for (var key in array) { // такође ради са assoc. arrays
// користи array[key]
...
Ред 528:
</source>
 
=== 1995: PHP ===
<source lang=PHP>
for ($i = 0; $i <= 5; $i++)
Ред 536:
echo "*";
}
echo "<br />";
}
</source>
 
=== 1995: Ruby ===
<source lang=Ruby>
for broj in 1..5
Ред 546:
end
 
5.times do |broj| # број се понавља од 0 до 4
# изјаве
end
Ред 555:
</source>
 
=== 1996: OCaml ===
Погледајте синтаксу израза.<ref>[http://caml.inria.fr/pub/docs/manual-ocaml-4.00/expr.html OCaml expression syntax]</ref>
<source lang="ocaml">
Ред 569:
</source>
 
=== 1998: ActionScript 3 ===
<source lang="actionscript3">
for (var broj:uint = 1; broj <= 5; broj++){
Ред 576:
</source>
 
== Имплементација у Интерпретираним програмским језицима ==
У [[Интерпретирани програмски језик|интерпретираним програмским језицима]], for петље могу бити реализоване на више начина. Често су for петље директно преведенe на [[асемблер]] као упоређујућа упутства и упутства [[GoTo|условних скокова]]. Међутим, то није увек тако. У неким тумачима програмских језика, for петље су само преведенe на while петљe. <ref>{{cite web|url=https://piazza.com/class#fall2012/cs61b/1575|title=Computer Science 61B: Data Structures and Algorithms in Java 6 - For Loops}}</ref> На пример, узмите следећи Mint/Horchata код:
 
<source lang=text>