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
- Koji su važeći indeksi niza sa n elemenata?
- Koja je razlika između kapaciteta niza i promenljive n?
- Zašto se maksimum obično postavlja na a[0], a ne na 0?
- Koja je razlika između imax i a[imax]?
- Zašto je za brojanje elemenata iznad proseka potreban još jedan prolaz?