Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
Programski jezik C – nizovi
Nizovi - zašto?
Kolekcija vrednosti istog tipa
Jedno ime
Obrada u ciklusu (for-petlja)
2
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
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
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
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
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
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
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
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
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
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
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;
}
Pristup elementima niza - primer
Izlaz za n=5?
Izlaz za n=10?
Izlaz za n=15?
Izlaz za n=25?
14
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
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
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
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
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]);
}
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
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
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
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
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
Niske i funkcije
Za prenos niski u funkcije važi sve što važi i za nizove
Niske su nizovi
25
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
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
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
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
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
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
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
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