Nabrajanja

Nabrajanje  konstante su celobrojne simbolicke konstante kojima su vrednosti dodeljene eksplicitno ili  implicitno, nabrajanjem njihovih imena u jednom nizu. Skup odjednom nabrojenih konstanti cini jedno nabrajanje, koje se moze smatrati tipom podataka koji je definisao programer.

Definisanje nabrajanja:

enum ime_nabrajanja {IME_KONSTANTE=vrednost,

IME_KONSTANTE=vrednost,…};

Ime nabrajanja je identifikator koji sluzi za identifikaciju datog nabrajanja. Moze da se izostavi, ali kasnije nije moguce definisati podaci tipa nabrajanja.

IME KONSTANTE je identifikator, koji predstavlja po jednu simbolicku konstantu. Uobicajeno je da imena konstante se pisu samo velikim slovima.

Vrednosti pojedinih simbolickih konstanti mogu da se odrede konstantnim celobrojnim izrazima. Ako iza konstante nema =vrednost, konstanta ce imati vrednost koja je za jedan veca od predhodne konstante u nizu. Ako iza prvog identifikatora u nizu nema vrednosti, prva konstanta imace vrednost 0.

Pr.

enum {NE, DA};

enum { MIN=10, MAX=100, POZELJNO=20};

enum Kvartal1{JAN=1, FEB, MART, APRIL};

typedef enum {CRNA, SIVA, SMEDJA, CRVENA} Boja;

typedef enum Kvartal1 mesec=JAN;

Boja booja=CRVENA +2;

Unije

Unije su složeni tipovi podataka koji omogućavaju da se u isti memorijski prostor, u različitim trenucima, smeštaju podaci različitih tipova.

Unije se difinišu naredbom union, sve ostalo je kao i kod struktura, navode se polja koja su različitog tipa.

Za razliku od struktura, kod kojih sva polja imaju definisanu vrednost, kod unije samo jedno polje u datom trenutku ima definisanu vrednost, polje kome je posljednje dodeljena vrednost.

Ako se inicijalizira unija, u zagradama se stavlja samo jedna vrednost i ako se ne navede čija je vrednost, dodeljuje se  prvom polju

Pr.

struct s {                                                                 union u {
int i;                                                                                int i;
float d;                                                                            float d;
char *c;                                                                          char *c;
};                                                                                 };

Prikaz u operativnoj memoriji:

s: s.i, s.d, s.c -sizeof s, polja se smeštaju u operativnoj memoriji jednoza drugim i svakom od polja se može dodeliti vrednost. Veličina strukture je  jednaka zbiru veličine polja.

U slučaju unije, sva polja se smeštaju počev od iste adrese. Dodela vrednosti jednog polja uništava ranije dodeljenu vrednost nekom drugom polju. Veličina unije odgovara veličini najvećeg polja. (u: u.i
u.d
u.c
– sizeof u)

Pr.1

typedef union u{
int i;
float f;
char c;
} u;

main()
{
u unija;
unija.c=’A’;
unija.i=5;

/* Dozvoljen je pristup samo poslednje dodeljenom clanu unije */
cout<<„Trenutna vrednost unije je,unija.i“<<unija.i; /* U redu je */

/* Pogresno bi bilo da se napise
cout<<„Trenutna vrednost unije je unija.c“<<unija.c;
*/
}

Pr.2 

#include
#include
using namespace std;
union ceo_ili_realan{
int ceo;
float realan;
};
int main(int argc, char *argv[])
{
ceo_ili_realan x;
cout<<„Unesi ceo broj?“<<endl; cin>>x.ceo;
cout<<“ Unija ima vrednost „<<x.ceo<<endl;
cout<<„Unesi realan broj ?“<<endl; cin>>x.realan;
cout<<“ Unija ima vrednost „<<x.realan<<endl;
system(„PAUSE“);
return EXIT_SUCCESS;
}

Struktura podataka

