33
Programski jezik C – nizovi

8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Programski jezik C – nizovi

Page 2: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Nizovi - zašto?

Kolekcija vrednosti istog tipa

Jedno ime

Obrada u ciklusu (for-petlja)

2

Page 3: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Primer – pojedinačne promenljive

#include <stdio.h>

int main() {

int b0, b1, b2, b3, b4, b5, b6, b7, b8, b9;

scanf("%d%d%d%d%d%d%d%d%d%d",

&b0, &b1, &b2, &b3, &b4, &b5, &b6, &b7, &b8, &b9);

printf("%d %d %d %d %d %d %d %d %d %d",

b0, b1, b2, b3, b4, b5, b6, b7, b8, b9);

return 0;

}

3

Page 4: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Primer - niz

#include <stdio.h>

int main() {

int b[10], i;

for (i = 0; i < 10; i++)

scanf("%d", &b[i]);

for (i = 0; i< 10; i++)

printf("%d ", b[i]);

return 0;

}

4

Page 5: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Nizovski tip - karakteristike

Nizovska struktura karakteriše se sledećim svojstvima:

svaka pojedinačna komponenta, tzv. element niza je direktno dostupna i eksplicitno se označava;

broj komponenti definiše se kada se uvodi niz;

sve komponente su istog tipa

definicija niza uključuje komponentni tip i broj komponenti (maksimalnu vrednost indeksa)

5

Page 6: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Deklaracija niza

tip ime_niza[dimenzija];

Dimenzija predstavlja broj elemenata niza.

Na primer, deklaracija

int a[10];

uvodi niz a od 10 celih brojeva

Prvi element niza ima indeks 0, a elementi niza su:

a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9]

6

Page 7: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Deklaracija i inicijalizacija

Prilikom deklaracije može da se izvrši i inicijalizacija

int a[5] = { 1, 2, 3, 4, 5 };

Sadržaj niza a biće:

1 2 3 4 5

Pri inicijalizaciji, može da se navede manji (ali NE i veći!) broj elemenata od dimenzije niza (inicijalizuju se samo početnielementi deklarisanog niza)

7

Page 8: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Deklaracija i inicijalizacija

Veličina memorijskog prostora potrebnog za niz određuje se ufazi prevođenja programa, pa broj elemenata niza (koji senavodi u deklaraciji) mora biti konstantni izraz

Na primer, deklaracija niza a je ispravna, deklaracije nizova b i c su neispravne:

int x;

char a[100+10];

int b[];

float c[x];

8

Page 9: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Inicijalizacija

Dimenziju niza je moguće izostaviti samo ako je prilikom deklaracije izvršena i inicijalizacija niza i tada se dimenzijaodređuje na osnovu broja elemenata u inicijalizatoru

Na primer, posle deklaracije

int b[] = { 1, 2, 3 };

sadržaj niza b jednak je:

1 2 3

9

Page 10: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Operator sizeof

Kada se operator sizeof primeni na ime niza, rezultat je veličinaniza u bajtovima.

Broj elemenata može da se izračuna na sledeći način:

sizeof(ime niza)/sizeof(tip elementa niza)

Na primer,

int a[10];

int brEl=sizeof(a)/sizeof(int);

10

Page 11: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Pristup elementima niza

Komponenta (element) niza se označava imenom niza i tzv. indeksom

indeks jednoznačno određuje željeni element

Indeks je izračunljivi objekat - izraz, i to razlikuje niz od drugih strukturnih tipova

Indeks u C-u je celobrojnog tipa i svaki niz obavezno počinje od indeksa 0

11

Page 12: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

L-vrednost

Elementu niza se može dodeliti vrednost: l-vrednost

Primer:

int a[3];

a[0]=5;

a[1]=3;

a[2]=7;

Niz NIJE l-vrednost: ne može mu se dodeliti vrednost

Primer

int a[3] = {5, 3, 7};

int b[3];

b = a; /* Neispravno */

a++; /* Neispravno */12

Page 13: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Pristup elementima niza -primer

Ne vrši se provera da li je indeks u granicama

Moguće je bez prijave greške ili upozorenja pristupati i lokaciji van opsega deklarisanog niza (na primer, element a[13] ili a[-1] u prethodnom primeru).

