Goto naredba – razlika između verzija
Nema sažetka izmjene |
Nema sažetka izmjene |
||
Red 1: | 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. Stariji programski jezici su uglavnom imali ovu strukturu, dok kod novijih |
'''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. Stariji programski jezici su uglavnom imali ovu strukturu, dok kod novijih podrška varira. |
||
== Naziv == |
== Naziv == |
||
Naziv komande dolazi od |
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: |
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: |
||
Red 43: | Red 43: | ||
</source> |
</source> |
||
Upotreba naredbe <code>goto</code> naročito je bila česta u starijim programskim jezicima sekvencijalnoga karaktera, umjesto pozivanja '' |
Upotreba naredbe <code>goto</code> naročito je bila česta u starijim programskim jezicima sekvencijalnoga karaktera, umjesto pozivanja ''potprograma'' (''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 |
| title = Letters to the editor: Go-to statement considered harmful |
||
| url = https://homepages.cwi.nl/~storm/teaching/reader/Dijkstra68.pdf |
| url = https://homepages.cwi.nl/~storm/teaching/reader/Dijkstra68.pdf |
||
Red 92: | Red 92: | ||
=== Razgranati Goto === |
=== Razgranati Goto === |
||
Osim jednostavne naredbe, još u starijim, nestrukturiranim verzijama ''Fortrana'' i ''Basica'' postojala je i složenija kontrolna struktura - |
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> |
<code>'''goto''' (l1, l2, ... ln) <expr></code> |
||
Red 128: | Red 128: | ||
=== GoSub === |
=== GoSub === |
||
<code>GOSUB</code> ili <code>GO SUB</code> je naredba u Basicu za pozivanje '' |
<code>GOSUB</code> ili <code>GO SUB</code> je naredba u Basicu za pozivanje ''potprograma''. 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 potprograma, pomoću ključne riječi <code>RETURN</code>. |
||
<code>'''GOSUB''' <expr> <...> '''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 |
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 potprograma 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 potprograma onim redom kojim su upisani. |
||
Primjer:<ref>{{cite book |
Primjer:<ref>{{cite book |
||
Red 164: | Red 164: | ||
Slično kao razgranati <code>GOTO</code>, i <code>GOSUB</code> ima svoju razgranatu varijantu. |
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 |
<code>GOSUB</code> instrukcija koja odlučuje o programskom skoku na osnovi evaluacije izraza, ima sljedeći oblik: |
||
<code>'''ON''' <expr> '''GOSUB''' <d1, d2, d3, ... dn></code> |
<code>'''ON''' <expr> '''GOSUB''' <d1, d2, d3, ... dn></code> |
||
Red 304: | Red 304: | ||
</source> |
</source> |
||
== |
== Vidi takođe == |
||
⚫ | |||
⚫ | |||
== Povezani članci == |
|||
* [[Strukturirano programiranje]] |
* [[Strukturirano programiranje]] |
||
Red 318: | Red 313: | ||
{{Reflist}} |
{{Reflist}} |
||
== Vanjske veze == |
|||
⚫ | |||
⚫ | |||
[[Kategorija:Računarstvo]] |
[[Kategorija:Računarstvo]] |
Verzija na datum 7 decembar 2019 u 14:52
GoTo je kontrolna struktura, odnosno naredba (komanda, engl. statement) koja postoji u mnogim 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. Stariji programski jezici su uglavnom imali ovu strukturu, dok kod novijih podrška varira.
Naziv
Naziv komande dolazi od engleske složenice go to sa značenjem idi na/do.
Programski jezici koji imaju goto
, na različite načine i s različitim kombinacijama velikih i malih slova (kapitalizacija) su imenovali ovu naredbu, npr:
GO TO
(kapitalno, razdvojene riječi) - Neke stare verzije Basica u Time-sharing sistemima;[1]
goto
,Goto
,GoTo
... (nebitna kapitalizacija) - Pascal i drugi programski jezici koji ne razlučuju kapitalizaciju identifikatora.
Upotreba
Sintaksa komande u svim jezicima je uglavnom ista:
goto <dest>
gdje destinacija može biti označena linijskim brojem (BASIC, FORTRAN 77) ili labelom, posebnom imenovanom "konstantom" (Pascal, C/C++). Naredba goto
se obično upotrebljava unutar If-Then-Else blokova, na sledeći način:
if <expr> then goto <label>
Programski jezik Pascal zahtijeva deklaraciju labele, kao i bilo koje druge varijable, konstante ili tipa, dok se destinacija obilježava imenom labele iza koje slijedi dvotočka:
label DstX;
{ ... }
goto DstX;
{ ... }
DstX:
{ ... }
Upotreba naredbe goto
naročito je bila česta u starijim programskim jezicima sekvencijalnoga karaktera, umjesto pozivanja potprograma (funkcija ili procedura), kako se to inače radi u proceduralnim i funkcijskim jezicima. Za razliku od poziva funkcije, koji vraća kontrolu toka programa natrag nakon izvršenja, naredba goto
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.[2]
Neki programski jezici ne podržavaju ovu naredbu, kao npr. Java, iako je u Javi goto
rezervirana riječ (engl. keyword), što znači da se ne može koristiti za imenovanje identifikatora. Proceduralni programski jezici Pascal i C/C++ podržavaju goto
, ali ne dopuštaju skakanje izvan dosega funkcije ili procedure. PHP nije imao goto
sve do verzije 5.3.[3]
Primjeri
MS-DOS Batch / Windows CMD
@echo off
cls
@fpc program.pp -Sg -WN -Xs -XX
pause
if exist program.exe (
@program.exe
) else (
goto :err
)
exit
:err
echo.
echo Compilation error.
pause
exit
Varijacije
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:
goto (l1, l2, ... ln) <expr>
Na primjer:
GOTO (20, 30, 40) i
U ovom primjeru programski skok će se izvršiti na osnovi vrijednosti cjelobrojne varijable i
. Za svako i = n
, GOTO
skače do one destinacije u listi (navedene u zagradi), za koju vrijedi da je njezin redni broj u listi jednak vrijednosti varijable i
. Dakle:
? (i = 1) -> goto 20 ? (i = 2) -> goto 30 ? (i = 3) -> goto 40
Za bilo koju drugu vrijednost i
različitu od 1, 2, 3
, ne će se izvršiti nijedan od skokova.
Basic je imao sličnu razgranatu strukturu s istom funkcionalnošću, ON ... GOTO
, odnosno GO TO ... OF ...
(u ovisnosti o verziji Basica). Primjer upotrebe:
50 ON i GOTO 100, 200, 300, 400
Starija, manje poznata varijanta:[1]
50 GO TO N OF 100, 200, 300, 400
U modernijim, strukturiranim programskim jezicima, umjesto ove razgranate strukture koristi se različito nazvana naredba višestrukoga izbora: switch
(C/C++), case
(Pascal), select case
(Fortran 90, QBasic, Visual Basic).
Slične naredbe
GoSub
GOSUB
ili GO SUB
je naredba u Basicu za pozivanje potprograma. Za razliku od GOTO
naredbe u Basicu, koja vrši jednosmjeran transfer kontole toka, GOSUB
omogućuje povratak na mjesto pozivanja, nakon izvršenja potprograma, pomoću ključne riječi RETURN
.
GOSUB <expr> <...> RETURN
Kako je GOSUB ... RETURN
konstrukcija u Basicu riješena na posve nestrukturiran način, iza koda glavnoga programa i prije početka pisanja potprograma mora se navesti ključna riječ STOP
, da bi se osiguralo da program nakon izvršenja glavnoga dijela ne nastavi izvršavanje svih navedenih potprograma onim redom kojim su upisani.
Primjer:[4]
10 REM *** Rješavanje kvadratne jednačbe ***
20 PRINT "Koliki su koeficijenti a, b, c? "
30 INPUT A, B, C
40 GOSUB 500
45 IF (B^2 - 4*A*C) < 0 THEN 10
50 PRINT "Korijeni ove jednačbe su: "
60 PRINT "x1 = "; X1 "x2 = "; X2
70 STOP
500 REM *** Podprogram za determinantu ***
510 IF (B^2 - 4*A*C) < 0 THEN 600
520 X1 = (-B + (B^2 - 4*A*C)^(1/2)) / (2*A)
530 X2 = (-B + (B^2 - 4*A*C)^(1/2)) / (2*A)
540 GOTO 610
600 PRINT "Determinanta je manja od nule. "
610 RETURN
620 END
On ... GoSub
Slično kao razgranati GOTO
, i GOSUB
ima svoju razgranatu varijantu.
GOSUB
instrukcija koja odlučuje o programskom skoku na osnovi evaluacije izraza, ima sljedeći oblik:
ON <expr> GOSUB <d1, d2, d3, ... dn>
Manje popularna varijanta u nekim starijim BASIC interpreterima / Time-sharing sistemima:[1]
GO SUB <expr> OF <d1, d2, d3, ... dn>
Npr:
50 GOSUB X OF 110, 210, 320, 1400
Izvršenje:
x = 1 : GOTO 110; x = 2 : GOTO 210; x = 3 : GOTO 320; x = 4 : GOTO 1400; x < 1 : GOSUB se ne izvršava; x > 4 : GOSUB se ne izvršava, jer su zadane samo 4 destinacije;
Break & Continue
U programskom jeziku C, osim goto
postoje i naredbe za skok iz petlje. Naredba break
prekida izvršavanje petlje unutar koje je pozvana vraćajući tok programa na lokaciju prije pojavljivanja petlje, dok continue
ponovno testira brojač (ako je u pitanju for
iteracija) ili uslov iteracije (kod while
petlji). Primjeri korištenja break
i continue
skokova preuzeti su iz knjige Programski jezik C autora Dennisa Ritchieja i Briana Kernighana.[5]
- Break
/* trim: remove trailing blanks, tabs, newlines */
int trim(char s[])
{
int n;
for (n = strlen(s)-1; n >= 0; n--)
if (s[n] != ' ' && s[n] != '\t' && s[n] != '\n')
break;
s[n+1] = '\0';
return n;
}
- Continue
for (i = 0; i < n; i++)
if (a[i] < 0) /* skip negative elements */
continue;
/* do positive elements */
Funkcije sa sličnim nazivom
GotoXY
Programski paket Borland Turbo Pascal ima u programskoj biblioteci proceduru GotoXY
unutar programskoga modula CRT. Uprkos sličnosti u nazivu, njezina svrha nije kontrola toka kao kod naredbe goto
, nego relociranje kursora u tekstualnom modu. Prototip procedure glasi:
procedure GotoXY(X,Y: Byte);
Parametri X
i Y
predstavljaju koordinate terminala.
Primjer u Pascalu koji crta dva okvira različite veličine u konzolnom programu:[6]
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.
Programski paketi Turbo C i Turbo C++ tvrtke Borland takodjer su imali funkciju gotoxy()
definiranu unutar conio.h
. Deklaracija glasi:
void gotoxy(int x, int y);
Primjer u C-u:[7]
#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;
}
Vidi takođe
Izvori
- ↑ 1,0 1,1 1,2 Željko Reljić, Branimir Makanec (1984). BASIC kompjuterski jezik. Tehnička knjiga, Zagreb.
- ↑ Dijkstra, Edsger W. (March 1968). „Letters to the editor: Go-to statement considered harmful”. Communications of the ACM 11 (3): 147–148.
- ↑ „PHP: goto - Manual”. PHP.net.
- ↑ Željko Reljić, Branimir Makanec (1984). BASIC kompjuterski jezik. Tehnička knjiga, Zagreb. str. 84.
- ↑ Brian W. Kernighan, Dennis M. Ritchie (1988). The C Programming Language (Second Edition). Prentice Hall.
- ↑ Roby Joehanes. „Roby's Pascal Tutorial. Lesson 1, Chapter 6: Procedures and Functions”. GeoCities.
- ↑ „C conio.h gotoxy Programming”. Code-Reference.com.