Do sada smo koristili promenljive istog tipa, ukljucujuci i nizove kao skup promenljive istog tipa. Ali često se javlja potreba da se koriste skupovi podataka koje nisu isti po tip- pr. želimo da sačuvamo podatke koije opisuju  jednu ili više knjiga.  Struktura Knjiga treba da sadrži informacije o naslovu knjige, autoru, br- stranica, datuma-izdavanja.

Struktura je kombinacija skupa istih ili različitih tipova podataka definirana pod jednim imenom koje formira sam korisnik, prema svojim potrebama. Svaki podatak strukture naziva se član strukture.

Definicija strukture:

struct ime
{
    tip1 clan1;
    tip2 clan2;
    tip3 clan3;
    ….
    tipN clanN;
};  

gdje je struct ključna riječ koja označava početak najave strukture, ime koju najavljujemo, a unutar zagrada navodimo sve čalnove(varijable) koje želimo kreirati strukturom.

Pr.

struct Kniga

{
string imeKniga;
string imeAutor;
int brojStranica;
string datumIzdavanja;
};

Definicija strukture treba biti izvan funkcija, ma da to nije obavezno. Definicija strukture Knjiga, kao i bilo koja druga struktura koja se kreira na gore navedeni način, ne zauzima memorije i ne kreira promenljive tipa Knjiga. Definicijom strukture kreiramo tip podataka koji se kasnije može koristiti kao i sve ostale tipove podataka (int, char, long, …). Unutar programa promenljive tipa Knjiga se deklarisu kao i sve promenljive bilo kog tipa,

Kniga ImePromenljive- kreira se  promenljiva tipa Knjiga čiji je naziv  ImePromenljive.Kao i svake promenljive i ove promenljive zauzimaju određeni memoriski prostor. Ove promenljive zauzimaju onoliko prostora koliko je potrebno da se čuvaju sve članove strukture. Može se koristiti operator   sizeof() за да одреđivanje  koliko bajti zauzimaju podaci.

Do podatke (članove) strukture pristipa se operatorom ‘.’. Na pr,  ImePromenlive.ImeKniga  pristupa se članu  ImeKniga promenljivoj ImePromenlive.

Pr:

#include
#include

using namespace std;

struct Knjiga
{
string imeKnjiga;
string imeAutor;
int brojStranica;
string datumIzdavanja;
};

int main()
{
Knjiga prva;
prva.imeKnjiga = „C++ Primer Plus (5th Edition)“;
prva.imeAutor = „Stephen Prata“;
prva.brojStranica = 1224;
prva.datumIzdavanja = „25.11.2004“;

Knjiga druga;
druga.imeKnjiga = „C++ Primer Plus (6th Edition)“;
druga.imeAutor = „Stephen Prata“;
druga.brojStranica = 1200;
druga.datumIzdavanja = „28.10.2011“;

//C++ Primer Plus (5th Edition) – Stephen Prata
cout << prva.imeKnjiga << “ – “ << prva.imeAutor << endl;

//C++ Primer Plus (6th Edition) – Stephen Prata
cout << druga.imeKnjiga << “ – “ << druga.imeAutor << endl;

//clanovi strukture ponasaju se kao obi;ne promenljive
//nad svakom od njih mogu se izvrsiti bilo koje operacije
cout << prva.imeKnjiga << “ ima “ << (prva.brojStranica – druga.brojStranica)
<< “ vise stranica od “ << druga.imeKnjiga << endl;

//C++ Primer Plus (5th Edition) ima 24 vise …
//stranica o
{
system(„PAUSE“);
return EXIT_SUCCESS;
}
}

U C++ promenljive koje se kreiraju na osnovu definicije određenog tipa nazivaju se objekti tog tipa. U gornjem primeru prva i druga su objekti tipa Knjiga. Važno je praviti razliku između pojmova tip i  objekat:  тип predstavlja definicija podataka (šta je to  Kniga i koje podatke treba čuvati za jednu knjigu), dok objekti sadrže stvarne podatke  – knjiga sa nazivom  „C++ Primer Plus (5th Edition)“.

