1 3 Sloeni tipovi podataka C raspolae sljedeim

  • Slides: 29
Download presentation
1. 3. Složeni tipovi podataka C raspolaže sljedećim složenim tipovima podataka: polja (indeksirane promjenljive)

1. 3. Složeni tipovi podataka C raspolaže sljedećim složenim tipovima podataka: polja (indeksirane promjenljive) jednodimenzionalno = NIZ, dvodimenzionalno = MATRICA, višedimenzionalno strukture unije 1

1. 3. 1. Polja NIZOVI ? Nizovi Niz ili vektor je jednodimenzionalno polje To

1. 3. 1. Polja NIZOVI ? Nizovi Niz ili vektor je jednodimenzionalno polje To je skup podataka istog tipa U memoriji se smješta u niz uzastopnih mem. lokacija Svi podaci u nizu imaju jedno ime = IME NIZA Ime niza predstavlja početnu adresu niza u memoriji Svaki element u nizu određen je: imenom niza, i indeksom (pomjerajem u odnosu na početak niza) niz[7] niz[6] niz[5] niz[4] niz[3] niz[2] niz[1] niz[0] MEMORIJA 2

1. 3. 1. Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata]

1. 3. 1. Polja NIZOVI ? Deklaracija niza Opšti oblik deklaracije: tip ime_niza [broj_elemenata] = {lista vrijednosti} tip niza (tip podataka u nizu) ime niza (identifikator u skladu sa sintaksom jezika, važe sva pravila kao i za skalarne promjenljive) 3 vrijednosti elemenata u nizu (inicijalizacija niza) (nije obavezno inicijalizovanje) (vrijednosti se razdvajaju zapetama) broj elemenata u nizu (cjelobrojna konstanta) (rezerviše se potreban broj bajtova za memorisanje deklarisanog broja elemenata)

1. 3. 1. Polja NIZOVI ? Deklaracija niza Primjer deklaracije: int niz[5]; char tekst[10];

1. 3. 1. Polja NIZOVI ? Deklaracija niza Primjer deklaracije: int niz[5]; char tekst[10]; tekst[9] tekst 10*1 B = 10 B Primjer: #define MAX 5 #define LENG 10 main() { int niz[MAX]; char tekst[LENG]; . . . } tekst[1] tekst[0] niz[4] niz[3] niz[2] 5*2 B = 10 B niz[1] niz[0] MEMORIJA 4

1. 3. 1. Polja NIZOVI ? Deklaracija niza Primjer deklaracije sa inicijalizacijom: A[0] int

1. 3. 1. Polja NIZOVI ? Deklaracija niza Primjer deklaracije sa inicijalizacijom: A[0] int A[3]={1, 2, 3}; int B[]={1, 2, 3, 4}; int C[5]={10}; int D[5]={0}; 5 1 A[1] 2 A[2] 3 B[0] B[1] B[2] 1 2 3 C[0] C[1] C[2] 10 0 0 D[0] D[1] D[2] 0 0 0 B[3] 4 C[3] C[4] 0 0 D[3] D[4] 0 0

1. 3. 1. Polja NIZOVI ? Primjer: Učitati niz od n cijelih brojeva, pa

1. 3. 1. Polja NIZOVI ? Primjer: Učitati niz od n cijelih brojeva, pa ih ispisati redoslijedom kojim su učitani. #include <stdio. h> #define MAX 100 main() { int niz[MAX]; int i, n; do { printf(”n=”); scanf(”%d”, &n); } while (n<1); for ( i=1 ; i<=n ; i++ ) { printf(”Unesite %d broj: ”); scanf(”%d”, &niz[i-1]); } printf(”Unijeli ste: ”); for ( i=0 ; i<n ; i++ ) printf(” %d”, niz[i]); } 6 POČETAK n ISTINA n<1 LAŽ i = 1, n niz[i-1] i = 0, n-1 niz[i] KRAJ

