Staa Vujii as 11 Niz predstavlja kolekciju elemenata

  • Slides: 48
Download presentation
Staša Vujičić Čas 11

Staša Vujičić Čas 11

 Niz predstavlja kolekciju elemenata istog tipa. Primer deklaracije niza je: int niz[5]; /*

Niz predstavlja kolekciju elemenata istog tipa. Primer deklaracije niza je: int niz[5]; /* niz od 5 elemenata tipa int*/ 2

 Primer unosa vrednosti elemenata niza sa standardnog ulaza: for(i=0; i<5; i++) scanf("%d ",

Primer unosa vrednosti elemenata niza sa standardnog ulaza: for(i=0; i<5; i++) scanf("%d ", &a[i]); 3

 Štampanje elemenata niza na standardni izlaz. for(i=0; i<5; i++) printf("%d ", a[i]); 4

Štampanje elemenata niza na standardni izlaz. for(i=0; i<5; i++) printf("%d ", a[i]); 4

#include <stdio. h> main() { /* Niz inicijalizujemo tako sto mu navodimo vrednosti u

#include <stdio. h> main() { /* Niz inicijalizujemo tako sto mu navodimo vrednosti u viticasnim zagradama. Dimenzija niza se odredjuje na osnovu broja inicijalizatora */ int a[] = {1, 2, 3, 4, 5, 6}; /* Isto vazi i za niske karaktera */ char s[] = {'a', 'b', 'c'}; /* Ekvivalentno prethodnom bi bilo char s[] = {97, 98, 99}; */ 5

Operator sizeof() je unarni operator koji se može primenjivati na podatke i tipove. Ako

Operator sizeof() je unarni operator koji se može primenjivati na podatke i tipove. Ako se primeni na tip T, tada je vrednost izraza sizeof(T) broj bajtova koji zauzima jedan podatak tog tipa. Ako se primeni na podatak (ili proizvoljan izraz), tada sizeof(izraz) ima vrednost broja bajtova koje zauzima podatak, imajući u vidu tip podatka (izraza). Operator sizeof daje vrednost tipa int. Vrednost izraza sizeof se računa u vreme prevođenja programa, jer je već tada jasno koja je veličina objekta na koji se primenjuje. /* Broj elemenata niza */ int a_br_elem = sizeof(a)/sizeof(int); int s_br_elem = sizeof(s)/sizeof(char); 6

/* Ispisujemo nizove */ int i; for (i = 0; i < a_br_elem; i++)

/* Ispisujemo nizove */ int i; for (i = 0; i < a_br_elem; i++) printf("a[%d]=%dn", i, a[i]); for (i = 0; i < s_br_elem; i++) printf("s[%d]=%cn", i, s[i]); } 7

 Program računa skalarni proizvod dva vektora, čije se celobrojne koordinate unose sa ulaza.

Program računa skalarni proizvod dva vektora, čije se celobrojne koordinate unose sa ulaza. Program demonstrira upotrebu nizova. #include <stdio. h> int main() { int a[100], b[100]; int i, n, s; 8

printf("Unesite dimenziju vektora: "); scanf("%d", &n); printf("Uneti koordinate prvog vektora: n"); for(i = 0;

printf("Unesite dimenziju vektora: "); scanf("%d", &n); printf("Uneti koordinate prvog vektora: n"); for(i = 0; i < n ; i++) scanf("%d", &a[i]); printf("Uneti koordinate drugog vektora: n"); for(i = 0; i < n ; i++) scanf("%d", &b[i]); for(i = 0, s = 0; i < n ; i++) s += a[i] * b[i]; printf("Skalarni proizvod vektora: %dn", s); } 9

 U C-u postoji jaka veza između pokazivača i nizova. Deklaracija int a[10]; definiše

