Goto naredba – razlika između verzija
m Poništena izmjena 40929439 korisnika 5.43.78.148 (razgovor) oznaka: poništenje |
mNema 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. |
'''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. U današnje vrijeme ova naredba se u programiranju uglavnom izbjegava, te postoji kritički odnos prema uporebi obe naredbe u [[strukturirano programiranje|strukturiranim]] programskim jezicima.<ref>{{cite web |
||
⚫ | |||
| title = Go To Statement Considered Harmful |
|||
| author = Edsger W. Dijkstra |
|||
}}</ref><ref>{{cite web |
|||
⚫ | |||
| title = Structured Programming with Go To Statements |
|||
| author = Donald Knuth |
|||
}}</ref> |
|||
== Naziv == |
== Naziv == |
||
Naziv komande dolazi od englezke 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 64: | Red 70: | ||
== Primjeri == |
== Primjeri == |
||
=== |
=== Windows CMD === |
||
<source lang="dos" highlight="10"> |
<source lang="dos" highlight="10"> |
||
Red 303: | Red 309: | ||
} |
} |
||
</source> |
</source> |
||
== Povijestni dokumenti == |
|||
⚫ | |||
⚫ | |||
== Povezani članci == |
|||
* [[Strukturirano programiranje]] |
|||
* [[Nestrukturirano programiranje]] |
|||
* [[Basic]] |
|||
== Izvori == |
== Izvori == |
Verzija na datum 21 decembar 2019 u 01:55
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. U današnje vrijeme ova naredba se u programiranju uglavnom izbjegava, te postoji kritički odnos prema uporebi obe naredbe u strukturiranim programskim jezicima.[1][2]
Naziv
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;[3]
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 podprograma (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.[4]
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.[5]
Primjeri
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:[3]
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 podprograma. Za razliku od GOTO
naredbe u Basicu, koja vrši jednosmjeran transfer kontole toka, GOSUB
omogućuje povratak na mjesto pozivanja, nakon izvršenja podprograma, 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 podprograma mora se navesti ključna riječ STOP
, da bi se osiguralo da program nakon izvršenja glavnoga dijela ne nastavi izvršavanje svih navedenih podprograma onim redom kojim su upisani.
Primjer:[6]
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 sledeći oblik:
ON <expr> GOSUB <d1, d2, d3, ... dn>
Manje popularna varijanta u nekim starijim BASIC interpreterima / Time-sharing sistemima:[3]
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.[7]
- 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:[8]
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:[9]
#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;
}
Izvori
- ↑ Edsger W. Dijkstra. „Go To Statement Considered Harmful”.
- ↑ Donald Knuth. „Structured Programming with Go To Statements”.
- ↑ 3,0 3,1 3,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.