You are on page 1of 23

Objektno orijentirano programiranje Elektrotehniki fakultet

Osijek
Auditorne vjebe Kneza Trpimira 2b
31000 Osijek

www.etfos.hr

1. Uvod u C#

C# (CSharp) je nastao u tvrtki Microsoft i razvijen je od strane tima strunjaka


predvoenih sa Anders Hejlsberg-om i Scott Wiltamuth-om. Na tritu se pojavio 2000.
godine zajedno sa .NET platformom. C# je nastao s ciljem da bude jednostavan, siguran,
moderan, objektno orijentiran jezik visokih performansi za .NET platformu. C# je nastao na
temelju objektnih jezika Java, C++ i Visual Basic. Vrlo je slian Javi i C++ jeziku (sintaksa i
semantika je dobrim dijelom preuzeta iz Jave, koja je kao i C# potpuno objektno orijentirani
jezik). Ali C# za razliku od Jave nije neovisan o platformi, tj. operativnom sustavu, ve je
kreiran za izradu stolnih (desktop) i Internet aplikacija u .Microsoft .NET okruenju.

C# sadri sve dobre odlike potpuno objektnog programskog jezika (koje veinom
preuzima iz C++ i Jave), a u sklopu .NET platforme omoguava kreiranje vizualnih
aplikacija ak i onim korisnicima koji nemaju programerskog iskustva. Takoer daje dobar
uvid u nain na koji nastaju objektne i vizualne aplikacije, i vrlo je lako nauiti korisnike kako
projektirati takve aplikacije i upravljati njihovim koritenjem. C# sadri samo oko 80
kljunih rijei i na desetke ugraenih tipova podataka kao to su:
C# ima velike mogunosti u definiranju klasa (tipova objekata), novih metoda i
svojstava, te koritenju enkapsulacije, nasljeivanja i polimorfizma kao to je to omogueno u
C++ i Javi. Takoer podrava XML stil unutar dokumenata, suelja, svojstva, dogaaje te
podrava rad s pokazivaima i ''garbage collection''. C# koristi postupak zvan garbage
collection za oslobaanje memorije koju zauzimaju objekti koji vie nisu dostupni programu.
Programer je osloboen brige o tome koji su mu objekti vie ne trebaju (garbage), jer to
umjesto njega radi sustav. Ako je objekt postojao i bio koriten neko vrijeme, moe postojati
nekoliko poziva na njega. Objekt postaje garbage tek nakon to su nestanu svi pozivi na njega.

Ranije smo rekli da je C# radi u razvojnom okruenjo nazvanom .NET platforma, a


sada emo objasniti to je to. .NET platforma je zapravo razvojni okvir koji omoguava novo
suelje za programiranje aplikacija (eng. application programming interface, tj. API) i
ujedinjuje klasino suelje Windows operativnog sustava, zajedno s brojnim tehnologijama
koje su proizale iz Microsoft-a, kao to su ASP razvojni okvir za web, XML, objektno-
orijentirani dizajn, podrku za nove web uslune protokole kao to je SOAP, WSDL, i UDDI,
sa naglaskom na Internet, a sve integrirano unutar DNA arhitekture (eng. Windows
Distributed interNet Applications Arcitecture).

.NET platfoma sastoji se od 4 grupe proizvoda:

1. skup programskih jezika u okviru Visual Studio razvojne okoline (jezici: C#, Visual
Basic .NET, Managed C++, Jscript .NET)

2. skup .NET Enterprise servera (u ijem sklopu se nalaze SQL Server, Exchange Server,
BizTalk)

3. ponuda komercijalnih web usluga (Project Hailstorm)

4. mobilni .NET ureaji (koji nisu PC), kao npr. mobilni telefoni, ureaji za igre, i dr.

.NET okvir (Framework) je okvir koji povezuje programske jezike ukljuene u .NET
platformu, omoguavajui koritenje istih objekata (klasa), njihovo nasljeivanje i
polimorfizam u razliitim jezicima koje ta platforma podrava. Dakle, jezici u .NET platformi
su u isto vrijeme i nezavisni i integrirani. Kako .NET okvir omoguava integriranje
programskih jezika? .NET okvir definira specifikaciju zvanu CTS (Common Type System)
koje se moraju drati svi .NET jezici (npr. sve u .NET jeziku je objekt neke specifine klase
koja je dio korijenske klase System.Object). .NET okvir definira opi koncept klasa, suelja,
delegata, tipova referenci i tipova vrijednosti, takoer ukljuuje i Common Language
Specification (CLS), specifikaciju s pravilima kojih se treba drati kako bi integracija jezika
bila mogua i kako bi neki jezik mogao biti dio .NET platforme. Prevoditelji (compiler-i) tih
jezika rade na principu CLS pravila i mogu kreirati objekte koji mogu meusobno
komunicirati neovisno o jeziku u kojem su napisani. Tako se stvara biblioteka klasa unutar
.NET okvira - Framework Class Library (FCL) koju moe koristiti bilo koji jezik koji se
dri CLS-a.
Glavne komponente .NET okvira su:

etiri slubena programska jezika: C#, Visual Basic .NET, Managed C++, Jscript .NET +
ova dva glavna dijela koja moe koristiti svaki .NET jezik:

1. Common Language Runtime (CLR) zajednika platforma izvravanja programa,


koju dijele Windows i web aplikacije kreirane u .NET okviru
2. Skup kreiranih klasa (FCL) - biblioteka klasa koju dijele programski jezici unutar
ovog okvira

