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“);
}


Postavi komentar