Grananje - naredba goto

1. Naredba goto

Pri pisanju programa u nekom od strukturiranih programskih jezika (Pascal, C...) preporučuje se izbjegavati tu naredbu. U pravilnom strukturiranom programu neće se pojaviti potreba da se ona koristi i većina programera ju izbjegava.

Velik broj naredbi goto smanjuje čitljivost programa i otežava možebitne naknadne ispravke.

Ali ako je očito da će njezinim korištenjem program postati pregledniji, kraći i razumljiviji, nema razloga da se ona ne upotrijebi.

Naredba goto omogućuje bezuvjetni skok na neku drugu naredbu unutar iste funkcije. Zbog toga zahtijeva simboličku oznaku linije (label) na koju se program grana nakon izvršene naredbe. U C-u je to identifikator sa znakom :.

Opći je oblik naredbe goto sljedeći:

goto label;

To je naredba koju treba  oprezno upotrebljavati jer često stvara tzv. beskonačnu petlju (tada program nikada ne završi).

Primjer 1.

Program koji za zadane duljine stranica trokuta računa njegovu površinu i opseg. Ako učitani brojevi ne čine stranice trokuta, program od korisnika traži da ponovi upis.

#include <stdio.h>
#include <math.h>
int main()
{
     float a,b,c,o,p,s;
     upis: printf("\nUnesite duljine stranica trokuta a, b, c: ");
     scanf("%f %f %f",&a,&b,&c);
     if (a+b>c && a+c>b && b+c>a && a>0 && b>0 && c>0)
     {
           o=a+b+c;
           s=o/2;
           p=sqrt(s*(s-a)*(s-b)*(s-c));
           printf("opseg zadanog trokuta je %.2f, a povrsina %.2f",o,p);
     }
     else
     {
           printf("\nZadani brojevi ne cine stranice trokuta. Molimo, ponovite upis");
           goto upis;
     }
     return 0;
}

Testni primjeri

Ulaz:      1  2  3
Izlaz:     Zadani brojevi ne cine stranice trokuta. Molimo, ponovite upis

Ulaz:      2  3  4
Izlaz:     opseg zadanog trokuta je 9 a površina 2.        

 

Zadatci za vježbu

1. Koje vrijednosti imaju varijable a i b nakon izvođenja niza naredbi?

int main()
{
     int a=1,b=0;
     provjera:
     if (a<10)
     {
          b+=a;
          a+=1;
          goto provjera;
     }
return 0;
}

 

2.  Što će se ispisati na zaslonu monitora ako se nakon pokretanja sljedećeg programa upiše broj 3172?

#include <stdio.h>
int main()
{
     int a,z,u=1;
     printf("\nUpisite jedan prirodan broj: ");
     scanf("%d",&a);
     poc:z=a%10;
     u*=z;
     a/=10;
     if (a!=0) goto poc;
     printf("\n %d",u);
     return 0;
}

Kako glasi tekst zadatka kojim bi se zadao prethodni program?