Набројиви тип

Набрајање нам омогућава да креирамо скуп константи на које можемо да референцирамо у програму. Набрајање је вредносни тип. Рецимо да пишемо програм који ће се користити у класи астрономије и да програм треба да се референцира на редослед планета у соларном систему у односу на Сунце. Редослед је: Меркур, Венера, Земља, Марс, Јупитер, Сатурн, Нептун и Плутон.

Набрајање се декларише коришћењем кључне речи . У следећој поједностављеној синтакси приказано је како се креира набрајање:

enum ime_nabrajanja { lista-konstanti }

ime_nabrajanja : Име које се додељује набрајању. По конвенцији, прво слово имена набрајања је велико.

lista_konstanti : Листа константи које се налазе у набрајању.

У следећем примеру декларисано је набрајање названо Planete:



enum Planete

{  
    Merkur,
    Venera,
    Zemlja,
    Mars,
    Jupiter,
    Saturn,
    Uran,
    Neptun,
    Pluton  

}

Као што можемо видети, набрајањем Planete дефинише се девет константи, при чему свака константа представља позицију планете у односу на Сунце. Прва константа, Merkur, има подразумевану (default) вредност 0. Остале константе имају за 1 већу вредност у односу на предходну вредност, тако да је константа Venera постављена на 2, константа Zemlja на 3, и тако даље, до константе Pluton, која је постављена на 8. Подразумевани тип за константе у набрајању је int.

Константе у набрајању можемо и иницијализовати, као што је приказано у следећем примеру:


enum Planete

{  
    Merkur = 1,
    Venera = 2,
    Zemlja = 3,
    Mars = 4,
    Jupiter = 5,
    Saturn = 6,
    Uran = 7,
    Neptun = 8,
    Pluton = 9 

 }

Први упис поставља константу Merkur на вредност 1. Као и раније, друге константе се постављају на вредност за 1 већу у односу на предходну вредност, тако да је константа Venera постављена на 2, константа Zemlja на 3, и тако даље све до константе Pluton, која је постављена на 9.

Да бисмо приступили елементу, користимо нотацију тачке. На пример, да бисмо приступили елементу Zemlja, користили бисмо Planete.Zemlja. У следећем примеру приказана је позиција Земље у односу на Сунце:

 
System.Console.WriteLine( "Pozicija Zemlje = " + (int)Planete.Zemlja);

Обратимо пажњу на употребу оператора за конверзију, да би се добила вредност на коју је Земља постављена у набрајању. Овом наредбом приказан је следећи израз:

Pozicija Zemlje = 3;

Ако не одрадимо конверзију оператором за конверзију, онда ће Planete.Zemlja из претходне наредбе вратити стринг "Zemlja" .

Специфицирање вредности у набрајању :
Можемо специфицирати вредност константи у набрајању. На пример, следећа енумерација, названа PeriodicnostPlaneta, дефинише орбиталне периоде ( време које је потребно планети да обиђе Сунце ), за прве четири планете; орбитални периоди су у изражени у данима.

enum PeriodicnostPlaneta

{
    Merkur = 88,
    Venera = 225,
    Zemlja = 365,
    Mars = 687,
}


На следећи начин можемо приказати орбитални период Марса:

System.Console.WriteLine( " Orbitalni period za Mars je : " +  
(int)PeriodicnostPlaneta.Mars+ " dana "  );


Специфицирање основног типа у набрајању :
Као што смо раније поменули, подразумевана вредност ѕа тип енумерације је int . Тип који користи енумерација познат је као основни тип основни тип . У суштини, као основни тип енумерације можемо користити било који целобројни тип. Да бисмо поставили основни тип.ставимо тип након имена енумерације и додајмо две тачке испред типа. На пример, у следећој енумерацији коришћен је тип long као њен основни тип:

enum PeriodicnostPlaneta: long

{
    Merkur = 88,
    Venera = 225,
    Zemlja = 365,
    Mars = 687,
}


Напомена: Иста константа се не може користити у декларацијама различитих набројивих типова података. На пример, дефиниције типова :

enum radnidani { pon, uto, sre, cet, pet };
enum vikend { pet, sub, ned };

