320 likes | 706 Views
Mehanizmi agregacije. *. Polja. *. Jednodimenzionalna polja: deklaracija. format tip_podatka identifikator [ broj ];. primjer float x[5];. prvi član ima indeks nula. float ------------ x[0]. float ------------ x[1]. float ------------ x[2]. float ------------ x[3]. float
E N D
Polja *
Jednodimenzionalna polja: deklaracija format tip_podatka identifikator [broj]; primjer float x[5]; prvi član ima indeks nula float ------------ x[0] float ------------ x[1] float ------------ x[2] float ------------ x[3] float ------------ x[4] float[5] ------------ x : 4 byte-a 20 byte-ova *
Polja • Polje je niz varijabli istog tipa podataka definiranih zajedničkim imenom, koje se nalaze na uzastopnim memorijskim lokacijama. • Pojedinom elementu polja pristupa se preko imena polja i indeksa (rednog broja) elementa u polju. • Indeksi polja u programskom jeziku C++ su cijeli brojevi između 0 i duljine polja umanjenog za 1. *
Jednodimenzionalna polja: definicija format tip_podatka identifikator [ ]={vrijednost_1, vrijednost_2, ..., vrijednost_n}; primjer float x[]={1342.5,4.7,23.4,12.,-72e12}; Nije potrebno navoditi broj elemenata float[5] ------------ x 1342.5 4.7 23.4 12. -72e12 : x[0] x[1] x[2] x[3] x[4] *
Dvodimenzionalna polja: deklaracija i definicija primjer int A[3][5] = {{11,12,13,14,15}, {21,22,23,24,25}}; int [3] [5] -------------- A : 11 12 13 14 15 A[0][0]: A[0][1]: A[0][2]: A[0][3]: A[0][4]: 21 22 23 24 25 Nedefinirani elementi popunjavaju se nulama A[1][0]: A[1][1]: A[1][2]: A[1][3]: A[1][4]: 0 0 0 0 0 Da nebi!!! A[2][0]: A[2][1]: A[2][2]: A[2][3]: A[2][4]: *
Izračunavanje dana: rješenje s poljima • #include<iostream>using namespace std; • int main() { • //inicijalizacija i deklaracija • int Dat[3]; • int Mjes[]={31,28,31,30,31,30,31,31,30,31,30}; • int j; • //ponavljanje • do { • //unosenje datuma • cout<<"Unosenje datuma (danmjesecgodina): "; • for(int i=0;i<=2;i++) • cin>>Dat[i]; • cout<<endl; • //prestupna godina? • if(((Dat[2]%100!=0) && (Dat[2]%4==0)) || • (Dat[2]%400==0)) • Mjes[1]=29; • else • Mjes[1]=28; *
//inicijalizacija sume_dana • int Suma=Dat[0]; • //izracunavanje • for(i=0;i<Dat[1]-1;i++) • Suma+=Mjes[i]; • //ispis • cout<<"Od 01.01. do "<<Dat[0]<<"."<<Dat[1] • <<"."<<Dat[2]<<"."<<" proslo je " • <<Suma<<" dana."<<endl; • //indikacija kraja • cout<<"Za nastavak <1>, za prekid <0>: "; • cin>>j; • cout<<endl; • }while(j==1); • return0; • } *
Znakovni nizovi (engl. characterstrings, strings) (1) Znakovni nizovi su jednodimenzionalna znakovnapolja koja služe za pohranjivanje tekstova: char VarazdinskiSlikar[]=“Ivo Režek”; I v o R e ž e k \0 Na kraju niza automatski se postavlja nul-znak (engl. null-character). Nije ga potrebno eksplicitno navoditi, ali treba o njemu voditi računa. Ispis koji dokazuje postojanje nul-znaka: for(int i=0;i<=10;i++) cout <<VarazdinskiSlikar[i]<<“\t” <<(int)(unsigned char)VarazdinskiSlikar[i]<<endl; horizontalni tabulator ispisuje ASCII kôd *
#include<iostream> #include<iomanip>using namespace std; int main(){ char VarazdinskiSlikar[]="Ivo Režek"; cout<<endl; //kombinacija ispisa //s tabulatorom (\t=popunjavanje s lijeva) //i setw (popunjavanje s desna) for(int i=0;i<=9;i++){ cout<<"\t"<<VarazdinskiSlikar[i]<<setw(10); cout<<(int)(unsigned char)VarazdinskiSlikar[i]<<endl; } cout<<endl; for(i=0;i<=9;i++){ cout<<setw(9)<<VarazdinskiSlikar[i]; cout<<"\t"<<(int)(unsigned char)VarazdinskiSlikar[i]; cout<<endl; } system(“pause”); return 0; } Dokaz: program P6_1.cpp *
Znakovni nizovi: definicija i ispis (primjeri) Primjer definicije znakovnog niza: char Niz[]=“Melita Kozina”; Isti se niz može definirati i ovako: char Niz[]= {‘M’,’e’,’l’,’i’,’t’,’a’,’ ’, ‘K’,’o’,’z’,’i’,’n’,’a’,’\0’}; potrebno definirati Naredba za ispis cout<<Niz<<endl; Ispisuje sadržajznakovnog nizasve do znaka ‘\0’ daje isti rezultat kao for(int i=0;i<13;i++) cout<<Niz[i]; cout<<endl; Što odabrati (koju definiciju, kakav ispis)? Odgovor: vidjeti sljedeći slajd *
Sljedeći slide #include<iostream>using namespace std; int main() { cout<<endl<<"DEFINIRANJE I ISPIS ZNAKOVNOG NIZA"<<endl; char PrviNiz[]="Melita Kozina"; char DrugiNiz[]= {'M','e','l','i','t','a',' ','K','o','z','i','n','a','\0'}; char Znak='\"';//navodnici cout<<endl<<"char PrviNiz[]="; cout<<Znak<<"Melita Kozina"<<Znak<<";"<<endl; cout<<endl<<"char DrugiNiz[]="; cout<<"{'M','e','l','i','t','a',' ','K','o','z','i','n','a',' '}” <<endl<<endl; cout<<"1. cout<<PrviNiz<<endl;"<<endl; cout<<" Ispis: "<<PrviNiz<<endl<<endl; cout<<"2. cout<<DrugiNiz<<endl;"<<endl; cout<<" Ispis: "<<DrugiNiz<<endl<<endl; cout<<"3. for(int i=0;(DrugiNiz[i] != NULL);i++) cout<<DrugiNiz[i];"<<endl; cout<<" Ispis: "; for(int i=0;(DrugiNiz[i] != NULL);i++) cout<<DrugiNiz[i]; cout<<endl; cout<<endl<<"Za kraj <1>: "; cin>>""; return 0; } definicije niza definicija konstante ispis definicija PrviNiz: ispis DrugiNiz: ispis (1) DrugiNiz: ispis (2) *
Preporuka char Niz[]="Melita Kozina”; //definicija cout<<Niz<<endl; //ispis P1_5.exe *
Znakovni nizovi: učitavanje Primjer 1. char tekst[80]; cin>>tekst; cout<<tekst; U čemu je problem? U prazninama. One predstavljaju graničnike koji prekidaju učitavanje podataka. Ispisuje samo do prve praznine, prekida izvođenje! Dokaz: P6_3.exePreporuka: prvo izvođenje - jedna riječdrugo izvođenje - dvije riječi Rješenje je u uporabi funkcijskih članova get( ) i getline( ) Ispisuje po jednu riječ u redu, ne prepoznaje kraj! Izvođenje se mora nasilno prekinuti!Dokaz: P6_4.exe Postoji još i Primjer 2. char tekst[80]; while (cin>>tekst) cout<<tekst<<endl; funkcijski član read( ) ali on radi sa znakom EOF, pa se uglavnom koristi za učitavanje datoteka. *
get ( ) s argumentima: prva varijanta Programski primjer Način rada #include<iostream> #include<iomanip>using namespace std; int main() { char tekst[80]; int i=0; cout<<“Unesi tekst:”<<endl; while (cin.get(tekst[i])) if (tekst[i++]=='\n') break; tekst[i-1]='\0'; cout<<“Ispis: “<<endl<<tekst; cout<<endl<<endl<<"Za kraj<1>:"; cout << endl; system(“pause”); return 0; } Učitava znak po znak. Duljina unešenog teksta mora biti manja od duljine niza. Nakon učitavanja, nizu treba dodati nul-znak. Praktičniji je za učitavanje podataka iz datoteke. *
get ( ) bez argumenata Programski primjer Način rada #include<iostream>using namespace std; int main() { cout<<endl<<"UCITAVANJE ZNAKOVNOG NIZA: "; cout<<"get() BEZ ARGUMENATA” <<endl; char tekst[80]; int i=0; cout<<endl<<"Unesi tekst (1-79 znakova):"<<endl; while((tekst[i]=cin.get())!= -1) if (tekst[i++]=='\n') break; tekst[i-1]='\0'; cout<<endl<<"Ispis:"<<endl <<tekst<<endl; cout<<endl; system(“pause”); return 0; } Učitava znak po znak. ‘get’ bez argumenata je funkcijski član tipa ‘int’, a vraća kôd znaka koji je učitao. Za učitani znak ‘\n’, ‘get’ bez argumenata vraćavrijednost-1. Nakon učitavanja, nizu treba dodati nul-znak. *
get ( ) s argumentima: druga varijanta Programski primjer Način rada #include<iostream>using namespace std; int main() { cout<<endl <<"UCITAVANJE ZNAKOVNOG NIZA: OPTIMALNI get()” <<endl; char tekst[80]; cout<<endl<<"Unesi tekst (1-79 znakova):”<<endl; cin.get(tekst, sizeof(tekst)); cout<<endl<<"Ispis:"<<endl <<tekst<<endl; cout<<endl; system(“pause”); return 0; } Učitava znak po znak. Prekida učitavanje kad naiđe na ‘\n’ koji ostaje u nizu, pa se može učitati najviše (duljina-1) znakova. Zaključni nul-znak dodaje se automatski. Najpogodniji način za učitavanje znakovnih nizova. *
getline ( ) Programski primjer Način rada Učitava znak po znak. Prekida učitavanje kad naiđe na ‘\n’. Automatski uklanja ‘\n’ i dodaje ‘\0’. Također vrlo pogodan način za učitavanje znakovnih nizova. #include<iostream>using namespace std; int main() { cout<<endl <<"UCITAVANJE ZNAKOVNOG NIZA: OPTIMALNI getline()"<<endl; char tekst[80]; cout<<endl<<"Unesi tekst (1-80 znakova):"<<endl; cin.getline(tekst,sizeof(tekst)); cout<<endl<<"Ispis:"<<endl<<tekst <<endl; cout<<endl; system(“pause”); return 0; } *
getline ( ) Programski primjer #include<iostream>using namespace std; int main() { cout<<endl <<"UCITAVANJE ZNAKOVNOG NIZA: OPTIMALNI getline()"<<endl; int n; char tekst[80]; cout << "Unesi broj: "; cin >> n; cout<<endl<<"Unesi tekst (1-80 znakova):"<<endl; cin.getline(tekst,sizeof(tekst)); cout<<endl<<"Ispis:"<<endl<<tekst <<endl; cout<<endl; system("pause"); return 0; } Ovaj će cin.getline biti preskočen Zašto? *
getline ( ) Programski primjer #include<iostream>using namespace std; int main() { cout<<endl <<"UCITAVANJE ZNAKOVNOG NIZA: OPTIMALNI getline()"<<endl; int n; char tekst[80]; cout << "Unesi broj: "; cin >> n; cout<<endl<<"Unesi tekst (1-80 znakova):"<<endl; cin.ignore(); cin.getline(tekst,sizeof(tekst)); cout<<endl<<"Ispis:"<<endl<<tekst <<endl; cout<<endl<<endl<<"Za kraj <1>: "; cin>>""; cout<<endl; return 0; } Ova naredba ignorira sadržaj spremnika unosa *
Zapisi *
Zapis: deklaracija format struct identifikator{ deklaracija_1; . . . deklaracija_n; } identifikator,...; primjer struct student { int sifra; char imeprez[30]; double prosocj;} stud; int ---------- sifra char[30] ----------------------- imeprez double -------------- PrOcj stud : 4 bajta * 30 bajta 8 bajta
Zapisi • Zapis je skup podataka koji mogu biti međusobno različitih tipova • Svaka komponenta zapisa ima svoje ime preko kojeg joj se pristupa. *
#include <iostream> using namespace std; int main () { int Ocj, B=0, S=0; struct student { int sifra; char imeprez[30]; double prosocj; } stud; cout << "Sifra: "; cin >> stud.sifra; cout << "Ime i prezime: "; cin.ignore(); cin.getline(stud.imeprez,sizeof(stud.imeprez)); char Jos='d'; Zapisi: primjeri *
while (Jos=='d') { cout << "Ocjena: "; cin >> Ocj; B++; S+=Ocj; cout << "Jos? "; cin >> Jos; } stud.prosocj=(float)S/B; cout << "Student: " << stud.sifra << " " << stud.imeprez << " Prosjek: " << stud.prosocj << endl; system("pause"); return 0; } Zapisi: primjeri *
Zapisi int main () {struct {int sifra;char imeprez[30];double prosocj;} stud; . . . } Zapisu kojem se odmah pridružuje varijabla i koji se ne koristi nigdje drugdje osim tamo gdje je deklariran nije potrebno definirati ime. Tako dobijamo tzv. neimenovani zapis *
Zapisi struct student {int sifra;char imeprez[30];double prosocj;};int main () { student stud; . . . } Zapis se može deklarirati posebno i koristiti kasnije kod deklariranja varijabli *
Unije *
Unije: deklaracija format union identifikator{ deklaracija_1; . . . deklaracija_n; } identifikator,...; primjer union student { int sifra; char imeprez[30]; double prosocj;} stud; char[30] ------------------------------ imeprez double -------------- PrOcj int ---------- sifra stud : * 30 bajta
Unije • Unija je memorijski prostor koji se može koristiti za pohranjivanje podataka različitih tipova. • Veličina unije jednaka je najvećem od podataka koji je u uniji definiran • U uniji istovremeno može biti upisana samo jedna komponenta unije. *
Unije Programski primjer Unos: #include<iostream> using namespace std; union student { int sifra; char imeprez[30]; }; int main() { student stud; cout << "Maticni broj: "; cin >> stud.sifra; cin.ignore(); cout << "Ime i prezime: "; cin.getline(stud.imeprez,sizeof(stud.imeprez)); cout << stud.sifra << "\t" << stud.imeprez << endl; system("pause"); return 0; } 13 ivica Ispis: 1667855977 ivica Cjelobrojna vrijednost komponente matbr prebrisana komponentom koja sadrži vrijednost niza znakova. *