1. 3. 1. Polja NIZOVI ? Primjer: Učitati niz od n cijelih brojeva, pa

1. 3. 1. Polja NIZOVI ? Primjer: Učitati niz od n cijelih brojeva, pa ih ispisati obrnutim redoslijedom. #include <stdio. h> #define MAX 100 main() { int niz[MAX]; int i, n; do { printf(”n=”); scanf(”%d”, &n); } while (n<1); for ( i=1 ; i<=n ; i++ ) { printf(”Unesite %d broj: ”); scanf(”%d”, &niz[i-1]); } printf(”Unijeli ste: ”); for ( i=n ; i>=1 ; i-- ) printf(” %d”, niz[i-1]); } 7 POČETAK n ISTINA n<1 LAŽ i = 1, n niz[i-1] i = n, 1 niz[i-1] KRAJ

1. 3. 1. Polja NIZOVI ? Primjer: Učitati niz od n cijelih brojeva, pa

1. 3. 1. Polja NIZOVI ? Primjer: Učitati niz od n cijelih brojeva, pa ispisati njihovu aritmetičku sredinu i one učitane brojeve koji su veći od sredine. POČETAK T n ISTINA as = s/n n<1 i = 0, n-1 LAŽ s=0 i = 0, n-1 ISTINA niz[i]>as niz[i] s = s + niz[i] T 8 KRAJ LAŽ #include <stdio. h> #define MAX 100 main() { int niz[MAX]; int i, n, s=0; float as; do { printf(”n=”); scanf(”%d”, &n); } while (n<1); for (i=0; i<=n-1; i++) { printf(”Unesite broj: ”); scanf(”%d”, &niz[i]); s+=niz[i]; } as=(float)s / n; printf(”Sredina: %7. 3 fn”, as); printf(”Veci su: ”); for ( i=0 ; i<n ; i++ ) if (niz[i]>as) printf(” %d”, niz[i]); }

1. 3. 1. Polja NIZOVI ? Primjer: Program koji učitava niz cijelih brojeva, a

1. 3. 1. Polja NIZOVI ? Primjer: Program koji učitava niz cijelih brojeva, a zatim ih ispisuje u rastućem redoslijedu. Sortiranje niza: Sortiranje je postupak kojim se mijenja poredak elemenata u nizu, kako bi se podaci doveli u željeni redoslijed: rastući (ascending) opadajući (descending) Rješenje problema? Postoji velik broj algoritama za sortiranje Najpopularniji algoritmi za sortiranje: select-sort bubble-sort quick-sort shell-sort stack-sort. . . 9

1. 3. 1. Polja NIZOVI ? Primjer: Program koji učitava niz cijelih brojeva, a

1. 3. 1. Polja NIZOVI ? Primjer: Program koji učitava niz cijelih brojeva, a zatim ih ispisuje u rastućem redoslijedu. #include <stdio. h> #define MAX 100 main() { int niz[MAX]; int i, j, n, rb, pom; do { printf(”n= ”); scanf(”%d”, & n); } printf(”n=”); while ((n )); ((n<1) || (n>100)); for ( i=1 ; i< i=1; i<=n; i++ ) { printf(”Unesite broj: ”); scanf(”%d”, &niz [i-1 -1]); } &niz[i for ( i=0 ; i<n-1 ; i++ i=0; i<n-1; i++ ) { for ( j=i+1, rb=i; j<n; j++ ) if (niz [j] < niz[rb] rb]) rb=j; if (rb!=i) { pom=niz [i]; niz[i]= niz[rb]; niz[rb]=pom; pom=niz[i]; niz[i]=niz niz[rb]=pom; } } printf(”Sortirani niz: ”); for ( i=0; i<n; i++ ) printf(” %d”, niz[i]); } 10

1. 3. 1. Polja MATRICE ? Dvodimenzionalna polja Element niza može da bude novi

