субота, 03. октобар 2015.

Petlje u C++ programskom jeziku


Često tokom programiranja imate potrebu da kodirate jednu te istu stvar dok se neki određeni uslov ne ispuni. Naredbe if else ili switch izvršavaju uslove samo jedanput. Šta ako trebate neke stvari ponavljati više puta? Neke izazove u programiranju rešavate ponavljanjem delovanja na iste podatke. Npr. Vi možete ispisati 10 linija koda da bi ste ispisali 10 puta „Hello World“ na konzoli, ali šta ako trebate da napišete 1000 puta „Hello World“? Hoćete li pisati 1000 linija koda za ovaj zadatak? Ili šta ako vi ne znate unapred koliko puta treba da ispišete na konzoli „Hello World“? Možda će vam sam smisao pisanja „Hello World“ čak 1000 puta na konzolu zvučati banalno, ali to je čisto da bi ste najlakše razumeli šta je ponavljanje i ono što zahteva u programiranju petlju kad treba da ponavljamo podatke. Inače petlje se koriste toliko često i rešavaju bezbroj izazova u programiranju da je danas je nemoguće zamisliti ozbiljan kod bez petlji. Jednostavno samo matematički omogućavaju mnogo više od jednostavnog izračunavanja. O smanjivanju kodiranja i čitljivosti koda da i ne govorimo.


( Petlja while, objašnjena kao šala )

Međutim nekad u prošlim vremenima i starim programskim jezicima nisu postojale petlje. Umesto njih se koristila naredba goto koja je odrađivala iskaze skokovima na zadatu labelu. Upotrebu naredbe goto u C++ programskom jeziku možete videti u primeru ovde. Sad kad naučite petlje, nećete imati potrebe više da koristite naredbu goto. Iskaz goto ćete viđati u starim programima, često u C ili Basic programskom jeziku, ali za neku sadašnjost se naredba goto apsolutno ne preporučuje. Nepažljiva upotreba goto iskaza brzo zapetlja program da se isti ne može ni čitati. Zato su dobile naziv „Špageta kod“. Ali ono što će te najčešće koristiti u vašim projektima su definitivno sve petlje. Svaka ima svoj razlog kad se koristi.

Šta je for ili for next petlja i kako se koristi? 


Petlja "for next" se uglavnom zove petlja u Basic programskom jeziku, dok se u C programskim jezicima naziva samo "for" petlja. Uglavnom se koristi kad nam je poznato koliko puta će se petlja izvršiti. Za razliku od drugih petlji, petlja "for" kombinuje inicijalizaciju ili brojač, uslov i inkrementiranje ili akcija u jednoj liniji koda. Sintaksa se piše ovako:

for ( inicijalizacija, uslov, akcija )
{
         naredbe

}

Koristeći navedenu petlju, čak 1000 puta ispisati na ekranu “Hello World” je jednostavno. Pogledajte sa koliko malo koda je to izvodljivo zahvaljujući petlji:

#include "stdafx.h"
#include <iostream>
using namespace std;

int main()
{
       for (short i = 1; i <= 1000; i++)
       {
             cout << i << " Hello World" << endl;

       }

       cout << endl;
       system("PAUSE");
       return 0;

}


Kad pokrenete navedeni kod dobićete ovakav ispisan rezultat:

. . .

995 Hello World

996 Hello World

997 Hello World

998 Hello World

999 Hello World

1000 Hello World

Press any key to continue . . . 

Zahvaljujući petlji vi navedenu liniju koda za ispis "Hello World" pišete samo jednom i to u strukturi for petlje. Pogledajte još jedan smisleniji primer. Zamislite da hoćete da ispišete brojeve od 1 do 30 ali koji su deljivi sa brojem 3. Sve što je potrebno je ovaj kod: 

#include "stdafx.h"
#include <iostream>
using namespace std;

int main()
{
       for (short i = 3; i <= 30; i += 3)
       {
             cout << i << endl;

       }

       cout << endl;
       system("PAUSE");
    return 0;

}

Kad se izvrši ovaj kod, rešenje je:

3
6
9
12
15
18
21
24
27
30

Press any key to continue . . . 


Da li postoji for each petlja u C++ programskom jeziku?

Ukoliko vaš kompajler podržava  C++ verziju 11 onda možete koristiti for each petlju. Programeri  C++ su uglavnom pre pravili svoje funkcije koje oponašaju ovaj vid petlje i većina  C++ programera ne koristi Microsoft Visual Studio za programiranje  C++ programa. Međutim ukoliko koristite Microsoft Visual Studio od 2012 verzije pa do novije, onda je sasvim ok da napišete ovakav kod. On će raditi.
#include "stdafx.h"
#include <iostream>
using namespace std;

int main() {
      
       string sentence = "Hello World";

       for each(char i in sentence )
       {
             cout << i << endl;
       }

       cout << endl;

       system("PAUSE");
       return 0;

}

Ukoliko pokrenete ovaj program on će vam ispisati svako slovo u rečenici Hello World“.

H
e
l
l
o

W
o
r
l
d

Press any key to continue . . . 


Petlja while

Petlja while se često koristi kada ne znate unapred koliko se puta nešto ponavlja, već to zavisi od nekog uslova. U prevodu petlja while ponavlja sekvence iskaza sve dok je početni uslov istinit.

while(uslov) naredba;

ili

while(uslov)
{
        naredbe

}


