Goto naredba – razlika između verzija

Uklonjeni sadržaj Dodani sadržaj
Poništena izmjena 40933035 korisnika Punk Rollonja (razgovor)
oznake: poništenje vraćena izmjena
m Poništena izmjena 40933309 korisnika Obsuser (razgovor)
oznake: poništenje vraćena izmjena
Red 1:
'''GoTo''' je [[kontrolna struktura]], odnosno naredba (komanda, engl. ''statement'') koja postoji u mnogim [[programski jezik|programskim jezicima]]. Izvršava jednosmjerni prenos kontrole toka (''programski skok'') do odredjene lokacije u kodu programa. Lokacija se uglavnom identificira imenovanom ''labelom'', ili rednim brojem linije. StarijiU programskidanašnje jezicivrijeme suova uglavnomnaredba imalise ovuu strukturuprogramiranju uglavnom izbjegava, dokte kodpostoji novijihkritički podrškaodnos variraprema uporebi ove naredbe u [[strukturirano programiranje|strukturiranim]] programskim jezicima.<ref>{{cite web
| url = http://bioinfo.uib.es/~joemiro/teach/material/escritura/gotoharmfulCol.pdf
| title = Go To Statement Considered Harmful
| author = Edsger W. Dijkstra
}}</ref><ref>{{cite web
| url = http://www.cs.sjsu.edu/~mak/CS185C/KnuthStructuredProgrammingGoTo.pdf
| title = Structured Programming with Go To Statements
| author = Donald Knuth
}}</ref>
 
== Naziv ==
 
Naziv komande dolazi od engleske složenice ''go to'' sa značenjem ''idi na/do''.
 
Programski jezici koji imaju <code>goto</code>, na različite načine i s različitim kombinacijama velikih i malih slova (''kapitalizacija'') su imenovali ovu naredbu, npr:
Linija 43 ⟶ 49:
</source>
 