C++ omogućava kreiranje objekata (promenljive) struktura posle njene definicije. Znači, između znakova ‘}’ и ‘;‘ možemo zapisati  imena promenljive. Primer kreiranja objekta prva i druga odmah posle definicije strukturnog tipa podataka.

struct Knjiga

{
string imeKnjiga;
string imeAutor;
int brojStranica;
string datumIzdavanja;
} prva, druga;

Primer:

Kreirajte program u kome se unose podatke o: ime, prezime, matični broj, prosek i datum rođenja za sve učenike jednog razreda (najviše 40). Nakon unosa svih podataka traži se učenik s najboljim prosekom; ispišite sve podatke za učenika koji ima najbolji prosek.

Objašnjenje: U programu su definsani dve strukture: datum i ucenik. Struktura datum služi za unos datuma rođenja učenika i sastoji se od dana, meseca i godine rođenja. Druga struktura se zove ucenik i sadrži 2 niza znakova (za ime i prezime), matični broj i prosek ocena. Niz (polje) razred se sastoji od struktura tipa učenik.
Na primer poziv za ispis razred[0].rodjendan.godina daje i za ispis godine rođenja za 1. učenika, a  razred[1].prosek će dati ispis prosjeka za 2. učenika.

Rešenje:

#include
#include
#include
using namespace std;
struct datum
{
int dan;
int mesec;
int godina;
};
struct ucenik
{
char ime[15];
char prezime[15];
int maticni;
float prosek;
struct datum rodjendan;
}razred[40];   /*polje razred čiji su članovi strukture tip ucenik*/
int main()
{
int n,i,k;
float max;
cout<<„\nKoliko ima ucenika? „; cin>>n;
if (n>40)
cout<<„Broj ucenika ne moze biti >40“;
else
{
for(i=0;i<n;i++) /*unos podataka za pojedinog učenika u polje razred*/
{
cout<<„\nIme: „; cin>>razred[i].ime;
cout<<„\nPrezime: „; cin>>razred[i].prezime;
cout<<„\nMaticni u imeniku: „; cin>>razred[i].maticni;
cout<<„\nProsek: „; cin>>razred[i].prosek;
cout<<„\nRodjen dan: „; cin>>razred[i].rodjendan.dan;
cout<<„\nRodjen mjesec: „; cin>>razred[i].rodjendan.mjesec;
cout<<„\nRodjen godina: „; cin>>razred[i].rodjendan.godina;
}
max=razred[0].prosek;    /*određivanje najboljeg prosjeka*/
k=0;
for(i=0;i<n;i++)
if (max<razred[i].prosek)
{
max=razred[i].prosjek;
k=i;
}
/*ispis najboljeg*/
cout<<„\nNajbolji je „<<razred[k].ime<<“ “ <<razred[k].prezime;
cout<<„\nMaticni broj „<<razred[k].maticni;
cout<<„\nRodjen „<<razred[k].rodjendan.dan<<razred[k].rodjendan.mjesec<< razred[k].rodjendan.godina;
cout<<„\nS prosjekom „<<razred[k].prosek;
}
system („PAUSE“);
return 0;
}

Pr: 

Napravi program koji izdaje informacije o najnovijem izdanju knjege?

Izgled zadatka

Rešenje:

#include <iostrim>
#include <cstdlib>
#include <string>
using namespace std;
struct autor

{
string ime;
string prezime;

};
struct knjiga

{
string ime;
autor a;
int godi;
int brs;
};
int main()
{

knjiga nova;
cout<<„Unesi informacije o novoj knjizi:“<<endl;
cout<<„Naslov:“; cin>>nova.ime;
cout<<„“<<endl;
cout<<„Ime i prezime autora knjige: „; cin>>nova.a.ime>>nova.a.prezime;
cout<<„Godina izdavamja knjige:“; cin>>nova.godi;
cout<<„“<<endl;
cout<<„Unesi broj stranica knjige:“; cin>>nova.brs;
cout<<„“<<endl;
cout<<“ Autor knjige „<<nova.ime<<“ je „<<nova.a.prezime<<endl;
cout<<“ Novo izdanje knjige izdato“<<nova.godi<< “ ima „<<nova.brs<<“ stranica“<<endl;

system(„PAUSE“);
return EXIT_SUCCESS;
}

