Loops - while, for, do-while, if-goto

Započeo Vasic, Mart 11, 2022, 17:53:53 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 1 gost pregledaju ovu temu.

Petlje (Loops) - while, for, do-while, if-goto


Šta su petlje?

Petlje su među najosnovnijim i najmoćnijim konceptima programiranja. Petlja u računarskom programu je instrukcija koja se ponavlja sve dok se ne postigne određeni uslov.
U strukturi petlje, petlja postavlja pitanje. Ako odgovor zahteva akciju, ona se izvršava. Isto pitanje se postavlja iznova i iznova sve dok ne bude potrebno dalje preduzimanje mera.
Svaki put kada se postavi pitanje naziva se iteracija.


Da li to važi i u pawn jeziku?

Da, samo se razlikuju tipovi - while, for, do-while, if-goto.

Tipovi petlje i njihova funkcija

"while" petlje rade nešto dok je navedeni uslov tačan. Uslov je potpuno istog formata kao uslov u statementu if, samo se više puta proverava i kod se izvršava ako je uslov tačan svaki put kada se proverava.

[pawn]new
   a = 9;
while (a < 10)
{
   // Kod unutar while petlje
   a++;
}
// Kod nakon petlje
[/pawn]

Ovaj kod će proveriti da li je 'a' manje od 10. Ako jeste, izvršavaće se kod unutar zagrada (a++;), povećavajući tako vrednost 'a'. Kada se dostigne kraj petlje, izvršenje koda se vraća nazad na proveru i ponavlja se, ovaj put provera neće uspeti jer 'a' već ima vrednost 10 (prethodno definisana vrednost joj je 9) i onda se petlja automatski preskače te se nastavlja kod koji se nalazi nakon nje. Ako je 'a' počelo kao 8, kod bi se pokrenuo dva puta, ako je od 7 onda tri puta, i tako u krug sve dok se ne dostigne željena vrednost.




"for" petlja je u suštini "compressed" while" petlja. "for" statement ima tri odeljka: inicijalizacija, uslov i finalizacija. Kao petlja "for", gornji primer petlje "while" bi bio napisan:

[pawn]for (new a = 9; a < 10; a++)
{
   // Kod unutar for petlje
}
// Kod nakon petlje
[/pawn]

Na primer, ovo je jednostavan kod da petlja "prođe" kroz sve igrače:

[pawn]for(new i,a = GetMaxPlayers(); i < a; i++)
{
        if(IsPlayerConnected(i))
        {
                 // Neki kod za izvršenje
        }
}
[/pawn]

Bilo koji od uslova u zagradi se može izostaviti tako što ne unesemo kod unutar zagrade.

[pawn]new
   a = 9;
for ( ; a < 10; )
{
   // Kod unutar for petlje
   a++;
}
// Kod nakon petlje
[/pawn]

Ovaj primer čini malo lakšim da pokaže kako se petlja "for" podudara sa petljom "while". Postoje dve vrlo male razlike između dve date "for" petlje. Prvi je da drugi primer deklariše "a" van petlje, što znači da se može koristiti van petlje, u prvom primeru scope-a "a" (odeljak koda za koji postoji promenljiva) je samo unutar petlje. Druga razlika je u tome što se a++ u drugom primeru zapravo izvršava malo pre a++ u prvom primeru, 99% vremena ovo ne čini nikakvu razliku, jedino je važno kada koristite 'continue' (continue u osnovi preskače iteraciju petlje), 'continue' će pozvati a++ u prvom primeru, ali će ga preskočiti u drugom primeru.




"do-while" petlja je "while" petlja gde uslov dolazi posle koda unutar petlje umesto pre. To znači da će se kod iznutra uvek izvršavati najmanje jednom jer se to radi pre nego što se provera završi:

[pawn]new
   a = 10;
do
{
   // Kod unutar do-while petlje
   a++;
}
while (a < 10); // Obratite pažnju na tačku zarez (;)
// Kod nakon petlje
[/pawn]

Da je to bila standardna "while" petlja, promenljiva "a" se ne bi povećavala jer je provera (a < 10) lažna, ali ovde se povećava pre te provere. Ako bi "a" počela kao 9, petlja bi takođe bila izvršena samo jednom. Ako bi počela kao 8, petlja bi bila izvršena dvaput itd...




"if-goto" - Ovo je u suštini neka "zamena" za petlje gore, upotreba goto je generalno izostavljena, međutim zanimljivo je videti šta tačno ta petlja radi:

[pawn]new
   a = 9;

loop_start:
if (a < 10)
{
   // Kod unutar petlje
   a++;
   goto loop_start;
}
// Kod nakon petlje
[/pawn]