Upotreba naredbe <code>goto</code> naročito je bila česta u starijim programskim jezicima sekvencijalnoga karaktera, umjesto pozivanja ''potprogramapodprograma'' (''funkcija'' ili ''procedura''), kako se to inače radi u [[proceduralno programiranje|proceduralnim]] i [[funkcijsko programiranje|funkcijskim]] jezicima. Za razliku od poziva funkcije, koji vraća kontrolu toka programa natrag nakon izvršenja, naredba <code>goto</code> prenosi kontrolu toka samo u jednom smjeru. Zbog toga nije pogodna za [[strukturirano programiranje]] i pisanje pregledna, uredna programskoga koda, što je dovelo do kritika protiv upotrebe naredbe još 60-ih godina 20. stoljeća.<ref>{{Cite journal
| title = Letters to the editor: Go-to statement considered harmful
| url = https://homepages.cwi.nl/~storm/teaching/reader/Dijkstra68.pdf
Linija 64 ⟶ 70:
== Primjeri ==
 
=== MS-DOS Batch / Windows CMDPascal ===
 
<source lang="dospascal" highlight="1025">
{$id: ALGMD-20100530}
unit Harmful;
 
interface(*********************************************************************)
 
function ProdOfInts(Op1, Op2: LongInt): LongInt;
function PowerOfInt(Base: LongInt; Exp: LongInt): LongInt;
 
implementation(****************************************************************)
 
var
Result: LongInt;
 
function ProdOfInts(Op1, Op2: LongInt): LongInt;
label
0, 1;
begin
0:
Result := 0;
1:
Result := Result + Op1;
Op2 := Op2 - 1;
 
if Op2 <> 0 then
goto 1
else if Op2 = 0 then
ProdOfInts := Result;
end;
 
function PowerOfInt(Base: LongInt; Exp: LongInt): LongInt;
begin
Result := 1;
 
while Exp <> 0 do
begin
Exp := Exp - 1;
Result := ProdOfInts(Base, Result);
end;
 
PowerOfInt := Result;
end;
 
begin(********************************************************************)end.
</source>
 
=== Windows CMD ===
 
<source lang="dos" highlight="9, 15, 20">
@echo off
 
setlocal
cls
set project=Harmful
@fpc program.pp -Sg -WN -Xs -XX
set options=-Sg -WN -Xs -XX
pause
 
call :main
endlocal
goto :eof
 
:main
if exist program.exe (
fpc %project%.pp %options%
@program.exe
 
if exist %project%.pp* (
goto :eof
) else (
gotocall :errerror
)
 
goto :eof
exit
 
:error
:err
echo.:
echo Compilation error.
pause
 
exit
:eof
</source>
 
Linija 92 ⟶ 154:
=== Razgranati Goto ===
 
Osim jednostavne naredbe, još u starijim, nestrukturiranim verzijama ''Fortrana'' i ''Basica'' postojala je i složenija kontrolna struktura - '''izračunati goto''' ili '''razgranati goto'''. Za razliku od obične ''goto'' instrukcije, ''razgranati goto'' omogućuje više od jedne destinacije za programski skok, u ovisnosti o vrijednosti kondicionalne varijable ili izraza (ekspresije) unutar razgranate strukture. U Fortranu sintaksa izgleda ovako:
 
<code>'''goto''' (l1, l2, ... ln) <expr></code>
Linija 128 ⟶ 190:
=== GoSub ===
 
<code>GOSUB</code> ili <code>GO SUB</code> je naredba u Basicu za pozivanje ''potprograma'podprograma'''. Za razliku od <code>GOTO</code> naredbe u Basicu, koja vrši jednosmjeran transfer kontole toka, <code>GOSUB</code> omogućuje povratak na mjesto pozivanja, nakon izvršenja potprogramapodprograma, pomoću ključne riječi <code>RETURN</code>.
 
<code>'''GOSUB''' <expr> <...> '''RETURN'''</code>
 
Kako je <code>GOSUB ... RETURN</code> konstrukcija u Basicu riješena na posve nestrukturiran način, iza koda glavnoga programa i prije početka pisanja potprogramapodprograma mora se navesti ključna riječ <code>STOP</code>, da bi se osiguralo da program nakon izvršenja glavnoga dijela ne nastavi izvršavanje svih navedenih potprogramapodprograma onim redom kojim su upisani.
 
Primjer:<ref>{{cite book
Linija 164 ⟶ 226:
 
Slično kao razgranati <code>GOTO</code>, i <code>GOSUB</code> ima svoju razgranatu varijantu.
<code>GOSUB</code> instrukcija koja odlučuje o programskom skoku na osnovi evaluacije izraza, ima sljedećisledeći oblik:
 
<code>'''ON''' <expr> '''GOSUB''' <d1, d2, d3, ... dn></code>
Linija 221 ⟶ 283:
/* do positive elements */
</source>
 
== Funkcije sa sličnim nazivom ==
 
=== GotoXY ===
 
Programski paket [[Borland]] [[Turbo Pascal]] ima u programskoj biblioteci proceduru <code>GotoXY</code> unutar programskoga modula [[CRT]]. Uprkos sličnosti u nazivu, njezina svrha nije kontrola toka kao kod naredbe <code>goto</code>, nego relociranje kursora u tekstualnom modu. Prototip procedure glasi:
 
<source lang="pascal">
procedure GotoXY(X,Y: Byte);
</source>
 
Parametri <code>X</code> i <code>Y</code> predstavljaju koordinate [[terminal|terminala]].
 
Primjer u Pascalu koji crta dva okvira različite veličine u [[konzola|konzolnom]] programu:<ref>{{cite web
| url = http://web.archive.org/20090525190625/www.geocities.com/siliconvalley/park/3230/pas/pasl1005.html
| author = Roby Joehanes
| title = Roby's Pascal Tutorial. Lesson 1, Chapter 6: Procedures and Functions
| publisher = GeoCities
}}</ref>
 
<source lang="pascal">
uses crt;
 
procedure makewin(x1,y1,x2,y2 : byte);
var
i,j : byte;
begin
{ top }
gotoxy(x1,y1); write(#201);
for i:=x1+1 to x2-1 do write(#205);
write(#187);
 
{ middle }
for i:=y1+1 to y2-1 do
begin
gotoxy(x1,i); write(#186);
for j:=x1+1 to x2-1 do write(' ');
write(#186);
end;
 
{ bottom }
gotoxy(x1,y2); write(#200);
for i:=x1+1 to x2-1 do write(#205);
write(#188);
end;
 
begin
clrscr;
makewin(1,1,30,8);
makewin(10,10,60,18);
readkey;
end.
</source>
 
Programski paketi [[Turbo C]] i [[Turbo C++]] tvrtke [[Borland]] takodjer su imali funkciju <code>gotoxy()</code> definiranu unutar <code>conio.h</code>. Deklaracija glasi:
 
<source lang="c">
void gotoxy(int x, int y);
</source>
 
Primjer u C-u:<ref>{{cite web
| url = https://code-reference.com/c/conio.h/gotoxy
| title = C conio.h gotoxy Programming | Library | Reference
| publisher = Code-Reference.com
}}</ref>
 
<source lang="c">
#include <stdio.h>
#include <conio.h>
 
int main()
{
int x = 40, y = 20;
clrscr();
gotoxy(x, y);
 
printf("gotoxy jumps to cursor position x%d y%d.", x, y);
 
getch();
return 0;
}
</source>
 
== Vidi takođe ==
 
* [[Strukturirano programiranje]]
* [[Nestrukturirano programiranje]]
* [[Basic]]
 
== Izvori ==
 
{{Reflist}}
 
== Vanjske veze ==
 
* [http://bioinfo.uib.es/~joemiro/teach/material/escritura/gotoharmfulCol.pdf Edsger W. Dijkstra: Go To Statement Considered Harmful]
* [http://www.cs.sjsu.edu/~mak/CS185C/KnuthStructuredProgrammingGoTo.pdf Donald Knuth: Structured Programming with Go To Statements]
 
[[Kategorija:Računarstvo]]
[[Kategorija:Programiranje]]
[[Kategorija:Programske paradigme]]