Pr:

Napravi program koji izračunava rastojanje između dve tacke cije su koordinate poznate?

Rešenje:

Napomena: Tačke su definisane kao strukture čije članove su koordinate

#include
#include
#include
using namespace std;
struct tacka
{
int x;
int y;
};
int main()
{
float d;
tacka A,B;
cout<<„Unesi koordinate tacke A i B“<<endl;
cout<<„Unesi x koordinatu tacke A“<<endl; cin>>A.x;
cout<<„Unesi y koordinatu tacke A“<<endl; cin>>A.y;
cout<<„Unesi x koordinatu tacke B“<<endl; cin>>B.x;
cout<<„Unesi y koordinatu tacke B“<<endl; cin>>B.y;
d=sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
cout<<„Rastojanje izmegu tacke A(„<<A.x<<„,“<<A.y<<„) i tacke B(„<<B.x<<„,“<<B.y<<„) je d=“<<d<<endl;

system(„PAUSE“);
return EXIT_SUCCESS;
}

Untitled

Pr:

Napravite program koji ako unesete broj između 1 i 4 izdaje adekvatno godisnje doba?

Rešenje:

#include
#include

using namespace std;

struct doba
{
string prolece;
string leto;
string jesen;
string zima;
};
int main()
{
int br=0;
doba unos;
pocetak:cout<<“ Unesi broj:“<<endl; cin>>br;
switch(br)
{
case 1:
unos.prolece=“Prolece“;
cout<<unos.prolece<<endl;
break;
case 2:
unos.leto=“Leto“;
cout<<unos.leto<<endl;
break;
case 3:
unos.jesen=“Jesen“;
cout<<unos.jesen<<endl;
break;
case 4:
unos.zima=“Zima“;
cout<<unos.zima<<endl;
break;
default:
cout<<„Uneli ste broj koji je > od 4 ili goto pocetak;
}
system(„PAUSE“);
return EXIT_SUCCESS;
}

Projektni zadatak

Napravite program koji izračunava prosečnu udaljenost svih naseljenih mesta Opštine Leposavić do Leposavića?

Rešenje:

#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;

int main()
{

string mesto[]={„Lesak“, „Socanica“, „kajkovo“, „Postenje“};

struct rastojanje
{
string mesto;
float rast;
};
float s=0;
int n;
rastojanje r[100];

cout<<„unesi broj naselja „<<endl;
cin>>n;
for(int i=0;i<n;i++)
{
r[i].mesto=mesto[i];
cout<<r[i].mesto<<endl;
}
cout<<“ „<<endl;
for(int i=0;i<n;i++)
{
cout<<“ Za „<<r[i].mesto<<“ -Leposavic rastojanje u kilometrima je? „;
cin>>r[i].rast;
s=s+r[i].rast;
};
cout<<“ „<<endl;
cout<<„Prosecna udaljenost naseljenih mesta do Leposavic je „<<s <<endl;
system(„PAUSE“);
return EXIT_SUCCESS;
}

projektni

Strukturne promenljive i pokazivači

Strukturne promenljive imaju adrese,  što omogućava definisati pokazivačke promenljive koje će pokazivati na njih. Da bi se definisao pokazivač na strukturnu promenljivu treba deklarisati pokazivačku promenljivu na objekat istog tipa kao što je tip strukturne promenljive i dodeliti mu adresu strukturne promenljive.
Ako je definisana pokazivačka promenljive osoba (za predhodno definisanu strukturu ličnost,

struct licnost
{
 char ime[30];
 char adresa[50];
 unsigned starost;
} i deklarisane strukturne promenljive tipa ličnost, 
struct licnost osobal, osoba2, s;),
struct licnost *osoba;
elementima strukture na koju ova promenljiva pokazuje može se pristupiti na sledeći način:
(*osoba).ime
(*osoba).adresa
 
(*osoba).starost