Ovo najčešće dovodi do fatalnih grešaka prilikom izvršavanjaprograma.

13

int main(){

int n,i;

int a[10]={0,0,0,0,0,0,0,0,0,0};

int b[10]={0,0,0,0,0,0,0,0,0,0};

printf("\na = \n");

for(i=0; i<10; i++)

printf("%d ", a[i]);

printf("\nb = \n");

for(i=0; i<10; i++)

printf("%d ", b[i]);

printf("\n");

scanf("%d", &n);

for(i=0; i<n; i++) a[i] = i;

printf("\na = \n");

for(i=0; i<10; i++)

printf("%d ", a[i]);

printf("\nb = \n");

for(i=0; i<10; i++)

printf("%d ", b[i]);

printf("\n");

return 0;

}

Page 14: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Pristup elementima niza - primer

Izlaz za n=5?

Izlaz za n=10?

Izlaz za n=15?

Izlaz za n=25?

14

Page 15: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Nizovi i funkcije

Niz se NE može preneti kao argument funkcije

Prenosi se samo adresa početka niza koja se zadaje njegovim imenom

Pozvana funkcija dobija i informaciju o tipu elemenata

Pozvana funkcija NE dobija informaciju o imenu niza niti o broju elemenata niza

Pozvana funkcija može da menja elemente niza – argumenta (na osnovu informacije o adresi početka niza)

Sama adresa početka niza, kao i svaki drugi argument, prenosi se po vrednosti i ne može da se menja u pozvanoj funkciji

15

Page 16: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Nizovi i funkcije

Funkcija koja prima niz može biti deklarisana na neki od sledećih načina:

tip ime_funkcije(tip ime_niza[dimenzija]);

tip ime_funkcije(tip ime_niza[]);

Pošto se u funkciju prenosi samo adresa početka niza, a ne i dimenzija niza, prvi oblik deklaracije nema puno smisla

16

Page 17: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Primer

#include <stdio.h>

void f(int a[])

{

printf("f: %d\n", sizeof(a));

}

int main() {

int a[] = {1, 2, 3, 4, 5};

printf("main: %d\n", sizeof(a));

f(a);

return 0;

}

17

Page 18: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Nizovi i funkcije

Adresa početka niza prenosi se imenom niza

Obično je potrebno da se prenese, kao poseban argument, i broj elemenata niza

Povratni tip funkcije ne može da bude niz, ali:

Funkcija može da izmeni / popuni vrednosti elemenata niza –svog argumenta i tako prosledi rezultujući niz pozivnoj funkciji

18

Page 19: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Primer

19

#include <stdio.h>

void ucitaj_broj(int a)

{

printf("Ucitaj broj: ");

scanf("%d", &a);

}

void ucitaj_niz(int a[], int n)

{

int i;

printf("Ucitaj niz: ");

for (i = 0; i < n; i++)

scanf("%d", &a[i]);

}

int main() {

int x = 0;

int y[3] = {0, 0, 0};

ucitaj_broj(x);

ucitaj_niz(y, 3);

printf("x = %d\n", x);

printf("y = %d %d %d\n",

y[0], y[1], y[2]);

}

Page 20: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Nizovi karaktera i niske karaktera (engl. strings)

Niz karaktera: char s1[] = {’Z’, ’d’, ’r’, ’a’, ’v’, ’o’};

Niska karaktera: char s3[] = "Zdravo";

Konstantne niske navode se između dvostrukih navodnika (naprimer, "ja sam niska").

U okviru niski, specijalni karakteri navode se korišćenjemspecijalnih sekvenci (na primer, "prvi red\ndrugi red").

Niske su interno reprezentovane kao nizovi karaktera na čijidesni kraj se dopisuje karakter ’\0’, tzv. završna, terminalna nula, nula-karakter (engl. null terminator)

20

Page 21: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Nizovi karaktera i niske

char s1[] = {’Z’, ’d’, ’r’, ’a’, ’v’, ’o’};

char s2[] = {’Z’, ’d’, ’r’, ’a’, ’v’, ’o’, ’\0’};

char s3[] = "Zdravo";

21

Page 22: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Karakterska konstanta i niska

Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova)

