Отпремање презентације траје. Молимо да сачекате

Отпремање презентације траје. Молимо да сачекате

Programiranje - Nizovi -

Сличне презентације


Презентација на тему: "Programiranje - Nizovi -"— Транскрипт презентације:

1 Programiranje - Nizovi -
Kolegij: Programski jezik C++ Ak. god. 2018/19 Izv. Prof. Dr. Sc. Marko Maliković

2 Nizovi podataka Nizovi su skupovi podataka istog tipa
Omogučavaju pristupanje većem broju podataka preko zajedničkog simboličkog imena i indeksa koji daje redni broj elementa u nizu ime[0], ime[1], ..., ime[i], ... Na primjer, niz: ocjena[0], ocjena[1], ..., ocjena[29] može sadržavati niz ocjena iz nekog školskog predmeta za 30 učenika nekog razreda Prvi član niza ima indeks 0, drugi član niza ima indeks 1, …, zadnji član niza ima indeks za jedan manji od duljine niza Članovi niza se “dohvaćaju” preko njihovog indeksa Na primjer, naredbom: cout << ocjena[7]; … se ispisuje ocjena osmog učenika u razredu

3 Nizovi podataka Podaci u nizu mogu biti bilo kojeg tipa:
Ugrađenog u C++ (npr. int, float, ...) Korisnički definiranog Pojedini članovi niza se mogu mijenjati neovisno o ostalim članovima niza Na primjer, naredbom: ocjena[7] = 5; … će se osmom članu niza ocjena dodijeliti vrijednost 5 … a ostale ocjene u nizu će ostati nepromijenjene Nizovi mogu biti jednodimenzionalni (u linearnom slijedu) ili višedimenzionalni

4 Deklaracija jednodimenzionalnih nizova
Općenito se deklaracija niza vrši navođenjem: tipa kojeg će imati članovi niza naziva niza duljine niza Na primjer: float tezina[5]; Gornja naredba deklarira jednodimenzionalni niz tezina koji će sadržavati pet brojeva tipa float

5 Inicijalizacija članova niza
Jedan od načina inicijalizacije: float x[] = {1342.5, 4.7, 23.4, 12., -7.2}; Kao što vidimo u gornjem primjeru, ne moramo uvijek navesti duljinu niza Ako kod inicijalizacije navedemo duljinu niza, onda ona mora biti veća ili jednaka broju inicijaliziranih članova u suprotnom će prevoditelj ispisati grešku "too many initializers" Ako je broj inicijalizatora u listi manji od duljine niza, onda se članovima kojima nedostaju inicijalizatori dodjeljuje vrijednost nula Dakle, naredbom: int broj[5] = {5, 7, 2}; će prva tri člana poprimiti vrijednosti 5, 7 i 2, a broj[3] i broj[4] će poprimiti vrijednost 0

6 Zašto nizovi? Npr: Potrebno je 100 podataka obraditi na isti način
Ako ne bismo koristili nizove tada bismo: Svaki pojedini rezultat trebali smjestiti u zasebnu varijablu Npr. x1, x2, x3, …, x100 Svaki rezultat odn. varijabla bi trebala proći kroz isti niz računskih operacija Program bi se morao sastojati od 100 istovjetnih blokova naredbi Očito loše! Daleko jednostavnije: sve podatke smjestiti pod zajednički naziv pojedine podatke dohvaćati pomoću brojčanog indeksa dakle, koristiti nizove

7 Ograničenja nizova Duljina niza mora biti poznata u trenutku prevođenja kôda Duljina niza se ne može mijenjati tijekom izvođenja programa Ako stavimo: int duljina = 100; double niz[duljina]; dobit ćemo poruku o grešci: Expression must have a constant value

8 Ograničenja nizova Ali možemo učiniti ovo:
constexpr int duljina = 100; double niz[duljina]; Ključna riječ constexpr jamči da će vrijednost biti inicijalizirana tijekom prevođenja Ključna riječ const bi također bila dovoljna ali ako je program podijeljen u više datoteka tada se varijabla deklarirana riječju const ne vidi izvan svoje datoteke pa prevoditelj javlja grešku

9 Primjer Treba unijeti N članova jednodimenzionalnog niza, pa ih ispisati i zbrojiti. N mora biti manji ili jednak 10 (N<=10). Ispis treba biti oblika: Upisi broj clanova niza: Upisi X[...] clan niza: .... Zbroj ... clanova niza iznosi ....

10 Rješenje #include <iostream> using namespace std; int main () { int N, i, zbroj; int X[10]; zbroj=0; do cout << "Upisi broj clanova niza: "; cin >> N; } while((N<=0) || (N>10)); for (i=0; i<N; i++) cout << endl << "Upisi X[" << i << "]: "; cin >> X[i]; cout << endl; cout << X[i] << endl; zbroj=zbroj+X[i]; cout << endl << "N = " << N << ". Zbroj " << N << " clanova niza iznosi "<< zbroj << "." << endl; return 0;

