19.09. Nizovi i rad sa njima
Čas 1 – Uvod i definisanje nizova
1. Kratka pitanja za ponavljanje gradiva:
- Šta znači da je C proceduralni, a C# objektni jezik?
- Kako se u C# razlikuje tip
boolod C jezika? - Od kog broja kreću indeksi u nizu?
*** TEORIJA - Objašnjenje bez primera koda ***
Kada se porede programski jezici C i C#, kroz prizmu nizova, višedimenzionalnih nizova i matrica, uočavaju se i sličnosti i razlike koje proizlaze iz njihove prirode i filozofije dizajna.
Osnovna sličnost je u tome što oba jezika omogućavaju rad sa nizovima, pri čemu se elementi niza čuvaju uzastopno u memoriji i pristup im se vrši preko indeksa koji uvek počinje od nule. I u C-u i u C#-u moguće je deklarisati višedimenzionalne nizove, a elementima se pristupa navođenjem više indeksa. Takođe, u oba jezika nizovi predstavljaju kolekcije elemenata istog tipa podataka, što omogućava njihovu efikasnu obradu.
Međutim, razlike između jezika postaju očigledne čim se razmotri način na koji se nizovi kreiraju i koriste. U jeziku C nizovi su statički, što znači da njihova veličina mora biti poznata u trenutku kompajliranja programa, osim ako se ne koriste posebne funkcije za dinamičku alokaciju memorije. U C# jeziku nizovi se tretiraju kao objekti, kreiraju se u toku izvršavanja programa i smeštaju na tzv. heap memoriju, što im daje veću fleksibilnost.
Bezbednost je još jedna značajna razlika. C ne vrši proveru granica niza, pa pristup elementima van zadatih granica može dovesti do oštećenja memorije i nepredvidivog ponašanja programa. Nasuprot tome, C# ima ugrađene mehanizme za proveru granica i u slučaju neispravnog pristupa automatski prekida izvršavanje, prijavljujući grešku kroz izuzetak.
Kada se govori o višedimenzionalnim nizovima i matricama, u jeziku C oni su zapravo organizovani kao nizovi nizova, pri čemu se struktura mora jasno definisati i ostaje nepromenljiva. C# nudi dve mogućnosti: korišćenje pravih višedimenzionalnih nizova, gde svi redovi imaju isti broj kolona, ili korišćenje tzv. nazubljenih (jagged) nizova, gde svaki red može imati različitu dužinu. Ovakav pristup daje veću slobodu programeru i prilagođava se raznovrsnijim problemima.
Što se tiče matrica, ni jedan od jezika nema poseban ugrađeni tip podatka za rad sa njima, ali je pristup različit. U C-u se matrice realizuju kroz dvodimenzionalne nizove, a sve operacije se implementiraju ručno. U C# jeziku, zahvaljujući objektnoj orijentaciji i bogatstvu biblioteka, lako se kreiraju posebne klase ili koriste gotovi moduli koji omogućavaju rad sa matricama na višem nivou apstrakcije.
Kao zaključak može se istaći da C daje jednostavan i brz, ali pristup na niskom nivou, gde je odgovornost u potpunosti na programeru. C# s druge strane nudi viši nivo bezbednosti, fleksibilnosti i podrške kroz objekte i biblioteke, čime se rad sa nizovima i matricama čini preglednijim i pouzdanijim.
2. Poređenje sa C
U C jeziku niz je jednostavno „deo memorije“ u kojem čuvamo podatke istog tipa. Deklaracija izgleda ovako:
int niz[5];
Ovo znači da imamo niz od 5 mesta, i svako mesto je tipa int. Prvi element niza ima indeks 0, drugi indeks 1, itd (indeksi uvek idu od nule do velicina -
1).
Tu smo na nivou proceduralnog razmišljanja – programer mora sam da vodi računa o veličini, indeksima, pa čak i da se pazi da ne pređe granice niza. Na početku programa mora da bude definisana maksimalna dužina niza i od toga može da se koristi manji broj elemenata, ali ne može da se naknadno poveća veličina niza, niti da bude veća od početno definisane.
U C# takođe postoje nizovi, ali ih posmatramo više objektno – svaki niz je zapravo objekat klase System.Array.
To znači:
-
niz ima svojstva (npr.
Length), -
niz ima metode (npr.
Sort,Reverse), -
niz nije samo „deo memorije“ već objekat sa mogućnostima.
Deklaracija:
int[] niz = new int[5];
Dakle, sintaksa je drugačija, ali logika je ista: niz čuva više vrednosti istog tipa.
3. Primer
using System;
class Program
{
static void Main()
{
int[] brojevi = { 2, 4, 6, 8, 10 };
Console.WriteLine("Prvi element: " + brojevi[0]);
Console.WriteLine("Treći element: " + brojevi[2]);
}
}
Diskusija: „Kako bi ovo izgledalo u C jeziku?“
C:
int brojevi[5] = {2,4,6,8,10};
printf("%d",
brojevi[0]);
– slično, ali u C# niz je objekat i nudi više mogućnosti.
4. Vežba (15 min)
Zadatak 1: Napraviti niz od 3 imena svojih drugova i ispisati ih na ekranu.
Rešenje:
string[] imena = { "Ana", "Marko", "Petar" };
foreach (string el in imena)
Console.WriteLine(el);
Čas 2 – Sistemske metode za rad sa nizovima
Jedna od prednosti C# jezika je to što nudi gotove metode za rad sa nizovima. To znači da ne moramo sve da pišemo sami – mnoge stvari su već pripremljene. Drugim rečima, pošto je niz u jeeziku C# objekat, on ima metode i svojstva, od kojih ćemo najčešće koristiti sledeće:
-
Length– dužina niza (broj elemenata niza) - ovo je svojstvo, a ispod su neke metode: -
Array.Sort(niz)– sortira niz u rastući redosled -
Array.Reverse(niz)– obrće redosled elemenata niza -
Array.IndexOf(niz, vrednost)– vraća indeks na kojem se nalazi određena vrednost
NAPOMENA: U C jeziku ovoga nema – tamo moramo sve sami da pišemo (sopstvene funkcije za sortiranje, za traženje itd.).
2. Primer
int[] brojevi = { 42, 5, 17, 9 };
Console.WriteLine("Dužina niza: " + brojevi.Length);
Array.Sort(brojevi);
Console.WriteLine("Sortirani niz:");
foreach (int x in brojevi)
Console.WriteLine(x);
Array.Reverse(brojevi);
Console.WriteLine("Obrnuti niz:");
foreach (int x in brojevi)
Console.WriteLine(x);
int indeks = Array.IndexOf(brojevi, 17);
Console.WriteLine("Broj 17 se nalazi na poziciji: " + indeks);
3. Vežbe (20 min)
Zadatak 2: Napraviti niz od 6 brojeva, ispisati ga, zatim ga sortirati i ponovo ispisati.
Rešenje:
int[] niz = { 33, 12, 7, 98, 50, 1 };
Console.WriteLine("Originalni niz:");
foreach (int x in niz)
Console.WriteLine(x);
Array.Sort(niz);
Console.WriteLine("Sortirani niz:");
foreach (int x in niz)
Console.WriteLine(x);
Zadatak 3: Napraviti niz stringova (imena predmeta u školi). Koristiti Array.Reverse da se prikažu unazad.
** Diskusija: C vs. C#
-
Slično: oba jezika imaju nizove, indeksi kreću od nule.
-
Različito: u C jeziku niz je „sirovi blok memorije“, a u C# niz je objekat sa metodama i svojstvima.
-
Prednost C#: manje „ručne“ logike, više sigurnosti, pregledniji kod.
** Kompleksniji primer (zajednički rad)
Zadatak: Napisati program koji traži od korisnika da unese 5 brojeva, smešta ih u niz, a zatim:
-
ispisuje sve brojeve,
-
ispisuje najveći i najmanji broj,
-
ispisuje niz obrnutim redosledom.
Rešenje:
using System;
class Program
{
static void Main()
{
int[] niz = new int[5];
Console.WriteLine("Unesite 5 brojeva:");
for (int i = 0; i < niz.Length; i++)
niz[i] = int.Parse(Console.ReadLine());
Console.WriteLine("Uneti brojevi:");
foreach (int x in niz)
Console.WriteLine(x);
int max = niz[0], min = niz[0];
foreach (int x in niz)
{
if (x > max) max = x;
if (x < min) min = x;
}
Console.WriteLine("Najveći broj: " + max);
Console.WriteLine("Najmanji broj: " + min);
Array.Reverse(niz);
Console.WriteLine("Obrnuti niz:");
foreach (int x in niz)
Console.WriteLine(x);
}
}
3. Mini test (10 min)
-- biće postavljeno naknadno
-----