Deklaracije za s2 i s3 su ekvivalentne i ovi nizovi sadrže po 7 karaktera (i zauzimaju po 7 bajtova)

Prvi niz karaktera nije ispravna niska

Karakterska konstanta nije isto što i karakterska niska

Na primer, ’x’ je karakterska konstanta - pojedinačni karakter

Na primer, "x" je niska koja sadrži dva karaktera, ’x’ i ’\0’

22

Page 23: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Zaglavlje string.h

strlen dužina niske u karakterima (bez 0-karaktera)

strcmp poređnje dve niske

strcpy kopiranje druge niske u prvu

strstr proverava da li je druga niska podniska prve niske

strcat nadovezuje drugu nisku na prvu

atoi – konverzija stringa u ceo broj

itoa – konverzija celog broja u string

...

23

Page 24: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Niske

Obrada niske obično karakter po karakter

Obično petlja oblika:

while (s[i] != ’\0’)

...

ili oblika:

for (i = 0; s[i] != ’\0’; i++)

...

24

Page 25: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Niske i funkcije

Za prenos niski u funkcije važi sve što važi i za nizove

Niske su nizovi

25

Page 26: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Niske i funkcije - primeri

/ strlen: vraca duzinu stringa s /

int strlen(char s[])

{

int i;

for (i=0; s[i]!= ’ \0'; i++);

return i;

}

26

Page 27: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Niske i funkcije - primeri

/ strcpy: kopira t u s; verzija sa indeksiranim nizovima /

void strcpy(char s [], const char t [])

{

int i;

i = 0;

while ((s[i] = t[i]) != ' \0 ')

i++;

return ;

}

27

Page 28: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Niske i funkcije - primeri

/ strcmp: vraca <0 ako je s<t, 0 ako je s==t, >0 ako je s>t /

int strcmp(char s[], char t[])

{

int i;

for (i = 0; s[i] == t[i]; i++)

if (s[i] == ' \0')

return 0;

return s[i] - t[i];

}

28

Page 29: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Višedimenzioni nizovi

tip ime_niza[dimenzija_1]...[dimenzija_n];

Dvodimenzioni niz je niz čiji su elementi nizovi, pa se elementu dvodimenzionog niza pristupa navođenjem indeksiranog elementa(kolone) indeksiranog elementa (vrste) dvodimenzionog niza tj.

ime_niza[vrsta][kolona]

29

Page 30: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Višedimenzioni nizovi

Npr.

char dani[2][13] = {

{ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },

{ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },

};

Slično i

char dani[][13] = {

{ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },

{ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },

};

30

Page 31: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Višedimenzioni nizovi

dani[0][2]

dani[1][10] ...

int godina = ...;

int mesec = ...;

Izračunavanje:

int prestupna = (godina % 4 == 0 && godina % 100 != 0) ||godina % 400 == 0;

char bd = dani[prestupna][mesec];

31

Page 32: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Matrice

Elementi se u memoriji smeštaju po vrstama

Niz se može inicijalizovati navođenjem liste inicijalizatora uvitičastim zagradama;

Pošto su elementi opet nizovi, svaki od njih se opet navodi u okviruvitičastih zagrada (unutrašnje vitičaste zagrade mogu da se izostave)

char a[2][3] = {

{1, 2, 3},

{4, 5, 6}

};

32

Page 33: 8.Programski jezik C nizovipoincare.matf.bg.ac.rs/~gordana/programiranjeI/Program... · 2018. 11. 12. · Niz s1 sadrži 6 karaktera (i zauzima 6 bajtova) Deklaracije za s2 i s3 su

Dvodimenzioni nizovi i funkcije

Ako je dvodimenzioni niz argument funkcije, mora da se navede broj kolona, dok je broj vrsta nebitan - imedvodimenzionog niza je pokazivač na niz vrsta od kojihsvaka sadrži onoliko elemenata koliki je navedeni broj kolona.

Na primer, niz dani bi se kao argument funkcije naveo u obliku

f(char dani[2][13]){. . . }, ili

f(char dani[ ][13]) {. . . }

U slučaju niza sa više od dve dimenzije, samo se prva dimenzijamože izostaviti (dok je sve naredne dimenzije neophodno navesti)

33