11 Deklaracija varijabli
#include <iostream> using namespace std; int main () { int N, i, zbroj; int X[10]; zbroj=0; do cout << "Upisi broj clanova niza: "; cin >> N; } while((N<=0) || (N>10)); for (i=0; i<N; i++) cout << endl << "Upisi X[" << i << "]: "; cin >> X[i]; cout << endl; cout << X[i] << endl; zbroj=zbroj+X[i]; cout << endl << "N = " << N << ". Zbroj " << N << " clanova niza iznosi "<< zbroj << "." << endl; return 0;

12 Inicijalizacija varijabli
#include <iostream> using namespace std; int main () { int N, i, zbroj; int X[10]; zbroj=0; do cout << "Upisi broj clanova niza: "; cin >> N; } while((N<=0) || (N>10)); for (i=0; i<N; i++) cout << endl << "Upisi X[" << i << "]: "; cin >> X[i]; cout << endl; cout << X[i] << endl; zbroj=zbroj+X[i]; cout << endl << "N = " << N << ". Zbroj " << N << " clanova niza iznosi "<< zbroj << "." << endl; return 0;

13 Unos podatka o duljini niza
#include <iostream> using namespace std; int main () { int N, i, zbroj; int X[10]; zbroj=0; do cout << "Upisi broj clanova niza: "; cin >> N; } while((N<=0) || (N>10)); for (i=0; i<N; i++) cout << endl << "Upisi X[" << i << "]: "; cin >> X[i]; cout << endl; cout << X[i] << endl; zbroj=zbroj+X[i]; cout << endl << "N = " << N << ". Zbroj " << N << " clanova niza iznosi "<< zbroj << "." << endl; return 0;

14 Unos vrijednosti elemenata niza
#include <iostream> using namespace std; int main () { int N, i, zbroj; int X[10]; zbroj=0; do cout << "Upisi broj clanova niza: "; cin >> N; } while((N<=0) || (N>10)); for (i=0; i<N; i++) cout << endl << "Upisi X[" << i << "]: "; cin >> X[i]; cout << endl; cout << X[i] << endl; zbroj=zbroj+X[i]; cout << endl << "N = " << N << ". Zbroj " << N << " clanova niza iznosi "<< zbroj << "." << endl; return 0;

15 Izračunavanje zbroja elemenata niza
#include <iostream> using namespace std; int main () { int N, i, zbroj; int X[10]; zbroj=0; do cout << "Upisi broj clanova niza: "; cin >> N; } while((N<=0) || (N>10)); for (i=0; i<N; i++) cout << endl << "Upisi X[" << i << "]: "; cin >> X[i]; cout << endl; cout << X[i] << endl; zbroj=zbroj+X[i]; cout << endl << "N = " << N << ". Zbroj " << N << " clanova niza iznosi "<< zbroj << "." << endl; return 0;

16 Ispis #include <iostream> using namespace std; int main () { int N, i, zbroj; int X[10]; zbroj=0; do cout << "Upisi broj clanova niza: "; cin >> N; } while((N<=0) || (N>10)); for (i=0; i<N; i++) cout << endl << "Upisi X[" << i << "]: "; cin >> X[i]; cout << endl; cout << X[i] << endl; zbroj=zbroj+X[i]; cout << endl << "N = " << N << ". Zbroj " << N << " clanova niza iznosi "<< zbroj << "." << endl; return 0;

17 Konačan program #include <iostream> using namespace std; int main () { int N, i, zbroj; int X[10]; zbroj=0; do cout << "Upisi broj clanova niza: "; cin >> N; } while((N<=0) || (N>10)); for (i=0; i<N; i++) cout << endl << "Upisi X[" << i << "]: "; cin >> X[i]; cout << endl; cout << X[i] << endl; zbroj=zbroj+X[i]; cout << endl << "N = " << N << ". Zbroj " << N << " clanova niza iznosi "<< zbroj << "." << endl; return 0;

18 Oprez! C++ ne provjerava granice niza prilikom pristupa članovima niza
Ako se navede prevelik ili negativan indeks: prevoditelj neće javiti pogrešku međutim, to će prouzročiti neispravan rad programa: Ako se dohvaća član s nedozvoljenim indeksom, rezultat je neki slučajni broj Ako se vrijednost pridružuje članu s nedozvoljenim indeksom, to će izazvati run-time error odnosno program će se srušiti prilikom izvođenja