Ovaj način petlje je jako slabo zastupljen, i ne koristi se tako često, iako je zanimljiv princip njegove funkcije.




"OBOE" je skraćenica od Off By One Error. Ovo je vrlo česta greška kada se petlja izvodi previše ili nekoliko puta. Na primer:

[pawn]new
   a = 0,
   b[10];
while (a <= sizeof (b))
{
   b[a] = 0;
}
[/pawn]

Ovaj veoma jednostavan primer demonstrira jedan od najčešćih OBOE-a, na prvi pogled ljudi mogu pomisliti da će ovo proći kroz sve sadržaje b i postaviti ih na 0, međutim ova petlja će se zapravo pokrenuti 11 puta i pokušati pristupiti b[10], što ne postoji (to bi bio 11. slot u b počevši od 0), tako da može izazvati razne probleme. Ovo je poznato kao Out Of Bounds error. (OOB).
Morate biti posebno obazrivi na OBOE kada koristite "do-while" petlje jer se UVEK pokreću bar jednom.




Hvala Vam što ste odvojili vreme da pročitate tutorijal.
Nadam se da ste skapirali kako petlje rade.

Moguće su greške, ne zamerite. Ukoliko uočite nešto što je nepravilno, napišite u komentaru.
Ukoliko Vam treba dodatna pomoć oko petlji, napišite u komentaru ove teme (a ne privatne poruke).
Sve ovo možete da pronađete online, ili na alternativnim samp-wiki stranicama, ali evo i ovde za lenje osobe.
Poslednja Izmena: Mart 11, 2022, 17:55:29 POSLE PODNE od Vasic
• Website: www.vasic.dev
Web Development & Cyber Security

Top brate, sad vise ne objasnjavam petlje 15x nego link pa neka citaju sami.
Jos bih dodao da se svaka petlja moze prekinuti uz pomoc break ili return. Break ce da prekine petlju i da nastavi kod, dok return prekida trenutnu funkciju kao i obicno.
Takodje trenutna iteracija se moze prekinuti i vratiti na pocetak petlje uz continue naredbu.

I da, goto iskreno po meni ne pripada u pelje (iako se petlja moze napraviti sa goto/jmp - sta vise svaki loop je koristi u masinskom kodu), to je obicna jump naredba i njena funkcija je da preskoci na odredjeni deo koda. Takodje tu naredbu ne preporucujem nikome da koristi, postoje dobri razlozi zasto je obsolete i noviji jezici je ne implementiraju.
Discord: fros7y
Resavam sve HITNE probleme za samp i generalno u vezi administracije i odrzavanja servera za $$$.

Ne skriptam generalno osim ako nije neka sitnica da se napravi ili popravi.

DM na Discord pa po dogovoru. Uplate samo preko paypal ili na banku direktno. Nista western, kripto i ostala sranja.

Lepo odradjeno, lepo pojasnjeno  :)
Sta je to web development?
To je nesto ono kao, kako bih to rekao, izgubis volju za zivotom i zelis da se ubijes, ali to je okej.
Onda jednostavno shvatis da si bio glup i resis problem, das sam sebi lajk,
skuvas NES 3u1 i pripremis se za sledeci projekat.

Citat: Deleted User poslato Mart 11, 2022, 18:59:13 POSLE PODNE
Top brate, sad vise ne objasnjavam petlje 15x nego link pa neka citaju sami.
Jos bih dodao da se svaka petlja moze prekinuti uz pomoc break ili return. Break ce da prekine petlju i da nastavi kod, dok return prekida trenutnu funkciju kao i obicno.
Takodje trenutna iteracija se moze prekinuti i vratiti na pocetak petlje uz continue naredbu.

I da, goto iskreno po meni ne pripada u pelje (iako se petlja moze napraviti sa goto/jmp - sta vise svaki loop je koristi u masinskom kodu), to je obicna jump naredba i njena funkcija je da preskoci na odredjeni deo koda. Takodje tu naredbu ne preporucujem nikome da koristi, postoje dobri razlozi zasto je obsolete i noviji jezici je ne implementiraju.
edit:
ne zeli da mi posalje poruku kako treba, forum ima neki waf pa blokira request

ugl. da, i ja sam bas razmisljao o break i return ali sam zaboravio posle da dodam. Sad je malo kasno, a ovde sam u komentaru ispisao ali nesto nece da mi prihvati request, valjda WAF blokira, ne znam zbog cega.
Sto se tice continue naredbe, u kratkim crtama je opisana negde u tutorijalu, znam da sam je stavio.
Poslednja Izmena: Mart 11, 2022, 19:52:14 POSLE PODNE od Vasic
• Website: www.vasic.dev
Web Development & Cyber Security

iskreno top odradjeno i detaljno objasnjeno  8)