1. 3. 1. Polja MATRICE ? Dvodimenzionalna polja Element niza može da bude novi niz tako dobijamo dvodimenzionalno polje (matrica) 0 1 . . . j . . . m-1 0 1 mat[1][0] i red (vrsta) n-1 mat[i][j] 11 kolona (stupac) mat[n-1][m-1]

1. 3. 1. Polja MATRICE ? Deklaracija matrice Opšti oblik deklaracije: tip ime_mat [D

1. 3. 1. Polja MATRICE ? Deklaracija matrice Opšti oblik deklaracije: tip ime_mat [D 1][D 2] = { {L 1}, {L 2}, . . . , {Ln-1} } tip matrice (tip podataka) ime matrice vrijednosti elemenata u matrici inicijalizacija matrice nije obavezno inicijalizovanje dimenzije matrice D 1 = broj redova D 2 = broj kolona rezerviše se potreban broj bajtova za memorisanje D 1*D 2 elemenata 12

1. 3. 1. Polja MATRICE ? Deklaracija matrice Primjer deklaracije: char tablica[2][3]; 0 1

1. 3. 1. Polja MATRICE ? Deklaracija matrice Primjer deklaracije: char tablica[2][3]; 0 1 tablica[1][2] tablica[1][1] 2 0 tablica[1][0] 1 tablica[0][2] tablica[0][1] logička predstava tablica[0][0] MEMORIJA fizička predstava 13

1. 3. 1. Polja MATRICE ? Deklaracija matrice Primjer deklaracije sa inicijalizacijom: int mat[2][3]

1. 3. 1. Polja MATRICE ? Deklaracija matrice Primjer deklaracije sa inicijalizacijom: int mat[2][3] = { {3, 1, 8}, {2, 5, 6} }; 0 1 2 0 3 1 8 1 2 5 6 Primjer deklaracije sa inicijalizacijom: int mat[2][3] = { {3, 1, 8} }; 0 1 2 14 0 3 1 8 1 0 0 0

1. 3. 1. Polja MATRICE ? Manipulacija matricom Primjer učitavanja matrice: for ( red=1;

1. 3. 1. Polja MATRICE ? Manipulacija matricom Primjer učitavanja matrice: for ( red=1; red<=n; red++ ) for ( kol=1; kol<=m; kol++ ) { printf(”mat[%d]=”, red-1, kol-1); scanf(”%d”, &mat[red-1][kol-1]); } ili: for ( red=0; red<n; red++ ) for ( kol=0; kol<m; kol++ ) { printf(”mat[%d]=”, red, kol); scanf(”%d”, &mat[red][kol]); } 15

1. 3. 1. Polja MATRICE ? Manipulacija matricom Primjer ispisivanja matrice: for ( red=1;

1. 3. 1. Polja MATRICE ? Manipulacija matricom Primjer ispisivanja matrice: for ( red=1; red<=n; red++ ) { for ( kol=1; kol<=m; kol++ ) printf(” %4 d”, mat[red-1][kol-1]); printf(”n”); } ili: for ( red=0; red<n; red++ ) { for ( kol=0; kol<m; kol++ ) printf(” %4 d”, mat[red][kol]); printf(”n”); } 16

1. 3. 1. Polja MATRICE ? Manipulacija matricom Primjer manipulacije glavnom dijagonalom: mat[0][0] mat[1][1]

1. 3. 1. Polja MATRICE ? Manipulacija matricom Primjer manipulacije glavnom dijagonalom: mat[0][0] mat[1][1] mat[i][i] mat[i][j], i=j mat[n-1] Ispis elemenata na glavnoj dijagonali: printf(”Glavna dijagonala: ”); for ( i=0; i<n; i++ ) printf(” %d”, mat[i][i]); Suma elemenata na glavnoj dijagonali: for ( s=i=0; i<n; i++ ) s+=mat[i][i]; printf(”Suma elemenata na GD: %d”, s); 17

1. 3. 1. Polja MATRICE ? Manipulacija matricom Primjer manipulacije sporednom dijagonalom: mat[0][n-1] mat[1][n-2].

1. 3. 1. Polja MATRICE ? Manipulacija matricom Primjer manipulacije sporednom dijagonalom: mat[0][n-1] mat[1][n-2]. . . mat[i][j], i+j=n-1 mat[n-1][0] Ispis elemenata na sporednoj dijagonali: printf(”Sporedna dijagonala: ”); for ( i=n-1; i>=0; i-- ) printf(” %d”, mat[i][n-1 -i]); Suma elemenata na sporednoj dijagonali: for ( s=i=0; i<n; i++ ) s+=mat[i][n-1 -i]; printf(”Suma elemenata na SD: %d”, s); 18

1. 3. 1. Polja MATRICE ? Manipulacija matricom Primjer manipulacije donjom trougaonom matricom: mat[i][j],

1. 3. 1. Polja MATRICE ? Manipulacija matricom Primjer manipulacije donjom trougaonom matricom: mat[i][j], j<=i Ispis donje trougaone matrice: printf(”Donja trougaona matrica: n ”); for ( i=0; i<n; i++ ) { for ( j=0; j<=i; j++ ) printf(” %4 d”, mat[i][j]); printf(”n”); } 19

1. 3. 1. Polja MATRICE ? Manipulacija matricom Primjer manipulacije gornjom trougaonom matricom: mat[i][j],

1. 3. 1. Polja MATRICE ? Manipulacija matricom Primjer manipulacije gornjom trougaonom matricom: mat[i][j], j>=i Ispis gornje trougaone matrice: printf(”Gornja trougaona matrica: n ”); for ( i=0; i<n; i++ ) { for ( j=1; j<=i; j++ ) printf(”%5 c”, ’ ’) for ( j=i; j<n; j++ ) printf(” %4 d”, mat[i][j]); printf(”n”); } 20

1. 3. 1. Polja MATRICE ? Manipulacija matricom Primjer transponovanja matrice 1 4 7

1. 3. 1. Polja MATRICE ? Manipulacija matricom Primjer transponovanja matrice 1 4 7 2 5 8 3 6 9 polazna matrica Ispis transponovane matrice na osnovu originalne matrice: printf(”Transponovana: n ”); for ( i=0; i<n; i++ ) { for ( j=0; j<n; j++ ) printf(” %4 d”, mat[j][i]); printf(”n”); } 21 1 2 3 4 5 6 7 8 9 transponovana matrica Transponovanje matrice: for ( i=0; i<n; i++ ) for ( j=i+1; j<n; j++ ) { pom=mat[i][j]); mat[i][j]=mat[j][i]; mat[j][i]=pom; }

1. 3. 1. Polja MATRICE ? Manipulacija matricom Primjer množenja dvije matrice 1 4

1. 3. 1. Polja MATRICE ? Manipulacija matricom Primjer množenja dvije matrice 1 4 1 2 5 0 3 6 2 * Matrica A (m*n) 1 4 7 2 2 1 3 1 0 Matrica B (n*p) ? ? ? 30 9 ? ? ? 66 24 15 4 ? ? ? 5 17 3 Matrica C (m*p) Množenje matrica: for ( i=0; i<m; i++ ) /* red matrice C */ for ( j=0; j<p; j++ ) /* kolona matrice C */ for ( k=0; k<n; k++ ) c[i][j]+=a[i][k]*b[k][j]; 22

1. 3. 1. Polja VIŠE DIMENZIJE? Višedimenzionalna polja C omogućava i manipulaciju višedimenzionalnim poljima

1. 3. 1. Polja VIŠE DIMENZIJE? Višedimenzionalna polja C omogućava i manipulaciju višedimenzionalnim poljima Trodimenzionalno polje tip ime[d 1][d 2][d 3]; Primjer deklaracije: int kocka[3][6][6]; Primjer 4 -dim. polja: char P 4[d 1][d 2][d 3][d 4]; 23 kocka[sloj][red][kolona]

1. 3. 2. Strukture STRUKTURA? Strukture Struktura je skup heterogenih podataka međusobno logički povezanih

1. 3. 2. Strukture STRUKTURA? Strukture Struktura je skup heterogenih podataka međusobno logički povezanih Pogodna za grupisanje atributa nekog entiteta (stvarnog ili nestvarnog) Atributi? ime prezime visina struct osoba { char prezime[15]; char ime[15]; int visina; } 24

1. 3. 2. Strukture STRUKTURA? Deklaracija strukture Opšti oblik deklaracije: struct ključna riječ ime

1. 3. 2. Strukture STRUKTURA? Deklaracija strukture Opšti oblik deklaracije: struct ključna riječ ime strukture ime { tip 1 element 1; tip 2 element 2; . . . tip. N element. N; } lista_promjenljivih; Deklaracija elementa (polja) lista promjenljivih Primjer: ovog tipa struct osoba { char prezime[15]; char ime[15]; int visina; } student 1, student 2, klub[100]; 25

1. 3. 2. Strukture STRUKTURA? Deklaracija strukture Alternativni oblik deklaracije: struct ime { tip

1. 3. 2. Strukture STRUKTURA? Deklaracija strukture Alternativni oblik deklaracije: struct ime { tip 1 element 1; . . . tip. N element. N; }; struct ime lista_promjenljivih; 26 Npr: struct osoba { char ime[15]; int visina; }; struct osoba student, klub[100];

1. 3. 2. Strukture STRUKTURA? Pristup elementima (poljima) strukture Pristup pomoću operatora ”. ”

1. 3. 2. Strukture STRUKTURA? Pristup elementima (poljima) strukture Pristup pomoću operatora ”. ” = ELEMENT STRUKTURE Primjer: struct osoba { char prezime[15]; char ime[15]; int visina; } student, klub[100]; Pristup poljima: student. prezime = ”Markovic”; student. ime = ”Marko”; student. visina = 190; 27 klub[1]. prezime = ”Jankovic”; klub[1]. ime = ”Janko”; klub[1]. visina = 202;

1. 3. 2. Strukture STRUKTURA? Primjer: Manipulacija kompleksnim brojevima pomoću strukture #include <stdio. h>

1. 3. 2. Strukture STRUKTURA? Primjer: Manipulacija kompleksnim brojevima pomoću strukture #include <stdio. h> main() { struct kompleks { float re, im; }; kompleks x = { 3. 0, 2. 0 }; kompleks y = { 2. 0, 3. 0 }; kompleks zbir, proizvod; zbir. re = x. re + y. re; zbir. im = x. im + y. im; proizvod. re = x. re*y. re – x. im*y. im; proizvod. im = x. re*y. im + x. im*y. re; printf(”Zbir je: %5. 2 f + j%5. 2 fn”, zbir. re, zbir. im); printf(”Proizvod je: %5. 2 f + j%5. 2 fn”, proizvod. re, proizvod. im); } 28

1. 3. 2. Strukture STRUKTURA? Primjer: Manipulacija tačkom u dvodimenzionalnom koordinatnom sistemu y A(x,

1. 3. 2. Strukture STRUKTURA? Primjer: Manipulacija tačkom u dvodimenzionalnom koordinatnom sistemu y A(x, y) x B(x. B, y. B) y d A(x. A, y. A) x 29 #include <stdio. h> #include <math. h> #define KV(x) (x)*(x) main() { struct tacka { float x, y; } a, b; float d; printf(”A: x=”); scanf(”%f”, &a. x); printf(”A: y=”); scanf(”%f”, &a. y); printf(”B: x=”); scanf(”%f”, &b. x); printf(”B: y=”); scanf(”%f”, &b. y); d = sqrt( KV(a. x-b. x) + KV(a. y-b. y)); printf(”Udaljenost: %5. 2 f”, d); }