19 Primjer za slučaj a) #include <iostream> using namespace std; int main() { int ocjena[5] = {5,6,7,3,8}; cout << ocjena[5] << endl; return 0; }

20 Program za sortiranje podataka - verzija s unosom podataka preko tipkovnice -
Korisnik preko tipkovnice unosi niz brojeva Te brojeve treba sortirati po veličini, od najmanjeg prema najvećem Tako sortirane brojeve treba ispisati "Bubble sort" algoritam za sortiranje pogodan za sortiranje manjeg broja podataka (s obzirom na brzinu)

21 Primjer Imamo niz: 13, 7, 6, 3, 1 Prvi prolaz: Drugi prolaz:
13, 7, 6, 3, 1 → 7, 13, 6, 3, 1 7, 13, 6, 3, 1 → 7, 6, 13, 3, 1 7, 6, 13, 3, 1 → 7, 6, 3, 13, 1 7, 6, 3, 13, 1 → 7, 6, 3, 1, 13 Drugi prolaz: 7, 6, 3, 1, 13 → 6, 7, 3, 1, 13 6, 7, 3, 1, 13 → 6, 3, 7, 1, 13 6, 3, 7, 1, 13 → 6, 3, 1, 7, 13 Treći prolaz: 6, 3, 1, 7, 13 → 3, 6, 1, 7, 13 3, 6, 1, 7, 13 → 3, 1, 6, 7, 13 Četvrti prolaz: 3, 1, 6, 7, 13 → 1, 3, 6, 7, 13

22 "Bubble sort" algoritam za sortiranje
Verzija za sortiranje od manjih prema većim elementima Prolazi se kroz niz zadanih brojeva Pritom se uspoređuju susjedni elementi Ako je neki element veći od sljedećeg treba ih zamijeniti (veći elementi se pomiču prema kraju niza) Nakon prvog prolaza kroz cijeli niz najveći element će se naći na kraju niza Ponovno se prolazi kroz niz ali samo do pretposljednjeg elementa (jer je najveći element već na kraju niza) I tako dalje ... Najveći članovi se svakim prolazom postepeno gomilaju na vrhu niza (poput mjehurića u pivu – odatle i naziv Bubble sort)

23 Bubble sort - Dijagram toka

24 Bubble sort - prvi dio kôda (unos podataka)
#include <iostream> #include <conio.h> using namespace std; int main () { int Niz[100]; int N; cout << "Upisi broj clanova niza: "; cin >> N; int i; for (i=0; i<N; ++i) cout << endl << "Upisi Niz[" << i << "]: "; cin >> Niz[i]; } cout << endl; // drugi dio programa na slijedećem slajdu...

25 Bubble sort - drugi dio kôda (sortiranje podataka)
// ... nastavak s prethodnog slajda for (i = N-1; i > 0; --i) { for (int j = 0; j < i; ++j) { if (Niz[j+1] < Niz[j]) { double privremeni = Niz[j]; Niz[j] = Niz[j+1]; Niz[j+1] = privremeni; } cout << "Brojevi slozeni po velicini: " << endl; for (i = 0; i < N; ++i) { cout << Niz[i] << endl; getch(); return 0;