Petlja while procenjuje uslov i izvršava naredbu sve dok uslov ne postane netačan. Ukoliko napravite petlju čiji je uslov uvek tačan, onda će te dobiti beskonačnu petlju. Inače će vaš program raditi beskonačno ili izgledati kao blokiran kao da ništa ne radi. Npr. ako napišete nešto ovako: 

#include "stdafx.h"
#include <iostream>
using namespace std;

int main()
{
      
       while (true)
       {
             cout << "endless loop";
            
       }

       cout << endl;
       system("PAUSE");
       return 0;

}

Rezultat pogledajte na slici:


( Rezultat beskonačne petlje ) 

Zato svaku petlju dobro proverite da li ima logičkog smisla. Kako petlja while radi ispravno pogledajte na jednostavnom primeru. Npr. hoćete da vam prikaže brojeve manje od 10. 

#include "stdafx.h"
#include <iostream>
using namespace std;

int main()
{
       short i = 0;

       while (i < 10)
       {
             cout << i << endl;
             i++;

       }

       cout << endl;
       system("PAUSE");
       return 0;

}

Kad pokrenete program, na konzoli će se ispisati:

0
1
2
3
4
5
6
7
8
9

Press any key to continue . . .


Naravno uslov može da bude i komplikovaniji tako što umesto jednog jednostavnog uslova koristite logičke operatore. Međutim ponekad će te hteti da imate veću kontrolu u petlji ili da izađete iz petlje pre nego što petlja završi uslov. Tada jednostavno koristite naredbu continue koja vraća izvršavanje petlje na sam vrh petlje ili koristite naredbu break sa kojom automatski izlazite iz petlje: 

#include "stdafx.h"
#include <iostream>
using namespace std;

int main()
{
       short number, sum = 0;

       while (true)
       {   
             cout << "Enter a number from 1 to 10 or 0 for sum all numbers: ";
             cin >> number;

             if (number != 0) {
                    sum += number;
             }
             else {
                    break; 

             }
       }

       cout <<  endl << "Sum = " << sum << endl << endl;
       system("PAUSE");
       return 0;

}

Kad pokrenete ovaj program on će prihvatati sve brojeve dok ne ukucate 0, a zatim će sabrati sve brojeve koje ste uneli. I pored toga što je u ovoj petlji uslov uvek tačan, kao da je beskonačna petlja; program ima izlaz preko naredbe break kad unesete 0.

Enter a number from 1 to 10 or 0 for sum all numbers: 5

Enter a number from 1 to 10 or 0 for sum all numbers: 8

Enter a number from 1 to 10 or 0 for sum all numbers: 4

Enter a number from 1 to 10 or 0 for sum all numbers: 3

Enter a number from 1 to 10 or 0 for sum all numbers: 7

Enter a number from 1 to 10 or 0 for sum all numbers: 0


Sum = 27

Press any key to continue . . .


Šta je do . . . while petlja?

Razlika između while i do… while petlje je samo u tome što se petlja do… while za razliku od while izvršava bar jednom. Sintaksa za iskaz do… while je sledeća:

do naredbe while (uslov);

ili

do

          naredbe;

} while (uslov);


Ali kako ova petlja funkcioniše u praksi; pogledajte program koji vas pita koliko puta hoćete da ispišete „Hello World“ na konzoli.

#include "stdafx.h"
#include <iostream>
using namespace std;

int main()
{
       short counter = 0;

             cout << "How many times you want to write 'Hello World': ";
             cin >> counter;

             do
             {
                    cout << "Hello World" << endl;
                    counter --;

             } while (counter > 0);
            
       cout <<  endl << "Counter = " << counter << endl << endl;

       system("PAUSE");
       return 0;

}

Kad pokrenete program, dobićete 4 puta ispisan „Hello World“ ukoliko ste uneli 4. Obratite pažnju da je brojač 0.

How many times you want to write 'Hello World': 4

Hello World

Hello World

Hello World

Hello World

Counter = 0

Press any key to continue . . .


I za kraj ovog posta ponovimo sve petlje u jednom programu:



#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

int main()
{
       string sentence = "Hello World";
       short counter = 5;

       cout << endl << "  'for' loop" << endl << endl;

       for (; counter > 0; counter --)
       {
             cout << sentence << endl;

       }
             cout << endl;
            
       cout << endl << "  'for each' loop" << endl << endl;
                   
       for each(char character in sentence )
       {
             cout << character << endl;

       }
            
             cout << endl;
      
             cout << endl << "  'while' loop" << endl << endl;

             while (counter < 6)
             {
                    cout << sentence << endl;
                    counter++;
             }

             cout << endl;
             counter = 5;

           cout << endl << "  'do while' loop" << endl << endl;
        do
           {
                    cout << sentence << endl;
                    counter --;

             } while (counter > 0);
            
             cout << endl;
              
       system("PAUSE");
       return 0;

}

Kad pokrenete program na konzoli će se ispisati sledeće:

'for' loop

Hello World

Hello World

Hello World

Hello World

Hello World

'for each' loop

H
e
l
l
o

W
o
r
l
d

'while' loop

Hello World

Hello World

Hello World

Hello World

Hello World

Hello World

'do while' loop

Hello World

Hello World

Hello World

Hello World

Hello World

Press any key to continue . . .


Kako to sve izgleda možete pogledati i na video-u:

 

( C++ Tutorial - 6. Loops )