Slika 1. Arhitektura .NET okvira.

CLR (Common Language Runtime) je mehanizam izvravanja u zajednikom jeziku


koji razliite .NET jezike prevodi u isti zajedniki jezik, koji se koristi kada se aplikacije
izvravaju (Barker, 2007). Ukljuuje virtualni stroj (virtual machine), slino kao Java virtual
machine (JVM), a radi tako da aktivira pojedine objekte ukljuene u aplikaciju, radi
debugging (provjeru greaka), provjeru tipova, te JIT (just in time) prevoenje. Prilikom
prevoenja programa u .NET-u se ne kreira odmah izvrna datoteka u strojnom jeziku, nego
najprije MSIL ili IL datoteka (Microsoft Intermediate Language), koja se tek kod pokretanja
projekta prevodi u strojni jezik po principu JIT, odnosno prevoenja na zahtjev (on demand).
Svi jezici unutar .NET platforme proizvode slian IL kod i objekti i klase iz jednog jezika
mogu se koristiti u drugom. Biblioteke (ili skupovi) klasa u .NET okviru su razliiti prostori
za nazive (namespaces). Namespaces su skupovi tipova koji su logiki organizirani, to
omoguuje koritenje vie verzija tipova s istim nazivom, ali unutar razliitih prostora za
nazive (npr. kao to postoje u prirodi skupine ili vrste ivih bia), npr.

iva bia
Vodozemci
Gmazovi
Sisavci
ivotinje
Ljudi
...daljnja podjela prema rasi, spolu, itd.

Postoji hijerarhija prostora za nazive, tako jedan prostor moe sadravati druge
prostore u hijerarhijskom poretku. Prostori za nazive su sadrani unutar .NET okvira, ali i
korisnici razvojnih alata mogu koristiti te prostore.

Primjer korisnikog Namespace-a:

// Namespace deklaracija
using System;

// Namespace deklariran od strane korisnika


namespace korisnicki_namespace
{
namespace tutorial
{
// Neka klasa
class NamespaceCSS
{
// Main pokree program
public static void Main()
{
// Ispis na konzoli
Console.WriteLine("Primjer Namespace-a u C#.");
}
}
}
}
Osnovni prostori za nazive u .NET-u su:

Naziv klase Opis


System Glavni prostor za nazive sustava
System.Data Klase koje se upotrebljavaju za ADO.NET i
globalnu manipulaciju podacima
System.Drawing Klasa za crtanje oblika i objekata u
aplikacijama
System.Windows.Forms Prostori za nazive i klase za koritenje formi
u windows aplikacijama

Alat koji daje prikaz svih raspoloivih prostora za nazive, klasa i metoda, te prua i
sintaksu i pomo za upotrebu nekog prostora za naziv ili klase je Object Browser. Pokree
se s omou izbornika View -> Object Browser. Najprije se u prozoru prikazuju prostori za
nazive koji se koriste u aktivnom projektu, ali se pretraivanjem moe dobiti pomo za bilo
koji prostor za nazive. Pretpostavimo da elimo pronai upute kako se koristi klasa za ispis
poruke korisniku na ekranu aplikacije. Ako u polje za pretraivanje u Object Browser-u
upiemo npr. ''MessageBox'' i pritisnemo Enter, dobije se popis svih skupina klasa za ispis
poruka. Ako elimo pronai samo klase za ispis poruka u Windows formi, tada emo na
popisu klasa oznaiti ''System.Windows.Form.MessageBox''. Na ekranu e se pojaviti sve
metode (postupci koji se mogu napraviti) za tu klasu. Tipkom F1 na ekranu se dobiva pomo
za koritenje te klase. Za povratak natrag potrebno je zatvoriti i prozor za pomo i prozor
Object Browser-a.

Sve naredbe moemo pisati upotrebom dueg naina, tj. navoenjem pune sintakse svih
prostora naziva koji se koriste za ispis poruke na ekranu:

System.Windows.Forms.MessageBox.Show ("Ispisi neke poruke.","Projekt1",


MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk);

Upotreba kraeg naina pozivanja klase iz prostora za nazive (ako je System.Windows.Forms


klasa ve navedena na poetku programa u naredbi Using):

MessageBox.Show ("Ispisi neke poruke.", "Projekt1", MessageBoxButtons.OKCancel,


MessageBoxIcon.Asterisk);

Ako upisujemo dui nain pozivanja nekog objekta, to se zove potpuno kvalificirana
naredba. Kod kraeg naina moe se koristiti mogunost IntelliSense ugraena u alat, koja
prua pomo pri pisanju naredbi na nain da nam prikazuje listu s moguim klasama,
objektima, metodama koje moemo izabrati s popisa. Aktivira se automatski pri poetku
pisanja naredbe ili tipkom Ctrl-Space. Dui (potpuno kvalificirani) nain pisanja naredbi ima
smisla koristiti ako u razliitim prostorima za nazive koristimo klase ili objekte s istim
nazivom, jer se moe pratiti iz kojeg prostora je uzet odreeni objekt. U svakom drugom
sluaju praktinije je koristiti krai nain pisanja naredbi.
1. 1. C# tipovi podataka

Kao i veina programskih jezika, i C# upotrebljava varijable i konstante za rad s


