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

Дефинисање набројивог скупа података

Могао си до сада да приметиш да програмски језик C нуди прилично оскудан избор типова података. У реалном свету, поред бројева и карактера, често ћеш наићи на стандардне скупове података који нису дефинисани у програмском језику C, као на пример називи дана у недељи или називи месеца у години. Овакве скупове података можеш сâм дефинисати помоћу кључне речи enum.

Пошто поменути скупови имају коначан број вредности називају се набројивим (енгл. enumeration). У набројивим скуповима, елементе скупа чине идентификатори, а општи облик дефинисања набројивог скупа података је:

enum ime_skupa { identifikator_1, identifikator_2, ... identifikator_n };

Напиши програм у програмском језику C у којем је дефинисан набројиви скуп података radni_dan чији су елементи: pon, uto, sre, cet и pet.

#include <stdio.h>

int main(void)
{
    enum radni_dan { pon, uto, sre, cet, pet };
    return 0;
}

У решењу задатка, идентификаторима pon, uto, sre, cet и pet редом су додељене целобројне вредности 0, 1, 2, 3 и 4 типа int. Ако би желео да дефинишеш променљиву dan која има вредност uto, то можеш учинити доделом идентификатора uto:

#include <stdio.h>

int main(void)
{
    enum radni_dan { pon, uto, sre, cet, pet };
    enum radni_dan dan = uto;
    return 0;
}

или доделом вредности 1:

#include <stdio.h>

int main(void)
{
    enum radni_dan { pon, uto, sre, cet, pet };
    enum radni_dan dan = 1;
    return 0;
}

Иницијализацију вредности елемената можеш вршити и сâм приликом дефиниције enum скупа, где неки елементи могу бити иницијализовани, а неки само декларисани. У следећем програму…

#include <stdio.h>

int main(void)
{
    enum nastavna_godina { sep = 9, okt, nov, dec, jan = 1, feb, mar, apr, maj, jun };
    return 0;
}

…елемент sep иницијализован је са целобројном вредношћу 9, потом је елементу okt додељена вредност 10, елементу nov вредност 11, елементу dec вредност 12, па је елемент jan иницијализован са вредношћу 1, елементу feb додељена је вредност 2, елементу mar вредност 3 и тако даље. Правило за доделу вредности елементима је једноставно: ако први елемент није иницијализован добиће вредност нула, односно, ако било који елемент осим првог није иницијализован добиће вредност претходног елемента увећану за један.

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

#include <stdio.h>

int main(void)
{
    enum server { ukljucen = 1, onlajn = 1, iskljucen = 0, oflajn = 0, greska = 0 };
    return 0;
}

где су јединицама дефинисана жељена стања (ukljucen и onlajn), а нулама нежељена (iskljucen, oflajn и greska). С друге стране, није дозвољено да различити елементи набројивог скупа буду дефинисани истим идентификатором, чак ни у различитим скуповима. Компајлер ће у следећем програму јавити грешке:

#include <stdio.h>

int main(void)
{
    enum dan_u_nedelji { pon, uto, sre, cet, pet, sub, ned };
    enum radni_dan { pon, uto, sre, cet, pet };
    return 0;
}

јер је програмер у скупу radni_dan покушао да редефинише идентификаторе pon, uto, sre, cet и pet које је већ користио у скупу dan_u_nedelji.

Дефинисање набројивог типа података

У претходној лекцији научио си како да дефинишеш изведене типове података помоћу кључне речи typedef. Комбинацијом кључних речи typedef и enum можеш дефинисати сопствени набројиви тип података. Општи облик дефинисања набројивог типа података је:

typedef enum { identifikator_1, identifikator_2, ... identifikator_n } ime_tipa;

Напиши програм у програмском језику C у којем ће бити дефинисан набројиви тип података radni_dan који може да има вредности pon, uto, sre, cet и pet, у којем је иницијализована променљива dan типа radni_dan са вредношћу uto.

#include <stdio.h>

int main(void)
{
    typedef enum { pon, uto, sre, cet, pet } radni_dan;
    radni_dan dan = uto;
    return 0;
}

За дефинисање набројивог типа података важе иста правила као и за дефинисање набројивог скупа података: променљивама набројивог типа могу се доделити идентификатори из набројивог скупа или одговарајуће целобројне вредности; иницијализација појединих или свих вредности у набројивом скупу може се вршити и у самој дефиницији набројивог типа; дозвољено је да различити елементи набројивог скупа имају исту вредност, али није дозвољено да буду дефинисани истим идентификатором.