Korišćenjem operatora „strelica u desno“ (->) elementima strukturne promenljive na koju pokazuje pokazivačka promenljiva osoba može se pristupiti na čitljiviji način:

 osoba->ime
osoba->adresa 
osoba->starost

Formalni parametar funkcije može biti struktura i pokazivač na strukturu. Kada je parametar struktura tada se kao stvarni argument pri pozivu funkcije navodi struktura čija se kopija stavlja na raspolaganje funkciji. Ovakva predaja parametara po vrednosti ne dozvoljava promenu strukture koja je stvarni argument.

Kada je formalni parametar funkcije pokazivač na strukturu,  tada se kao stvarni argument pri pozivu funkcije navodi adresa strukturne promenljive. Pošto se funkciji predaje adresa strukturne promenljive ona može ne samo da koristi njene elemente već i da je menja.

Pr.

#include <cstdlib>
#include <iostream>
using namespace std;
struct licnost{
char ime[30];
char adresa[50];
int starost;
};
void citaj (struct licnost *o)
{
cout<<„Unesite ime osobe: „<<endl;
gets(o->ime);

cout<<„Unesite adresu osobe: „<<endl;
gets(o->adresa);

cout<<„Unesite starost osobe: „<<endl;
cin>>o->starost;
while (getchar()!=’\n’);
}
main()
{
struct licnost osobal,osoba2,*s;
cout<<(„Unesi podatke za prvu osobu:\n“);
citaj(&osobal);

cout<<(„Unesi podatke za drugu osobu:\n“);
citaj(&osoba2);

if (osobal.starost > osoba2.starost) s=&osobal;
else s=&osoba2;
cout<<„Starijija je osoba :“;
cout<<s->ime<<„, sa adresom „<<s->adresa<<„i „<< s->starost<<“ godine“<<endl ;
system(„PAUSE“);
}

Nizovi struktura

Strukture se mogu koristiti kao komponente nizova. Niz struktura se opisuje sledećom deklaracijom
struct licnost osoba[MAXOS];
opisuje se niz struktura od MAXOS elemenata. Svaki element predstavlja strukturu tipa licnost.Ime osoba[2] je ime druge strukturne promenljive, a osoba[2].adresa predstavlja element adresa druge strukturne promenljive.Ako deklarišemo pokazivač na strukturu ličnost

struct licnost osoba[MAXOS],*pok;
tada su inicijalizacije pokazivačke promenljive ekvivalentne:
pok=osoba;
pok=&osoba[0];
Pošto pok pokazuje na osoba[0] to pok+1 pokazuje na osoba[l].
Primer: Napisati program kojim se učitava niz struktura deklarisan sa:
struct licnost osoba[MAXOS],*pok; i ispisuje na dva načina: prvo korišćenjem elemenata niza, a zatim korišćenjem pokazivača koji se inicijalizuje adresom niza struktura?

#include <cstdlib>
#include <iostream>
using namespace std;
struct licnost
{
char ime[30];
char adresa[50];
int starost;
};
void citaj (struct licnost *o)
{
cout<<„Unesite ime osobe: „; cin>>o->ime;
cout<<„Unesite adresu osobe: „; cin>>o->adresa;
cout<<„Unesite starost osobe: „; cin>>o->starost;
}
main()
{
int n, i;
struct licnost osoba[20], *p;
cout<<„Unesi broj osoba:(<=20)“<<endl;
cin>>n;for(i=0;i<n;i++)
{
cout<<„Unesi podatke za osobu „<<i+1<<endl;
citaj(&osoba[i]);
}
/* prvi nacin za ispis ucitanih vrednosti */
for (i=0;i<n;i++)
{
cout<<osoba[i].ime<<„, „<< osoba[i].adresa<<„, „<<osoba[i]. starost<<endl;
}/* drugi naèin ispisa korišæenjem pokazivaèa */
for (p=osoba;p<osoba+n;p++)
{
cout<<p->ime<<„, „<< p->adresa<<„, „<< p->starost<<endl;
}
system(„PAUSE“);
}