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;
}
Ukoliko bismo u ovom programu željeli vidjeti koliko je učitanih brojeva manjih (ili većih) od prosjeka to ne bismo mogli napraviti jer je program u varijabli x zapamtio samo posljednju učitanu vrijednost. Ostale nisu sačuvane. Ono što možemo je za pohranu ocjena upotrijebiti polje i tada će sve učitane vrijednosti biti spremljene pa se mogu usporediti sa prosjekom.
To nazivamo pretraživanje niza - traženje elemenata koji zadovoljavju određeni uvjet.
Napomena: Algoritmi pretraživanja, zajedno s algoritmima sortiranja, su algoritmi koji se najčešće koriste u programiranju. Razlikuju se prema složenosti, brzini i uporabi memorije. Zasad ćemo proučiti najjednostavniji način pretraživanja, ne uzimajući u obzir brzinu i složenost. To je u ovom primjeru opravdano zbog male količine podataka koje treba pretražiti.

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;
}