U C-u postoji jaka veza između pokazivača i nizova. Deklaracija int a[10]; definiše niz a veličine 10, odnosno blok od 10 susednih objekata u memoriji sa imenima a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9]. Zapis a[i] ukazuje na i-ti element niza a. 10

 Ako je pa pokazivač na neki ceo broj deklarisan pomoću int *pa; tada

Ako je pa pokazivač na neki ceo broj deklarisan pomoću int *pa; tada dodeljivanje pa = &a[0]; podešava pa da pokazuje na nulti element niza a, to jest, pa sadrži adresu od a[0]. 11

 Kako je ime niza sinonim za adresu početnog elementa niza, dodela pa =

Kako je ime niza sinonim za adresu početnog elementa niza, dodela pa = &a[0]; se može napisati i kao pa = a; Ako pa pokazuje na određeni element nekog niza, tada pa+1 pokazuje na naredni element pa tako pa+i pokazuje i elemenata iza pa, a pa-i na i elemenata ispred pa. 12

 Dakle, ako pa pokazuje na a[0] onda je *(pa+i) zapravo sadržaj i-tog elementa

Dakle, ako pa pokazuje na a[0] onda je *(pa+i) zapravo sadržaj i-tog elementa niza to jest isto je što i a[i]. pa+i je isto što i &pa[i]. Ime niza se ponaša kao pokazivač na početni element niza. Razlika između pokazivača p i a je u tome što a nije pokazivačka promenljiva, pa samim tim ne možemo da joj promenimo vrednost. 13

 Drugim rečima, izraz p++ je dozvoljen (pomera pokazivač p za jednu poziciju u

Drugim rečima, izraz p++ je dozvoljen (pomera pokazivač p za jednu poziciju u nizu udesno) a++ nije dozvoljen, jer a nije promenljiva pokazivačkog tipa, već tipa "niz celih brojeva” koja je samo automatski konvertovana u pokazivač na prvi član niza. 14

#include <stdio. h> int main() { int a[10] = {0, 1, 2, 3, 4,

#include <stdio. h> int main() { int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, * p = a; int i; 15

printf("Vrednost izraza a (tipa int *): %pn", a); printf("Vrednost izraza p (tipa int *):

printf("Vrednost izraza a (tipa int *): %pn", a); printf("Vrednost izraza p (tipa int *): %pn", p); printf("Vrednost izraza *a (tipa int): %dn", *a); printf("Vrednost izraza *p (tipa int): %dn", *p); Vrednost izraza a (tipa int *): 0 xbfd 1 f 11 c p (tipa int *): 0 xbfd 1 f 11 c *a (tipa int): 0 *p (tipa int): 0 16

for(i = 0; i < 10; i++) { printf("Vrednost izraza printf("Vrednost izraza } &a[%d]

for(i = 0; i < 10; i++) { printf("Vrednost izraza printf("Vrednost izraza } &a[%d] (tipa int *): %pn", i, &a[i]); &p[%d] (tipa int *): %pn", i, &p[i]); (a + %d) (tipa int *): %pn", i, a + i); (p + %d) (tipa int *): %pn", i, p + i); a[%d] (tipa int): %dn", i, a[i]); p[%d] (tipa int): %dn", i, p[i]); *(a + %d) (tipa int): %dn", i, *(a + i)); *(p + %d) (tipa int): %dn", i, *(p + i)); } 17

 Vrednost Vrednost Vrednost Vrednost izraza izraza izraza izraza &a[0] (tipa int *): 0

Vrednost Vrednost Vrednost Vrednost izraza izraza izraza izraza &a[0] (tipa int *): 0 xbfd 1 f 11 c &p[0] (tipa int *): 0 xbfd 1 f 11 c (a + 0) (tipa int *): 0 xbfd 1 f 11 c (p + 0) (tipa int *): 0 xbfd 1 f 11 c a[0] (tipa int): 0 p[0] (tipa int): 0 *(a + 0) (tipa int): 0 *(p + 0) (tipa int): 0 &a[1] (tipa int *): 0 xbfd 1 f 120 &p[1] (tipa int *): 0 xbfd 1 f 120 (a + 1) (tipa int *): 0 xbfd 1 f 120 (p + 1) (tipa int *): 0 xbfd 1 f 120 a[1] (tipa int): 1 p[1] (tipa int): 1 *(a + 1) (tipa int): 1 *(p + 1) (tipa int): 1. . . 18

 Program obrće elemente niza. Program demonstrira upotrebu nizova, uz korišćenje indeksne (nizovske) sintakse.