informacijama u memoriji. Vrijednost varijabli se moe mijenjati kroz program, dok se
konstante koriste za memoriranje vrijednosti koje se nee mijenjati kroz neku proceduru ili
cijelu aplikaciju (kljuna rije Const ispred deklaracije varijable).

Prema tome tko ih definira, tipovi se mogu podijeliti na dva skupa:

1. intrinsic ili built-in (ugraeni tipovi)


2. userdefined (oni koje definira sam korisnik).

Nadalje se tipovi dijele prema svrsi:

1. Value types (tipovi vrijednosti) - oni koji se koriste za uvanje dijelova informacija u
memoriji standardni tipovi (npr. brojevi i tekst)
2. Reference types (tipovi referenci) - oni koji su reference i pokazuju na objekte
napravljene iz klasa

Tip Opis .NET tip Tip Opis .NET tip Tip Opis .NET tip
int Cijeli broj (od -2 147 483 647 System.Int32
do 2 147 483 647)
short Cijeli broj (manji: od -32768 System.Int16
do 32767)
long Cijeli broj (veliki, oko 16 System.Int64
znamenaka)
decimal Decimalni broj (fiksna System.Decimal
preciznost)
double Veliki realni broj s pokretnim System.Double
zarezom
string Niz karaktera (tekst) System.String
bool Logiki podatak (istina ili System.Boolean
la)
object Generiki objekt koji moe System.Object
sadravati druge tipove
float Mali realni broj s pokretnim System.Float
zarezom
byte 1 znak (vrijednosti 0-255) System.Byte
char 1 tekstualni znak System.Char
Slika 2. Standardni tipovi u C#.

Imena varijabli su kljuna za programiranje. U programima, imena se koriste za pozivanje


razliitih stvari. Da bi mogao koristiti te stvari, programer mora razumjeti pravila davanja
imena i pravila koritenja imena. Zapravo, programer mora znati sintaksu i semantiku imena.
Prema sintaksnim pravilima, ime je niz od jednog ili vie karaktera. Mora poinjati
slovom i mora biti u potpunosti sastavljeno od slova, brojeva i donje crte "_".
Nekoliko primjera ispravnih imena:

N
n
rate
x15
quite_a_long_name
HelloWorld

Velika i mala slova smatraju se razliitima pa su:

HelloWorld
helloworld
HELLOWORLD i
HElloWorLD

sasvim razliita imena.

Neka imena rezervirana su za posebne namjene u Javi i programer ih ne moe koristiti za


druge namjene. Rezervirane rijei ukljuuju:

class
public
static
if
else
while

i nekoliko desetaka drugih rijei koje smo ranije nabrojali.

1.2. Operatori

Izraz je dio koda programa koji predstavlja ili rauna neku vrijednost. Izraz
moe biti konstanta, varijabla, poziv funkcije ili vie ovakvih elemenata kombiniranih
operatorima (npr. + ili >). Vrijednost izraza moe se dodati varijabli, koristiti kao ulazna
vrijednost izlaznog potprograma ili pomou operatora povezati s drugim vrijednostima u
sloeniji izraz.

etiri osnovne skupine operatora su:

- aritmetiki
- operatori na bitovima
- relacijski
- logiki
Aritmetiki operatori
Operator Namjena
+ Zbrajanje
- Oduzimanje
* Mnoenje
/ Dijeljenje (za brojeve s pominim zarezom), cjelobrojno dijeljenje
% Ostatak cjelobrojnog dijeljenja (modulo)
++ Inkrementiranje (poveavanje vrijednosti za 1)
+= Zbrajanje i dodjela vrijednosti
-= Oduzimanje i dodjela vrijednosti
*= Mnoenje i dodjela vrijednosti
/= Dijeljenje i dodjela vrijednosti, cjelobrojno dijeljenje i dodjela vrijednosti
%= Ostatak cjelobrojnog dijeljenja (modulo) i dodjela vrijednosti
-- Dekrementiranje (smanjivanje vrijednosti za 1)

Operatori na bitovima
Operator
Namjena
~ Unarno NE (NOT) na bitovima
& I (AND) na bitovima
| ILI (OR) na bitovima
^ Ekskluzivno ILI (XOR) na bitovima
>> Pomicanje bitova udesno
>>> Pomicanje bitova udesno uz popunjavanje nulom (logiko pomicanje)
<< Pomicanje bitova ulijevo
&= I (AND) na bitovima
|= ILI (OR) na bitovima uz dodjeljivanje vrijednosti
^= Ekskluzivno ILI (XOR) na bitovima uz dodjeljivanje vrijednosti
>>= Pomicanje bitova udesno uz dodjeljivanje vrijednosti
>>>= Pomicanje bitova udesno uz popunjavanje nulom uz dodjeljivanje
vrijednosti
<<= Pomicanje bitova ulijevo uz dodjeljivanje vrijednosti

Relacijski operatori
Operator
Namjena
== Je jednako
!= Nije jednako
> Je vee
< Je manje
>= Vee jednako
<= Manje jednako
Logiki operatori
Operator
Namjena
! Logika negacija
& Logiki AND
| Logiki OR
^ Logiki XOR
&& Uvjetni AND
|| Uvjetni OR
== Jednakost
!= Nejednakost (razliito od)
&= AND uz dodjeljivanje vrijednosti
|= Logiki OR uz dodjeljivanje vrijednosti
^= Logiki XOR uz dodjeljivanje vrijednosti
?: Ternarni operator

Prioriteti operatora