су НЕКОРЕКТНЕ, јер се константа pet појављује у дефиницији оба типа .

Ако желимо да добијемо назив вредности нашег enuma можемо да користимо следећу линију кода :

(( PeriodicnostPlaneta)88).ToString();

Ова линија кода би за повратну вредност имала стринг који би био : "Merkur" , уколико бисмо користили претходну енумерацију. На следећем примеру видећемо како можемо користити набројиви тип.

Пример 1. Направити програм који за задати редни број дана у недељи исписује његово име .


Решење:
Направићемо, користећи набројиви тип, енумерацију Dani која ће садржати елементе : ponedeljak, utorak, sreda, cetvrtak, petak , subota, nedelja који ће редом имати вредности 1, 2, 3, 4, 5, 6, 7 . Пре тога направимо форму:


Правимо форму облика:
Преименујемо label-e и button1
Слика 4.61. Почетни изглед форме
Слика 4.62. Изглед форме након преименовања компоненти

//Kreiramo promenljivu k tipa int
int k ;
//Kreiramo enumeraciju Dani i svakom elementu dodajemo vrednost
enum Dani
{
    Ponedeljak = 1,
    Utorak = 2,
    Sreda = 3,
    Cetvrtak = 4,
    Petak = 5,
    Subota = 6, 
    Nedelja = 7  	
}
private void button1_Click(object sender, EventArgs e)
{
    //Uzimamo vrednost za promenljivu k koju je korisnik uneo u textBox1
    k = int.Parse(textBox1.Text) ;
    //U lebeli2 ispisujemo resenje ispisivanjem naziva vrednosti naseg nabrojivog tipa Dani
    label2.Text =k + ". dan u nedelji je : " + ((Dani)k).ToString();
}
 
Покренемо програм и проверимо (за конкретне вредности бројева) :

Слика 4.63. Изглед форме након покретања програма


Пример 2. Направити програм који за задати редни број месеца у години исписује његово име у лабели .



Решење:
Направићемо, користећи набројиви тип, енумерацију Mesec која ће садржати елементе : Januar, Februar, Mart, April, Maj, Jun, Jul, Avgust, Septembar, Oktobar, Novembar, Decembar који ће редом имати вредности 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 . Пре тога направимо форму:


Правимо форму облика:
Преименујемо label-e и button1
Слика 4.64. Почетни изглед форме
Слика 4.65. Изглед форме након преименовања компоненти

//Kreiramo promenljivu k tipa int
int k ;
//Kreiramo enumeraciju Mesec i svakom elementu dodajemo vrednost
enum Mesec
{
    Januar = 1,
    Februar = 2,
    Mart = 3,
    April = 4,
    Maj = 5,
    Jun = 6,
    Jul = 7,
    Avgust = 8,
    Septembar = 9,
    Oktobar = 10,
    Novembar = 11,
    Decembar = 12 	
}
private void button1_Click(object sender, EventArgs e)
{
    //Uzimamo vrednost za promenljivu k koju je korisnik unese preko textBox1
    k = int.Parse(textBox1.Text) ;   
    //U lebeli2 ispisujemo resenje ispisivanjem naziva vrednosti naseg nabrojivog tipa Mesec
    label2.Text =k + ". mesec u godini je : " + ((Mesec)k).ToString();
}


 
Покренемо програм и проверимо (за конкретне вредности бројева) :

Слика 4.66. Изглед форме након покретања програма


Пример 3. Направити програм који за унету оцену из информатике исписује успех ученика (одличан, врло добар, добар, довољан, недовољан) .

Решење :


//Deklarisemo pomocnu promenljivu
int a;
//Kreiramo enumeraciju Ocene, ciji su elementi ocene iz informatike
enum Ocene
{
    nedovoljan = 1,
    dovoljan = 2,
    dobar = 3,
    vrlo_dobar = 4,
    odlican = 5
}
private void button1_Click(object sender, EventArgs e)
{
    //Prihvatamo unetu ocenu iz textBox-a
    a = int.Parse(textBox1.Text);
    //Ispisujemo uspeh u labeli
    label2.Text = "Vas uspeh iz informatike je " + ((Ocene)a).ToString()+ "." ;
}