Uvod u strukture i unije
U ovoj lekciji upoznaćemo se sa osnovnim pojmovima, razlikama između struktura i unija, kao i njihovom praktičnom primenom u C++ jeziku i drugim programskim jezicima. Posebno ćemo videti kako se strukture koriste u algoritmima i strukturama podataka radi organizovanijeg i efikasnijeg programiranja.
U programiranju, često se javlja potreba da se više različitih podataka posmatra kao jedna logička celina. Na primer, podatke o studentu možemo posmatrati kao skup — ime, prezime, broj indeksa, ocene. Umesto da svaki od tih podataka čuvamo u posebnoj promenljivoj, možemo ih grupisati u jednu strukturu.
Šta su strukture?
Struktura (struct) je složeni tip podataka koji omogućava grupisanje različitih tipova podataka pod jednim imenom.
Svaki element strukture naziva se član ili polje strukture.
Strukture omogućavaju jednostavniju organizaciju podataka i lakši pristup složenim objektima u programima.
// Primer strukture u C++
#include <iostream>
using namespace std;
struct Student {
string ime;
string prezime;
int brojIndeksa;
double prosek;
};
int main() {
Student s1;
s1.ime = "Marko";
s1.prezime = "Petrović";
s1.brojIndeksa = 123;
s1.prosek = 9.4;
cout << "Student: " << s1.ime << " " << s1.prezime << endl;
cout << "Broj indeksa: " << s1.brojIndeksa << endl;
cout << "Prosek: " << s1.prosek << endl;
return 0;
}
Struktura u memoriji (C++)
Na slici 1 je prikazana struktura Student u programskom jeziku C++. Prikazane su dve instance ove strukture — s1 i s2. Cilj ilustracije je da jasno pokaže da svaka instanca strukture ima sopstveni, odvojen prostor u memoriji.
Definicija strukture
struct Student { int id; float prosek; }; Objašnjenje članova:
id— celobrojni identifikator studenta (tipint), obično zauzima 4 bajta.prosek— prosek ocena (tipfloat), obično zauzima 4 bajta.
Šta slika prikazuje
Na dijagramu su prikazana dva odvojena bloka memorije: jedan za s1, drugi za s2. Svaki blok sadrži polja id i prosek u istom redosledu. To znači da:
- vrijednosti
s1.idis1.prosekne utiču nas2— one su fizički smeštene na različitim adresama; - veličina jedne instance strukture je zbir (sa eventualnim poravnanjem) veličina njenih članova — u ovom primeru ~8 bajta;
- redosled članova obično određuje način rasporeda u memoriji (kompajler može dodati padding iz razloga poravnanja).
Primer inicijalizacije (C++)
Student s1 = {101, 9.5f}; Student s2 = {102, 8.7f}; Nakon ovoga u memoriji imamo:
s1.id= 101 is1.prosek= 9.5 u blokus1;s2.id= 102 is2.prosek= 8.7 u blokus2;- obje instance zauzimaju isti raspored bajtova, ali na različitim adresama.
Važne napomene
- Ovakav prikaz pomaže da se razume zašto promena polja
s1ne menjas2. - Ako želiš da štediš memoriju i znaš da ti neće trebati oba podatka istovremeno, koristi
union— ali tada članovi dele isti memorijski prostor. - Na nekim arhitekturama postoji padding između članova radi poravnanja; to znači da stvarna veličina strukture može biti veća od prostog zbira veličina članova.
Šta su unije?
Unija (union) je slična strukturi, ali se njeni članovi preklapaju u memoriji.
To znači da svi članovi unije dele isti prostor, pa unija u jednom trenutku može sadržati samo jednu aktivnu vrednost.
Koristi se kada je potrebno uštedeti memoriju, ili kada isti deo memorije treba tumačiti na više načina.
// Primer unije u C++
#include <iostream>
using namespace std;
union Broj {
int ceo;
float realan;
};
int main() {
Broj b;
b.ceo = 10;
cout << "Ceo broj: " << b.ceo << endl;
b.realan = 3.14;
cout << "Realan broj: " << b.realan << endl;
// Napomena: vrednost 'b.ceo' sada više nije validna
return 0;
}
Razlike između strukture i unije
- Struktura čuva sve članove istovremeno, dok unija koristi zajednički prostor u memoriji.
- Struktura troši više memorije (zbir svih članova), dok unija zauzima memoriju veličine najvećeg člana.
- Strukture se koriste za modelovanje kompleksnih entiteta, dok se unije koriste za optimizaciju i posebne slučajeve interpretacije podataka.
Primena u algoritmima
U oblasti algoritama i struktura podataka, strukture se koriste za definisanje složenih tipova kao što su čvorovi stabala, elementi liste ili zapisi u tabelama. Unije su ređe, ali mogu biti korisne u sistemskom programiranju i pri radu sa binarnim formatima podataka.
Dalje teme
- Strukture sa pokazivačima (za izradu povezanih lista)
- Ugnježdene strukture i strukture unutar nizova
- Korišćenje struktura kao parametara funkcija
- Kombinacija struktura i unija
Strukture u različitim programskim jezicima
Koncept strukture (struct) prisutan je u mnogim programskim jezicima, jer omogućava da se više međusobno povezanih podataka grupiše u jednu logičku celinu.
Strukture su posebno karakteristične za jezike poput C i C++, ali postoje i u modernim jezicima kao što su C#, Go i Rust,
gde se koriste za modelovanje složenijih tipova podataka.
U programskom jeziku C, strukture su namenjene isključivo za čuvanje podataka, dok u C++ mogu imati i metode, konstruktore i destruktore, što ih čini sličnim klasama. U nastavku je prikazan jednostavan primer definicije i korišćenja strukture u C jeziku.
// Primer: Struktura u C jeziku
#include <stdio.h>
// Definicija strukture
struct Student {
char ime[50];
int godina;
float prosek;
};
int main() {
// Deklaracija promenljive tipa strukture
struct Student s1;
// Dodela vrednosti poljima strukture
printf("Unesite ime studenta: ");
scanf("%s", s1.ime);
printf("Unesite godinu studija: ");
scanf("%d", &s1.godina);
printf("Unesite prosek studenta: ");
scanf("%f", &s1.prosek);
// Ispis unetih podataka
printf("\nStudent: %s\nGodina: %d\nProsek: %.2f\n", s1.ime, s1.godina, s1.prosek);
return 0;
}
U ovom primeru struktura Student grupiše tri različita podatka — tekstualno ime, ceo broj i decimalnu vrednost.
Na ovaj način moguće je organizovati podatke koji zajedno čine jednu logičku celinu, bez potrebe za više odvojenih promenljivih.
Objašnjenje ilustracije: Unija (primer — podaci senzora)
Na slici je prikazana unija (C++ union) koja modeluje podatke jednog senzora — konkretno članovi unije su temperatura, vlažnost i status. Cilj ilustracije je da prikaže osnovnu ideju: svi članovi unije dele isti memorijski prostor.
Šta znači „dele isti memorijski prostor”?
- Svi članovi (npr.
float temperatura,float vlaznost,char status[10]) nalaze se na istim adresama RAM-a — oni se fizički preklapaju. - Kada upišeš vrednost u jedan član, on prepiše bajtove koji su pre toga mogli sadržati neku drugu vrednost.
- Zbog toga u datom trenutku samo jedan član ima smislen (valjan) podatak — onaj koji je poslednji upisan.
Kako se to koristi u praksi?
Unije su korisne kada znaš da u datom trenutku treba čuvati samo jednu od više mogućih reprezentacija podataka. Tipični primeri:
- uređaj koji ponekad vraća temperaturu, ponekad vlagu, ponekad status (tekst);
- interpretracija istih bajtova kao različitih tipova (npr. rad sa bitovima ili konverzija tipova);
- u mikrokontrolerima — pregled registara kao bajta ili kao zasebnih bitova.
Krakt kod-primer (C++)
union SensorData { float temperatura; // npr. 4 bajta float vlaznost; // npr. 4 bajta (isti prostor kao temperatura) char status[10]; // npr. 10 bajtova -> unija će zauzeti najmanje 10 bajtova };
SensorData d;
d.temperatura = 23.5f; // sada je važeća temperatura
// d.vlaznost i d.status nisu validni dok se ne upišu
d.vlaznost = 55.2f; // ovo prepisuje isti memorijski prostor
Važne napomene i dopunska objašnjenja
- Veličina unije je jednaka veličini njenog najvećeg člana — u primeru iznad to je niz od 10 bajtova.
- Poslednji upis određuje šta je „validno” u uniji — čitanje nekog drugog člana bez prethodnog upisa može dati nepredvidive rezultate.
- Da bi zadržao više vrednosti istovremeno (npr.
idiprosekza studenta), treba koristitistruct, neunion. - Unije su pogodne za uštedu memorije kada je kritično da zauzmeš što manje RAM-a i kada je jasno da se koristi samo jedna interpretacija podataka u svakom trenutku.
- U kombinaciji sa dodatnim poljima u strukturi moguće je imati i trajne (nezavisne) podatke i jedan „promenljivi” deo koji je unija, npr.:
struct Measurement { int sensorId; union { float temp; float hum; char status[10]; } data; }; Sažetak
Ilustracija jasno pokazuje suštinu: unija ne čuva sve članove odjednom, već samo jednu aktivnu interpretaciju istog memorijskog bloka. To je moćno kada se koristi pravilno — štedi prostor i olakšava rad sa različitim formatima podataka — ali zahteva pažnju pri čitanju i pisanju vrednosti.
Strukture u C++ jeziku — napredne mogućnosti i poređenje sa klasama
U programskom jeziku C++, strukture (struct) su proširene u odnosu na C.
One više nisu samo kolekcije podataka — mogu sadržati i funkcije (metode), kao i konstruktore, destruktore,
static članove, pa čak i private i public sekcije.
Razlika između strukture i klase u C++ jeziku je minimalna: kod strukture su članovi po defaultu javni (public), dok su kod klase privatni (private).
// Primer: Struktura u C++ jeziku
#include <iostream>
#include <string>
using namespace std;
struct Student {
string ime;
int godina;
double prosek;
// Konstruktor
Student(string i, int g, double p) {
ime = i;
godina = g;
prosek = p;
}
// Metod za prikaz informacija
void prikazi() {
cout << "Student: " << ime << endl;
cout << "Godina: " << godina << endl;
cout << "Prosek: " << prosek << endl;
}
};
int main() {
// Kreiranje objekta pomoću konstruktora
Student s1("Ana", 2, 9.3);
// Pozivanje metode
s1.prikazi();
return 0;
}
Kao što se vidi u primeru, struktura Student sada ima konstruktor i metod prikazi().
Ovo pokazuje da se strukture u C++ ponašaju gotovo identično kao klase.
U modernom C++ programiranju, strukture se najčešće koriste za jednostavne podatkovne tipove (data structures),
dok se klase koriste za složenije objekte i logiku programa.
Ovakav pristup čini C++ veoma fleksibilnim — omogućava korišćenje istih principa objektno orijentisanog programiranja i u jednostavnijim strukturama podataka.
Unije (union) — zajednička memorija za različite tipove podataka
Unije u C i C++ jeziku predstavljaju posebnu vrstu strukture koja omogućava da više promenljivih deli istu memorijsku lokaciju. Drugim rečima, svi članovi unije koriste isti blok memorije, ali u jednom trenutku aktivan može biti samo jedan od njih.
Koriste se kada je potrebno da se uštedi memorija ili kada promenljiva može imati različite oblike podataka u zavisnosti od konteksta.
// Primer: Upotreba unije
#include <iostream>
#include <cstring>
using namespace std;
union Podatak {
int ceoBroj;
float realanBroj;
char tekst[20];
};
int main() {
Podatak p;
p.ceoBroj = 42;
cout << "Ceo broj: " << p.ceoBroj << endl;
p.realanBroj = 3.14;
cout << "Realan broj: " << p.realanBroj << endl;
strcpy(p.tekst, "Test unije");
cout << "Tekst: " << p.tekst << endl;
return 0;
}
U ovom primeru, svi članovi (ceoBroj, realanBroj i tekst) zauzimaju istu memorijsku lokaciju.
Svaka nova dodela vrednosti „prepisuje“ prethodnu, pa u datom trenutku samo poslednje dodeljena vrednost ima smisla.
Razlike između strukture i unije
- U strukturi svaki član ima svoju memorijsku lokaciju — svi članovi mogu postojati istovremeno.
- U uniji svi članovi dele istu memoriju — aktivan je samo jedan član u datom trenutku.
- Veličina unije jednaka je veličini njenog najvećeg člana.
Praktična primena unija
Unije su naročito korisne u:
- Uređajskim drajverima – kada se isti podaci mogu tumačiti na više načina.
- Radom sa binarnim podacima – npr. interpretacija istog niza bajtova kao broja, teksta ili strukture.
- Programima niskog nivoa – kada se upravlja memorijom ili komunicira sa hardverom.
Zaključak
Unije su moćan, ali potencijalno rizičan mehanizam. Zbog zajedničke memorije, nepažljivo korišćenje može dovesti do gubitka podataka. Ipak, u situacijama kada je memorijska efikasnost od presudnog značaja, unije su izuzetno korisne i često se koriste u kombinaciji sa strukturama.
Kombinovanje struktura i unija — praktičan primer
U praksi se često kombinuju strukture i unije kako bi se dobila fleksibilna i efikasna organizacija podataka. Unija može biti član strukture, čime se omogućava da neki delovi strukture dele memoriju, dok drugi ostaju nezavisni.
// Primer: Struktura sa unijom
#include <iostream>
#include <cstring>
using namespace std;
struct Zaposleni {
char ime[30];
int tipPlata; // 0 = fiksna, 1 = po satu
union Plata {
int fiksna;
float poSatu;
} plata;
};
int main() {
Zaposleni z;
strcpy(z.ime, "Marko");
z.tipPlata = 0; // Fiksna plata
z.plata.fiksna = 3000;
cout << "Ime: " << z.ime << endl;
if (z.tipPlata == 0)
cout << "Fiksna plata: " << z.plata.fiksna << endl;
else
cout << "Plata po satu: " << z.plata.poSatu << endl;
z.tipPlata = 1; // Menjamo na platu po satu
z.plata.poSatu = 15.5;
if (z.tipPlata == 0)
cout << "Fiksna plata: " << z.plata.fiksna << endl;
else
cout << "Plata po satu: " << z.plata.poSatu << endl;
return 0;
}
Analiza memorijskog rasporeda
- Članovi unije
Platadele istu memorijsku lokaciju — zauzima prostor najvećeg člana (float ili int). - Ostatak strukture (
imeitipPlata) zauzima svoje zasebne lokacije. - Ovime se štedi memorija i omogućava fleksibilno predstavljanje različitih tipova plata u okviru iste strukture.
Prednosti kombinovanja
- Efikasna memorijska upotreba u situacijama kada neki podaci nisu aktivni istovremeno.
- Jasna i logična organizacija podataka unutar strukture.
- Povećava čitljivost i modularnost koda, olakšava održavanje.
Zaključak
Kombinacija struktura i unija je snažan alat u C i C++ jeziku za rad sa složenim podacima. Primenom ovakvih konstrukcija programer može postići i fleksibilnost i efikasnost memorije, što je posebno korisno u sistemskom i takmičarskom programiranju.
Unije u C i C++
Unije su specifična struktura podataka koja omogućava da više različitih tipova podataka deli istu memorijsku lokaciju. Za studente može biti nejasno kada i zašto koristiti unije, zato je važno objasniti praktične scenarije njihove primene.
Upozorenje: Budite oprezni pri korišćenju unija, jer istovremeni pristup različitim članovima može dovesti do nepredvidivih rezultata. Koristite ih samo kada je poznato da će se u jednom trenutku koristiti samo jedan od članova.
Primer upotrebe unije u C/C++
// Definicija unije
union Podaci {
int ceo_broj;
float realan_broj;
char karakter;
};
#include <iostream>
using namespace std;
int main() {
Podaci p;
p.ceo_broj = 42;
cout << "Ceo broj: " << p.ceo_broj << endl;
// Sada upisujemo realan broj, što menja sadržaj iste memorije
p.realan_broj = 3.14;
cout << "Realan broj: " << p.realan_broj << endl;
// Pristup prethodnom članu sada nije pouzdan
cout << "Ceo broj posle upisa realnog: " << p.ceo_broj << endl;
return 0;
}
Kada koristiti unije:
- Kada je potrebno uštedeti memoriju i u svakom trenutku koristimo samo jedan od tipova podataka.
- U strukturama koje kombinuju različite vrste podataka, ali nikada ne aktiviraju više članova odjednom.
Kada ne koristiti unije:
- Za situacije gde je potrebno istovremeno čuvanje više različitih vrednosti.
- Kada postoji rizik da se nepredviđeno pristupi pogrešnom članu, što može izazvati greške i nepredvidivo ponašanje programa.
Kompozicija struktura i unija
U praksi se često koriste strukture koje u sebi sadrže unije, kada je potrebno da određena grupa podataka deli memoriju, ali da ostane logički povezana. Ovo omogućava efikasnije korišćenje memorije i bolju organizaciju podataka.
Primer u C/C++
// Struktura koja sadrži uniju
#include <iostream>
using namespace std;
struct Merenje {
int tip; // 0 = celobrojno, 1 = realan broj, 2 = karakter
union {
int ceo_broj;
float realan_broj;
char karakter;
} vrednost;
};
int main() {
Merenje m;
// Celobrojno merenje
m.tip = 0;
m.vrednost.ceo_broj = 100;
cout << "Tip: " << m.tip << ", Ceo broj: " << m.vrednost.ceo_broj << endl;
// Realno merenje
m.tip = 1;
m.vrednost.realan_broj = 3.14;
cout << "Tip: " << m.tip << ", Realan broj: " << m.vrednost.realan_broj << endl;
// Karakter
m.tip = 2;
m.vrednost.karakter = 'A';
cout << "Tip: " << m.tip << ", Karakter: " << m.vrednost.karakter << endl;
return 0;
}
Objašnjenje:
- Struktura
Merenjesadrži informaciju o tipu podatka koji se trenutno koristi. - Unija
vrednostomogućava da se na istoj memorijskoj lokaciji čuva samo jedan tip podatka u jednom trenutku. - Ovakva kombinacija je korisna kada želimo da logički grupišemo podatke, ali istovremeno uštedimo memoriju.
Saveti za korišćenje:
- Uvek prati vrednost
tippre pristupa uniji da izbegneš neočekivane rezultate. - Ovaj pristup je čest u sistemskom programiranju, enkodovanju protokola i aplikacijama gde je memorija kritična.
Dijagram memorijske organizacije
Ispod je vizuelni prikaz kako struktura Merenje koristi uniju vrednost. Svaka linija predstavlja memorijsku lokaciju:
+-----------------+ | tip (int) | // čuva tip podatka: 0=ceo, 1=real, 2=char +-----------------+ | vrednost | // unija: koristi istu lokaciju za sve tipove | +-----------+ | | | ceo_broj | // ako je tip=0 | +-----------+ | | | realan_broj | // ako je tip=1 | +-----------+ | | | karakter | // ako je tip=2 | +-----------+ | +-----------------+
Napomena: Unija deli istu memoriju za sve svoje članove, pa se samo jedan tip podatka može koristiti u jednom trenutku.
Ovo štedi memoriju, ali zahteva da se uvek prati tip pre pristupa podacima.
Ovakav prikaz pomaže studentima da vizuelizuju kako se podaci smeštaju u memoriju i zašto kombinacija struktura i unija može biti korisna u praktičnim aplikacijama kao što su sistemsko programiranje i rad sa protokolima.
Odvojeni deo za unije
Unije su napredna tema i studentima može biti nejasno kada i kako ih koristiti. U osnovi, unija omogućava da različiti tipovi podataka dele istu memorijsku lokaciju, ali se u jednom trenutku koristi samo jedan tip.
Upozorenja i preporuke
- Uvek pratite vrednost kontrolnog polja (npr.
tip) pre pristupa članovima unije, kako ne bi došlo do nepredviđenih rezultata. - Ne koristite unije za situacije kada želite istovremeno čuvati više tipova podataka — u tom slučaju je struktura bolja.
- Unije su korisne kada je memorija kritična ili kada radite sa niskonivojskim podacima (npr. enkodovanje protokola, sistemsko programiranje).
Praktični primeri kada koristiti unije
- Sistem za merenje gde svaki podatak može biti
int,floatilichar, ali nikada više od jednog tipa u isto vreme. - Dekodovanje paketa protokola gde različiti tipovi polja dele istu memorijsku lokaciju u zavisnosti od vrste poruke.
- Takmičarski programerski zadaci gde je potrebno efikasno koristiti memoriju prilikom simulacije različitih tipova podataka.
Zaključak: Unije se koriste kada želimo da logički grupišemo podatke i uštedimo memoriju, ali je ključna pravilna kontrola tipa. Kombinacija struktura i unija je često optimalno rešenje.
Primena struktura i unija u C#
U C# se koriste struct za kreiranje tipova vrednosti koji grupišu više polja.
Iako C# nema direktne unije kao u C/C++, moguće je postići sličan efekat korišćenjem [StructLayout(LayoutKind.Explicit)] i [FieldOffset] atributa.
Primer strukture u C#
// Struktura u C# koja sadrži različite tipove podataka
using System;
struct Merenje {
public int Tip; // 0 = int, 1 = float, 2 = char
public int CeoBroj;
public float RealanBroj;
public char Karakter;
}
class Program {
static void Main() {
Merenje m;
// Celobrojno merenje
m.Tip = 0;
m.CeoBroj = 100;
Console.WriteLine($"Tip: {m.Tip}, Ceo broj: {m.CeoBroj}");
// Realno merenje
m.Tip = 1;
m.RealanBroj = 3.14f;
Console.WriteLine($"Tip: {m.Tip}, Realan broj: {m.RealanBroj}");
// Karakter
m.Tip = 2;
m.Karakter = 'A';
Console.WriteLine($"Tip: {m.Tip}, Karakter: {m.Karakter}");
}
}
Simulacija unija u C#
// Korišćenje Explicit Layout za simulaciju unije
using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
struct MerenjeUnion {
[FieldOffset(0)] public int CeoBroj;
[FieldOffset(0)] public float RealanBroj;
[FieldOffset(0)] public char Karakter;
[FieldOffset(4)] public int Tip; // dodatno polje za kontrolu tipa
}
class Program {
static void Main() {
MerenjeUnion m;
m.Tip = 0;
m.CeoBroj = 42;
Console.WriteLine($"Tip: {m.Tip}, Ceo broj: {m.CeoBroj}");
m.Tip = 1;
m.RealanBroj = 3.14f;
Console.WriteLine($"Tip: {m.Tip}, Realan broj: {m.RealanBroj}");
m.Tip = 2;
m.Karakter = 'Z';
Console.WriteLine($"Tip: {m.Tip}, Karakter: {m.Karakter}");
}
}
Napomena:
- U C# je važno koristiti Tip ili sličan kontrolni mehanizam da se zna koji član trenutno sadrži validne podatke.
- Ova tehnika je korisna kada želimo da uštedimo memoriju, posebno u sistemskim ili performansno kritičnim aplikacijama.
Praktični zadaci sa strukturama i unijama
U ovoj sekciji se nalaze primeri zadataka koji pomažu u učenju i vežbanju rada sa strukturama i unijama u C/C++ i C#.
Zadaci
- Definiši strukturu za auto:
Napraviti strukturu koja sadrži informacije o automobilu: marka, model, godina proizvodnje, cena.
Cilj: Vežbati kreiranje struktura sa različitim tipovima podataka.
- Definiši uniju za različite tipove podataka:
Napravi uniju koja može da sadrži int, float ili char i strukturu koja prati koji tip je trenutno aktivan.
Cilj: Razumevanje korišćenja unija i kontrolnih polja za praćenje tipa podataka.
- Struktura sa unutrašnjom unijom:
Napraviti strukturu koja sadrži ime zaposlenog i uniju za čuvanje njegove dodatne informacije (broj zaposlenih sati, ocena u procentima ili inicijal karakter).
Cilj: Vežbanje kombinovanja struktura i unija za efikasnu memorijsku organizaciju.
- C# struktura i simulacija unije:
Definisati C#
structsa više polja i simulirati uniju koristeći[StructLayout(LayoutKind.Explicit)]i[FieldOffset].Cilj: Razumevanje kako C# omogućava kontrolu nad memorijom i simulaciju unija.
Napomena: Ovi zadaci su odlična priprema za praktične primene u algoritmima i sistemskom programiranju. Nakon što ih rešite, možete vizuelizovati kako se podaci smeštaju u memoriju i kako različiti tipovi utiču na veličinu i raspored struktura.
Rešenja praktičnih zadataka sa strukturama i unijama
1. Struktura za auto (C/C++)
// Definisanje strukture za automobil
#include <iostream>
#include <string>
using namespace std;
struct Auto {
string marka;
string model;
int godina;
double cena;
};
int main() {
Auto a;
// Unos podataka
a.marka = "Toyota";
a.model = "Corolla";
a.godina = 2020;
a.cena = 15000.50;
// Ispis podataka
cout << "Marka: " << a.marka << ", Model: " << a.model
<< ", Godina: " << a.godina << ", Cena: " << a.cena << endl;
return 0;
}
2. Unija za različite tipove podataka (C/C++)
// Definisanje unije i strukture koja prati tip
#include <iostream>
using namespace std;
struct Vrednost {
int tip; // 0=int, 1=float, 2=char
union {
int ceo_broj;
float realan_broj;
char karakter;
} podatak;
};
int main() {
Vrednost v;
v.tip = 0;
v.podatak.ceo_broj = 42;
cout << "Tip: " << v.tip << ", Ceo broj: " << v.podatak.ceo_broj << endl;
v.tip = 1;
v.podatak.realan_broj = 3.14;
cout << "Tip: " << v.tip << ", Realan broj: " << v.podatak.realan_broj << endl;
v.tip = 2;
v.podatak.karakter = 'A';
cout << "Tip: " << v.tip << ", Karakter: " << v.podatak.karakter << endl;
return 0;
}
3. Struktura sa unutrašnjom unijom (C/C++)
// Strukturisani zapis sa unijom
#include <iostream>
#include <string>
using namespace std;
struct Zaposleni {
string ime;
int tip; // 0=int sati, 1=float procenat, 2=char inicijal
union {
int sati;
float procenat;
char inicijal;
} dodatak;
};
int main() {
Zaposleni z;
z.ime = "Marko";
// Primer sa sati
z.tip = 0;
z.dodatak.sati = 40;
cout << z.ime << ", Tip: " << z.tip << ", Sati: " << z.dodatak.sati << endl;
// Primer sa procenat
z.tip = 1;
z.dodatak.procenat = 95.5;
cout << z.ime << ", Tip: " << z.tip << ", Procenat: " << z.dodatak.procenat << endl;
return 0;
}
4. C# struktura i simulacija unije
// Struktura u C# i simulacija unije
using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
struct Vrednost {
[FieldOffset(0)] public int ceo_broj;
[FieldOffset(0)] public float realan_broj;
[FieldOffset(0)] public char karakter;
}
struct Merenje {
public int tip; // 0=int, 1=float, 2=char
public Vrednost podatak;
}
class Program {
static void Main() {
Merenje m;
m.tip = 0;
m.podatak.ceo_broj = 100;
Console.WriteLine($"Tip: {m.tip}, Ceo broj: {m.podatak.ceo_broj}");
m.tip = 1;
m.podatak.realan_broj = 3.14f;
Console.WriteLine($"Tip: {m.tip}, Realan broj: {m.podatak.realan_broj}");
m.tip = 2;
m.podatak.karakter = 'A';
Console.WriteLine($"Tip: {m.tip}, Karakter: {m.podatak.karakter}");
}
}
Komentar: Ovi primeri pokazuju kako se koriste strukture i unije u različitim jezicima. U C/C++ unija direktno deli memoriju, dok u C# koristimo StructLayout(LayoutKind.Explicit) da simuliramo isti efekat. Vežbanjem ovih primera učenici bolje razumeju memorijsku organizaciju i praktičnu upotrebu kombinacija struktura i unija.
Vežbe i zadaci za samostalno rešavanje
Ovi zadaci su dizajnirani da učenici praktično primene znanja o strukturama i unijama. Svaki zadatak uključuje kratak opis i predlog šta treba implementirati.
1. Definiši strukturu za auto
- Napraviti strukturu
Autokoja sadrži:marka,model,godinaicena. - Napisati program koji unosi podatke za 3 automobila i ispisuje ih.
- Opcionalno: sortirati automobile po godini ili ceni.
2. Definiši uniju za različite tipove podataka
- Napraviti uniju koja može čuvati
int,floatilichar. - Kombinovati sa strukturom koja prati tip trenutnog podatka.
- Napisati program koji demonstrira korišćenje svih tipova podataka iz unije.
3. Struktura sa unutrašnjom unijom
- Napravi strukturu
Zaposlenikoja sadrži ime i uniju sa:sati,procenatiinicijal. - Program treba da unosi vrednosti različitih tipova i ispisuje rezultate.
- Uputiti učenike da uvek proveravaju tip pre pristupa uniji.
4. Vežba za C# – simulacija unije
- Napraviti strukturu
Merenjekoja sadržitipi simuliranu unijuVrednostkoristećiStructLayout(LayoutKind.Explicit). - Program treba da demonstrira čuvanje
int,floaticharvrednosti, sa odgovarajućim ispisom. - Cilj: razumeti kako se deli memorija u uniji i kako se tip prati u C#.
Savet za učenike
- Uvek proveriti tip pre pristupa uniji da bi izbegli neočekivane rezultate.
- Razmišljati o efikasnosti memorije i kada je korisno koristiti unije.
- Probati kombinacije više struktura sa unijama da se stekne praktično iskustvo.

