Download presentation
Presentation is loading. Please wait.
1
Mehanizmi agregacije *
2
Polja *
3
Jednodimenzionalna polja: deklaracija
format tip_podatka identifikator [broj]; primjer float x[5]; prvi član ima indeks nula float[5] x float x[0] float x[1] float x[2] float x[3] float x[4] : 4 byte-a 20 byte-ova *
4
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. *
5
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] *
6
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]: Da nebi!!! A[2][0]: A[2][1]: A[2][2]: A[2][3]: A[2][4]: *
7
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 (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; else Mjes[1]=28; *
8
* //inicijalizacija sume_dana int Suma=Dat[0]; //izracunavanje
for(i=0;i<Dat[1]-1;i++) Suma+=Mjes[i]; //ispis cout<<"Od 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); return 0; } *
9
Znakovni nizovi *
10
Ispis koji dokazuje postojanje nul-znaka:
Znakovni nizovi (engl. character strings, strings) (1) Znakovni nizovi su jednodimenzionalna znakovna polja 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 *
11
Dokaz: program P6_1.cpp * #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; } for(i=0;i<=9;i++){ cout<<setw(9)<<VarazdinskiSlikar[i]; cout<<"\t"<<(int)(unsigned char)VarazdinskiSlikar[i]; system(“pause”); return 0; Dokaz: program P6_1.cpp *
12
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žaj znakovnog niza sve 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 *
13
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) *
14
Preporuka * char Niz[]="Melita Kozina”; //definicija
cout<<Niz<<endl; //ispis P1_5.exe *
15
Znakovni nizovi: učitavanje u uporabi funkcijskih članova
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.exe Preporuka: 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. *
16
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. *
17
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 ( 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ća vrijednost -1. Nakon učitavanja, nizu treba dodati nul-znak. *
18
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 ( 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. *
19
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 ( znakova):"<<endl; cin.getline(tekst,sizeof(tekst)); cout<<endl<<"Ispis:"<<endl<<tekst <<endl; cout<<endl; system(“pause”); return 0; } *
20
Ovaj će cin.getline biti preskočen
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 ( 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? *
21
Ova naredba ignorira sadržaj spremnika unosa
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 ( 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 *
22
Zapisi *
23
-----------------------
Zapis: deklaracija format struct identifikator { deklaracija_1; . deklaracija_n; } identifikator,...; primjer struct student { int sifra; char imeprez[30]; double prosocj; } stud; stud int sifra char[30] imeprez double PrOcj : * 4 bajta 30 bajta 8 bajta
24
Zapisi Zapis je skup podataka koji mogu biti međusobno različitih tipova Svaka komponenta zapisa ima svoje ime preko kojeg joj se pristupa. *
25
Zapisi: 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'; *
26
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; *
27
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 *
28
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 *
29
Unije *
30
------------------------------
Unije: deklaracija format union identifikator { deklaracija_1; . deklaracija_n; } identifikator,...; primjer union student { int sifra; char imeprez[30]; double prosocj; } stud; stud double PrOcj char[30] imeprez int sifra : * 30 bajta
31
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. *
32
Unije Programski primjer Unos: Ispis: 13 ivica 1667855977 ivica
#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: ivica Cjelobrojna vrijednost komponente matbr prebrisana komponentom koja sadrži vrijednost niza znakova. *
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.