Materijali/Čas 07

Čas 07 · Indeksi, prolazak, prosek, minimum i maksimum

Nizovi: čuvanje i osnovna obrada

Niz čuva više vrednosti istog tipa pod jednim imenom. Učimo kako se elementima pristupa preko indeksa, kako se niz učitava i prolazi petljom i kako se iz njega dobijaju zbir, prosek, minimum i maksimum.

MAPA ČASA

Deklaracija → unos → prolazak → rezultat → provera

1
niz i dužina
2
unos
3
obrada
4
ispis
5
provera indeksa

Na kraju je dovoljno da:

  • Pravilno koristi indekse od 0 do n - 1.
  • Učitaj i prikaži elemente niza petljom.
  • Odredi zbir, prosek i broj elemenata iznad proseka.
  • Pronađi vrednost i indeks prvog minimuma ili maksimuma.
  • Zameni dva elementa i nacrtaj dijagram prolaska kroz niz.

01 · KORAK

Niz je više promenljivih pod jednim imenom

Deklaracija int a[6]; pravi mesto za šest celih brojeva. Svaki element ima isti tip i svoj indeks.

Niz može odmah da dobije početne vrednosti. Ako u uglastim zagradama ne napišemo dužinu, prevodilac je određuje po broju navedenih elemenata.

int a[6];
int b[3] = {4, 7, 9};
int c[] = {4, 7, 9};
int d[5] = {4, 7};
Poveži zapis i sadržajOdredi koliko elemenata imaju b, c i d. Napiši sve vrednosti niza d; elementi koji nisu izričito navedeni dobijaju 0.
Pitanje za usmeniNapisati i objasniti sintaksu deklaracije jednodimenzionalnih polja. Navesti primer inicijalizacije niza prilikom deklaracije.

02 · KORAK

Prvi indeks je 0, poslednji je n - 1

Ako niz trenutno koristi n elemenata, važeći indeksi su 0, 1, 2, …, n - 1. Zapis a[i] znači vrednost koja se nalazi na poziciji i.

Deklarisani kapacitet i broj trenutno korišćenih elemenata nisu isto. U int a[20] ima mesta za 20 brojeva, ali n može da bude 6 ako smo učitali samo šest.

int a[20];
int n;
scanf("%d", &n);
if (n < 1 || n > 20) return 0;
Nađi granicuZa n = 6 napiši prvi i poslednji važeći indeks. Objasni zašto a[6] nije šesti element nego izlazak iz važećeg dela niza.
Greška koja može da prođe neprimećenoPetlja i <= n pokušava da pristupi i elementu a[n]. Za n elemenata prolazak mora da stane dok je i < n.

03 · KORAK

Jedna petlja obilazi ceo niz

Brojač i je indeks trenutnog elementa. U unosu scanf dobija adresu &a[i], a u ispisu printf čita vrednost a[i].

Smer petlje određuje redosled ispisa. Za obrnut redosled krećemo od n - 1 i smanjujemo i do 0.

for (int i = 0; i < n; i++)
    scanf("%d", &a[i]);

for (int i = n - 1; i >= 0; i--)
    printf("%d ", a[i]);
Prati indekse, ne samo vrednostiZa niz 8, -3, 5, 8 napiši redom parove indeks–vrednost koje druga petlja obilazi.
& pripada elementu koji učitavamoKod unosa jednog elementa pišemo &a[i]. Sam a[i] je trenutna vrednost, dok &a[i] označava mesto na koje scanf upisuje novu.

04 · KORAK

Zbir i prosek, pa drugi prolaz

Zbir počinje od 0 i u prvom prolazu dobija svaki element. Realan prosek dobijamo izrazom (double)zbir / n.

Da bismo prebrojali elemente iznad proseka, prosek prvo mora da bude poznat. Zato niz čuvamo i obilazimo drugi put.

int zbir = 0, iznad = 0;
for (int i = 0; i < n; i++)
    zbir = zbir + a[i];

double prosek = (double)zbir / n;
for (int i = 0; i < n; i++)
    if (a[i] > prosek) iznad++;
Objasni potrebu za dva prolazaZa niz 2, 9, 4, 1, 4 izračunaj prosek i navedi koji elementi su strogo iznad njega. Zatim objasni zašto taj odgovor nije bio poznat usred prvog prolaza.
Prosek nije celobrojno deljenjeBez pretvaranja u double, zbir / n odbacuje decimalni deo kada su oba operanda int.

05 · KORAK

Pamtimo indeks najboljeg kandidata

Za maksimum prvo pretpostavimo da je element na indeksu 0 najveći. Zatim od indeksa 1 proveravamo može li neki element da ga zameni.

Promenljiva imax čuva poziciju, a a[imax] vrednost na toj poziciji. Sa operatorom > ostaje indeks prvog pojavljivanja najveće vrednosti.

int imax = 0;
for (int i = 1; i < n; i++) {
    if (a[i] > a[imax]) {
        imax = i;
    }
}
printf("%d %d\n", imax, a[imax]);
Prvi maksimumZa niz -4, 7, 2, 7, -1 prati i, a[i], imax i a[imax]. Objasni zašto rezultat ostaje indeks 1, a ne 3.
Ne postavljaj maksimum na 0Ako su svi elementi negativni, početna vrednost 0 uopšte nije element niza i daje pogrešan rezultat. a[0] je stvaran kandidat.

06 · KORAK

Indeksi omogućavaju i promenu niza

Kada pronađemo indekse minimuma i maksimuma, njihove vrednosti menjamo uz pomoćnu promenljivu. Dužina niza se pritom ne menja.

Ubacivanje, brisanje i sortiranje zahtevaju pomeranje ili više zamena i dolaze na sledećem času.

int pomocna = a[imin];
a[imin] = a[imax];
a[imax] = pomocna;
Vežbaonica Časa 07Zadaci 1–5 učvršćuju unos, obrnuti ispis, prvi maksimum, minimum i prosek. Zadaci 6–8 povezuju zamenu, transformaciju i ispravljanje grešaka sa programima iz radne sveske.
Šta slediČas 08 koristi istu osnovu za pretragu, ubacivanje, brisanje i jednostavno sortiranje.

ZATVARANJE

Provera pre sledećeg časa

  1. Koji su važeći indeksi niza sa n elemenata?
  2. Koja je razlika između kapaciteta niza i promenljive n?
  3. Zašto se maksimum obično postavlja na a[0], a ne na 0?
  4. Koja je razlika između imax i a[imax]?
  5. Zašto je za brojanje elemenata iznad proseka potreban još jedan prolaz?