среда, 21. октобар 2015.

Strukture i Enumeracije u C++ programskom jeziku


Za strukturu često kažu da je to u stvari klasa, stime da su njeni članovi podrazumevano javni. Inače struktura je skup istih ili različitih promenjivih tipova podataka koje vi pravite sami prema vašim potrebama. Često je programeri koriste kad im treba niz sa različitim tipovima podataka. Često se koristi i da grupišete promenjive jer je tako kodiranje lakše i čitljivije. Strukture se najviše koriste u C programskom jeziku jer C programski jezik nema klase. Ali C++ tretira strukturu kao klasu, ali više kao specijalnu klasu koja je kompatibilna sa C programskim jezikom. Svi vaši primeri u C programskom jeziku s ključnom rečju struct će raditi i u C++ programskom jeziku. Programski jezik C nema ključne reči public i private, pa se zato svi članovi strukture tretiraju kao javni. Kod strukture zaboravite na privatnost.


( Strukture i enumeracije čine kodiranje čitljivijim ) 

Naravno da struktura može da sadrži funkciju, čak i konstruktore kao i klasa, ali u praksi se to retko radi. Jedna struktura može da sadrži i drugu strukturu. Ukoliko imate potrebe za funkcijama i konstruktorima najbolje da napravite klasu za to. Inače često možete videti da programeri koriste pokazivače na strukturu. Sintaksa za strukturu je slična klasi ali se za razliku od klasa više kodira u istom fajlu vašeg programa nego u posebnim fajlovima.

struct ime_strukture
{
           tip1 promenjiva1;
           tip2 promenjiva2;
. . .
 
}

Članovima strukture pristupamo jednostavno navođenjem imena člana posle tačke. Pogledajte najednostavniji primer:


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

struct Point
{
       int X;
       int Y;
};

int main()
{
       Point a;

       a.X = 5;
       a.Y = 15;

       cout << a.X << endl << a.Y << endl << endl;
       system("PAUSE");
       return 0;

}

Kad pokrenete program, rezultat je:

5
15

Press any key to continue . . . 


Jednostavno kad trebate da postavite poziciju neke tačke na formi u nekoj igrici, vi nemate potrebe da koristite dve promenjive za svaku tačku, već jednu strukturu koja sadrži dve promenjive.

Kako da koristim pokazivač na strukturu?

Pokazivač na strukturu koristite kao i na svaki drugi tip podataka. Pogledajte isti navedeni program, ali sa dodatim pokazivačem na strukturu.

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

struct Point
{
       int X;
       int Y;
      
};

int main()
{
       Point a;
       Point *p = &a;
      
       a.X = 5;
       a.Y = 15;

       cout << a.X << endl << a.Y << endl << endl;

       (*p).X = 80;
       (*p).Y = 150;

       cout << p -> X << endl << p -> Y << endl << endl;

       system("PAUSE");
       return 0;

}


Kad pokrenete program videćete da ste sa pokazivačem na strukturu, promenili vrednosti strukture a bez potrebe da definišete pokazivače i za promenjive u strukturi. Mislim jako moćna stvar.

5
15

80
150

Press any key to continue . . . 


Kako izgleda program možete videti i na video-u:

 

( C++ Tutorial - 11. Structure )

Šta je enumeracija?

Enumeracija ili kako je programeri skraćeno zovu enums su u stvari konstante nabrajanja koje programer definiše. Uglavnom se koristi zato što programerima olakšava čitanje, pisanje, identifikovanje i održavanje koda, nego što umanjuje kod. Enumeracija se deklariše ključnom rečju enum sve više kao i struktura, van funkcija, iako u starim projektima će te često nailaziti na enumeraciju unutat main() metode. Sintaksa za enumeracija je:

enum ime_enumeracije 
{
         vrednost1,
         vrednost2,
         . . .

}


Najbolje da pogledate primer kako se koristi enumeracija. Npr. u hrvatskom jeziku se nazivi meseci u godini pišu i govore drugačije od celog sveta, pa često ljudi nisu sigurni kad neko kaže neki mesec na hrvatskom jeziku bez prevoda; na koji mesec misli. Ali ako uradite nešto ovako poput ovog programa koji koristi enumeraciju meseci, stvari postaju jasnije. Pogledajte kod programa.


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

enum months
{
       January = 1,
       February,
       March,
       April,
       May,
       June,
       July,
       August,
       September,
       October,
       November,
       December

};

int main()
{
       short number = 0;
       string month, input;
      
       cout << "Type the number of months in year ( 0 - 12 ): ";
       cin >> number;

       switch (number)
       {
       case January:
             month = "Sijecanj";
             break;

       case February:
             month = "Veljaca";
             break;

       case March:
             month = "Ozujak";
             break;

       case April:
             month = "Travanj";
             break;

       case May:
             month = "Svibanj";
             break;

       case June:
             month = "Lipanj";
             break;

       case July:
             month = "Srpanj";
             break;

       case August:
             month = "Kolovoz";
             break;

       case September:
             month = "Rujan";
             break;

       case October:
             month = "Listopad";
             break;

       case November:
             month = "Studeni";
             break;

       case December:
             month = "Prosinac";
             break;

       default:
             break;
       }
      
       cout << endl << number << " month of the year on Croatian language is " << month << endl << endl;

       system("PAUSE");
       return 0;

}


U ovom program ste mogli enumeraciju i da definišete ovako:

enum { January = 1, February, March, April, May, June, July, August, September, October, November, December }months;

Ili da iza months dodate još naziva odvojenim zarezima, to je samo na vama. Važno je da se ne zbunite kad tako vidite da neko kodira enumeraciju. Možete se pitati zašto ovako zaobilazno ispitujemo koji broj u godini je mesec na hrvatskom jeziku, zašto u ovom programu uopšte koristimo enumeraciju? To je prvo zato što je ovo jednostavan primer, zatim što nije retkost videti kod gde se koristi enumeracija dok bi se mogla zaobići. Zamislite da imate u projektu više puta ispitivanja po mesecima. Za to je uvek bolje i čitljivije koristili jednu enumeraciju koju ispitujete. Drugo, mali trik; kad vi u Visual Studio 2015 ukucate switch zatim pritisnete Tab na tastaturi, zatim u zagradi unesete ime enumeracije i pritisnete Enter. IDE će sam ispisati sve case statment-e koje sadrži enumeracija. To olakšava i ubrzava kodiranje. Verovatno ste primetili da član enumeracije January ima dodeljenu vrednost 1. To znači da enumeracija months broji članove od 1, inače enumeracije se broje od 0. Vi možete dodeliti brojne vrednosti enumeracije svakom članu kako god hoćete. Kako to sve izgleda možete pogledati i na video-u:

 

( C++ Tutorial - 12. Enumeration )