Program obrće elemente niza. Program demonstrira upotrebu nizova, uz korišćenje indeksne (nizovske) sintakse. #include <stdio. h> #define MAX 100 int main() { int n; int a[MAX]; int i, j; 19

/* Unosimo broj elemenata */ printf("Uneti broj elemenata niza (<= 100): "); scanf("%d", &n);

/* Unosimo broj elemenata */ printf("Uneti broj elemenata niza (<= 100): "); scanf("%d", &n); /* Proveravamo da li je prekoraceno ogranicenje */ if(n > MAX) n = MAX; /* Unosimo elemente niza */ printf("Uneti elemente niza: n"); for(i = 0 ; i < n ; i++) scanf("%d", &a[i]); 20

/* Prikaz niza */ printf("Uneli ste niz: n"); for(i = 0 ; i <

/* Prikaz niza */ printf("Uneli ste niz: n"); for(i = 0 ; i < n ; i++) printf("%d ", a[i]); printf("n"); /* Obrcemo niz */ for(i = 0, j = n - 1 ; i < j ; i++, j--) { int t = a[i]; a[i] = a[j]; a[j] = t; } 21

/* Prikaz niza */ printf("Niz nakon obrtanja: n"); for(i = 0 ; i <

/* Prikaz niza */ printf("Niz nakon obrtanja: n"); for(i = 0 ; i < n ; i++) printf("%d ", a[i]); printf("n"); } 22

#include <stdio. h> #define MAX 100 int main() { int n; int a[MAX]; int

#include <stdio. h> #define MAX 100 int main() { int n; int a[MAX]; int *p, *q; /* Unosimo broj elemenata */ printf("Uneti broj elemenata niza: "); scanf("%d", &n); 23

/*Proveravamo da li je prekoraceno ogranicenje*/ if(n > MAX) n = MAX; /* Unosimo

/*Proveravamo da li je prekoraceno ogranicenje*/ if(n > MAX) n = MAX; /* Unosimo elemente niza */ printf("Uneti elemente niza: n"); for(p = a ; p - a < n ; p++) scanf("%d", p); /* Prikaz niza */ printf("Uneli ste niz: n"); for(p = a ; p - a < n ; p++) printf("%d ", *p); printf("n"); 24

/* Obrcemo niz */ for(p = a, q = a + n - 1

/* Obrcemo niz */ for(p = a, q = a + n - 1 ; p < q ; p++, q--) { int t = *p; *p = *q; *q = t; } /* Prikaz niza */ printf("Niz nakon obrtanja: n"); for(p = a ; p - a < n ; p++) printf("%d ", *p); printf("n"); } 25

 Program za uneti datum utvrđuje redni broj tog dana u datoj godini. Program

Program za uneti datum utvrđuje redni broj tog dana u datoj godini. Program demonstrira upotrebu nizova, kao i veze nizova i pokazivača. #include <stdio. h> int main() { int obicna[12] = {31, 28, 31, 30, 31}; int prestupna[] = {31, 29, 31, 30, 31}; 26

int dan, mesec, godina; int i, *tekuca; int dan_u_godini = 0; printf("Uneti datum u

int dan, mesec, godina; int i, *tekuca; int dan_u_godini = 0; printf("Uneti datum u formatu dd: mm: yyyy: "); scanf("%d: %d", &dan, &mesec, &godina); /* Proveravamo da li je godina prestupna */ if(godina % 400 == 0 || (godina % 100 != 0 && godina % 4 == 0)) tekuca = prestupna; else tekuca = obicna; 27

/* Sumiramo dane protekle prethodnih meseci. Indeks ide od 0 do mesec - 2,

/* Sumiramo dane protekle prethodnih meseci. Indeks ide od 0 do mesec - 2, zato sto indeksi u C -u pocinju od 0. Npr, za dan u mesecu martu (treci mesec) treba sabrati broj dana u januaru i februaru (tj. indeks u petlji treba ici od 0 do 1, ukljucujuci i jednicu). */ for(i = 0 ; i < mesec - 1 ; i++) dan_u_godini += tekuca[i]; /* Nakon toga jos treba dodati broj proteklih dana u tekucem mesecu */ dan_u_godini += dan; printf("Uneti datum je %d. dan u godinin", dan_u_godini); } 28

 Nizovi se prenose u funkciju tako što se prenese adresa njihovog početka. Iz

Nizovi se prenose u funkciju tako što se prenese adresa njihovog početka. Iz tog razloga oni se MOGU MENJATI u okviru funkcije. Sve nizove osim niski karaktera (stringova) neophodno je prenositi zajedno sa dimenzijom niza. 29

 Funkcija za ispis niza brojeva demonstracija prenosa niza brojeva u funkciju. 30

Funkcija za ispis niza brojeva demonstracija prenosa niza brojeva u funkciju. 30

#include <stdio. h> void print_array(int a[], int n) { int i; for (i =

#include <stdio. h> void print_array(int a[], int n) { int i; for (i = 0; i < n; i++) printf("%d ", a[i]); putchar('n'); } 31

main() { int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

main() { int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; print_array(a, sizeof(a)/sizeof(int)); } Izlaz: 123456789 32

 Skalarni proizvod dva niza brojeva. #include <stdio. h> long mnozi(int x[], int y[],

Skalarni proizvod dva niza brojeva. #include <stdio. h> long mnozi(int x[], int y[], int n); main() { int a[]={1, 2, 3, 4, 5, 6}, b[]={8, 7, 6, 5, 4, 3}; printf("Skalarno a*b= %ldn", mnozi(a, b, 6)); } 33

long mnozi(int x[ ], int y[ ], int n) { int i; long suma=0;

long mnozi(int x[ ], int y[ ], int n) { int i; long suma=0; for(i=0; i<n; i++) suma=suma+x[i]*y[i]; return suma; } Izlaz: Skalarno a*b= 98 34

 Program unosi realne brojeve sa ulaza, i računa zbir i proizvod elemenata, kao

Program unosi realne brojeve sa ulaza, i računa zbir i proizvod elemenata, kao i najveći i najmanji element u nizu. #include <stdio. h> #define MAX 100 35

/* Funkcija racuna zbir elemenata niza */ double zbir(double a[], int n) { double

/* Funkcija racuna zbir elemenata niza */ double zbir(double a[], int n) { double s = 0; int i; /* Sumiramo n elemenata niza. */ for(i = 0; i < n ; i++) s=s+a[i]; return s; } 36

/* Funkcija racuna proizvod elemenata niza */ double proizvod(double a[], int n) { double

/* Funkcija racuna proizvod elemenata niza */ double proizvod(double a[], int n) { double p = 1; /* Mnozimo n elemenata niza */ for(; n ; n--) p *= *a++; return p; } 37

/* Funkcija racuna najveci element niza */ double max(double *a, int n) { double

/* Funkcija racuna najveci element niza */ double max(double *a, int n) { double max = *a; /* Odredjujemo najveci element */ for(a++, n-- ; n > 0 ; a++, n--) if(*a > max) max = *a; return max; } 38

/* Funkcija racuna najmanji element niza */ double min(double *a, int n) { double

/* Funkcija racuna najmanji element niza */ double min(double *a, int n) { double min = a[0]; int i; /* Odredjujemo najmanji element */ for(i = 1 ; i < n ; i++) if(a[i] < min) min = a[i]; return min; } 39

int main() { double a[MAX]; int n , i; /* Ucitavamo dimenziju niza */

int main() { double a[MAX]; int n , i; /* Ucitavamo dimenziju niza */ printf("Uneti broj elemenata niza (<= 100): "); scanf("%d", &n); /* Proveravamo da li je dimenzija veca od MAX */ if(n > MAX) n = MAX; /* Ucitavamo elemente niza */ for(i = 0; i < n ; i++) scanf("%lf", a + i); 40

/* Pozivamo gornje funkcije i prikazujemo vrednosti */ printf("Zbir elemenata niza je: %5. 3

/* Pozivamo gornje funkcije i prikazujemo vrednosti */ printf("Zbir elemenata niza je: %5. 3 fn", zbir(a, n)); printf("Proizvod elemenata niza je: %5. 3 fn", proizvod(a, n)); printf("Najveci element u nizu je: %5. 3 fn", max(a, n)); printf("Najmanji element u nizu je: %5. 3 fn", min(a, n)); } 41

 Program zamenjuje susedne elemente niza na parnim i neparnim pozicijama. Program demonstrira prenos

Program zamenjuje susedne elemente niza na parnim i neparnim pozicijama. Program demonstrira prenos nizova po adresi. #include <stdio. h> /* Deklaracije funkcija */ void zameni(int a[], int n); void prikazi(int a[], int n); int main() { int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int n = sizeof(a)/sizeof(int); 42

prikazi(a, n); zameni(a, n); prikazi(a, n); return 0; } /* Funkcija zamenjuje susedne elemente

prikazi(a, n); zameni(a, n); prikazi(a, n); return 0; } /* Funkcija zamenjuje susedne elemente niza na parnim i neparnim pozicijama. */ void zameni(int a[], int n) { int i; for(i = 0 ; i < n - 1 ; i += 2) { int t = a[i]; a[i] = a[i + 1]; a[i + 1] = t; } } 43

/* Funkcija prikazuje niz */ void prikazi(int a[], int n) { int i; for(i

/* Funkcija prikazuje niz */ void prikazi(int a[], int n) { int i; for(i = 0 ; i < n ; i++) printf("%d ", a[i]); printf("n"); } 44

 Program generiše niz Fibonačijevih brojeva. Program demonstrira vraćanje podataka nizovskog tipa iz funkcije.

Program generiše niz Fibonačijevih brojeva. Program demonstrira vraćanje podataka nizovskog tipa iz funkcije. #include <stdio. h> #define MAX 46 45

/* Funkcija izracunava prvih n Fibonacijevih brojeva i smesta ih u niz a */

/* Funkcija izracunava prvih n Fibonacijevih brojeva i smesta ih u niz a */ void fibonaci(int a[], int n) { int i; for(i = 0 ; i < n ; i++) if(i < 2) a[i] = 1; else a[i] = a[i - 1] + a[i - 2]; } 46

/* Funkcija prikazuje niz */ void prikazi(int a[], int n) { int i; for(i

/* Funkcija prikazuje niz */ void prikazi(int a[], int n) { int i; for(i = 0 ; i < n ; i++) printf("%d ", a[i]); printf("n"); } 47

int main() { int f[MAX]; int n; /* Ucitavamo dimenziju niza */ printf("Uneti broj

int main() { int f[MAX]; int n; /* Ucitavamo dimenziju niza */ printf("Uneti broj Fibonacijevih brojeva (<=46): "); scanf("%d", &n); /* Proveravamo prekoracenje */ if(n > MAX) n = MAX; /* Pozivamo funkciju fibonaci() koja generise niz Fibonacijevih brojeva, i smesta ih u niz f. */ fibonaci(f, n); /* Prikazujemo niz */ prikazi(f, n); } 48