Mehanizmi agregacije
description
Transcript of Mehanizmi agregacije
Mehanizmi Mehanizmi agregacijeagregacije
*
PoljaPolja
*
Jednodimenzionalna polja: deklaracijaJednodimenzionalna polja: deklaracija
float------------
x[0]
float------------
x[1]
float------------
x[2]
float------------
x[3]
float------------
x[4]
formatformat
tip_podatkatip_podatka identifikator identifikator [ [brojbroj];];
prvi član ima indeks prvi član ima indeks nulanula
20 byte-ova20 byte-ova
4 byte-a4 byte-a
*
float[5]------------
x::
primjer
float x[5];
PoljaPolja• Polje je niz varijabli istog tipa podataka Polje je niz varijabli istog tipa podataka
definiranih zajedničkim imenom, koje se nalaze definiranih zajedničkim imenom, koje se nalaze na uzastopnim memorijskim lokacijama.na uzastopnim memorijskim lokacijama.
• Pojedinom elementu polja pristupa se preko Pojedinom elementu polja pristupa se preko imena polja i indeksa (rednog broja) elementa u imena polja i indeksa (rednog broja) elementa u polju.polju.
• Indeksi polja u programskom jeziku C++ su Indeksi polja u programskom jeziku C++ su cijeli brojevi između 0 i duljine polja cijeli brojevi između 0 i duljine polja umanjenog za 1.umanjenog za 1.
*
Jednodimenzionalna polja: definicijaJednodimenzionalna polja: definicija
1342.5 4.7 23.4 12. -72e12
primjer
float x[]={1342.5,4.7,23.4,12.,-72e12};
*
float[5]------------
x::
x[0]x[0] x[1]x[1] x[2]x[2] x[3]x[3] x[4]x[4]
formatformat
tip_podatka tip_podatka identifikatoridentifikator [ ]={ [ ]={vrijednost_1, vrijednost_2, ..., vrijednost_nvrijednost_1, vrijednost_2, ..., vrijednost_n};};
Nije potrebno navoditi broj Nije potrebno navoditi broj elemenataelemenata
Dvodimenzionalna polja: deklaracija i definicijaDvodimenzionalna polja: deklaracija i definicijaprimjer
int A[3][5] = {{11,12,13,14,15}, {21,22,23,24,25}};
*
int [3] [5]--------------
A:: 11
A[0][0]:A[0][0]:
12 13 14 15
A[0][1]:A[0][1]: A[0][2]:A[0][2]: A[0][3]:A[0][3]: A[0][4]:A[0][4]:
21
A[1][0]:A[1][0]:
22
A[1][1]:A[1][1]:
23
A[1][2]:A[1][2]:
24
A[1][3]:A[1][3]:
25
A[1][4]:A[1][4]:
0
A[2][0]:A[2][0]:
0
A[2][1]:A[2][1]:
0
A[2][2]:A[2][2]:
0
A[2][3]:A[2][3]:
0
A[2][4]:A[2][4]:
Nedefinirani elementi
popunjavaju se nulama
Da nebi!!!Da nebi!!!
#include<iostream>using namespace std;int main() { //inicijalizacija i deklaracijaint Dat[3];int Mjes[]={31,28,31,30,31,30,31,31,30,31,30};int j;
//ponavljanjedo { //unosenje datuma
cout<<"Unosenje datuma (dan mjesec godina): ";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;
elseMjes[1]=28;
Izračunavanje dana: rješenje s poljimaIzračunavanje dana: rješenje s poljima
*
//inicijalizacija sume_danaint Suma=Dat[0];
//izracunavanjefor(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 krajacout<<"Za nastavak <1>, za prekid <0>: ";cin>>j;cout<<endl;
}while(j==1);return 0;}
*
ZnakovniZnakovninizovinizovi
*
Znakovni nizoviZnakovni nizovi(engl. (engl. charactercharacter stringsstrings, , stringsstrings))
(1)(1) Znakovni nizovi su Znakovni nizovi su jednodimenzionalna znakovnajednodimenzionalna znakovna poljapolja koja koja služe za pohranjivanje služe za pohranjivanje tekstovatekstova::
char VarazdinskiSlikar[]=“Ivo Režek”;char VarazdinskiSlikar[]=“Ivo Režek”;
I
*
v o R e ž e k \0
Na kraju niza automatski se postavlja nul-znak (engl. Na kraju niza automatski se postavlja nul-znak (engl. null-null-charactercharacter). ).
Ispis koji dokazuje postojanje nul-znaka:Ispis koji dokazuje postojanje nul-znaka:for(int i=0;i<=10;i++)for(int i=0;i<=10;i++)
coutcout <<VarazdinskiSlikar[i]<<“\t”<<VarazdinskiSlikar[i]<<“\t”<<(int)(unsigned char)VarazdinskiSlikar[i]<<endl;<<(int)(unsigned char)VarazdinskiSlikar[i]<<endl;
Nije ga potrebno eksplicitno navoditi, ali treba o njemu voditi Nije ga potrebno eksplicitno navoditi, ali treba o njemu voditi računa.računa.
horizontalni tabulator
ispisuje ASCII kôdô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.cppDokaz: program P6_1.cpp
*
Znakovni nizovi: definicija i ispis (primjeri)Znakovni nizovi: definicija i ispis (primjeri)
Primjer definicije znakovnog niza:Primjer definicije znakovnog niza:char Niz[]=char Niz[]=
“Melita Kozina”;“Melita Kozina”;Isti se niz može definirati i ovako:Isti se niz može definirati i ovako:
char Niz[]=char Niz[]= {‘M’,’e’,’l’,’i’,’t’,’a’,’ ’, ‘K’,’o’,’z’,’i’,’n’,’a’,’\0’}; {‘M’,’e’,’l’,’i’,’t’,’a’,’ ’, ‘K’,’o’,’z’,’i’,’n’,’a’,’\0’};
*
Naredba za ispisNaredba za ispiscout<<Niz<<endl;cout<<Niz<<endl;
Što odabrati (koju definiciju, kakav ispis)?
daje isti rezultat kaodaje isti rezultat kaofor(int i=0;i<13;i++) for(int i=0;i<13;i++)
cout<<Niz[i];cout<<Niz[i];cout<<endl;cout<<endl;
Ispisuje sadržajIspisuje sadržajznakovnog nizaznakovnog niza
sve do znaka ‘\0’sve do znaka ‘\0’
potrebno definiratipotrebno definirati
Odgovor: vidjeti sljedeći slOdgovor: vidjeti sljedeći slajdajd
#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='\"';//navodnicicout<<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;
}
Sljedeći slideSljedeći slide
*
definicije nizadefinicije niza
PrviNiz: ispisPrviNiz: ispis
DrugiNiz: ispis (1)DrugiNiz: ispis (1)
DrugiNiz: ispis (2)DrugiNiz: ispis (2)
ispis definicijaispis definicija
definicija konstante
char Niz[]="Melita Kozina”; //definicijacout<<Niz<<endl; //ispis
PreporukaPreporuka
*
P1_5.exe
Znakovni nizovi: učitavanjeZnakovni nizovi: učitavanje
*
Primjer 1.char tekst[80];cin>>tekst;cout<<tekst;
Primjer 2.char tekst[80];while (cin>>tekst)
cout<<tekst<<endl;
Ispisuje po jednu riječ u redu, ne Ispisuje po jednu riječ u redu, ne prepoznaje kraj! Izvođenje se mora prepoznaje kraj! Izvođenje se mora
nasilno prekinuti!nasilno prekinuti!Dokaz: P6_4.exeDokaz: P6_4.exe
Rješenje jeRješenje je
u uporabi funkcijskih članovaget( )
igetline( )
U čemu je problem?U čemu je problem?U prazninama. One predstavljaju
graničnike koji prekidaju učitavanje podataka.
funkcijski član read( ) ali on radi sa znakom EOF, pa se uglavnom koristi
za učitavanje datoteka.
Postoji još iPostoji još i
Ispisuje samo do prve praznine, Ispisuje samo do prve praznine, prekida izvođenje! Dokaz: P6_3.exe prekida izvođenje! Dokaz: P6_3.exe
PreporukaPreporuka: : prvo izvođenje - jedna riječprvo izvođenje - jedna riječ
drugo izvođenje - dvije riječidrugo izvođenje - dvije riječi
*
get ( ) get ( ) s argumentima: prva varijantas argumentima: prva varijanta
Učitava Učitava znak po znakznak po znak..
Duljina unešenog teksta mora biti Duljina unešenog teksta mora biti manja od duljine niza.manja od duljine niza.
Nakon učitavanja, nizu treba Nakon učitavanja, nizu treba dodati nul-znak.dodati nul-znak.
PraktičnijiPraktičniji je za učitavanje je za učitavanje podataka iz podataka iz datotekedatoteke..
Način radaNačin radaProgramski primjerProgramski primjer
#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;
}
*
get ( ) get ( ) bez argumenatabez argumenata
Učitava Učitava znak po znakznak po znak..
‘‘get’ bez argumenata je get’ bez argumenata je funkcijski član tipa ‘int’, a funkcijski član tipa ‘int’, a
vraća kôdvraća kôd znaka koji je učitao. znaka koji je učitao.
Za učitani znak Za učitani znak ‘\n’‘\n’, ‘get’ bez , ‘get’ bez argumenata argumenata vraćavraća vrijednostvrijednost
-1.-1.
Nakon učitavanja, nizu treba Nakon učitavanja, nizu treba dodati nul-znak.dodati nul-znak.
Način radaNačin radaProgramski primjerProgramski primjer#include<iostream>using namespace std;int main() {cout<<endl<<"UCITAVANJE
ZNAKOVNOG NIZA: ";cout<<"get() BEZ ARGUMENATAget() 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;
}
*
get ( ) get ( ) s argumentima: druga varijantas argumentima: druga varijanta
Učitava Učitava znak po znakznak po znak..
Prekida učitavanje kad naiđe Prekida učitavanje kad naiđe na na ‘\n’‘\n’ koji koji ostajeostaje u nizu, pa se u nizu, pa se može učitati najviše (duljina-1) može učitati najviše (duljina-1)
znakova. znakova.
Zaključni Zaključni nul-znaknul-znak dodaje se dodaje se automatskiautomatski..
Najpogodniji način za Najpogodniji način za učitavanje znakovnih nizova.učitavanje znakovnih nizova.
Način radaNačin radaProgramski primjerProgramski primjer
#include<iostream>using namespace std;int main() {cout<<endl<<"UCITAVANJE ZNAKOVNOG NIZA:
OPTIMALNI get()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;
}
*
getline ( )getline ( )
Učitava Učitava znak po znakznak po znak..
Prekida učitavanje kad naiđe Prekida učitavanje kad naiđe na na ‘\n’.‘\n’.
Automatski Automatski uklanja ‘\n’uklanja ‘\n’ i i dodaje ‘\0’.dodaje ‘\0’.
Također vrlo pogodan način Također vrlo pogodan način za učitavanje znakovnih za učitavanje znakovnih
nizova.nizova.
Način radaNačin radaProgramski primjerProgramski primjer#include<iostream>using namespace std;int main() {cout<<endl<<"UCITAVANJE ZNAKOVNOG NIZA:
OPTIMALNI getline()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 ( )getline ( )
Ovaj će cin.getline biti Ovaj će cin.getline biti preskočenpreskočen
Programski primjerProgramski primjer#include<iostream>using namespace std;int main() {cout<<endl<<"UCITAVANJE ZNAKOVNOG NIZA:
OPTIMALNI getline()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;
}
Zašto?Zašto?
*
getline ( )getline ( )
Ova naredba ignorira Ova naredba ignorira sadržaj spremnika sadržaj spremnika
unosaunosa
Programski primjerProgramski primjer#include<iostream>using namespace std;int main() {cout<<endl<<"UCITAVANJE ZNAKOVNOG NIZA:
OPTIMALNI getline()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;
}
ZapisiZapisi
*
Zapis: deklaracijaZapis: deklaracija
double--------------
PrOcj
int----------
sifra
formatformat
structstruct identifikator identifikator {{
deklaracija_1deklaracija_1;;
..
..
..
deklaracija_n;deklaracija_n;
} identifikator,...;} identifikator,...;
88 b bajtaajta*
stud ::
primjer
struct student {int sifra;char imeprez[30];double prosocj;
} stud;
4 4 bbajtaajta
char[30]-----------------------
imeprez
3030 b bajtaajta
ZapisiZapisi
• Zapis je skup podataka koji mogu biti Zapis je skup podataka koji mogu biti međusobno različitih tipovameđusobno različitih tipova
• Svaka komponenta zapisa ima svoje ime preko Svaka komponenta zapisa ima svoje ime preko kojeg joj se pristupa.kojeg joj se pristupa.
*
ZapisiZapisi: primjeri: primjeri#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';
*
ZapisiZapisi: primjeri: primjeriwhile (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;}
*
ZapisiZapisiint main () {struct {
int sifra;char imeprez[30];double prosocj;
} stud;...
}
*
Zapisu kojem se Zapisu kojem se odmah pridružuje odmah pridružuje
varijabla i koji se ne varijabla i koji se ne koristi nigdje koristi nigdje
drugdje osim tamo drugdje osim tamo gdje je deklariran gdje je deklariran
nije potrebno nije potrebno definirati ime. Tako definirati ime. Tako
dobijamo tzv. dobijamo tzv. neimenovani zapisneimenovani zapis
ZapisiZapisistruct student {
int sifra;char imeprez[30];double prosocj;
};
int main () {student stud;...
}
*
Zapis se može Zapis se može deklarirati deklarirati posebno i posebno i
koristiti kasnije koristiti kasnije kod kod
deklariranja deklariranja varijablivarijabli
UnijeUnije
*
char[30]------------------------------
imeprez
Unije: deklaracijaUnije: deklaracija
double--------------
PrOcj
int----------
sifra
formatformat
unionunion identifikator identifikator {{
deklaracija_1deklaracija_1;;
..
..
..
deklaracija_n;deklaracija_n;
} identifikator,...;} identifikator,...;
*
stud ::
primjer
union student {int sifra;char imeprez[30];double prosocj;
} stud;
3030 b bajtaajta
UnijeUnije
• Unija je memorijski prostor koji se može koristiti za Unija je memorijski prostor koji se može koristiti za pohranjivanje podataka različitih tipova. pohranjivanje podataka različitih tipova.
• Veličina unije jednaka je najvećem od podataka koji je Veličina unije jednaka je najvećem od podataka koji je u uniji definiranu uniji definiran
• U uniji istovremeno može biti upisana U uniji istovremeno može biti upisana samo jedna samo jedna komponentakomponenta unije. unije.
*
*
UnijeUnijeProgramski primjerProgramski primjer
#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;
}
13ivica
1667855977ivica
Unos:Unos:
Ispis:Ispis:
Cjelobrojna vrijednost Cjelobrojna vrijednost komponente matbr komponente matbr prebrisana komponentom prebrisana komponentom koja sadrži vrijednost niza koja sadrži vrijednost niza znakova. znakova.