26 Bubble sort - verzija s prekidom ako su brojevi već sortirani -
for (i = N-1; i > 0; --i) { bool zamjena = false; for (int j = 0; j < i; ++j) { if (Niz[j+1] < Niz[j]) { double privremeni = Niz[j]; Niz[j] = Niz[j+1]; Niz[j+1] = privremeni; zamjena = true; } if (zamjena == false) { break; cout << "Brojevi slozeni po velicini: " << endl; for (i = 0; i < N; ++i) { cout << Niz[i] << endl; getch(); return 0;

27 Bubble sort - verzija s generiranjem slučajnih brojeva - 1
Bubble sort - verzija s generiranjem slučajnih brojeva - 1. dio programa - #include "stdafx.h" #include <iostream> #include <ctime> using namespace std; int main() { constexpr int N = 10000; srand((int)time(0)); // Koristi sistemsko vrijeme pa rand() ne daje uvijek iste slučajne brojeve int broj[N]; for (int i = 0; i < N; i++) { broj[i] = rand(); // Generira slučajan broj između 0 i RAND_MAX (najčešće 32767) }

28 Bubble sort - verzija s generiranjem slučajnih brojeva - 2
Bubble sort - verzija s generiranjem slučajnih brojeva - 2. dio programa - for (int i = N-1; i > 0; --i) { for (int j = 0; j < i; ++j) { if (broj[j] > broj[j + 1]) { swap(broj[j], broj[j + 1]); } cout << "Brojevi slozeni po velicini:" << endl << endl; for (int i = 0; i < N; ++i) { cout << broj[i] << endl; return 0;

29 Dvodimenzionalni nizovi
Članovi dvodimenzionalnog niza imaju dva indeksa Deklaracija u slučaju niza cijelih brojeva dimenzija 3x5: int Tablica[3][5]; Niz smo nazvali Tablica jer je dvodimenzionalne nizove lakše razumjeti ako na njih gledamo kao na tablice: Prvi indeks predstavlja redke Drugi indeks predstavlja stupce Ali na njih samo možemo gledati kao na tablice ali u stvari oni to nisu to je samo jedna njihova moguća vizualizacija

30 Primjer Napišimo program za unos članova dvodimenzionalnog niza i njihov ispis u obliku tablice Elementi se mogu inicijalizirati ovako: int X[2][3]= { {1,2,3}, {4,5,6}}; Ispis treba biti oblika:

31 Program za prethodni primjer
#include <iostream> using namespace std; int main () { int i, j; int X[2][3]= {{1,2,3}, {4,5,6}}; for(i=0; i<2; i++) for(j=0; j<3; j++) cout << X[i][j] <<" "; } cout << endl; return 0;

32 Ispis prethodnog programa

33 Program za množenje matrica

34 Program za množenje matrica
Dakle: ⋯ ⋮ ⋱ ⋮ 𝐴 𝑖 [0] ⋯ 𝐴 𝑖 […] ⋯ ⋮ ⋱ ⋮ ⋯ ⋯ ⋮ ⋱ ⋮ ⋯ 𝐴 𝑖 [𝑛−1] ⋯ ⋮ ⋱ ⋮ ⋯ ⋯ 𝐵 0 [𝑗] ⋮ ⋱ ⋮ ⋯ 𝐵 … [𝑗] ⋯ ⋮ ⋱ ⋮ ⋯ 𝐵 𝑛−1 [𝑗] ⋯ ⋮ ⋱ ⋮ ⋯ ⋯ ⋮ ⋱ ⋮ ⋯ Na koje mjesto konačne matrice (umnoška) ide element koji se dobije množenjem gornjeg i-tog retka matrice A i j-tog stupca matrice B?

35 Program za množenje matrica
Dakle: ⋯ ⋮ ⋱ ⋮ 𝐴 𝑖 [0] ⋯ 𝐴 𝑖 […] ⋯ ⋮ ⋱ ⋮ ⋯ ⋯ ⋮ ⋱ ⋮ ⋯ 𝐴 𝑖 [𝑛−1] ⋯ ⋮ ⋱ ⋮ ⋯ ⋯ 𝐵 0 [𝑗] ⋮ ⋱ ⋮ ⋯ 𝐵 … [𝑗] ⋯ ⋮ ⋱ ⋮ ⋯ 𝐵 𝑛−1 [𝑗] ⋯ ⋮ ⋱ ⋮ ⋯ ⋯ ⋮ ⋱ ⋮ ⋯ Ide u i-ti redak i j-ti stupac

36 Program za množenje matrica
#include <iostream> #include <iomanip> using namespace std; int main() { int a[10][10], b[10][10], c[10][10]; int r1, s1, r2, s2; // Unos dimenzija matrica cout << "Unesi broj redaka prve matrice: "; cin >> r1; cout << "Unesi broj stupaca prve matrice: "; cin >> s1; cout << "Unesi broj redaka druge matrice: "; cin >> r2; cout << "Unesi broj stupaca druge matrice: "; cin >> s2; // Ako s1!=r2 reci korisniku da ponovno unese dimenzije: while (s1!=r2) { cout << "Broj stupaca prve matrice nije jednak broju stupaca druge matrice!"; } // Unos elemenata prve matrice: cout << endl << "Unesi elemente prve matrice:" << endl; for(int i = 0; i < r1; ++i) for(int j = 0; j < s1; ++j) { cout << "Unesi element a" << i + 1 << j + 1 << ": "; cin >> a[i][j]; // Unos elemenata druge matrice: cout << endl << "Unesi elemente druge matrice:" << endl; for(int i = 0; i < r2; ++i) for(int j = 0; j < s2; ++j) { cout << "Unesi element b" << i + 1 << j + 1 << ": "; cin >> b[i][j]; // Postavljamo elemente matrice c na nulu c[i][j]=0; // Mnozenje matrica a i b i spremanje rezultata u matricu c: for(int j = 0; j < s2; ++j) for(int k = 0; k < s1; ++k) { c[i][j] += a[i][k] * b[k][j]; // Prikaz rezultata: cout << endl << "Umnozak matrica: " << endl; for(int i = 0; i < r1; ++i) { cout << setw(5) << c[i][j]; cout << endl; return 0;

37 Program za množenje matrica


Скинути ppt "Programiranje - Nizovi -"

Сличне презентације


Реклама од Google