Jednodimenzionalni niz
Sjedište: | CARNET - Arhiva 2021 Loomen |
E-kolegij: | III. Gimnazija Osijek - Informatika 2 |
Knjiga: | Jednodimenzionalni niz |
Otisnuo/la: | Gost (anonimni korisnik) |
Datum: | utorak, 28. siječnja 2025., 04:28 |
1. Jednodimenzionalni niz
Jednodimenzionalni niz je najjednostavniji oblik nizova. U njemu se elementi dohvaćaju s pomoću samo jednog indeksa. Elementi niza nalaze se u linearnom slijedu. Početni indeks niza u C-u je 0.
Kako to izgleda u memoriji?
Primjerice, ako se u programu najavi realna varijabla a (float a;), program prevoditelj već pri najavi osigura mjesto za jednu realnu varijablu (4 bajta). Toj se lokaciji pristupa preko imena varijable:
Najavom (deklaracijom) jednodimenzionalnog niza u memoriji za svaki element rezervira se zasebna memorijska lokacija. Rezervirane lokacije uglavnom idu jedna iza druge.
Kad se najavi niz od devet realnih elemenata, program prevoditelj osigurava u memoriji neprekinuti prostor za devet realnih podataka (9 puta po 4 bajta).
1.1. Najava (deklaracija) jednodimenzionalnog niza
Niz se, kao i svaka druga varijabla u programu, mora najaviti (deklarirati). Opći oblik najave jednodimenzionalnog niza je ovakav:
tip_podatka ime [duljina_niza];
gdje je:- tip_podatka jedan od osnovnih tipova podataka u C-u (int, float, double, char) , a odnosi se na tip elemenata koji će se upisivati u niz
- ime – identifikator
- duljina_niza najveći broj elemenata koji se mogu upisati u dani niz.
Napomena: Ako se niz najavi kao globalna varijabla (prije funkcije main()), onda je početna vrijednost svih elemenata niza
jednaka 0. No, ako se najavi kao lokalna varijabla, onda elementi niza nisu
inicijalizirani (nisu postavljeni na određenu početnu vrijednost). To znači da
su elementi tako najavljenog niza popunjeni slučajnim vrijednostima (ovisno o
tome što je na tomu mjestu u memoriji bilo prije navedene najave).
1.2. Inicijalizacija jednodimenzionalnog polja
Ako je potrebno, niz se može inicijalizirati tijekom najave ili u programu.
Najavom oblika:
int a[5]={10, 20, 30, 40, 50};
elementima niza pridružene su sljedeće vrijednosti:
U ovakvoj je inicijalizaciji potrebno pripaziti da broj elemenata u vitičastim zagradama ne bude veći od duljine niza. Može biti manji ili jednak. Iako, neke novije verzije prevoditelja za programski jezik C same će prilagoditi dimenziju niza, što u nekim slučajevima može prouzročiti greške pa treba biti oprezan.
Ako pri inicijalizaciji skup vrijednosti ima manje elemenata nego što je najavljeno, vrijednosti preostalih elemenata su 0 (to se odnosi samo na inicijalizaciju niza kao globalne varijable).
Primjerice, najava globalne varijable oblika
int b[7]={10, 20, 30, 40, 50};
dat će sljedeći niz u memoriji:
Ako na isti način najavimo lokalnu varijablu, početne vrijednosti elemenata niza b[5] i b[6] bit će neodređene (ono što u tom trenutku bude u memoriji).
Da bi se izbjegle eventualne pogreške, duljina niza se može i izostaviti. Program prevoditelj će tada sam odrediti duljinu niza, prema broju elemenata navedenih u vitičastim zagradama.
Prethodni se niz može najaviti i inicijalizirati i na sljedeći način:
int b[]={10, 20, 30, 40, 50};
Zauzeti memorijski prostor u tom je primjeru ovakav:
1.3. Dohvaćanje elemenata niza
Za dohvaćanje vrijednosti bilo kojeg elementa niza potrebno je znati njegovo mjesto u nizu, odnosno njegov indeks. S obzirom na to da indeksi u C-u počinju od nule, treba imati na umu da je element na i-tomu mjestu u nizu, zapravo, element indeksa i-1. Ako treba dohvatiti treći član niza b, to je element b[2]. Vrijednost elementa b[2] u prethodnom je primjeru 30. Možemo je ispisati na zaslon funkcijom za ispisivanje.
Naredbom
printf("\n%d",b[3]);
na zaslonu će se ispisati broj 40 jer to je vrijednost koja se nalazi na četvrtome mjestu u nizu b (i ima indeks 3).
Primjer
Najavljen je i inicijaliziran niz a:int a[]={13, 21, 16, 2, 5};
a[2]=a[0]+a[1];
a[2]++;
Koje će vrijednosti imati element a[2] nakon izvršavanja:
a) samo prve linije kôda (deklaracije)
b) prvih dviju linija koda
c) svih triju navedenih instrukcija?
Rješenje
a) 16
b) 34 (13 + 21)
c) 35 (34 + 1)
Iz prethodnog je primjera vidljivo da se svaki element niza može dohvaćati i mijenjati neovisno o ostalim elementima.
Zadatak
U sljedećem su programu učinjene tri greške. Pronađite ih i ispravite bez upisivanja programa u računalo.
#include <stdio.h>int main ()
{
int a;
int a[], b[3]={1, 2, 3, 4};
a[0]=b[1];
a[1]=b[0];
printf("%d, %d", a[0], a[1]);
return 0;
}
Rješenje
varijabla a najavljena je na dvama mjestima
veličina niza a nije određena
previše vrijednosti u postupku inicijalizacije niza b (duljina niza je 3, a navedene su četiri početne vrijednosti)
Ispravan program izgleda ovako:
#include <stdio.h>int main ()
{
int a[2], b[3]={1, 2, 3};
a[0]=b[1];
a[1]=b[0];
printf("%d, %d", a[0], a[1]);
return 0;
}
i na zaslon ispisuje vrijednosti niza a, odnosno brojeve 2 i 1.
1.4. Ispis elemenata niza
Postavljene vrijednosti elemenata niza često treba ispisati na zaslonu. Tada se naredba za ispis kombinira s programskim petljama koje omogućuju „kretanje” po nizu, promjenom indeksa. Moguće je koristiti se bilo kojom petljom, ali je najpraktičniji izbor petlja for.
for (i = 0; i<n; i++)printf ("\nformat", ime_polja[i]);
gdje je
- i – kontrolna varijabla
- n ‒ veličina niza (najveći broj elemenata)
- format – format za ispis koji ovisi o tipu elemenata upisanih u niz.
Primjer 1.
Niz naredbi:
#include <stdio.h>int main ()
{
int i, b[]={1, 3, 5, 7, 11, 13};
for (i=0;i<6;i++)
printf("%d ", b[i]);
return 0;
}
najavljuje, inicijalizira i ispisuje niz b od šest elementa: 1 3 5 7 11 13 s razmakom između svakog elementa.
Napomena: Varijabla i je kontrolna varijabla koja se mijenja od 0 do 5 i na taj način omogućuje funkciji za ispisivanje da dohvati i ispiše vrijednosti svih elemenata niza. U zadnjem koraku petlje varijabla i poprima vrijednost 6, ali tada uvjet nije zadovoljen i prestaje izvršavanje petlje for.
Primjer 2.
Nakon izvođenja programa:
#include <stdio.h>int main ()
{
int i, b[10]={2,4,6,8,10,12,14,16};
for (i=1;i<7;i+=2)
printf("%d ", b[i]);
return 0;
}
na zaslonu će se ispisati: 4 8 12. Zbog čega?
Početna vrijednost kontrolne varijable u petlji for jednaka je 1, što znači da će prvi element koji se ispiše imati indeks 1, a to je drugi element u danom nizu, tj. broj 4. Vrijednost kontrolne varijable uvećava se za dva, pa se svaki drugi element preskače. Iako je, najavljivanjem i inicijalizacijom niza, zauzeto i popunjeno osam mjesta, zbog završne vrijednosti kontrolne varijable koja je pet, ispisuju se samo navedeni elementi. (Kontrolna varijabla i će u petlji poprimiti i vrijednost 7, ali zbog neistinitosti uvjeta, petlja se više ne izvršava.)1.5. Upisivanje vrijednosti elemenata u niz
Ne zahtijeva svaki program postavljanje vrijednosti elemenata pri najavljivanju. Najčešće je potrebno omogućiti korisniku da tijekom uporabe programa sam upisuje vrijednosti u niz.I za ispisivanje vrijednosti i za njihovo učitavanje koriste se programske petlje. Promjenom vrijednosti kontrolne varijable mijenja se mjesto u nizu na koje se upisuje vrijednost. Na taj se način u memoriji čuvaju sve upisane vrijednosti sve dok se ne prekine izvođenje programa.
for (i = 0; i<n; i++)scanf ("\nformat", &ime_niza[i]);
Primjer 1.
Niz naredbi:
#include <stdio.h>int main()
{
int i, b[3];
for (i=0;i<3;i++)
scanf("%d", &b[i]);
return 0;
}
od korisnika traži upisivanje vrijednosti u najavljeni niz od tri elementa.
Primjer 2.
Program traži upisivanje vrijednosti u niz, a zatim ih ispisuje na zaslonu monitora.
Napomena: Često u zadatcima treba pretpostaviti maksimalnu duljinu niza, a pri samom izvršavanju od korisnika tražiti stvarnu dimenziju. Tako je to učinjeno u ovom primjeru: pretpostavljena najveće duljina je 20!
#include <stdio.h>
int main()
{
int i,n,a[20];
printf("Upisite broj elemenata u nizu: ");
scanf("%d",&n);
if (n<=20 && n>0)
{
printf("\nUpisi elemente niza:\n");
for (i=0; i<n; i++)
{
printf("a[%d]= ",i);
scanf("%d",&a[i]);
}
printf("\nUcitani elementi su: \n");
for (i=0; i<n; i++)
printf("\n %d. element je %d",i, a[i]);
}
else
printf("\nUpisali ste krivi broj");
return 0;
}
Testni primjeri:
Ulaz: 4
45 62 48 54
Izlaz: Ucitani elementi su:
0. element je 45
1. element je 62
2. element je 48
3. element je 54
1.6. Pretraživanje niza
Kad smo obrađivali for petlju napisali smo program u kojem smo trebali ispisati aritmetičku sredinu n učitanih brojeva. Program je izgledao ovako:
#include<stdio.h>int main()
{
int n,x,i,s=0;
float as;
printf("Unesi koliko brojeva ");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("\nUnesi %d broj ",i);
scanf("%d",&x);
s=s+x;
}
as=(float)s/n;
printf("prosjek %.2f\n",as);
return 0;
I za pretraživanje niza koriste se programske petlje, ali sada zajedno s naredbom grananja jer je potrebno provjeriti zadovoljava li element niza zadani uvjet.
for (kv=0;kv<n;kv++)
if (uvjet) naredba;
Cijeli program bi onda izgledao ovako:#include<stdio.h>
int main()
{
int n,x[50],i,s=0, koliko=0;
float as;
printf("Unesi koliko brojeva ");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("Unesi %d broj ",i);
scanf("%d",&x[i]);
s=s+x[i];
}
as=(float)s/n;
for(i=1;i<=n;i++)
if (x[i]<as)
koliko++;
printf("prosjek %.2f, manje od prosjeka je %d",as,koliko);
return 0;
}