Professional Documents
Culture Documents
Cas 11
Cas 11
Biljana Stojanovi
as 11, 23. 12. 2009.
1. Nizovi
1.1 Inicijalizacija elemenata niza
Inicijalizacija elemenata niza se moe izvriti navoenjem inicijalizacionih vrednosti
izmeu vitiastih zagrada koje moraju biti konstante.
Dimenzija niza se u tom sluaju automatski odreuje na osnovu broja inicijalizatora i
nije neophodno navoditi je izmeu [].
Ako se dimenzija navede, ne sme biti manja od broja inicijalizatora u listi.
Ako je vea, ostali elementi niza popunjavaju se nulama.
Zapis a[i] znai isto to i *(a + i). Prilikom izraunavanja izraza a[i], C ga odmah
pretvara u *(a + i). Ova dva oblika su ekvivalenta.
a[i]
*(a + i)
p[i]
Dakle, ako p pokazuje na odreeni element niza a, tada p+1 pokazuje na naredni
element, dok p+i pokazuje na element koji se u nizu a nalazi i pozicija iza elementa
na koji pokazuje p, a p-i pokazuje na element koji se u nizu a nalazi i pozicija pre
elementa na koji pokazuje p.
Razlika izmeu imena niza (a) i pokazivaa (p) je u tome to je pokaziva
promenljiva, dok ime niza nije promenljiva, pa samim tim mu se ne moe promeniti
vrednost.
Drugim reima, izrazi p = a i p++ su dozvoljeni (postavlja da p pokazuje na nulti
element niza a, odnosno pomera pokaziva p za jednu poziciju u nizu a u desno).
Izrazi a = p i a++ nisu dozvoljeni a nije promenljiva pokazivakog tipa, ve je
tipa niz celih brojeva i samo je automatski konvertovana u pokaziva na prvi lan
niza.
printf("Vrednost
printf("Vrednost
printf("Vrednost
printf("Vrednost
izraza
izraza
izraza
izraza
return 0;
}
scanf("%d", p);
/* Prikaz niza */
printf("Uneli ste niz:\n");
for(p = a; p - a < n; p++)
printf("%d ", *p);
printf("\n");
/* 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");
return 0;
}
Primer 5 (Redni broj dana u godini): Program za uneti datum utvruje redni broj
tog dana u datoj godini. Program demonstrira upotrebu nizova, kao i veze nizova i
pokazivaa.
#include <stdio.h>
int main()
{
int obicna[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int prestupna[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30,31};
int dan, mesec, godina;
int i, *tekuca;
int dan_u_godini = 0;
printf("Uneti datum u formatu dd:mm:yyyy: ");
scanf("%d:%d:%d", &dan, &mesec, &godina);
/* Proveravamo da li je godina prestupna */
if(godina % 400 == 0 || (godina % 100 != 0 && godina % 4 == 0))
tekuca = prestupna;
/* Pokazivac tekuca pokazuje na
Biljana Stojanovi | Univerzitet u Beogradu, Matematiki fakultet
3. Nizovi i funkcije
Funkcije koje prihvataju niz kao argument, zapravo prihvataju kao argument samo
adresu prvog elementa niza. To ima nekoliko posledica:
1. Funkcija ne zna unapred koliko elemenata ima niz, ve samo gde on u
memoriji poinje. Zato se duina niza mora preneti posebnim celobrojnim
parametrom. Ovo vai za sve nizove, osim za niske karaktera.
2. Svejedno je da li emo u listi parametara napisati npr. double a[] ili double
*a, prevodilac to uvek razume kao double *a.
Ako napiemo na nizovski nain, double a[], tada se dimenzija ne navodi
izmeu [], a ako se navede, ignorie se.
3. Unutar funkcije se promenljiva a koristi kao pokaziva na double, tj. sa njom
se moe raditi sve to i sa bilo kojim pokazivaem, ukljuujui i promene
vrednosti.
Biljana Stojanovi | Univerzitet u Beogradu, Matematiki fakultet
Primer 7 (Nizovi i funkcije): Program unosi realne brojeve sa ulaza i rauna zbir i
proizvod elemenata, kao i najvei i najmanji element u nizu.
#include <stdio.h>
#define MAX 100
/* Funkcija racuna zbir elemenata niza */
double zbir(double a[], int n)
{
double s = 0;
int i;
/* Sumiramo n elemenata niza */
Biljana Stojanovi | Univerzitet u Beogradu, Matematiki fakultet
10
niza. */
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;
/* NAPOMENA: funkcija zameni() menja vrednosti
elementima niza. Kako je a pokazivac na
prvi element originalnog niza koji je predat
kao argument funkciji prilikom poziva,
promene koje funkcija izvrsi odrazice se
na originalni niz, tj. pozivajuca funkcija
ce moci da "vidi" promene na nizu koje je
izvrsila funkcija zameni() */
for(i = 0 ; i < n - 1 ; i += 2)
{
int t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
}
/* Funkcija prikazuje niz */
void prikazi(int a[], int n)
{
int i;
for(i = 0 ; i < n ; i++)
printf("%d ", a[i]);
printf("\n");
}
NAPOMENA!
Funkcija NE MOE da vrati podatak tipa niz. Fragment koda nalik sledeem:
int [] f()
{
int a[10];
Biljana Stojanovi | Univerzitet u Beogradu, Matematiki fakultet
11
Primer 9
12
int i;
for(i = 0 ; i < n ; i++)
if(i < 2)
a[i] = 1;
else
a[i] = a[i - 1] + a[i - 2];
}
/* Funkcija prikazuje niz */
void prikazi(int a[], int n)
{
int i;
for(i = 0 ; i < n ; i++)
printf("%d ", a[i]);
printf("\n");
}
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);
return 0;
}
13