Ukoliko se koristi vie operatora u jednom izrazu, a bez zagrada koje bi odredile redoslijed
procjenjivanja, potrebno je voditi rauna o prioritetima operatora koji odreuju redoslijed
procjenjivanja.

Lista operatora prema prioritetima:

Unarni operatori: ++, --, !, unarni - i +, pretvorba vrste


Mnoenje i dijeljenje: *, /, %
Zbrajanje i oduzimanje: +, -
Relacijski operatori: <, >, <=, >=
Jednakost i nejednakost: ==, !=
Logiki i: &&
Logiki ili: ||
Uvjetni operator: ?:
Operatori pridjeljivanja: =, +=, -=, *=, /=, %=

Operatori u istom redu imaju jednake prioritete, kad se pojave zajedno, unarni operatori i
operatori pridjeljivanja se procjenjuju s desna na lijevo, a ostali s lijeva na desno. Da biste
sami odredili prioritet najbolje je koristiti zagrade.

Primjer:

using System;
class Binary
{
public static void Main()
{
int x, y, rezultat;
float floatrezultat;

x = 7;
y = 5;
rezultat = x + y;
Console.WriteLine("x+y: {0}", rezultat);

rezultat = x - y;
Console.WriteLine("x-y: {0}", rezultat);

rezultat = x * y;
Console.WriteLine("x*y: {0}", rezultat);

rezultat = x / y;
Console.WriteLine("x/y: {0}", rezultat);

floatrezultat = (float)x / (float)y;


Console.WriteLine("x/y: {0}", floatrezultat);

rezultat = x % y;
Console.WriteLine("x%y: {0}", rezultat);

rezultat += x;
Console.WriteLine("rezultat+=x: {0}", rezultat);
}
}

Rezultat:

x+y: 12
x-y: 2
x*y: 35
x/y: 1
x/y: 1.4
x%y: 2
rezultat+=x: 9
1.3. Blokovi, petlje, grananja

Sposobnost raunala da obavlja sloene zadatke zasniva se na svega nekoliko naina


kombiniranja jednostavnih naredbi u upravljake strukture. U C# postoji est takvih struktura:
blok, while petlja, do ..while petlja, for petlja, foreach petlja, if izraz i switch izraz. Svaka
od ovih struktura smatra se jednim "izrazom", iako se zapravo radi o strukturiranom izrazu
koji u sebi moe sadravati jednu ili vie drugih naredbi.

Blok je najjednostavnija vrsta strukturiranog izraza. Namjena mu je da jednostavno okupi niz


naredbi zatvorenih vitiastim zagradama u jednu naredbu. Nain zapisivanja bloka je:

{
izrazi
}

Blokovi naredbi se najee javljaju unutar drugih izjava gdje slue okupljanju vie
naredbi u jednu cjelinu. Zapravo, blok se moe koristiti bilo gdje gdje se moe javiti izraz. A
ve smo vidjeli da je njegovo koritenje nuno kod podprograma main. Po definiciji,
podprogram je jedan blok.

Dva primjera blokova:

{ // Ovaj blok ispisuje vrijednost varijable odg


System.Console.WriteLine("Odgovor je ");
System.Console.WriteLine (("{0}", odg);
}

{ // Ovaj blok zamjenjuje vrijednosti varijabli x i y


int temp; // deklariranje privremene varijable koja se koristi //samo u ovom bloku
temp = x; // Sauvaj kopiju vrijednosti varijable x u temp
x = y; // Kopiraj vrijednost varijable y u x
y = temp; // Kopiraj vrijednost varijable temp u y
}

Uoite u drugom primjeru: varijabla temp je deklarirana unutar bloka, te je nevidljiva i


nedostupna izvan bloka. Takva varijabla naziva se lokalna varijabla. Doseg (scope) nekog
identifikatora je dio programa u kojem se taj identifikator moe koristiti. Doseg varijable
definirane unutar bloka je ogranien na taj blok, tonije na dio bloka nakon deklaracije
varijable.

Nije dozvoljeno vie deklaracija s istim imenom u istom dosegu.

Sam blok ne utjee na tok izvravanja programa. Preostalih est navedenih struktura koje
za razliku od bloka utjeu na tok izvravanja programa mogu se podijeliti u dvije skupine:
petlje i grananja.
While petlja se koristi za uzastopno ponavljanje jednog izraza. Tonije, while petlja ponavlja
izjavu dok je zadani uvjet istinit. While petlja ima oblik:
while (logiki izraz)
izraz

Budui da izraz moe biti, a najee i je, blok, uobiajene su while petlje oblika:

while (logiki izraz) {


izrazi
}

Kad raunalo doe do while izjave, procjenjuje logiki izraz koji vraa vrijednost true
ili false. Ako je vrijednost izraza false, raunalo preskae ostatak while petlje i nastavlja s
izvrenjem programa. Ako je vrijednost true, raunalo izvrava izraze unutar petlje, zatim se
vraa na poetak petlje i ponavlja postupak, tj. ponovo procjenjuje logiki izraz, te zavrava
petlju ako je vrijednost false, a nastavlja ako je vrijednost true. Ovo se nastavlja dok izraz ne
poprimi vrijednost false; sluaj u kojem se to nikad ne dogodi naziva se beskonana petlja.

Evo primjera petlje koja ispisuje brojeve 1,2,3,4 do 9:

using System;
class WhilePetlja
{
public static void Main()
{
int myInt = 0;

while (myInt < 10)


{
Console.Write("{0} ", myInt);
myInt++;
}
Console.WriteLine();
}
}

Do-while petlja je namijenjena sluajevima kada je potrebno da se uvjet ponavljanja testira


na kraju petlje umjesto na poetku. Do-while petlja je zapravo while petlja s uvjetom
ponavljanja postavljenim na kraju petlje. Rije do se koristi za oznaavanje poetka petlje.
Dakle, do-while petlja ima oblik:

do
izraz
while ( logiki izraz );

ili s koritenjem blokova:

do {
izrazi
} while (logiki izraz);
';' na kraju se ne smije izostaviti jer je to dio izraza. Izostavljanje bi prouzroilo sintaksnu
greku. Pri izvravanju do petlje, raunalo prvo izvrava tijelo petlje, tj. izraze unutar petlje, a
zatim procjenjuje logiki izraz. Ako je vrijednost izraza true, raunalo se vraa na poetak do
petlje i ponavlja postupak; ako je vrijednost logikog izraza false, izlazi iz petlje i nastavlja
izvravanje ostatka programa. Budui da se uvjet nastavljanja procjenjuje tek na kraju
petlje, tijelo petlje se izvrava bar jedan put.

U slijedeem primjeru pseudokoda "igre", do petlja ima smisla u odnosu na while petlju jer
osigurava barem jednu "igru", a osim toga, test koji se izvodi na kraju "igre" ne bi ni imao
smisla na poetku.

do {
Odigraj igru
Pitaj korisnika eli li igrati jo jednu igru
Proitaj korisnikov odgovor
} while ( Korisnikov odgovor je da );

For petlja je slina while petlji i ne donosi nove sposobnosti programskom jeziku, ali je za
neke namjene prikladnija od odgovarajue while petlje.

Uobiajena while petlje ima oblik:

inicijalizacija
while ( uvjet nastavljanja ) {
izrazi
promjena vrijednosti
}

Na primjer, promotrimo sljedeu while petlju:

godine = 0; // inicijalizacija
while ( godine < 5 ) { // uvjet nastavljanja

kamata = glavnica * postotak;


glavnica += kamata; // izvri tri izraza
System.Console.WriteLine("{0}", glavnica);

godine++; // promjena vrijednosti


}

Ova petlja se moe zamijeniti sljedeom for petljom:

for ( godine = 0; godine < 5; godine++ ) {


kamata = glavnica * postotak;
glavnica += kamata;
System.Console.WriteLine("{0}", glavnica);
}

Inicijalizacija, uvjet nastavljanja i promjena vrijednosti su objedinjeni u prvoj liniji for petlje.
Na ovaj nain su svi initelji for petlje na jednom mjestu to olakava itanje i razumijevanje.
For i izvorna while petlja izvravaju se jednako.
For petlja ima oblik:

for (inicijalizacija; uvjet nastavljanja; promjena vrijednosti )


izraz

ili koritenjem blokova:

for (inicijalizacija; uvjet nastavljanja; promjena vrijednosti) {


izrazi
}

Uvjet nastavljanja mora biti logiki izraz, dok inicijalizacija i promjena vrijednosti mogu
biti bilo kakvi izrazi.

Primjer:

using System;

class ForPetlja
{
public static void Main()
{
for (int i = 0; i < 20; i++)
{
if (i == 10)
break;

if (i % 2 == 0)
continue;

Console.Write("{0} ", i);


}
Console.WriteLine();
}
}

Foreach petlja se koristi za iteraciju kroz stavke u popisu. Ona djeluje na polja kao to su
ArrayList. Sintaksa foreach petlje je:

foreach (<Tip> <Iteracijska varijabla> in <lista>) {


//izrazi
}

Tip je tip stavke koja se nalazi u listi, na primjer, ako je tip liste int [] tip e biti int.
Iteracijska varijabla je identifikator koji ste odabrali i trebala bi biti smislena. Na primjer,
ako lista sadri niz sa godinama ljudi, smislen naziv iteracijske varijable je dob. Kljuna rije
in je potrebna, jer je dio sintakse foreach petlje. Foreach petlja je samo za itanje to znai da
ne moete mijenjati iteracijsku varijablu unutar petlje. Na svakoj iteraciji kroz foreach petlju
provjerava se da li postoji jo elemenata u listi i ako postoji u iduem koraku se prelazi na
idui element liste. Kad je lista gotova zavrit e se petlja i kontrola programa e se prenijeti
na prvi izjavu nakon zavretka foreach bloka.

Primjer:

using System;

class ForEachPetlja
{
public static void Main()
{
string[] names = { "Ante", "Josip", "Martina", "Robert" };

foreach (string person in names)


{
Console.WriteLine("{0} ", person);
}
}
}

Rezultat:

Ante
Josip
Martina
Robert

If izraz kae raunalu da izabere jedan od dvaju razliitih tokova izvravanja programa, u
ovisnosti o vrijednosti zadanog logikog izraza. If izraz "grananja" ili "odluivanja" ima
oblik:
if (logiki izraz)
izraz
else
izraz

Raunalo pri izvravanju if izraza procjenjuje logiki izraz koji vraa vrijednost true ili
false. Ako je vrijednost true, raunalo izvrava prvi izraz, a preskae izraz nakon "else". Ako je
vrijednost izraza false, raunalo preskae prvi izraz i izvrava drugi. U svakom sluaju, samo
jedan od tih dvaju izraza unutar if izraza e biti izvren. Dva izraza predstavljaju alternativne
tokove programa; raunalo se odluuje za jedan od ovih tokova programa na osnovi
vrijednosti logikog izraza.

Jedna od mogunosti primjene ove naredbe je odluivanje samo da li e neka naredba biti
izvrena ili ne. U tom sluaju if izraz nema else dio:

if (logiki izraz)
izraz
Ako je vijednost izraza true, raunalo izvrava izraz unutar if izraza, a u sluaju rezultata false
ga preskae.

Koritenjem blokova, if izraz poprima oblik:

if (logiki izraz) {
izrazi
}
else {
izrazi
}

ili samo:

if (logiki izraz) {
izrazi
}

Slijedi primjer if izraza koji zamjenjuje vrijednosti dviju varijabli, x i y, ali samo ako je x vei
od y. Nakon izvravanja ovog if izraza, moemo biti sigurni da je x manji ili jednak y:

if ( x > y ) {
int temp; // deklariranje privremene varijable koja se koristi
// samo u ovom bloku
temp = x; // Sauvaj kopiju vrijednosti varijable x u temp
x = y; // Kopiraj vrijednost varijable y u x
y = temp; // Kopiraj vrijednost varijable temp u y
}

Na kraju evo primjer if izraza koji ima i dio else:

if ( br_godina > 1 ) {
System.Console.WriteLine("Vrijednost ulaganja nakon ");
System.Console.WriteLine("{0}", br_godina);
System.Console.WriteLine(" godina je ");
}
else {
System.Console.WriteLine("Vrijednost nakon 1 godine:");
}
System.Console.WriteLine("{0}", ulaganje +" kn");

Switch izraz koristi znatno rijee nego if izraz, vrlo je koristan za grananja u vie grana. Switch
izraz omoguuje procjenu uvjeta i na osnovu te vrijednosti skok na neko mjesto unutar switch
izraza. Vrijednost izraza koji se procjenjuje mora biti cjelobrojna (byte, short, int ili char),
nikako ne moe biti string ili realni broj. Za razliku od kombinacije if - else, ovdje se ne moe
nalaziti logiki izraz. Razlog je tome u injenici da naredba switch utvruje vrijednost izraza u
odreenom trenutku i zatim skae na blok koji je oznaen vrijednou dobivene cjelobrojne
konstante oblika "case konstanta:". Mogua je takoer upotreba oznake "default:" na koju se
izvodi skok u sluaju da vrijednost izraza ne odgovara ni jednoj od oznaka sluaja.
Switch izraz ima oblik:

switch (izraz) {
case konstanta_1:
izrazi_1
break;
case konstanta_2:
izrazi_2
break;
.
. // (ostali sluajevi)
.
case konstanta_N:
izrazi_N
break;
default: // proizvoljni postavni sluaj
izrazi_(N+1)
} // kraj switch izraza

Break naredbe su stvar izbora i nisu obavezne. Uinak break naredbe je da skae na
kraj switch izraza. Ako se izostavi break naredba raunalo e nastaviti s izvravanjem
programa, izvravajui redom naredbe iz slijedeih sluajeva. Mogue je izostaviti itave
grupe izraza s break naredbom i tako dobiti dvije (ili vie) oznaka sluaja u jednom redu, ime
se omoguava skok na isti skup izraza za razliite vrijednosti izraza u switch naredbi.

Primjer upotrebe switch naredbe (uoiti da konstante u oznakama sluaja ne moraju biti
poredane po nekom redu, vano je da su razliite):

switch (N) { // N je neka cjelobrojna varijabla


case 1:
System.Console.WriteLine("Broj je 1.")
break;
case 2:
case 4:
case 8:
System.Console.WriteLine("Broj je 2, 4, ili 8.");
break;
case 3:
case 6:
case 9:
System.Console.WriteLine("Broj je 3, 6, ili 9.");
break;
case 5:
System.Console.WriteLine("Broj je 5.");
break;
default:
System.Console.WriteLine("Broj je 7,");
System.Console.WriteLine(" ili nije izmeu 1 i 9.");
}
1.4. Rukovanje izuzecima

Osim sintaksnih i semantikih greaka, u aplikaciji se mogu pojaviti i greke izuzetaka (eng.
exceptions). One se ne vide kod prevoenja (prilikom Build-anja i Debug-iranja) nego se
pojavljuju prilikom izvravanja aplikacije i ne mogu se sprijeiti. To su greke koje nastaju
najee zbog unosa neodgovarajuih podataka od strane korisnika, ili zbog neunesenih
podataka.

Rukovanje izuzecima je vano napraviti u programskom kodu, kako bi se sprijeilo


''iskakanje'' programa, i omoguilo daljnje nastavljanje izvravanja aplikacije. to bi se
dogodilo kada ne bismo rukovali izuzecima u kodu? Ako u programskom kodu nije
predvieno rukovanje izuzecima, tada se prilikom izvravanja aplikacije moe dogoditi da
program izbaci ''grubu'' poruku o greci i zaustavi izvravanje aplikacije. Korisnik tada ne
moe dalje raditi s aplikacijom. Ako se prilikom debug-iranja pojavi greka izuzetka, program
e nas izbaciti u kod. Da bi se sve to sprijeilo, potrebno je u kodu ''hvatati'' mogue izuzetke
koje moemo predvidjeti.

Primjeri nekih izuzetaka:

Ako korisnik u textbox ne unese neki podatak koji je potreban (npr. plau djelatnika), pa se ne
moe izraunati prosjena plaa, pojavit e se poruka o greci i zaustaviti aplikacija. Npr. ako
korisnik prilikom unosa nekog podatka s kojim treba dijeliti neki broj unese vrijednost 0. Npr.
ako se unese vrijednost koja po tipu ne odgovara tipu vrijednosti koju treba unijeti u
odgovarajui textbox (npr. ako se oekuje da se unese broj, a korisnik je unio tekst).

Primjer:

using System;
using System.IO;

class tryCatchDemo
{
static void Main(string[] args)
{
try
{
File.OpenRead("Nepostojeca_Datoteka");
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}

Gornji primjer sastoji se od jednog catch bloka koji e uhavitit iznimku ako pokuamo
proitati nepostojeu datoteku. U ovom sluaju samo e ispisati poruku o pogreci u konzoli.
Iznimka moe zavriti program, a da pri tome ostavi program u nepostojanom stanju
bez oslobaanja svih resursa i ienja varijabli. Catch blok je prikladno mjesto da se uhvate
iznimke i pokua popraviti program. Ponekad je potrebno napraviti oslobaanje resursa
neovisno o tome jeste li uspjeli popraviti iznimku ili ne. U takvim situacijama se najee
korisiti finally blok. Kao to znate, datoteni tok mora biti zatvoren kad zavrite rad s
datotekom. U tom sluaju, file stream je resurs koji treba biti oien. U iduem primjeru,
outStream je uspjeno otvoren, to znai da program sada moe rukovati datotekom. Kada
pokuate otvoriti InStream, pokrenut e se FileNotFoundException i prebaciti izvoenje
programa u catch blok. Mogue je zatvoriti outStream catch bloku, ali to ako se algoritam
izvri uspjeno? Tada datoteka nikada nee biti zatvorena. Sreom, ukljuili smo Finally blok
koji e se uvijek biti izvren. Bez obzira da li e algoritam podii iznimku ili ne, kod u bloku
Finally e se izvriti prije nego napusti metodu.

Primjer:

using System;
using System.IO;

class FinallyDemo
{
static void Main(string[] args)
{
FileStream outStream = null;
FileStream inStream = null;

try
{
outStream = File.OpenWrite("Izlazna_datoteka.txt");
inStream = File.OpenRead("Nepostojeca_Datoteka.txt");
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
if (outStream != null)
{
outStream.Close();
Console.WriteLine("outStream zatvoren.");
}
if (inStream != null)
{
inStream.Close();
Console.WriteLine("inStream zatvoren.");
}
}
}
}
Primjer Windows form aplikacije koja ne rukuje iznimkama:

Kroz jedan primjer pokazat emo to se dogaa ako aplikacija ne rukuje izuzecima. Otvorite
novi projekt. U Visual Studio 2008 odaberite File -> New-> Project. Nakon toga Visual C# i
Windows Forms Application. Program pohranite pod nazivom Iznimka i kliknite na gumb
OK. Otvorit e se prazna forma. Pomou trake Toolbox kreirajte na formi input polja, texbox-
ove i tri gumba kao na slici:

Cilj je pokazati kako se ponaa aplikacija ako se ne rukuje izuzecima. Za tu svrhu


koristit emo dugme ''Iznimka bez rukovanja''. Kliknite dvaput na to dugme kako bismo
upisali kod u metodu button1_click. U metodu button1_click upisat emo naredbe koje e
vrijednost koju korisnik unese u textBox1.Text pohraniti u cjelobrojnu varijablu broj1, zatim
emo varijablu broj1 uveati za 5 i rezultat ispisati u textBox2.Text. Cijela metoda e
izgledati ovako:

private void button1_Click(object sender, EventArgs e)


{
int broj1;
int rezultat;
broj1 = Convert.ToInt32(textBox1.Text);
rezultat = broj1 + 5;
textBox2.Text = Convert.ToString(rezultat);
}

Pohranite i debugirajte aplikaciju, testirajte ispravnost tako da u prvi okvir za tekst


unesete broj: 8. Nakon to kliknete na prvo dugme, kao rezultat e se u drugom okviru za
tekst upisati broj 13. Sada obriite unesenu vrijednost 1 u prvom okviru za tekst i nemojte
unijeti nita. Zatim kliknite na dugme ''Iznimka bez rukovanja''. Budui da nije unijeta
vrijednost koja je programu potrebna za raunanje rezultata, pojavit e se poruka o izuzetku
kojim nije rukovano (eng. exception was unhandled), u prozoru kao na slici:
Poruka da ulazni tekst nije u ispravnom obliku se pojavila se jer nismo unijeli niti
jednu vrijednost u okvir za tekst. Kliknite na dugme Continue kako biste uklonili taj prozor.
Osim to se pojavila poruka o izuzetku kojim nije rukovano (eng. unhandled exception),
izvravanje aplikacije je prekinuto, a program nas vraa u prozor za pisanje koda, u liniju gdje
se dogodila greka izuzetka (ta je linija i posebno oznaena zelenom bojom). Ako pokuamo
nastaviti izvravanje aplikacije naredbom Debug / Continue (F5), vidimo da program ponovo
prikazuje istu poruku o izuzetku i aplikacija se ne moe nastaviti. Moemo samo prekinuti
debug-iranje naredbom Debug / Stop debugging (shift-F5).

Pohranite aplikaciju, zatvorite Visual Studio 2008, te na disku pronaite mapu u kojoj
je pohranjena Iznimka.exe izvrna datoteka. Da biste vidjeli to e se dogoditi ako korisnik
pokrene aplikaciju koja ne rukuje izuzecima, dvaput kliknite na Iznimka.exe datoteku. U prvi
okvir za tekst opet nemojte unijeti nita, nego samo kliknite na dugme ''Iznimka bez
rukovanja''. Pojavit e se poruka kao na slici:

Korisnik sada moe nastaviti aplikaciju klikom na dugme Continue ili prekinuti
klikom na dugme Quit. Ukoliko korisnik nastavi rad aplikacije (Continue), nee se ispisati
rezultat, jer je program prekinuo izvravanje, a ako klikne na dugme Quit, program e izai iz
plikacije u Windows operativni Sustav. Na taj nain onemoguuje se korisniku kvalitetan rad
s aplikacijom, te svaki programer treba u aplikaciji predvidjeti barem veinu izuzetaka koji se
mogu dogoditi i upisati naredbe koje rukuju s njima i tako omoguiti korisniku nesmetani rad
s aplikacijom.
Rukovanje izuzecima pomou petlja try...catch

Da bi se rukovalo iznimkom, potrebno je koristiti naredbe petlje:

try {
ovdje naredbe u kojima se moe pojaviti izuzetak
}
catch (tip izuzetka varijabla) {
ovdje naredba kojom se ispisuje poruka korisniku da unese ispravan podatak
}

U aplikaciji Iznimka napravit emo primjer rukovanja iznimkom. Otvorite projekt Iznimka, te
dvaput kliknite na dugme ''Try...catch'', kako biste se pozicionirali u metodu button2_click. U
metodu button2_click kopirajte sve naredbe iz prethodne metode button1_click. Neposredno
iza vitiaste zagrade, a ispred prve naredbe treba upisati naredbu: try. Dalje dodajte vitiaste
zagrade za naredbu try tako da sve upisane naredbe budu u zagradama. U dijelu catch treba
upisati naredbu koja e ispisati korisniku poruku da treba unijeti broj1. Trenutni kod za
metodu button2_Click izgledat e ovako:

private void button2_Click(object sender, EventArgs e)


{
try
{
int broj1; int rezultat;
broj1 = Convert.ToInt32(textBox1.Text);
rezultat = broj1 + 5;
textBox2.Text = Convert.ToString(rezultat);
}
catch
{
MessageBox.Show("Niste unijeli cijeli broj!");
}
}

Gore navedene naredbe try...catch spreavaju pucanje programa ispisivanjem poruke


korisniku i omoguavaju nastavak aplikacije. Pohranite i pokrenite aplikaciju debug-iranjem.
Nemojte unijeti broj1 u prvi okvir za tekst, nego samo kliknite na dugme Try...catch.

Nakon ispisane poruke u MessageBox-u unesite neku cjelobrojnu vrijednost u prvi okvir za
tekst. Koji e se sada rezultat ispisati?

to e se dogoditi ako u prvi okvir za tekst unesemo decimalni broj ili neki tekst? Da li se
pojavljuje izuzetak? Pokuajte u prvi okvir za tekst unijeti broj: 2.3. Kliknite na dugme
Try...catch. Ponovo se pojavljuje poruka korisniku da treba unijeti cijeli broj. Isto ponovite
tako da u okvir za tekst unesete tekst ''Dobar dan.'' , a zatim kliknete na dugme Try...catch.
to se dogaa?

Petlja try..catch...finally

U sluaju kada elimo da program nastavi s radom iako se dogodio izuzetak (ne elimo
korisnika vraati na ponovni unos podataka), u try...catch petlju dodaje se naredba finally.

Opi oblik je:

try {
ovdje naredbe u kojima se moe pojaviti izuzetak
}
catch [(tip izuzetka varijabla)] {
ovdje naredba kojom se ispisuje poruka korisniku da unese ispravan
podatak
}
finally {
ovdje naredba kojom se ispisuje poruka korisniku da je program nastavio
s radom unato izuzetku
}

U projektu Iznimka kliknite dvaput na dugme Try...catch...finally kako biste kreirali


metodu button3_click. U tu metodu najprije kopirajte sve naredbe iz prethodne metode
button2_Click (sve naredbe petlje try...catch). U ovoj metodi button3_Click na kraju (iza
petlje catch, tj. zavrene vitiaste zagrade za tu petlju), dodajte sljedee naredbe:

textBox2.Text = "Rezultat nije mogao biti izraunat. Program je zavren.";

Pohranite i pokrenite debug aplikacije. Nakon poruke u MessageBox-u da niste unijeli broj,
pojavit e se poruka u okviru textBox2 koju smo upisali u naredbu finally.

Zakljuak: Rukovanje izuzecima vrlo je vano za kontinuirano izvravanje aplikacija. Izuzeci


se mogu pojaviti zbog neunesenog podatka, ali i zbog pogrenog ili specifinog unosa zbog
kojeg se ne moe dalje nastaviti s radom aplikacije. Ukoliko elimo rukovati izuzetkom na
nain da korisnik ponovo unese traenu vrijednost, koristi se petlja try..catch. Ukoliko elimo
rukovati izuzetkom na nain da se nakon pojave izuzetka samo nastavi dalje s izvravanjem
aplikacije, koristi se petlja try...catch...finally.

You might also like