10.10. Definisanje nabrojivog i strukturnog tipa
U programiranju često želimo da definišemo sopstvene tipove podataka, koji bolje opisuju pojmove iz realnog sveta.
U C jeziku to smo radili pomoću enum i struct, a isto postoji i u C# jeziku, ali sa određenim razlikama.
Ovi tipovi su osnova prelaska sa proceduralnog programiranja (C) na objektno (C#), jer predstavljaju naše sopstvene strukture podataka koje se ponašaju kao prave „mini klase“.
1. čas – Nabrojivi tip (enum)
Nabrojivi tip (enumeracija) koristi se kada promenljiva može imati samo nekoliko diskretnih vrednosti, koje unapred znamo.
Na primer, ako imamo dane u nedelji, ne želimo da ih predstavljamo brojevima 1–7, već imenima.
Enum u C jeziku
U C jeziku definiše se ovako:
enum Dani { Ponedeljak, Utorak, Sreda, Cetvrtak, Petak, Subota, Nedelja };
Promenljiva tog tipa:
enum Dani danas;
danas = Sreda;
U C-u, svaka vrednost u enum zapravo je celobrojna konstanta, počev od 0 (može se ručno promeniti):
enum Dani { Ponedeljak = 1, Utorak, Sreda };
Enum u C# jeziku
U C# sintaksa je slična:
enum Dani { Ponedeljak, Utorak, Sreda, Cetvrtak, Petak, Subota, Nedelja }
Koristi se ovako:
Dani danas = Dani.Sreda;
Console.WriteLine(danas);
Rezultat:
Sreda
U C#, svaka vrednost enum tipa takođe ima celobrojnu vrednost (od 0 naviše),
ali možemo je eksplicitno zadati:
enum Dani { Ponedeljak = 1, Utorak, Sreda, Cetvrtak, Petak, Subota, Nedelja }
Možemo čak i pretvarati između tipa int i enum:
int broj = (int)Dani.Petak; // broj = 5
Dani dan = (Dani)3; // dan = Cetvrtak
Prednost u odnosu na obične brojeve
Umesto da pišemo:
int dan = 3; // nije jasno koji dan
pišemo:
Dani dan = Dani.Sreda;
Ovo čini kod čitljivijim i bezbednijim.
Zadatak 1
Napisati program koji koristi nabrojivi tip Boje sa vrednostimaCrvena, Zelena, Plava, Zuta,
Ljubicasta.
Korisnik unosi broj od 0 do 4, a program ispisuje naziv boje.
using System;
enum Boje { Crvena, Zelena, Plava, Zuta, Ljubicasta }
class Program
{
static void Main()
{
Console.Write("Unesite broj boje (0-4): ");
int n = int.Parse(Console.ReadLine());
Boje boja = (Boje)n;
Console.WriteLine("Izabrali ste boju: " + boja);
}
}
Primer izlaza:
Unesite broj boje (0-4): 2
Izabrali ste boju: Plava
2. čas – Strukturni tip (struct)
Struktura (struct) je tip podataka koji definiše korisnik i koji u sebi sadrži više različitih promenljivih – kao što su ime, prezime, ocena itd.
U C jeziku i C# strukture izgledaju slično, ali C# strukture imaju objektne osobine – mogu imati metode, konstruktore i svojstva.
Struktura u C jeziku
struct Student {
char ime[20];
int godina;
float prosek;
};
struct Student s1 = { "Ana", 3, 8.5 };
Pristup elementima:
printf("%s ima prosek %.2f", s1.ime, s1.prosek);
Struktura u C# jeziku
U C# izgleda slično, ali koristi se objektni zapis:
struct Student
{
public string Ime;
public int Godina;
public double Prosek;
}
Korišćenje:
Student s1;
s1.Ime = "Ana";
s1.Godina = 3;
s1.Prosek = 8.5;
Console.WriteLine(s1.Ime + " ima prosek " + s1.Prosek);
Struktura sa konstruktorom
U C# možemo dodati konstruktor da pojednostavimo stvaranje objekta:
struct Student
{
public string Ime;
public int Godina;
public double Prosek;
public Student(string ime, int godina, double prosek)
{
Ime = ime;
Godina = godina;
Prosek = prosek;
}
}
class Program
{
static void Main()
{
Student s1 = new Student("Marko", 4, 9.2);
Console.WriteLine(s1.Ime + " ima prosek " + s1.Prosek);
}
}
Zadatak 2
Napisati program koji definiše strukturu Film sa poljima:
-
Naslov(string) -
Godina(int) -
Ocena(double)
Korisnik unosi podatke za jedan film i program ih zatim ispisuje.
using System;
struct Film
{
public string Naslov;
public int Godina;
public double Ocena;
}
class Program
{
static void Main()
{
Film f1;
Console.Write("Unesite naslov filma: ");
f1.Naslov = Console.ReadLine();
Console.Write("Unesite godinu: ");
f1.Godina = int.Parse(Console.ReadLine());
Console.Write("Unesite ocenu (1-10): ");
f1.Ocena = double.Parse(Console.ReadLine());
Console.WriteLine("\nFilm: " + f1.Naslov);
Console.WriteLine("Godina: " + f1.Godina);
Console.WriteLine("Ocena: " + f1.Ocena);
}
}
Uporedni pregled (C i C#)
| Koncept | C | C# |
|---|---|---|
| Definisanje enum | enum Dani { Ponedeljak, Utorak } |
isto |
| Definisanje struct | struct Osoba { char ime[20]; int godina; } |
struct Osoba { public string Ime; public int Godina; } |
| Metode u struct | nije moguće | moguće |
| Konstruktor u struct | nije moguće | moguće |
| Ispis enum vrednosti | brojčano | tekstualno (Console.WriteLine(Dani.Ponedeljak) daje “Ponedeljak”) |
| OOP osobine | nema | delimično (struct je vrednosni tip ali ima osobine objekta) |
Zadatak za samostalni rad
Kreirati strukturu Ucenik sa poljima Ime, Razred, Prosek i Pol.
Koristiti i enum tip za Pol (Muski, Zenski).
Program treba da unese podatke o učeniku i ispiše ih u formatu:
Učenik: Ana, IV razred, prosek 4.80, pol: Zenski
Rešenje zadatka - postavlja se posle časa
Zaključak
| Tip | Svrha | Osobine |
|---|---|---|
| enum | Predstavlja fiksni skup imenovanih vrednosti | Čitljiviji kod, sprečava greške pri unosu |
| struct | Kombinuje više polja u jedinstven tip | Omogućava logičko grupisanje podataka |
| C vs C# | U C su obične strukture podataka, u C# imaju i objektne osobine | U C# mogu imati metode i konstruktore |
🧩 Za kraj časa
Diskusiono pitanje:
Ako struktura u C# može imati metode i konstruktor, u čemu se onda razlikuje od klase?
(Odgovor za razmišljanje: struktura je „vrednosni tip“, a klasa je „referentni tip“ – strukture se kopiraju po vrednosti, klase po referenci.)