csharp programiranje skripta (vinca)

219
Uvod u C# Ovo je prva lekcija programiranja u jeziku C#. Prvi deo vas uvodi u osnovna znanja koja su neophodna da bi ste se kasnije lako snašli. Ovde ćemo napraviti kratak pregled jezika C# i .NET okruženja, opis ovih tehnologija, prednosti njihove upotrebe, kao i međusobnu povezanost. Počećemo sa osnovnim pitanjima vezanim za .NET okruženje. Ovo je nova tehnologija koja sadrži nove koncepte, sa kojima je isprva teško uhvatiti se u koštac, uglavnom zbog toga što predstavlja potpuno nov način rada u razvoju aplikacija. Kratak pregled osnova od velike je važnosti za razumevanje programiranja u jeziku C#. Nakon kratkog pregleda preći ćemo na prost opis samog jezika C#, uključujući korene i sličnost sa jezikom C++. Šta je .NET okruženje? .NET okruženje je nova i revolucionarna platforma za razvoj aplikacija napravljena od strane Microsofta. Primetićete da nismo rekli „razvoj aplikacija u operativnom sistemu Windows". lako prva verzija .NET okruženja radi na operativnom sistemu Windows, budući planovi podrazumevaju i rad na drugim sistemima, kao što su FreeBSD, Linux, Macintosh, pa čak i na uređajima klase ličnog digitalnog asistenta (PDA). Jedan od ključnih razloga za razvoj ove tehnologije je namera da ona postane sredstvo kojim se vrši integracija različitih operativnih sistema. Pored toga, ova definicija .NET okruženja ne ograničava mogućnosti bilo kog tipa aplikacije. Ograni čenja zapravo ne postoje - .NET okruženje daje vam mogućnost izrade Windows aplikacija, Web aplikacija, Web servisa i skoro svega ostalog što bi ste mogli zamisliti. .NET okruženje dizajnirano je tako da se može koristiti iz bilo kog jezika: C#, C++, Visual Basic, JScript, pa čak i starije jezike kao što je COBOL. Da bi sve to funkcionisalo, pojavile su se i posebne verzije ovih jezika za .NET: Managed C++, Visual Basic .NET, JScript .NET, kao i razni drugi. Ne samo da svi oni imaju pristup .NET okruženju, već mogu i međusobno komunicirati. Sasvim je moguće kod programiranja u jeziku C# koristiti kod napisan u Visual Basic .NET-u, kao i obrnuto. Sve ovo omogućuje dosad nezamisliv nivo višestruke namene, što pored ostalog čini .NET okruženje toliko atraktivnim. Šta se nalazi unutar .NET okruženja? .NET okruženje se najvećim delom sastoji od ogromne biblioteke koda koju upotrebljavamo preko klijentskih jezika (kao što je C#) koristeći tehnike objektno orijentisanog programiranja (OOP). Ova biblioteka podeljena je na različite module koje koristimo u zavisnosti od zadatka. Na primer, jedan modul sadrži delove potrebne za pravljenje Windows aplikacija, drugi je vezan za mreže, a neki za razvoj Weba. Neki moduli su podeljeni u različite podmodule, kao što su moduli za pravljenje Web servisa unutar modula za razvoj Weba. Namera je da različiti operativni sistemi podržavaju neke ili sve module zavisno od njihovih karakteristika. Na primer PDA će imati podršku za sve osnovne funkcionalnosti .NET modula, što se svakako ne odnosi i na one namenske ili rede korišćene. Jedan deo biblioteke .NET okruženja definiše samo osnovne tipove. Tip je u stvari način na koji se predstavlja podatak (kao što je recimo označena 32-bitna celobrojna veličina), a definicijom fundamentalnih tipova podataka olakšava se interoperatibilnost izmedu jezika koji koriste .NET * okruženje. To se naziva zajednički sistem tipova (engl. Common Type System - CTS). Okruženje osim biblioteke poseduje i .NET zajedničko izvršno jezičko okruženje (engl. Common Language Runtime - CLR), koje je odgovorno za izvršavanje svih aplikacija razvijenih uz pomoć :NET biblioteke.

Upload: mesa-selimovic

Post on 03-Aug-2015

96 views

Category:

Documents


8 download

TRANSCRIPT

Uvod u C#Ovo je prva lekcija programiranja u jeziku C#. Prvi deo vas uvodi u osnovna znanja koja su neophodna da bi ste se kasnije lako snali. Ovde emo napraviti kratak pregled jezika C# i .NET okruenja, opis ovih tehnologija, prednosti njihove upotrebe, kao i meusobnu povezanost. Poeemo sa osnovnim pitanjima vezanim za .NET okruenje. Ovo je nova tehnologija koja sadri nove koncepte, sa kojima je isprva teko uhvatiti se u kotac, uglavnom zbog toga to predstavlja potpuno nov nain rada u razvoju aplikacija. Kratak pregled osnova od velike je vanosti za razumevanje programiranja u jeziku C#. Nakon kratkog pregleda prei emo na prost opis samog jezika C#, ukljuujui korene i slinost sa jezikom C++.

ta je .NET okruenje?.NET okruenje je nova i revolucionarna platforma za razvoj aplikacija napravljena od strane Microsofta. Primetiete da nismo rekli razvoj aplikacija u operativnom sistemu Windows". lako prva verzija .NET okruenja radi na operativnom sistemu Windows, budui planovi podrazumevaju i rad na drugim sistemima, kao to su FreeBSD, Linux, Macintosh, pa ak i na ureajima klase linog digitalnog asistenta (PDA). Jedan od kljunih razloga za razvoj ove tehnologije je namera da ona postane sredstvo kojim se vri integracija razliitih operativnih sistema. Pored toga, ova definicija .NET okruenja ne ograniava mogunosti bilo kog tipa aplikacije. Ogranienja zapravo ne postoje - .NET okruenje daje vam mogunost izrade Windows aplikacija, Web aplikacija, Web servisa i skoro svega ostalog to bi ste mogli zamisliti. .NET okruenje dizajnirano je tako da se moe koristiti iz bilo kog jezika: C#, C++, Visual Basic, JScript, pa ak i starije jezike kao to je COBOL. Da bi sve to funkcionisalo, pojavile su se i posebne verzije ovih jezika za .NET: Managed C++, Visual Basic .NET, JScript .NET, kao i razni drugi. Ne samo da svi oni imaju pristup .NET okruenju, ve mogu i meusobno komunicirati. Sasvim je mogue kod programiranja u jeziku C# koristiti kod napisan u Visual Basic .NET-u, kao i obrnuto. Sve ovo omoguuje dosad nezamisliv nivo viestruke namene, to pored ostalog ini .NET okruenje toliko atraktivnim.

ta se nalazi unutar .NET okruenja?.NET okruenje se najveim delom sastoji od ogromne biblioteke koda koju upotrebljavamo preko klijentskih jezika (kao to je C#) koristei tehnike objektno orijentisanog programiranja (OOP). Ova biblioteka podeljena je na razliite module koje koristimo u zavisnosti od zadatka. Na primer, jedan modul sadri delove potrebne za pravljenje Windows aplikacija, drugi je vezan za mree, a neki za razvoj Weba. Neki moduli su podeljeni u razliite podmodule, kao to su moduli za pravljenje Web servisa unutar modula za razvoj Weba. Namera je da razliiti operativni sistemi podravaju neke ili sve module zavisno od njihovih karakteristika. Na primer PDA e imati podrku za sve osnovne funkcionalnosti .NET modula, to se svakako ne odnosi i na one namenske ili rede koriene. Jedan deo biblioteke .NET okruenja definie samo osnovne tipove. Tip je u stvari nain na koji se predstavlja podatak (kao to je recimo oznaena 32-bitna celobrojna veliina), a definicijom fundamentalnih tipova podataka olakava se interoperatibilnost izmedu jezika koji koriste .NET * okruenje. To se naziva zajedniki sistem tipova (engl. Common Type System - CTS). Okruenje osim biblioteke poseduje i .NET zajedniko izvrno jeziko okruenje (engl. Common Language Runtime - CLR), koje je odgovorno za izvravanje svih aplikacija razvijenih uz pomo :NET biblioteke.

1

Kako napisati aplikaciju koristei .NET okruenje?Pisanje aplikacija unutar .NET okruenja u stvari znai pisanje koda (koristi se bilo koji jezik koji podrava ovo okruenje) uz pomo .-NET biblioteke koda. U ovoj semestru koristiemo VS za razvoj, koji je mono i integrisano razvojno okruenje koje podrava jezik C# . Prednost ovog okruenja je lakoa kojom se mogunosti .NET-a mogu integrisati u na kod. Kod koji emo pisati bie u potpunosti C#, ali demo koristiti .NET okruenje, a takoe i dodatne alate VS-a kada zatreba. Da bi se C# kod izvrio neophodno ga je prevesti u jezik koji operativni sistem na kome je aplikacija razume, poznat kao prirodni kod. Ovo prevoenje se jo naziva i kompajliranje koda, funkcija koju obavlja kompajler. Unutar .NET okruenja ta operacija ima dve faze.

MSIL i JITKada kompajliramo kod koristei biblioteku .NET okruenja, ne pravimo odmah prirodni kod specifian za operativni sistem. Umesto toga, kompajliramo u Microsoftov posredni jezik (engl. Microsoft Intermediate Language - MSIL). Ovaj kod nije odreen ni jednim operativnim sistemom i nije namenjen samo za jezik C#. Ostali .NET jezici - na primer, Visual Basic .NET - takoe se kompajliraju u njega u svojoj prvoj fazi. VS e izvesti ovaj korak ukoliko ga koristimo pri razvoju C# aplikacija. Da bi se program izvrio, oigledno je potrebno jo rada. Za taj posao zaduen je kompajler u pravo vreme (engl. Just-In-Time - JIT), koji prevodi MSIL u prirodni kod specificiran od strane operativnog sistema i arhitekture same maine na kojoj se program izvodi. Tek tada operativni sistem moe izvriti program. Pojam u pravo vreme" oznaava da se MSIL kod kompajlira samo kada je to potrebno. U prolosti je bilo neophodno kompajlirati kod u vise razliitih aplikacija zavisno od samog operativnog sistema i arhitekture samog procesora. esto je to bio oblik optimizacije (da2

bi se recimo kod naterao da radi bre na AMD setu ipova), ali s vremena na vreme moglo je biti kritino (da aplikacije, na primer rade i pod Win9x i pod WinNT/2000 okruenjima). Sve je to sada nepotrebno, jer JIT kompajleri (kako im samo ime kae) koriste MSIL kod, koji je nezavisan od maine, operativnog sistema ili procesora. Postoji nekoliko JIT kompajlera - svaki za razliitu arhitektura, a koristie se odgovarajui da bi se napravio traeni prirodni kod. Lepota je u tome to je mnogo manje rada potrebno sa nae strane. U stvari, moemo zaboraviti na detalje koji se odnose na sistemsku zavisnost i koncentrisati se na mnogo zanimljiviju funkcionalnost naeg koda.

SklopoviKada kompajliramo aplikaciju, MSIL kod se smeta u posebne sklopove (engl. assembly). Takvi sklopovi sadre i izvrne programske datoteke koje mogu biti startovane direktno iz Windowsa bez potrebe za nekim drugim programima (takve datoteke imaju .exe nastavak) i biblioteke koje koriste i druge aplikacije (koje imaju . dll nastavak). Sklopovi pored MSIL sadre i takozvane meta informacije (odnosno podatke o podacima sadranim u sklopu, nazvane jo i metapodaci), kao i opcione resurse (dodatne podatke koje koristi MSIL, kao to su zvukovi i slike). Metapodaci dozvoljavaju sklopovima da budu potpuno samoopisujui. Ne trebaju nam nikakve dodatne informacije da bi smo koristili sklopove. Podrazumeva se, naravno da izbegnemo situacije kao to su nedostavljanje traenih informacija sistemskom registru i si., to je inae esto bio problem pri korienju drugih platformi. To u stvari znai da je distribucija aplikacija esto jednostavna koliko i kopiranje podataka u direktorijum na nekom udaljenom raunaru. Kako nam nisu potrebne nikakve dodatne informacije o ciljnim sistemima, moemo odmah pokrenuti izvrnu datoteku iz ovog direktorijuma i (pod uslovom da je .NET CLR instaliran) poleemo. Naravno da neemo uvek eleti da ukljuimo sve to je potrebno za izvrenje jedne aplikacije na jednom mestu. Moda poelimo da napiemo kod koji e moi da koriste i druge aplikacije. U tom sluaju korisno je takav vienamenski kod smestiti na mesto koje mogu koristiti sve aplikacije U .NET okruenju to mesto se naziva globalni ke sklopova (engl. Global Assembly Cache - GAC). Smetanje koda u ovaj ke je jednostavno - samo postavimo programski skup koji sadri ovaj kod u direktorijum koji sadri ke.

Upravljivi kodUloga CLR-a se ne zaustavlja onog trenutka kada smo kompajlirali kod u MSIL, niti kada JIT kompajler sve to prevede u prirodni kod. Kod napisan u .NET okruenju je upravljiv tokom svog izvrenja (ova faza se obino naziva izvrna). To znai da CLR vodi rauna o naoj aplikaciji kroz upravljanje memorijom, obezbeivanje sigurnosti, dozvoljava meujeziko otklanjanje greaka i tako dalje. Suprotno ovome, aplikacije koje ne rade pod kontrolom CLR-a nazivaju se neupravljive, odreeni jezici kao to je C++ mogu se koristiti za pisanje takvih aplikacija ( na primer, da bi se pristupilo funkcijama niskog stepena operativnog sistema). Sve u svemu, u jeziku C# moemo napisati samo onaj kod koji radi pod upravljivim okruenjem. Mi demo iskoristiti razne mogunosti upravljivosti CLR-a i dozvoliti .NET-u da se sam pozabavi interakcijom sa operativnim sistemom.

Sakupljanje otpadaJedna od najvanijih mogunosti upravljivog koda jeste koncept sakupljanja otpada. Ovo je metod .NET-a koji se stara o tome da memorija koju je aplikacija koristila tokom svog izvrenja bude obavezno ispranjena kada aplikacija nije vise u upotrebi. Pre pojave .NET-a to je najee bila briga samih programera, te je usled nekoliko malih greaka memorija misteriozno gubila itave blokove jer bila pogreno pozivana. To je najee bilo praeno usporavanjem vaeg raunara i obaveznim padom sistema. Sakupljanje otpada se odvija tako to uestalo ispituje memoriju vaeg raunara i odbacuje sve to vam nije vise potrebno. Ono nema neki vremenski okvir izvravanja, moe se dogoditi hiljadu puta u sekundi, jednom u nekoliko sekundi, ili kad god, ali moete biti sigurni da e se dogoditi. Kako je sakupljanje otpada nepredvidivo, morate ga imati na umu dok radite aplikacije. Kod koji za svoje izvrenje zahteva puno memorije morao bi iza sebe da poisti pre nego to dopusti sakupljanju otpada da to uradi za njega, ali to nije tako teko kako zvui.

3

Uklapanje u celinuPre nego to nastavimo, sumirajmo sve korake koji su nam potrebni da bi smo napravili .NET aplikaciju. 1. Kod za aplikaciju pie se korienjem .NET kompatibilnog jezika kao to je C#:

2. Ovaj kod se kompajlira u MSIL, koji je smeten u sklop:

3. Kod koji se izvrava (bez obzira da li je sam po sebi izvrni ili ga koristi neki drugi kod) mora se prethodno kompajlirati kroz JIT kompajler u prirodni kod:

4. Prirodni kod se izvrava u kontekstu upravljanog CLR, zajedno sa bilo kojom drugom aplikacijom ili procesom:

4

PovezivanjePostoji jedan dodatak gore pomenutom procesu. C# kod koji se kompajlira u MSIL u koraku 2 ne mora da bude smeten u jednu datoteku. Mogue je podeliti kod aplikacije u razliite datoteke koji e se tokom kompajliranja objediniti u sklop. Ovaj proces je poznat i kao povezivanje i veoma je koristan. Ta podela se vri jer je mnogo lake raditi sa vise manjih datoteka nego sa jednom ogromnom. Moete izdeliti kod na logike celine i smestiti ih u nezavisne datoteke na kojima se moe nezavisno raditi i praktino zaboraviti na njih kada zavrite. Ovo nam olakava pronalaenje odreenih delova koda kada nam zatrebaju. Takoe omoguuje programerskim timovima da podele teret na manje delove kojima je lake rukovati, kao i to da ukoliko doe do provere nekog od tih delova ne postoji rizik da se ugroze celina programa ili njegovi delovi na kojima se radi. Takoe celo MSJIT kompajliranje moe se predstaviti i u celini to vam moe pomoi da sagledate na drugi nain:

ta je C# ?Kako je gore pomenuto, C# je jedan od jezika koji slui za izradu aplikacija koje mogu raditi pod .NET CLR-om. On predstavlja evoluciju jezika C i C++ koju je kreirao Microsoft da bi se radilo sa .NET okruenjem. U njegovom razvoju koriene su mnoge prednosti drugih jezika, naravno uz otklanjanje njihovih mana. Razvoj aplikacija u jeziku C# je jednostavniji nego u C++, jer je sintaksa prostija. Pa ipak, C# je moan jezik i postoji veoma mali broj stvari koje bi smo uradili u C++ jeziku pre nego u C#-u. Paralelne mogunosti jezika C# onima naprednijim u C++-U, kao to je direktno pristupanje i manipulisanje sistemskom memorijom, moe biti izvedeno jedino kroz kod koji je obeleen kao nesiguran. Ove napredne tehnike programiranja su potencijalna opasnost (odakle im i ime) zato to je mogue pristupiti memorijskim blokovima koji su kritini za sistem, a sve to potencijalno vodi ka katastrofi. Iz ovog razloga, kao i drugih, ova tema nije obraena ovim predavanjima. S vremena na vreme kod u jeziku C# je malo razumljiviji od C++ koda. Jer je C# jezik sigurniji po pitanju dodele tipa promenljivim (za razliku od C++-a). To znai da ukoliko nekoj

5

promenljivoj ili nekom podatku dodelimo odreeni tip, on ne moe biti zamenjen nekim drugim nevezanim tipom. Postoje stroga pravila kojih se moramo pridravati prilikom konverzija tipova, to u sutini znai da emo esto morati da napiemo vise koda u jeziku C# nego u C++-U da bismo izvrili iste zadatke. Ali iz toga moemo izvui i neku korist. Kod je robusniji i jednostavnije je otkloniti greke, odnosno .NET u svakom trenutku moe odrediti kojem tipu pripada traeni podatak. Usled toga jezik C# nam ne omoguuje naredbe kao to su Uzmi deo memorije poevi od 4. bajta unutar podatka i duine 10 bajta i interpretiraj ga kao X", to ne mora da bude uvek loe. C# je samo jedan od jezika koji omoguuju rad sa .NET razvojnim okruenjem, ali moda je i najbolji. Njegova prednost je u tome to je jedini napravljen od poetka ba za .NET okruenje, pa samim rim moe biti i vodei jezik korien za verzije .NET-a namenjene dragim operativnim sistemima. VB.NET je, recimo, napravljen tako da bude to sliniji svojim prethodnicima i stoga ne moe da iskoristi .NET biblioteku koda u potpunosti. Suprotno njemu, jezik C# je napravljen tako da moe iskoristiti svaki deo biblioteke koda .NET okruenja koju ova moe da ponudi.

Kakve aplikacije moemo pisati u C#-u?Kako je gore navedeno, jezik C# nema ogranienja u pogledu toga kakve sve aplikacije moemo napraviti. C# koristi okruenje i samim tim nema ogranienja u vezi sa moguim aplikacijama. Pa ipak, pogledajmo koji su tipovi najee pravljenih aplikacija: Windows aplikacije - To su recimo, aplikacije tipa Microsoft Office koje imaju izgled Windowsa i odlino se slau sa njim. Ovo je uproeno korienjem modula Windows formulara unutar .NET okruenja, koji u stvari ini biblioteka kontrola (kao to su dugmad, palete alatki, meniji i tako dalje) koje nam koriste pri izradi Windows korisnikog interfejsa (UI). Web aplikacije - Web strane koje moemo videti kroz bilo koji ita. .NET okruenje prua veoma moan sistem generisanja Web sadraja i to dinamiki, dozvoljavajui personalizaciju, sigurnost i jo mnogo toga. Ovaj sistem se naziva Active Server Pages .NET (ASP.NET), a jezik C# moemo koristiti za izradu ASP.NET aplikacija uz pomo Web formulara. Web servisi - Predstavljaju nov i uzbudljiv nain izrade raznovrsnih distribuiranih aplikacija. Koristei Web servise preko Interneta moemo razmenjivati bilo koju vrstu podataka, koristei prostu sintaksu, ne vodei rauna o tome u kom jeziku je napisana aplikacija niti na kom sistemu je postavljena. Bilo kom od ovih tipova moe zatrebati pristup bazama podataka, to se postie korienjem Active Data Objects .NET (ADO.NET) odeljka .NET okruenja. Mnogi od ovih resursa mogu biti iskorieni, kao to su alati za izradu komponenata na mrei, iscrtavanje, izvoenje komplikovanih matematikih zadataka i tako dalje.

6

Visual Studio.NETU ovom predavanju za programiranje u jeziku C# koristimo Visual Studio .NET (VS), poev od aplikacija koje se pokreu iz komandne linije, pa sve do kompleksnih tipova projekata. VS nije neophodan za razvoj C# aplikacija, ali nam znatno olakava stvari. Moemo (ako to poelimo) napisati na kod u najobinijem programu za ureivanje teksta, kao to je Notepad, i kompajlirati kod u sklopove koristei kompajler iz komandne linije koji je u sastavu .NET okruenja. Meutim, zato bismo to radili, kada moemo iskoristiti snagu VS-a da nam pomogne? Sledi kratka lista razloga zbog kojih je VS pravi izbor za razvoj u .NET okruenju: VS automatizuje korake neophodne pri kompajliranju prirodnog koda, ali u isto vreme dozvoljava i kompletnu kontrolu nad opcijama ukoliko elimo da ih promenimo. VS program za ureivanje teksta je povezan sa jezicima koje podrava VS (ukljuujui jezik C#) i to tako da omoguuje pametnu detekciju greaka i sugerie odgovarajui kod na pravom mestu dok ga unosimo. VS sadri i dizajnerske alate za aplikacije koje ukljuuju Windows formulare kao i Web formulare, koji vam omoguuju jednostavna tehnika povlaenja i putanja (engl. drag-and-drop) dizajn elemenata korisnikog interfejsa. Mnogi tipovi projekata koji su mogui u jeziku C# mogu se napraviti sa, 'optenamenskim' kodom koji se ve nalazi na pravom mestu. Umesto da poinjemo od nule, esto emo nai razliite datoteke koje sadre kod koji je za nas zapoet, smanjujui nam vreme provedeno u spremanju projekta. VS sadri nekoliko arobnjaka koji vam automatizuju zadatke opte namene i koji mogu dodati odgovarajui kod postojeim datotekama, a da mi o tome ne vodimo brigu (ili u nekim sluajevima ak i da ne pamtimo tanu sintaksu). VS sadri mone alatke za prikazivanje i navigaciju elemenata naeg projekta, bez obzira da li se radi o prirodnom kodu jezika C# ili nekoj slici, ili moda zvunoj datoteci. Pored toga to olakava pisanje aplikacija, VS omoguuje i jednostavniju distribuciju i prilagoavanje projekata klijentima, kako bi ih oni lake koristili ili instalirali. VS omoguuje i napredne tehnike otklanjanja greaka pri razvoju projekata, i to tako da moemo u isto vreme ui u kod jedne instrukcije dok pazimo u kakvom je stanju aplikacija. Ima jo mnogo toga, ali nadam se da ste shvatili o emu se radi!

Reenja u VS-uKada koristimo VS za razvoj aplikacija, to radimo kreiranjem reenja. Reenje, po VS terminologiji, predstavlja neto vise od aplikacije. Reenja sadre projekte, koji mogu biti zasnovani na Windows formularima, Web formularima i tako dalje. Reenja mogu sadrati i vise projekata, tako da moemo grupisati srodan kod na jedno mesto, iako e se oni kompajlirati u razliite sklopove na razliitim mestima na disku. Ovo moe biti od velike koristi, kada se radi na deljenom kodu (koji moe biti smeten u globalni ke sklopova) u isto vreme dok aplikacije koriste taj kod. Otklanjanje greaka u kodu je mnogo lake ako se koristi jedinstveno razvojno okruenje, jer moemo pratiti instrukcije u viestrukim modulima koda.

7

SaetakU ovom predavanju upoznali smo se sa osnovnim pojmovima .NET razvojnog okruenja i sa mogunostima pravljenja monih i raznovrsnih aplikacija. Saznali smo ta je neophodno da bi se kod napisan, recimo, u jeziku C# pretvorio u funkcionalnu aplikaciju, i koje su prednosti upravljanog koda koji radi pod optim izvrnim jezikom .NET-a (Common Language Runtime). Videli smo ta je u stvari jezik C#, kako je povezan sa .NET okruenjem i upoznali se sa alatom koji emo koristiti za programiranje u C# - Visual Studio .NET-u. U sledeem predavanju nauiemo kako se C# kod pie pomou VS-a, pa emo samim tim moi da se skoncentriemo na jezik C# sam po sebi, umesto da brinemo o tome kako VS radi.

8

Pisanje programa u jeziku C#Nakon to smo se upoznali sa tim ta je u stvari jezik C# i kako se uklapa u .NET okruenje, doao je trenutak da zaponemo sa pisanjem koda. U tom poslu koristiemo Visual Studio .NET (VS), pa treba da nauimo osnovne stvari o torn razvojnom okruenju. VS je ogroman i komplikovan proizvod, tako da u prvo vreme korisniku moe delovati zastraujue, ali uz njegovu pomo pravljenje jednostavnih aplikacija moe biti iznenaujue prosto. im ponemo sa korienjem VS-a uvideete da nije potrebno mnogo znati o njemu da bismo se poigrali sa C# kodom. Kasnije emo videti neke mnogo komplikovanije operacije koje je mogue izvesti u VS-u, ali za sada su dovoljna osnovna znanja. Poto zavirimo u VS, sastaviemo dve proste aplikacije. Za sada se neemo mnogo optereivati kodom, samo emo se upoznati sa tim koje su procedure potrebne da bi se aplikacija napravila i da bi funkcionisala kako treba, mada e sve to uskoro postati sporedno. Prva aplikacija koju emo napraviti bie jednostavna konzolna aplikacija. Konzolne aplikacije ne koriste grafiko okruenje Windowsa, tako da ne moramo da brinemo o dugmadima, menijima, interakciji sa pokazivaem mia i tako dalje. Umesto toga, pokrenuemo aplikaciju iz komandne linije i komunicirati sa njom na mnogo prostiji nain. Druga aplikacija e biti bazirana na Windows formularima. Njen izgled, kao i rad sa njom, bie vrlo prepoznatljiv onima koji su koristili Windows i njeno kreiranje ne zahteva nita vise rada nego prethodna. Ipak, sintaksa njenog koda je mnogo komplikovanija, mada esto neemo morati da vodimo rauna o detaljima. Dodatna fleksibilnost Windows aplikacija nije neophodna da bi se nauio C# jezik, dok jednostavnost konzolnih aplikacija omoguuje da se skoncentriemo na uenje sintakse, a da za to vreme ne brinemo o tome kako aplikacija izgleda niti kakav je oseaj raditi sa njom.

Razvojno okruenje Visual Studio .NETKada prvi put uitate VS, odmah se pojavi nekoliko prozora, od kojih je veina prazna, zajedno sa nizom elemenata menija i ikona sa paletama alatki. Ukoliko prvi put pokreete VS bie vam predstavljena lista sa vrednostima namenjena za korisnike sa iskustvom u radu na prethodnim izdanjima ovog razvojnog okruenja. Automatski odabrani element! su sasvim u redu, za sada ih prihvatite jer tu nema niega to se kasnije ne moe promeniti. Izgled VS okruenja je u potpunosti prilagodljiv, ali su nam sasvim dovoljne ve postavljene vrednosti. One su sreene na sledei nain:

1

Glavni prozor, koji prikazuje uvodnu poetnu stranu" kada se VS pokrene, jeste onaj u kome se prikazuje ceo na kod. Ovaj prozor je podeljen na kartice tako da moemo lako skakati sa jedne na drugu datoteku tako to emo pritisnuti miem njihovo ime. Ovaj prozor ima i druge funkcije: moe prikazati grafiki korisniki interfejs koji dizajniramo za na projekat, iste tekstualne datoteke, HTML, kao i razliite alate ugraene u VS. Opisaemo svaki, kako na njega naiemo tokom rada. Iznad glavnog prozora nalaze se palete sa alatkama, kao i VS meni. Ovde moete nai nekoliko razliitih paleta sa alatkama rangiranih po funkcionalnosti - od alatki za snimanje i uitavanje datoteka, preko izgradnje i pokretanja projekta, do kontrola za otklanjanje greaka. O svima njima emo priati kada nam budu zatrebali. Slede kratki opisi glavnih karakteristika VS-a, koje ete najee koristiti:Server Explorer i Toolbox paleta sa alatkama izbacuju sopstvene menije kada se preko njih prede miem, i otvaraju nam nove dodatne mogunosti, kao to su pristup i podeavanje karakteristika i servisa samog servera, i pristup korisnikom interfejsu za izradu elemenata Windows aplikacija. Solution Explorer prozor prikazuje informacije o trenutno uitanim reenjima. Reenje je po terminologiji VS-a jedan ili vise projekata zajedno sa njihovom konfiguracijom. Ovde moemo videti razliiti pogled na projekte unutar reenja, kao to su datoteke iz kojih se sastoje i njihov sadraj. Properties prozor omoguuje detaljniji pogled na sadrinu projekta i dozvoljava nam da izvedemo dodatno konfigurisanje pojedinih elemenata. Na primer, taj prozor moemo koristiti da promenimo izgled dugmeta unutar Windows formulara. Task List and Output prozor prikazuje informacije prilikom kompajliranja projekta zajedno sa zadacima koji treba da se izvre (slino listi zadataka u Microsoft Outlooku). Ovi zadaci se mogu uneti runo, a mogu biti i automatski generisani od VS-a.

2

Ponimo sa pravljenjem prvog primera naeg projekta, koji e u sebe ukljuiti mnogo VS elemenata koje smo gore naveli.

Konzolna aplikacijaU ovom predavanju koristiti napravimo jednu jednostavnu. emo konzolne aplikacije, posebno na poetku, stoga

Veba br. 1.Napravite novi projekat konzolne aplikacije birajui File | New | Project... iz menija:

Izaberite Visual C# Projects direktorijum unutar prozora Project Types:, i tip projekta Console Application u okviru prozora Templates: (za ovo ete morati malo da pomerite prozor na dole). U okviru za tekst Location: promenite putanju u C:\Temp\SoftIng\LecturesCode\Vezba1 (ovaj e direktorijum biti automatski napravljen ukoliko ve ne postoji), i ostavite podrazumevani tekst u okviru za tekst Name: Pozdrav Svete.

3

Pritisnite miem na dugme OK. Kada se projekat inicijalizuje dodajte sledee redove u datoteku koja se bude pojavila u glavnom prozora:

Izaberite Debug | Start Without Debbuging iz menija. Posle nekoliko trenutaka trebalo bi da vidite sledee:

Pritisnite bilo koji taster da izaete iz aplikacije. Takoe samu konzolnu aplikaciju moemo pokrenuti i na drugi nain: Odaberite Start | Programs | Microsoft Visual Studio .NET 2003 | Visual Studio .NET Tools | Visual Studio .NET Command Prompt. Pojavie se komandni prozor i bie definisane sve promenljive okruenja potrebne prevodiocima i alatkama Visual Studija. Ako se pokrene obino komandno okruenje, bez zadavanja tih promenljivih, .NET alatke nee raditi.

4

Posle otvaranja komandnog prozora .NET-a uite u folder u kome ste sauvali ovu konzolnu aplikaciju. Unesite u komandnom prozoru sledeu komandu, koja prevodi kod konzolne aplikacije: csc Class.cs Naravno programiranje pod celim Visual Studio .NET je tkz. Case Sensity, osetljiv velika i mala slova. Tako da morate da obratite panju pri kucanju koda. Ovde to nije sluaj, ali nije naodmet da se navikavate na velika i mala slova. Prvo ete dobiti obavetenje o verziji prevodioca i izvrnog okruenja, a zatim i o autorskim pravima. Pokrenute program i biete pozdravljeni na sledei nain: C:\> Class1 Pozdrav svete na jeziku C# ! C:\> Funkcija Console.WriteLine() dodaje tekstu indikator novog reda (engl. Newline character). U windowsu je to kombinacija znaka za poetak reda i znaka za prelazak u novi red. Da biste u nekoliko iskaza pisali u istom redu, koristite funkciju Write(). Ona zahteva da sami dodate indikator novog reda. Sada u prethodnom programu zamenite iskaz WriteLine() sledeim iskazima: Cons ol e. Writ e (" Zdr av o sv e t e " ) ; Console.Write ( " n a jeziku C # ! \ r \ n " ) ; Obrnuta kosa crta (\) ispred znaka je signal prevodiocu da je u pitanju izlazna sekvenca (engl. escape sequence). Iz sledee tabele vidi se da C# koristi iste izlazne znake kao i C++. Ako iza obrnute kose crte stavite neki dragi znak, dobiete od prevodioca poruku da nije prepoznao izlazni znak. Izlazna sekvenca \a \b V \n V \t \v \" \\ ZnaenjeZvono. Zvunik proizvodi kratak signal. Brisanje ulevo (engl. backspace). Pomera za jedno mesto ulevo. Kraj strane. Pomera na poetak sledee strane prilikom tampanja. Na ekranu daje kontrolni znak. Novi red. Pomera u sledei red. Na ekranu se kursor pomera na poetak sledeeg reda. Znak za povratak na poetak reda. Pomera na poetak tekueg reda. Tekst koji se ispisuje na ekranu posle ovog znaka, pojavljivae se preko tekueg sadraja reda. Horizontalan tabulator. Daje znak tabulatora. Vertikalan tabulator. Pomera kursor nadole za zadati broj redova. Na ekranu daje kontrolni znak. Navodnici. Bez obrnute kose crte se koristi kao graninik za znakovne nizove. U kombinaciji sa obrnutom kosom crtom, prevodilac ga tumai kao obian znak. Dvostruka obrnuta kosa crta. Ispisuje obrnutu kosu crtu.

5

6

Kako to radiZa sada neemo ispitivati kod koji smo koristili u ovom projektu; vise demo brinuti o tome kako koristiti VS da bi se kod osposobio za izvravanje. Kao to ste videli, VS radi gomilu stvari za nas, to ini jednostavnim proces kompajliranja i izvrenja koda. Postoji vise naina za izvoenje ak i ovako jednostavnih koraka. Na primer, pravljenje novog projekta moe se izvesti preko stavke menija File| New | Project... kao to smo i radili, ili pritiskanjem kombinacije tastera Ctrl+Shift+N, ili pritiskom miem na odgovarajuu ikonu u paleti sa alatkama. Slino tome va kod moe biti kompajliran i izvren na vise naina. Za metod koji smo koristili izborom stavke menija Debug | Start Without Debbuging, imamo takoe preicu (Ctrl+F5), a isto tako i ikonu u paleti sa alatkama. Kod moemo pokrenuti korienjem stavke menija Debug | Start (takoe pritiskajui F5 ili odabirajui odgovarajuu ikonu; ili moemo kompajlirati kod bez njegovog pokretanja (sa ukljuenom ili iskljuenom proverom greaka) koristei Build | Build, Ctrl+Shift+B, ili odabirajui drugu ikonu. Kada je kod kompajliran moemo ga pokrenuti startovanjem dobijene .exe datoteke iz Windows Explorera, ili iz komandne linije. Da bismo to izveli, moramo otvoriti komandnu liniju, prei u direktorijum C:\Temp\SoftIng\LecturesCode\Vezba1\bin\Debug\, uneti Pozdrav Svete i pritisnuti taster Enter. U narednim primerima samo emo rei: Napravite novi konzolni projekat", ili: Pokrenite program", a vi izaberite nain koji vam odgovara da biste to uradili. Ukoliko ne bude drugaije naglaeno, kod treba pokretati sa ukljuenim otklanjanjem greaka. Treba naglasiti da se poruka Press any key to continue koju ste videli u okviru konzolnog programa, pojavljuje samo ukoliko nije ukljueno ispravljanje greaka. Ako pokrenemo projekat u modu za otklanjanje greaka prozor konzolnog programa e nestati. U principu to je dobro, ali ne i za prethodni primer. Ukoliko bismo tako uradili, ne bismo videli rezultate naeg rada. Sada smo napravili projekat preko koga moemo detaljno pogledati neke delove ovog projektnog okruenja. Prvi prozor na koji treba obratiti panju je Solution Explorer | Class View u gornjem desnom uglu ekrana koji je dole prikazan u oba reima rada (reim moete menjati pritiskajui dugmad u dnu prozora).

Ovaj pogled preko Solution Explorera prikazuje datoteke od kojih se sastoji projekat Pozdrav svete. Datoteka kojoj smo dodali kod je Class1.cs prikazana zajedno sa jo jednom kod datotekom, AssemblyInfo.cs. (Sve datoteke sa C# kodom imaju nastavak cs). Ova druga datoteka sa kodom za sada nije naa briga, ona sadri dodatne informacije o naem projektu koje nas se jo uvek ne tiu.

7

Unutar ovog prozora moemo menjati sadraj glavnog prozora, koji e se kod unutar njega prikazivati, i to tako to emo otvoriti datoteku .cs koja nam je potrebna ili pritisnuti na nju desnim dugmetom mia i odabrati opciju View Code. To moete uraditi i na drugi nain, jednostavnim pritiskom miem na dugme iz palete sa alatkama u gornjem delu prozora. U okviru ovog prozora moemo i manipulisati sa datotekama, brisati ih, menjati im ime i slino. Ovde se takoe mogu nalaziti i drugi tipovi datoteka, kao to su resursne datoteke projekta (resursi su datoteke koje nisu uvek C# datoteke - to mogu biti i slike ili zvune datoteke). Naravno, i sa njima moemo manipulisati preko istog interfejsa. Lista References sadri spisak .NET biblioteka koje koristimo u naem projektu. I to je neto ime emo se pozabaviti kasnije, zato to su standardne reference za na poetak dovoljne. Drugi pogled istog prozora, Class View, predstavlja nain da pogledamo na projekat kroz strukturu koda koji smo napravili. Tome emo se vratiti kasnije, a za sada odaberimo pogled Solution Explorer. Primetiete da se sadraj donjeg prozora menja u odnosu na to koju ikonu ili datoteku odaberete u gornjim prozorima. To je jo jedan prozor koji ima vise pogleda, ali najvaniji od njih je pogled Properties:

Ovaj prozor pokazuje dodatne informacije o tome ta smo odabrali u prozora iznad njega. Na primer, kada izaberemo Class1.cs iz naeg projekta videemo ono to je prikazano na slici. Ovaj prozor moe da nam prikae i informacije o drugim elementima koje odaberemo, kao to su komponente korisnikog interfejsa, to emo videti u drugom delu ovog predavanja koji se bavi Windows aplikacijama. esto, ukoliko unesemo izmene u prozor Properties, to e direktno uticati na kod tako to e dodati nove redove koda ili menjati sadraj naih datoteka. U nekim projektima proveemo isto toliko vremena menjajui stvari u ovom prozora, koliko emo provesti u pisanju samog koda. Sada pogledajmo prozor Output. Kada ste pokretali program verovatno ste primetili da se u ovom prozora pojavio neki tekst pre konzolnog prozora nae aplikacije. Na naem raunara pojavilo se, na primer:

8

Kao to moete pretpostaviti, to je izvetaj o statusu datoteka koje se kompajliraju. Ovde emo dobiti i izvetaj o grekama koje se mogu dogoditi tokom kompajliranja. Na primer, probajte da obriete taku-zarez iz reda koji smo dodali unosei kod u prethodnom koraku, i ponovo kompajlirajte. Ovaj put videete sledee:

Ovaj put projekat nee raditi. U sledeem predavanju kada budemo preli na sintaksu C#-a, videemo da se taka-zarez oekuje kroz ceo kod - na kraju skoro svakog reda naeg koda. Poto sada moramo neto uraditi da bismo naterali kod da radi, VS automatski dodaje zadatak u listu zadataka koja deli prostor sa prozorom Output:

9

Ovaj prozor e nam pomoi da utvrdimo gde se u naem kodu nalaze greke i vodie rauna o tome ta sve treba da uradimo da bi kompajlirali na kod. Ako dva puta pritisnemo miem na greku prikazanu u ovom prozoru, kursor e se postaviti tano na mestu gde je greka unutar koda (otvorie se datoteka koda koja sadri greku ukoliko ve nije otvorena), tako da problem moemo brzo reiti. Takoe emo videti male crvene talasaste linije na mestu gde lei naa greka tako da kod nije teko pretraiti. Zapazite kako je lokacija greke navedena kao broj reda. VS program za ureivanje teksta standardno ne prikazuje brojeve redova, a to je neto to bi bilo od koristi da vidimo. Da bismo to postigli, trebalo bi potvrditi odreena polja za potvrdu unutar dijaloga Options do koga se dolazi izborom stavke menija Tools | Options.... Ime polja za potvrdu je Line Numbers i nalazi se u kategoriji Text Editor | C# | General, kao to je prikazano na sledeoj slici:

10

Promenljive i izraziRaunarski program je, najpreciznije reeno, serija operacija koja manipulie podacima. To vai i za najkomplikovanije primere kao to su obimne i vienamenske Windows aplikacije (Microsoft Office, na primer). Najee skriven od pogleda korisnika, taj skup operacija se uvek odvija u pozadini. Ono to vidite na vaem monitoru toliko vam je poznato, da je teko zamisliti da je cela pria neto vise od pokretnih slika". U stvari, ono to vidite jeste samo predstava nekih podataka, ija gruba forma nije nita drugo do niz nula i jedinica smetenih negde u unutranjosti memorije vaeg raunara. Sve to uradite na ekranu, bez obzira na to da li se radi o pokretanju pokazivaa mia, pritiska na neku ikonu, ili unosa teksta u program za ureivanje teksta, rezultirae naizmeninom razmenom podataka u memoriji. Naravno, postoje i manje apstraktne situacije koje vam mogu pokazati isto. Ukoliko ukljuite aplikaciju kalkulator, obezbediete podatke u obliku brojeva i izvesti odreene operacije sa njima na nain na koji biste to uradili i na papiru, samo to je ovako mnogo bre. Ako je raunarski program u osnovi izvoenje operacija nad podacima, to znai da je nama potreban nain na koji moemo uskladititi neke podatke, kao i utvrivanje metoda manipulacije njima. Ove dve funkcije se obezbeuju preko promenljivih i izraza respektivno, a u ovom predavanju istraiemo ta to uopteno i detaljno znai. Prethodno je potrebno da se upoznamo sa osnovnom sintaksom jezika C#.

Osnove C# sintakse

Izgled i oseaj rada sa jezikom C# vrlo je slian C++-u i Javi. U poetku sintaksa izgleda prilino zbunjujue, a i manje je nalik pisanom engleskom nego neki drugi jezici. Pa ipak, kako zaponete sa programiranjem u jeziku C# shvatiete da je sintaksa razumljiva i da je mogue napisati vrlo jasan i itljiv kod bez mnogo muke. Za razliku od kompajlera za neke druge jezike, C# kompajler ne obraa panju na dodatne razmake unutar koda, bez obzira na to da li se sastoje od blanko znakova, tabulatora ili znakova za novi red. To znai da imamo prilinu slobodu u formatiranju naeg koda, iako se pridravanjem odreenih pravila itanje koda moe znatno olakati. C# kod je sastavljen od niza iskaza, a svaki od njih se zavrava takom-zarezom. Kako se beli (prazan) prostor ignorie, mogue je u jedan red staviti vise iskaza, ali zarad itljivosti uobiajeno je prei u novi red nakon take-zareza. Na taj nain izbegavamo vise iskaza u jednom redu. Savreno je prihvatljivo (ak i prilino normalno) da se jedan iskaz unese u vise redova. C# spada u jezike sa blokovskom strukturom, to znai da su svi iskazi delovi bloka unutar koda. Ovi blokovi, koji su oivieni vitiastom zagradom ({i}), mogu da sadre bilo koju vrstu iskaza, a i ne moraju ni jednu. Zapamtite da vitiaste zagrade ne zahtevaju taku-zarez iza sebe. Na primer, blok C# koda moe izgledati ovako: { ; ;

}

Ovde naravno nisu pravi izgled C# koda - kroz ovaj tekst je samo prikazano gde bi trebalo staviti C# iskaze. Primetite da su u ovom sluaju red 2 i red 3 deo istog iskaza zbog toga to na kraju reda dva ne postoji taka-zarez.

1

U ovom jednostavnom primeru nain na koji je uvuen tekst tipian je za C#. To nije izmiljeni metod pisanja C# koda, ve ustaljena praksa; VS e sam uraditi slinu stvar. Uopteno, svaki blok koda ima svoj stepen uvlaenja, koliko e desno biti postavljen u odnosu na levu ivicu. Blokovi koda mogu biti ugnedeni jedan u drugi (odnosno, blokovi mogu sadrati druge blokove), i u torn sluaju se ugnedeni blokovi uvlae jo vie: { ; { ; ; } ; } Takoe, redovi koda koji predstavljaju nastavak prethodnog reda uvlae se jo vise, kao u prvom primeru u redu 3. Zapamtite da ovaj stil pisanja niim nije uslovljen. Meutim, ukoliko ga ne koristite, stvari mogu postati vrlo konfuzne! Jo jedna stvar koju esto nalazimo u C# kodu jesu komentari. Komentari, strogo govorei, uopte nisu deo C# koda, ali na svu sreu postoje unutar njega. Komentari rade ono to im ime kazuje: omoguavaju dodavanje opisnog teksta vaem kodu - i to na srpskom (engleskom, francuskom, nemakom, mongolskom i tako dalje) jeziku, a to e kompajler u potpunosti ignorisati. Kada se budemo bavili nekim delovima koda koji su dui, bie zgodno da dodamo podsetnike o tome ta radimo, na primer: Ovaj red koda pita korisnika za broj", ili: Ovaj deo koda je napisao Petar". C# sadri dva naina da se to izvede. Moemo postaviti markere na poetku i na kraju komentara, ili moemo upotrebiti marker koji oznaava da je sve do kraja ovog reda komentar. Ovaj poslednji metod je izuzetak od pravila koje smo gore pomenuli, da C# kompajler ignorie prelazak u novi red. Za obeleavanje komentara prvom metodom koristimo znakove / * " na poetku komentara, i znakove * / " na kraju. Ovo moete koristiti za jedan red i za vise njih, ali u torn sluaju svi redovi izmedu markera postaju deo komentara. Jedina stvar koju ne moemo unositi unutar markera jeste * / ", jer bi to bilo shvaeno kao kraj komentara. Tako da je prihvatljivo sledee: /* Ovo je komentar */ /* Takoe... ... i ovo */ Ali sledee bi izazvalo probleme: /* Komentari se cesto zavravaju " */" znakovima */ Ovde e kraj komentara (znakovi posle * / ") biti prepoznat kao C# kod i doi e do greke. Drugi pristup komentarima ukljuuje zapoinjanje komentara znakom / / ". U nastavku moete unositi ta god vam je volja sve dok ste u istom redu! Sledee ispravno: // Ovo je druga vrsta komentara. Ali, sledee nee raditi, zato to e drugi red biti interpretiran kao C# kod: // Takoe je i ovo, ali ovo nije.

2

Ova vrsta komentara je korisna za dokumentovanje iskaza, jer moe biti postavljena u istom redu kao i iskaz: ; // Objanjenje iskaza Trei tip komentara u jeziku C# dozvoljava vam da dokumentujete va kod. To su pojedinani redovi komentara koji poinju sa tri / " simbola umesto sa dva, na primer: /// Poseban komentar Pod normalnim okolnostima kompajler ignorie ovakve komentare kao i sve druge, ali VS moete konfigurisati tako da on pravi posebno formatirane tekstualne datoteke kada se projekat kompajlira, koje nam kasnije mogu koristiti da napravimo prateu dokumentaciju. Vrlo je vano naglasiti da je C# kod osetljiv na upotrebu malih i velikih slova. Za razliku od nekih drugih jezika, kod se mora unositi pazei na upotrebu velikih i malih slova. Ukoliko se toga ne pridravamo, zaustaviemo kompajliranje projekta.

Osnove strukture C# konzolne aplikacije

Pogledajmo jo jednom primer konzolne aplikacije iz prethodnog predavanja (Pozdrav Svete), i zavirimo u njegovu strukturu. Kod je izgledao ovako: using System; namespace Pozdrav_Svete { /// /// Summary description for Class1. /// class Classl1 { static void Main(string [] args) { // // TODO: Add code to start application here // Console.WriteLine("Pozdrav svete na jeziku C# !"); } } } Moemo odmah uoiti sve elemente sintakse o kojima smo malopre priali. Vidimo takuzarez, vitiaste zagrade, komentare zajedno sa odgovarajuim uvlaenjem. Najvaniji deo koda za sada je: static void Main (string [] args) { // // TODO: Add code to start application here // Console.WriteLine("Pozdrav svete na jeziku C# !"); } Ovaj deo koda se izvrava kada se konzolna aplikacija startuje, ili jo preciznije, izvrava se blok koda oivien vitiastim zagradama. Jedini red koda koji e neto uraditi jeste onaj koji smo dodali automatski generisanom kodu - to je u stvari jedini red koji nije komentar. Ovaj kod jednostavno ispisuje neki tekst unutar konzolnog prozora, iako nas trenutno ne interesuje taan mehanizam kojim se to izaziva.

3

Cilj nam je da u prvih nekoliko predavanja objasnimo osnove sintakse jezika C#, tako da nas ne interesuje kako u toku svog izvravanja aplikacija dolazi do take gde se poziva Console.WriteLine (). Kasnije emo razjasniti znaaj ovog dodatnog koda.

Promenljive

Kako je naznaeno u uvodu ovog predavanja, promenljive nam slue da u njih skladitimo podatke. U osnovi, o promenljivima unutar memorije raunara razmiljamo kao o malim kutijama koje su poreane u nekoj polici. Te kutije moemo puniti raznim stvarima i prazniti ih, ili moemo samo zaviriti u njih. Iako u osnovi svi raunarski podaci u sutini sadre istu stvar (nizove jedinica i nula), promenljive imaju vise tipova. Ponovo kroz analogiju sa kutijama moemo zamisliti da one dolaze u razliitim veliinama i oblicima, tako da odreene stvari mogu stati samo u odreene kutije. Glavni razlog za ovakav nain raspodele po tipovima lei u tome to postoje razliiti tipovi podataka kojima se na drugaiji nain manipulie, tako da ograniavajui promenljive po tipu izbegavamo zabunu. Na primer, ne bi bilo logino tretirati na isti nain nizove jedinica i nula koje zajedno ine digitalnu sliku kao i zvune datoteke. Da bismo koristili promenljive, one moraju biti deklarisane. To znai da moramo da im dodelimo ime i tip. Jednom kad ih deklariemo, koristiemo ih za smetanje onog tipa podataka koji je naznaen u deklaraciji. Da bi se promenljiva navela u jeziku C# koristi se tip i ime kao u sledeem primeru: ; Ako probamo da upotrebimo promenljivu koja nije deklarisana, kod se nee kompajlirati, ali u torn sluaju kompajler e vas tano obavestiti ta je problem. Pored toga, ako pokuate da upotrebite promenljivu kojoj niste dodelili neku vrednost, to e takoe prouzrokovati greku, ali kompajler e i to primetiti. injenica je da postoji neogranien broj tipova koje moemo koristiti. To nam omoguava da sami definiemo svoje tipove ma koliko zamreni oni bili. Kada smo ve kod toga, postoje odreeni tipovi podataka koje e svi poeleti da koriste u odreenom trenutku, na primer promenljive koje sadre brojeve. Iz tog razloga postoje prosti unapred definisani tipovi promenljivih koje bi trebalo znati.

Prosti tipovi promenljivih

Prosti tipovi su recimo brojevne ili logike vrednosti (tano ili netano) koje sainjavaju osnovne blokove za izgradnju naih aplikacija, kao i za izgradnju drugih, sloenijih tipova. Veina prostih tipova su brojevni, to nam u prvi mah izgleda malo udno - zar nam ne treba samo jedan tip promenljivih da bismo uskladitili brojeve? Razlog za podelu tipova brojevnih promenljivih lei u samom mehanizmu smetanja brojeva kao nizova jedinica i nula u memoriju raunara. Za celobrojne vrednosti jednostavno uzimamo odreen broj bitova (nezavisnih cifri koje mogu biti jedinice ili nule) i predstavljamo na broj u binarnom formatu. Promenljiva koja smeta N bitova dozvoljava nam da preko nje prikaemo bilo koji broj izmedu 0 i (2n- 1). Bilo koji broj iznad ove vrednosti bie prevelik da se smesti u promenljivu. Recimo da imamo promenljivu u koju moemo smestili dva bita. Preslikavanje izmedu celih brojeva i bitova koji ih predstavljaju izgleda ovako: 0=00 1=01 2-10 3-11

4

Ako elimo da smestimo vise brojeva, treba nam vise bitova (tri bita e nam recimo, omoguiti smetanje brojeva od 0 do 7). Nezaobilazan zakljuak bi bio da nam za sve brojeve koje moemo zamisliti treba beskonana koliina bita, to ba i nee stati u na verni PC. ak i da postoji odgovarajui broj bitova za svaki broj, nikako ne bi bilo efikasno koristiti sve bitove za, recimo, promenljivu koja treba da smesti u sebe brojeve od 0 do 10 (ogroman prostor bi bio protraen). etiri bita bi nam ovde zavrila posao, dozvoljavajui nam da u isti memorijski prostor smestimo znatno vise vrednosti iz ovog opsega. Umesto toga, imamo odreen broj razliitih celobrojnih tipova koje demo koristiti za razliite opsege brojeva, ime emo zauzimati i razliite koliine memorije (sve do 64 bita). Sledi njihova lista: Zapamtite da svaki od ovih tipova koristi jedan ili vie standardnih tipova definisanih u .NET okruenju. Kao to smo razmotrili u prvom predavanju, korienje standardnih tipova nam omoguuje kombinovanje vise razliitih jezika u jedan projekat ili reenje. Nazivi koje koristimo za tipove u jeziku C# predstavljaju pseudonime za tipove koji su definisani u okruenju. Ova tabela je lista imena ovih tipova, i onoga ta predstavljaju unutar biblioteke .NET okruenja.Tip sbyte byte short ushort int uint long ulong pseudonim za System.SByte System.Byte System.Intl6 System.UIntl6 System.Int32 System.UInt32 System.Int64 System.UInt64 dozvoljene vrednosti ceo broj izmeu -128 i 127. ceo broj izmeu 0 i 255. ceo broj izmeu -32768 i 32767. ceo broj O i 65535. ceo broj izmeu -2147.483.648 i 2147.483.647. ceo broj izmeu 0 i 4294967295. ceo broj izmeu -9223.372.036.854.775.808 i 9223.372.036.854.775.807. ceo broj izmeu 0 i 1846.744.073.709.551.615.

Znak u" koji stoji ispred imena nekih promenljivih jeste skraenica za unsigned" (neoznaeno), to znai da u taj tip promenljivih ne moemo smetati negativne brojeve, to se moe videti iz kolone dozvoljenih vrednosti u prethodnoj tabeli. Pored celobrojnih, potreban nam je i nain da smestimo brojeve sa pokretnim zarezom, odnosno decimalne brojeve. Postoje tri tipa promenljivih namenjenih brojevima sa pokretnim zarezom: float, double i decimal. Prva dva tipa uvaju brojeve u pokretnom zarezu u obliku +/- m x 2e, gde se dozvoljene vrednosti za m i e razlikuju za svaki tip. Tip decimal koristi oblik +/- m x 10e. Ova tri tipa, zajedno sa dozvoljenim vrednostima, kao i realnim opsezima, prikazani su u sledeoj tabeli:Tip float double decimal Pseudonim za System. Single System.Double System.Decimal Minm 0 0 0 Maxm 224 253 296 Mine -149 -1075 -26 Maxe 104 970 0 Pribl. min vrednost 1.5x10-45 5.0x10124 1.0x10-28 Pribl. max vrednost 3.4x1038 1.7x10308 7.9x1028

5

Pored brojevnih tipova postoje jo tri prosta tipa:Tip char bool string Pseudonim za System.Char System.Boolean System.String Dozvoljene vrednosti pojedinaan Unicode znak, smeten kao ceo broj izmeu 0 i 65535. logika vrednost, true ili f a l s e . niz znakova.

Zapazite da ne postoji gornja granica za niz znakova koji sainjavaju string. To je zbog toga to koliina memorije koju on zauzima moe biti promenljiva. Logiki tip bool je jedan od najee korienih tipova promenljivih u jeziku C#. Slini tipovi se najee koriste i u drugim jezicima. Vrlo je vano imati promenljivu koja moe imati vrednosti true ili false, zbog logikog toka aplikacije. Uzmite u razmatranje, na primer, na koliko pitanja moe biti odgovoreno sa true ili false (odnosno, sa da ili ne). Poreenje vrednosti dve promenljive ili potvrivanje nekog unosa podataka, predstavljaju samo dva od mnogih naina primene logikih promenljivih koje emo uskoro isprobati. Poto smo se upoznali sa tipovima promenljivih, uradimo kratak primer kako ih deklarisati i koristiti.

Veba br. 2.Napravite novi projekat konzolne aplikacije birajui File | New | Project... iz menija:

Izaberite Visual C# Projects direktorijum unutar prozora Project Types:, i tip projekta Console Application u okviru prozora Templates: (za ovo ete morati malo da pomerite prozor na dole). U okviru za tekst Location: promenite putanju u C:\Temp\SoftIng\LecturesCode\Vezba2 (ovaj e direktorijum biti automatski napravljen ukoliko ve ne postoji), i ostavite podrazumevani tekst u okviru za tekst Name: Rad sa promenljivima1.

6

Dodajte sledei kod u Classl.cs (obriite redove sa komentarom na torn mestu):

Pokrenite program (ukoliko vam nije iskljuen reim za otklanjanje greaka, konzolna aplikacija e se zatvoriti pre nego to vidite ta se dogodilo):

Kako to radiKod koji ste dodali uradi sledee:deklarie dve promenljive; dodeljuje vrednosti promenljivima; preko konzole ispisuje te dve vrednosti.

7

Promenljive se deklariu u sledeem kodu: int MojInteger; string MojString; Prvi red deklarie promenljivu tipa int i to pod imenom MojInteger, a dragi red deklarie promenljivu tipa string nazvanu MojString.Zapamtite da je dodeljivanje imena promenljivima ogranieno, odnosno ne moe ba sve biti ime promenljive. O ovome emo priati u delu koji se bavi imenovanjem promenljivih.

Sledea dva reda koda deklariu vrednosti: MojInteger = 17; MojString = "Moj Ceo Broj \"MojInteger\" je:"; Ovde dodeljujemo dve fiksne vrednosti (poznatije kao vrednosti literala unutar koda) naim promenljivima koristei operator dodele = (o operatorima emo detaljnije govoriti u delu koji se bavi izrazima u okviru ovog predavanja). Dodeljujemo vrednost 17 promenljivoj MojInteger, dok promenljivoj MojString dodeljujemo MojInteger" is (ukljuujui i navodnike). Kada se dodeljuju znakovne vrednosti literala, zapamtite da moraju biti oiviene navodnicima. Da bi se to izvelo kako treba, neke znakove ne smemo koristiti unutar navodnika (na primer-same navodnike), ili ih moramo oznaiti tako to emo umesto njih koristiti neki niz znakova (poznat kao escape sekvenca) koji predstavlja one koje elimo da koristimo. U ovom primeru koristili smo sekvencu \" da bismo oznaili duple navodnike: MojString = "Moj Ceo Broj \"MojInteger\" je:"; Da nismo koristili escape sekvencu, i umesto nje probali: MojString = ""MojInteger" je"; pri kompajliranju bi se pojavila greka. Pri dodeljivanju znakova literala moramo biti oprezni sa prelazima u novi red - C# kompajler e odbaciti literale koji su vei od jednog reda. Ako elimo da proirimo literal na vise od jednog reda, moramo koristiti escape sekvencu \n. Na primer, sledea dodela: MojString = "Ovaj string ima \nprelazaka u novi red. "; bie prikazana u dva reda u okviru konzolnog prozora. Sve iskone (engl. escape) sekvence sastoje se iz znaka obrnute kose crte ( \ ) koji prati nekoliko znakova (videemo kasnije koji su to znakovi). Poto je znak obrnute kose crte iskorien u ovu svrhu, i za njega postoji escape sekvenca koja se jednostavno sastoji iz dva takva znaka, \\. Vratimo se kodu. Ostao nam je samo jo jedan red koji nismo prouili: Console.WriteLine("{0} {1}.", MojString, MojInteger);

8

Ovo je jako slino metodi ispisivanja teksta unutar konzole koju smo koristili u prvom primeru, ali smo sada naveli i nae promenljive. Ovo je tehnika koju emo koristiti u prvom delu knjige da bismo u okviru konzolnog prozora ispisali neki tekst. Unutar zagrada imamo dve stvari: string, listu promenljivih ije vrednosti elimo da ubacimo u izlazni string, odvojenu zarezima. ini se da string koji ispisujemo na izlazu, " {0} {1}. ", ne sadri nikakav koristan tekst. Ali kada se program pokrene, vidimo da taj string u stvari predstavlja ablon u koji ubacujemo sadraj naih promenljivih. Svaki znak oivien vitiastim zagradama predstavlja mesto na koje se smeta sadraj naih promenljivih. A svako mesto (ili string za formatiranje) predstavljeno je celobrojnom vrednou oivienom vitiastim zagradama. Celobrojne vrednosti poinju od nule i uveavaju se za jedan, a ukupan broj mesta treba da bude jednak broju promenljivih koje su navedene u produetku stringa i odvojene su zarezima. Kada se tekst ispie na konzoli, svako mesto biva zamenjeno odgovarajuom vrednou predviene promenljive. U gore navedenom primeru { 0 } je zamenjena stvarnom vrednou prve promenljive MojString, a {1} je zamenjeno sadrajem promenljive MojInteger. Ovaj metod ispisa teksta na konzolu koristiemo i u narednim primerima.

9

Imenovanje promenljivih, konvencije i vrednosti literalaKao to je spomenuto u prethodnom delu, za ime promenljive ne moe se koristiti bilo koji niz znakova. I pored toga, ostaje nam dovoljno fleksibilan nain imenovanja promenljivih. Osnovna pravila pri imenovanju promenljivih su:Prvi znak imena promenljive mora biti ili slovo, ili znak podvlaenja (_), ili @. Naredni znakovi mogu biti slova, znakovi podvlaenja ili brojevi.

Kao dodatak tome postoje odreene kljune rei koje oznaavaju neke radnje samom kompajleru, kao to su kljune rei using i namespace iz prethodnih primera. Ako kojim sluajem iskoristimo neku od kljunih rei kao ime promenljive, kompajler e se pobuniti, i ubrzo ete shvatiti da ste napravili greku, pa stoga ne brinite o tome mnogo. Na primer, sledea imena promenljivih su dobra:myBigVar VAR1 _test

Ova nisu:99FlasaPiva namespace Sve-je-gotovo

Upamtite, C# je osetljiv na korienje velikih i malih slova, zbog ega moramo pamtiti taan oblik imena koje smo dodelili promenljivoj. ak i jedna greka ovog tipa spreie kompajliranje programa.Posledica toga je i to da moemo imati vie promenljivih koje se razlikuju samo u velikim i malim slovima. Na primer, ovo su sve razliite promenljive:myVariable MyVariable MYVARIABLE

Pravila imenovanjaImena promenljivih su neto sa ime ete mnogo raditi. Zbog toga bi vredelo malo vremena utroiti na neku optu klasifikaciju i sortiranje imena koja emo koristiti. Pre nego to krenemo trebalo bi da imate na umu da je ovo kontroverzna oblast. Tokom godina razliiti sistemi su dolazili i odlazili, a neki programeri se svojski bore da opravdaju sopstvene sisteme. Do skoro najpopularniji sistem bio je poznat kao maarska notacija. U njemu svaka promenjiva sadri prefiks koji se pie malim slovom i identifikuje tip. Na primer, ako je promenljiva tipa int onda stavljamo i ( ili n) ispred njenog imena (recimo iGodiste). Koristei ovaj sistem, lako se moe utvrditi kog su tipa promenljive. Primena tog sistema u modernijim jezicima kao to je C#, malo je nezgodna. Za one tipove promenljivih koje smo do sada upoznali, mogli bismo se lako snai sa jednim ili dva slova kao prefiksima. Ali poto sami moemo definisati kompleksnije tipove, a i kako postoji vise stotina kompleksnih tipova u osnovi .NET okruenja, taj sistem brzo postaje neupotrebljiv. Kako na jednom projektu moe raditi vise ljudi, svaki od njih moe za sebe pronai posebnu1

kombinaciju oznaka za prefikse i na taj nain potpuno zbuniti ostale, to dovodi do pogubnih posledica. Programeri su do sada shvatili da je najbolje imenovati promenljivu prema njenoj nameni. Ako iskrsne bilo kakva sumnja, dovoljno je lako pronai kome tipu promenljiva pripada. U VS-u dovoljno je da pokaziva mia namestimo na ime promenljive kojoj elimo da otkrijemo tip i ispisae se poruka koja nas o tome obavetava. Trenutno imamo dve konvencije prema kojima se promenljive imenuju u .NET okruenju, a to su PascalCase i camelCase. Nain na koji su napisana imena ove dve konvencije je prema njihovoj upotrebi: obe se odnose na to da imena promenljivih budu sastavljena iz vie rei, a i naglaavaju da svaka re poinje velikim slovom, dok su sva ostala mala. Konvencija camelCase ima dodatno pravilo - da prvo slovo kompletnog imena promenljive bude malo slovo. Sledei primer koristi camelCase konvenciju:godite imeUenika datumUpisa

A u sledeem je upotrebljena konvencija PascalCase:Godite PrezimeUenika ZimaNaegNezadovoljstva

Za proste promenljive pridravaemo se konvencije camelCase, dok demo PascalCase koristiti za naprednije imenovanje, to je u stvari preporuka Microsofta. Konano, vredi napomenuti da su sistemi imenovanja u prolosti esto koristili znak podvlaenja, obino da bi se odvojile rei unutar imena promenljivih, kao to je moja_prva_promenljiva. Ovakav pristup je sada odbaen.

Tabela 4.1. Prefiksi tipova podataka

Tip podatakaBoolean Byte Char Decimal Double Integer Long Object Short String

Prefiksbln byt chr dec dbl int lng obj sho str

Primer vrednostiblnUlogovan bytGodiste chrLozinka decProdato dblRezultatIzracunavanja intBrojacPetlje lngIdKupca objWord shoTotalnaVrednost strIme

2

Tabela 4.2. Prefiksi promenljivih po podruju vaenja

Podruje vaenjaGlobal Private to class Nonstatic promenljiva, local to method

Prefiksg m (no prefix)

Primer vrednostig_strSnimiPutanju m_blnPromenaVrednosti

Vrednosti literalaU prethodnom primeru videli smo dve vrednosti literala - celobrojnu i znakovnu. I drugi tipovi promenljivih takoe mogu imati vrednosti literala, to e biti prikazano u sledeoj tabeli. Mnogi od njih ukljuuju sufikse, odnosno nizove znakova koji se dodaju na kraju literala da bi se naznaio eljeni tip. Neki literali imaju vie razliitih tipova koje na osnovu konteksta odreuje kompajler za vreme kompajliranja:Tabela 4.3. Sufiksi literala kod tipova podataka

Tip(ovi)bool int,uint, long, ulong uint,ulong long, ulong ulong float double decimal char string

Kategorijalogika celobrojna celobrojna celobrojna celobrojna realna realna realna znakovna niz znakova

Sufiksnema nema u ili U l ili L ul, uL, Ul,lu, U, Lu, ili LU f ili F nema, d ili D m ili M nema nema

Primer/dozvoljene vrednostitrue ili false 100 100U 100L 100UL 1.5F 1.5 1.5M a, ili escape sekvenca a..a, moe se ukljuiti escape sekvenca

String literaliRanije u ovom predavanju videli smo nekoliko iskonih sekvenci koje moemo koristiti u literalnim stringovima. Vredi predstaviti kompletnu tabelu, da bismo imali podsetnik:

Tabela 4.4. Escape sekvence

Escape sekvenca\` \" \\ \0 \a

Znak koji pravijednostruki navodnik dvostruki navodnik obrnuta kosa crta nula alarm(pravi pitanje)

Vrednost znaka u unicode-u0x0027 0x0022 0x005C 0x0000 0x0007

3

Tabela 4.4. Escape sekvence

Escape sekvenca\b \f \n \r \t \v

Znak koji praviunazad za jedan znak prelazak na sledeu stranicu novi red prenos u novi red horizontalni tabulator vertikalni tabulator

Vrednost znaka u unicode-u0x00080 0x000C 0x000A 0x000D 0x0009 0x000B

Kolona ove tabele koja prikazuje Unicode vrednost, predstavlja heksadecimalnu vrednost koju taj znak ima u Unicode skupu znakova. Za svaki Unicode znak moemo navesti odgovarajuu iskonu sekvencu, kao to su one u tabeli. Sekvenca se uvek sastoji od znaka \ iza koga sledi etvorocifrena heksadecimalna vrednost (na primer etiri cifre iza znaka x u gornjoj tabeli). To znai da su sledea dva stringa ekvivalentna:"Petar\s string." "Petar\u0027s string"

Oigledno da imamo vise mogunosti korienjem Unicode iskorienih sekvenci. Takoe moemo deformisati i literalne stringove. To podrazumeva da su u taj niz ukljueni svi znakovi oivieni dvostrukim navodnikom, ukljuujui i one koji oznaavaju kraj reda ili iskonu sekvencu. Jedini izuzetak je iskona sekvenca za dvostruke navodnike koja se mora navesti da bi se izbegao prevremeni kraj niza. Da bi se ovo izbeglo, na poetak niza znakova, pre navodnika, stavljamo znak @:@"sinonim string literala."

Niz znakova, odnosno string, lako moemo deformisati na normalan nain, ali sledei zahteva ovaj metod:@"Kratka lista: objekat 1 objekat 2"

Literalni stringovi naroito su korisni u imenima datoteka zato to ovi esto koriste znak obrnute kose crte. Ako koristimo normalan string, moramo koristiti dvostruku obrnutu kosu crtu u celom stringu, na primer:"C: \Temp\MojFolder\MojFajl.doc"

Sa litaralnim stringom, ovo moe biti itljivije. Sledei literalni string predstavlja potpuno isto kao malopreanji niz znakova:@"C:\Temp\ MojFolder\MojFajl.doc"

4

Zapamtite da su nizovi znakova, odnosno stringovi, referentnog tipa, za razliku od onih koji su vrednosnog tipa Posledica toga je i to da se stringu moe dodeliti vrednost null, to znai da string promenljiva ne pokazuje na string. Ovo emo kasnije detaljnije objasniti.

Odreivanje i dodeljivanje vrednosti promenljivimSetimo se da smo deklarisali promenljive koristei samo njihov tip i ime, na primer:int godite;

Potom smo joj dodelili vrednost uz pomo operatora dodele =:godite = 25; Upamtite da promenljive moraju biti inicijalizovane pre nego to ih upotrebimo. Prethodni redovi mogu biti korieni kao inicijalizacija.

Ima jo nekoliko stvari koje moemo uraditi, koje ete vidati u C# kodu. Prvo, moemo navesti vise razliitih promenljivih istog tipa u isto vreme, to je mogue izvesti ako ih odvojimo zarezom:int xVelicina, yVelicina;

gde su i xVelicina i yVelicina obe navedene kao celobrojne promenljive. Druga tehnika koju ete sretati jeste dodeljivanje vrednosti promenljivima dok ih deklariemo, to u stvari znai kombinovanje dva reda koda:int godite = 25;

A moemo i obe tehnike koristiti zajedno:int xVelicina =4, yVelicina = 5;

Ovde su xVelicina i yVelicina razliitih vrednosti. Pogledajte sledee:int xVelicina, yVelicina = 4;

Ovo znai da je yVelicina inicijalizovana, a xVelicina samo deklarisana.

IzraziVideli smo kako deklarisati i inicijalizovati promenljive i vreme je da nauimo kako da sa njima manipuliemo. C# kod sadri vei broj operatora koji tome slue, ukljuujui i operator dodeljivanja =, koji smo ve koristili. Kombinovanjem operatora sa promenljivima i literalima (koji se nazivaju operandi kada se koriste zajedno sa operatorima) moemo formirati izraze, koji ine osnovne gradivne blokove pri raunanju. Postoji irok dijapazon operatora, od onih jednostavnih do najkomplikovanijih, koje ete sretati samo u matematikim primenama. Prosti ukljuuju sve osnovne matematike operacije, kao to je; recimo operator + za sabiranje, a oni komplikovaniji, na primer, manipulaciju nad sadrajem promenljive i to prikazane u binarnom obliku. Postoje i logiki operatori koji slue u radu sa logikim promenljivima, kao i operatori dodele, recimo =.

5

U ovom predavanju skoncentrisaemo se na matematike i operatore dodeljivanja, dok emo za idua ostaviti logike operatore. Naime, preko logikih emo ispitivati kontrolu toka programa. Operatori se mogu grubo podeliti na tri kategorije: unarni operatori, koji rade samo sa jednim operandom; binarni operatori, koji rade sa dva operanda; ternarni operatori, koji rade sa tri operanda. Najvei deo operatora spada u binarne, samo nekoliko u unarne, dok je ternarni samo jedan koji se jo zove i uslovni operator (uslovni operator je logiki, odnosno on vraa logiku vrednost, ali o tome u iduem predavanju). Pogledajmo sada matematike operatore, koji sadre i binarnu i unarnu kategoriju.

Matematiki operatoriPostoji pet prostih matematikih operatora, od kojih dva imaju i unarnu i binarnu formu. U donjoj tabeli navedeni su svi ove operatori, zajedno sa kratkim primerom njihove upotrebe i rezultatima pri radu sa prostim numerikim tipovima (celobrojnim i decimalnim):

Tabela 4.5. Operatori

Operator+ * / % + -

Kategorijabinarni binarni binarni binarni binarni unarni unarni

Primer izrazavar1=var2+var3; var1=var2-var3; var1 = var2 * var3; var1 = var2 / var3 var1 = var2 % var3 var1 = +var2 var1 = -var2

Rezultatvar1 je dodeljena vrednost sume var2 i var3 var1 je dodeljena vrednost razlike var2 i var3 var1 je dodeljena vrednost proizvoda var2 i var3 var1 je dodeljena vrednost deljenja var2 i var3 var1 je dodeljena vrednost koja je ostatak deljenja var2 i var3 var1 je dodeljena vrednost var2 var1 je dodeljena vrednost var2

Primeri su pokazani korienjem prostih numerikih tipova. Ukoliko koristite druge proste tipove moe doi do zabune. Sta mislite da e se dogoditi ako, na primer, saberete dve logike promenljive ? U ovom sluaju nita, zato to e se kompajler odmah pobuniti ako, recimo, pokuate da koristite operator + (ili bilo koji dragi matematiki operator) sa bool promenljivama. Sabiranje dve promenljive tipa char takoe dovodi do malog nesporazuma. Zapamtite da se promenljive tipa char uvaju kao brojevi, pa prema tome, sabiranje takve dve promenljive za rezultat daje broj (da budemo precizniji, broj tipa int). Ovo je primer implicitne konverzije i o njemu emo jo dosta govoriti, kao i o eksplicitnoj konverziji, koja se takoe odnosi na sluajeve kada su var1, var2, i var3 razliitih tipova.

6

Nakon ovoga, binarni + operator ima smisla koristiti sa promenljivama tipa string. U ovom sluaju tabela treba ovako da izgleda:Tabela 4.6. Operatori

Operator+

Kategorijabinarni

Primer izrazavar1=var2+var3;

Rezultatvar1 je dodeljena nadovezana vrednost stringova var2 i var3

Nijedna draga matematika operacija nee raditi sa stringovima. Ostala dva operatora koje treba da upoznamo su operatori inkrementiranja i dekrementiranja. Oba su unarni operatori koji se koriste na dva razliita naina: ili odmah ispred, ili odmah iza operanda. Pogledajmo na brzinu rezultate ovih prostih izraza, pa ih onda razmotrimo:Tabela 4.7. Operatori inkrementiranja i dekrementiranja

Operator++ -++ --

Kategorijaunarni unarni unarni unarni

Primer izrazavar1=++var2 var1=--var2 var1=var2++ var1=var2-var1 var2 var1 var2 var1 var2 var1 var2 je je je je je je je je

Rezultatdodeljena vrednost. var2+1, uveana za 1. dodeljena vrednost. var2-1, umanjena za 1. dodeljena vrednost var2. uveana za 1. dodeljena vrednost var2. umanjena za 1.

Kljuna stvar kod ovih operatora je da se vrednost operanda uvek menja. ++ uvek uveava svoj 1 operand za 1, a - ga uvek umanjuje za 1. Od toga gde se operator tano nalazi, zavisi i rezultat koji je smeten u var1. Smetanje operatora pre operanda, znai da se operand menja pre nego to se izvre dalja izraunavanja. Ukoliko ih stavimo posle operanda, operand se menja tek posle izraunavanja. Ovo zahteva jo jedan primer. Razmotrite sledei kod:int var1, var2 = 5, var3=6; var1 = var2++* --var3;

Pitanje je sledee: koja e vrednost biti dodeljena promenljivoj var1 ? Pre nego to se izraz izrauna, operator -- e promeniti vrednost var3 iz 6 u 5. Operator ++ koji stoji posle var2, moemo ignorisati, jer se on nee izvriti pre nego to se obavi raunanje, tako da e var1 biti proizvod 5 i 5, odnosno 25. Prosti unarni operatori mogu nam koristiti u mnogim situacijama. Oni su u stvari samo skraenica za izraze tipa:var1 =var1+ 1;

Ovaj tip izraza ima mnogo upotreba, pogotovo kada se radi o petljama.

7

Preko sledeeg primera videemo kako da koristimo matematike operatore i upoznaemo se sa nekim novim, korisnim konceptima.

Veba br. 3.Napravite novi projekat konzolne aplikacije birajui File | New | Project... iz menija: Izaberite Visual C# Projects direktorijum unutar prozora Project Types:, i tip projekta Console Application u okviru prozora Templates: (za ovo ete morati malo da pomerite prozor na dole). U okviru za tekst Location: promenite putanju u C:\Temp\SoftIng\LecturesCode\Vezba3 (ovaj e direktorijum biti automatski napravljen ukoliko ve ne postoji), i ostavite podrazumevani tekst u okviru za tekst Name: Promenljive2 Dodajte sledei kod u Class1.cs:

Operatori dodeljivanja

Do sada smo koristili prost operator dodele =, i moda vam je iznenaujue da bilo koji drugi postoji. Meutim, ima ih vise i mogu biti vrlo korisni! Svi ostali operatori dodele rade na slian nain. Kao i kod operatora = i drugi se dre toga da se promenljiva kojoj se dodeljuje vrednost nalazi sa leve strane, dok se operandi i operatori nalaze sa desne strane. Kao i ranije videemo tabelarni prikaz njihovih objanjenja:

Snimite program, i pokrenite ga.

8

Unesite vae ime i pritisnite Enter. Zatim unesite potrebne brojeve, i pritiskajte Enter.

Kako to radi

Osim to nam prikazuje operatore, ovaj kod nam donosi dva vana koncepta sa kojima emo se susresti mnogo puta u radnim primerima: Korisniki unos Konverzija tipa Korisniki unos je slian komandi Console.WriteLine (), koju smo ve videli. Ovde, meutim, koristimo Console.ReadLine(). Ova komanda trai od korisnika neki unos, koji smeta u promenljivu tipa string:

Ovaj kod ispisuje sadraj dodeljene promenljive, userName, pravo na ekran. U ovom primera uitavamo i dva broja. Ovo je malo kompleksnije, zato to Console.ReadLine() generie string, a nama treba broj. Ovo nas uvodi u temu konverzije tipa. O ovome emo detaljnije u kasnije, za sada pogledajmo kod iz primera. Prvo, navodimo dve promenljive u koje treba smestiti brojeve koje unosimo:

Sledee, ispisujemo poruku i koristimo komandu Convert.ToDouble() na promenljivoj tipa string koju nam je vratio red Console.ReadLine(), da bismo konvertovali promenljivu iz tipa string u tip double. Ovaj broj dodeljujemo promenljivoj prviBroj koju smo naveli:

9

Ova sintaksa je izuzetno prosta, a verovatno vas nee zauditi kada saznate da se mnoge druge konverzije odvijaju na slian nain. I drugi broj dobijamo na isti nain:

Potom na izlaz aljemo rezultate sabiranja, oduzimanja, mnoenja, deljenja, i na kraju prikazujemo ostatak posle deljenja, koristei operator modula (%) za to:

U oit e da su izrazi prviBroj + drugiBroj i slino, parametri iskaza Console. WriteLine( ) , bez korienja neke posredne promenljive:

Ovakva sintaksa omoguuje veliku itljivost koda, i smanjuje broj redova koje moramo da napiemo.

10

Operatori dodeljivanjaDo sada smo koristili prost operator dodele =, i moda vam je iznenaujue da bilo koji drugi postoji. Meutim, ima ih vise i mogu biti vrlo korisni! Svi ostali operatori dodele rade na slian nain. Kao i kod operatora = i drugi se dre toga da se promenljiva kojoj se dodeljuje vrednost nalazi sa leve strane, dok se operandi i operatori nalaze sa desne strane. Kao i ranije videemo tabelarni prikaz njihovih objanjenja:Tabela 4.8. Operatori dodeljivanja

Operator

Kategorijabinarni binarni binarni binarni binarni binarni

Primer izrazavar1=var2; var1+=var2 var1-=var2; var1*=var2; var1/=var2; var1%=var2;

Rezultatvar1 je dodeljena vrednost var2 var1 je dodeljena vrednost koja ini sumu v a r1 v ar2 var1 je dodeljena vrednost razlike varl i var2 var1 je dodeljena vrednost proizvoda v a r 1 i var2 var1 je dodeljena vrednost deljenja var1 i var2 var1 je dodeljena vrednost ostatka deljenja var1 i var2

= += -= *= /= %=

Kao to vidite, dodatni operatori ukljuuju var1 u izraunavanje, tako da:var1 += var2;

daje isti rezultat kao i:var1 = var1 + var2;

Upamtite da se operator += moe koristiti i sa stringovima, kao i +. Ukoliko koristimo dugaka imena za promenljive, ovi operatori nam mogu nainiti kod itljivijim.

Prvenstvo operatora

Kada raunar obrauje izraz, on izvrava svaki operator prema redosledu. Meutim, to ne znai da se operatori uvek izraunavaju sleva nadesno. Jednostavan primer je: var1 = var2 + var3; Ovde se prvo izvrava operator + pa tek onda =. Postoje i druge situacije kada prvenstvo izvoenja operatora nije oigledno, na primer: var1 = var2 + var3 * var4; Ovde je redosled izvrenja sledei: prvo operator * , zatim + i na kraju =. Ovo je standardni matematiki redosled i daje isti rezultat kao da ste na papiru izveli neku operaciju u algebri. Kod takvih kalkulacija, moemo odrediti prvenstvo izvravanja koristei zagrade, na primer: var1 = (var2 + var3) * var4;

11

Ovde se sadraj unutar zagrada izraunava prvi, to znai da e operator + biti izvren pre operatora *. Redosled po kome se izvravaju operatori prikazan je u tabeli dole - tamo gde su operatori istog prioriteta (kao recimo * i /) redosled se odreuje sleva udesno:Tabela 4.9. Prvenstvo operatora

PrvenstvoNajvii

Operator++, (korieni kao prefiksi); +, -(unarni) *, /, % +, =, *=, /=, %=, +=, -= ++, (korieni kao sufiksi)

Najnii

Zapamtite da se redosled moe promeniti upotrebom zagrada, kako je gore opisali

Imenovani prostori

Pre nego to nastavimo, bilo bi korisno da upoznamo imenovane prostore - metod .NET okruenja kojim se obezbeuje kontejner koji sadri aplikacioni kod, i to tako da i kod i njegov sadraj mogu biti jedinstveno identifikovani. Imenovani prostori se takoe koriste i pri kategorisanju objekata .NET okruenja. Najvei deo tih objekata su definicije tipova, kao to su recimo prosti tipovi (System. Int32 i slino). C# kod se podrazumevano sadri u globalnim imenovanim prostorima. To znai da se tom kodu moe pristupiti iz nekog drugog koda koji je unutar globalnih imenovanih prostora, tako to se navede njegovo ime. Moemo koristiti i kljunu re namespace, da bismo eksplicitno definisali imenovani prostor u bloku koda oivienom vitiastim zagradama. Takva imena moraju biti kvalifikovana, ukoliko e ih koristiti kod izvan imenovanog prostora. Kvalifikovano ime je ono koje sadri sve informacije o svojoj hijerarhiji. To znai da ukoliko imamo kod u jednom imenovanom prostoru, koji treba da koristi ime definisano u nekom drugom imenovanom prostoru, moramo ukljuiti referencu na ovaj imenovani prostor. Kvalifikovana imena koriste znak(.) izmeu nivoa imenovanog prostora. Na primer: namespace LevelOne { //kod u imenovanom prostoru LevelOne //ime "NameOne" definisano } //kod u globalnom imenovanom prostoru Ovaj kod definie jedan imenovani prostor, LevelOne, kao i jedno ime u njemu, NameOne (ovde nije upotrebljeno nita od pravog koda, da bi bilo uopteno; umesto toga stavljeni su komentari tamo gde bi trebale da stoje definicije). Kod napisan unutar LevelOne imenovanog prostora, poziva ovo ime upotrebom "NameOne" - nije potrebna nikakva druga klasifikacija, Meutim, kod u globalnom imenovanom prostoru mora pozivati ovo ime na sledei nain: "LevelOne.NameOne". U okviru imenovanih prostora moemo definisati ugnedene imenovane prostore, takoe koristei kljunu re namespace. Ugnedeni imenovani prostori se pozivaju preko svoje hijerarhije, opet koristei taku da bi naveli svaki nivo unutar hijerarhije. Ovo emo najbolje prikazati preko primera.

12

Razmotrite sledee imenovane prostore: namespace LevelOne { //kod u imenovanom prostoru LevelOne namespace LevelTwo { //kod u imenovanom prostoru LevelOne.LevelTwo //ime "NameTwo" definisano } } //kod u globalnom imenovanom prostoru Ovde se NameTwo mora pozivati kao "LevelOne.LevelTwo.NameTwo" iz globalnog imenovanog prostora; ili kao "LevelTwo.NameTwo" iz imenovanog prostora LevelOne; ili kao "NameTwo" iz imenovanog prostora LevelOne.LevelTwo. Vano je naglasiti da su imena jedinstveno definisana od strane njihovih imenovanih prostora. Mogli bismo definisati ime "NameThree" u imenovanim prostorima LevelOne i LevelTwo: namespace LevelOne { //ime "NameThree" definisano namespace LevelTwo { //ime "NameThree" definisano } } Ovde smo definisali dva imena, LevelOne.NameThree i LevelOne.LevelTwo.NameThree, koja se mogu koristiti nezavisno jedno od drugoga. Kada definiemo imenovani prostor, moemo pojednostaviti pristup imenima koje sadre pomou iskaza using. Iskaz using znai: U redu, trebae nam imena iz ovog imenovanog prostora, pa se neemo muiti da svaki put navodimo njihova puna imena". Na primer, u sledeem kodu kaemo da iz imenovanog prostora LevelOne treba da imamo pristup imenima u imenovanom prostora LevelOne.LevelTwo bez klasifikacije: namespace LevelOne { using LevelTwo; namespace LevelTwo { //ime "LevelTwo" definisano } } Sada iz imenovanog prostora LevelOne moemo pozvati ime LevelTwo.NameTwo pomou "NameTwo".

13

Ponekad, kao u primera NameThree, ovo moe dovesti do problema sa kolizijom istih imena u razliitim imenovanim prostorima (kada se kod verovatno nee kompajlirati). U takvim sluajevima, moemo definisati sinonim za imenovani prostor kao deo iskaza using: namespace LevelOne { using LT=LevelTwo; // ime "NameThree" definisano namesp ace Lev elTwo { } } Ovde se iz imenovanog prostora LevelOne ime LevelOne. NameThree poziva kao "NameThree", a ime LevelOne.LevelTwo.NameThree kao "LT.NameThree". Iskaz using odnosi se na imenovani prostor u kome se sadri, kao i na sve imenovane prostore ugnedene u njega. U gore navedenom kodu globalni imenovani prostor ne moe koristiti "LT.NameThree". Meim, koristie iskaz using, na sledei nain: using LT = LevelOne.LevelTwo; namespace LevelOne { //ime "NameThree" definisano namespace LevelTwo { //ime "NameThree" definisano } // ime "NameThree" definisano

}

Tada kod u globalnom imenovanom prostora kao i u LevelOne mogu koristiti "LT.NameThree". Ovde je vano podvui jo neto. Iskaz using sam po sebi ne daje vam pristup imenima u drugom imenovanom prostoru. Ukoliko kod nije na neki nain povezan sa vaim projektom tako to je definisan u izvornoj datoteci vaeg projekta, ili ukoliko nije deformisan unutar nekog drugog koda koji je povezan sa vaim projektom, neemo imati pristup imenima koja sadri. Isto tako, ako je kod koji sadri imenovani prostor povezan sa vaim projektom, pristup imenima koje sadri je omoguen, bez obzira na to da li koristimo using. Iskaz using nam prosto olakava pristup ovim imenima, a moe i prilino skratiti inae dugaak kod, da bi ga napravio razlonijim. Ukoliko se vratimo na kod u Pozdrav Svete, sa poetka ovog predavanja, videemo sledee redove koji se odnose na imenovane prostore:using System; namespace Pozdrav_Svete { ..... ..... }

Prvi red koristi using da definie imenovani prostor System koji e biti korien u ovom C# kodu, i moe mu se pristupiti iz svih imenovanih prostora koji su u ovoj datoteci, bez klasifikacije. System imenovani prostor je koreni imenovani prostor za aplikacije .NET okruenja i sadri sve osnovne funkcionalnosti neophodne za konzolne aplikacije.14

Zatim je deklarisan i imenovani prostor za samu aplikaciju, Pozdrav Svete.

SaetakU ovom predavanju preli smo prilian deo terena koji se bavi pravljenjem korisnih (ako ne i osnovnih) C# aplikacija. Upoznali smo se sa osnovama C# sintakse i analizirali osnove koda konzolnih aplikacija koje VS generie za nas, kada se pravi konzolni aplikacioni projekat. Najvei deo ovog predavanja, bavi se korienjem promenljivih. Videli smo ta su to promenljive, kako se prave, kako im se dodeljuju vrednosti i kako se manipulie tim vrednostima. Usput, upoznali smo se i sa osnovama interakcije sa korisnikom, tako to smo videli kako ispisati tekst u konzolnoj aplikaciji i kako proitati ono to nam korisnik unese. Ovo je ukljuilo samo osnovne tipove konverzije. Takoe smo nauili kako formirati izraze pridruivanjem operatora i operanda, i kako se ovi izvravaju i kojim redosledom. Na kraju, upoznali smo se sa pojmom imenovanih prostora, koji e nam kako napredujemo kroz knjigu postajati sve vaniji. Poto vam je ova tema predstavljena prilino skraeno, stvorena je osnova za dalje diskusije. Sve to smo do sada programirali izvrava se red po red.

Vebe1. Kako pozvati ime veliki iz koda unutar imenovanog prostora cudan ? namespace cudan { //kod u imenovanom prostoru cudan } namespace super { namespace velikani { // definisano ime veliki } } 2. Koje od navedenih imena promenljivih nije ispravno: a) b) c) d) e) mojaPromenljivaJeDobra 99Flake _floor time2GetJiggyWidIt tf.zr.ac.yu

15

Kontrola toka programaSav kod u jeziku C# koji smo do sada videli ima neto zajedniko. U svakom od primera kod se izvravao red po red, od gore ka dole, ne proputajui nita. Kada bi se svaka aplikacija izvravala ovako, bili bismo vrlo ogranieni u onome to se da uraditi. U ovom predavanju videemo dve metode kontrole toka programa, odnosno redosleda izvrenja redova u C# kodu. Te dve metode su sledee: Grananje - gde izvravamo kod uslovno, u zavisnosti od rezultata nekog poreenja, na primer. Ovaj kod izvri samo ako je myVal manje od 10." Petlje - ponavljanje izvrenja istih iskaza (odreeni broj puta, dok se ne dostigne uslov koji je unapred zadat). Obe tehnike ukljuuju korienje Bulove logike. U predavanju o prikazu tipova videli smo tip bool, ali nismo mnogo radili sa njim. Krenuemo od toga ta se podrazumeva pod Bulovom logikom, tako da bismo je mogli upotrebiti u toku kontrole programa.

Bulova logika

Tip bool, moe sadrati samo dve vrednosti: true ili false. Ovaj tip se esto koristi da bi se zabeleio rezultat neke operacije, tako da moemo reagovati na osnovu tog rezultata. Uglavnom se tipovi bool koriste da uskladite rezultat nekog poreenja.Istorijski, vredelo bi seati se (i potovati) engleskog matematiara Dorda Bula, iji je rad sredinom devetnaestog veka omoguio osnovu Bulove logike.

Kao primer, razmotrite situaciju u kojoj bismo eleli da izvrimo kod na osnovu toga da li je promenljiva myVal manja od 10. Da bismo ovo uradili, moramo proveriti da li je iskaz myVal je manje od 10" istinit ili neistinit. Tanije, moramo znati logiku vrednost rezultata tog poreenja. Logiko poreenje zahteva upotrebu logikog operatora poreenja (koji se jo zove i relacioni operator), koji su prikazanih u donjoj tabeli. U svim ovim sluajevima, var1 je promenljiva tipa bool, dok tipovi promenljivih var2 i var3 mogu biti razliiti.Tabela 5.1. Operatori dodeljivanja

Operator == != < > =

Kategorijabinarni binarni binarni binarni binarni binarni

Primer izrazavar1=var2== var3; var1=var2!= var3; var1=var2< var3; var1=var2>var3; var1=var2= var3;

Rezultatvar1 je dodeljena vrednost true ako je var2 jednaka var3, u suprotnom false. var1 je dodeljena vrednost true ako je var2 nije jednaka var3, u suprotnom false. var1 je dodeljena vrednost true ako je var2 manja od var3, u suprotnom false. var1 je dodeljena vrednost true ako je var2 vea od var3, u suprotnom false. var1 je dodeljena vrednost true ako je var2 manja ili jednaka var3, u suprotnom false. var1 je dodeljena vrednost true ako je var2 vea ili jednaka var3, u suprotnom false.

1

Moemo koristiti ove operatore na brojnim vrednostima u kodu kao to je:bool isLessThan1O; isLessThan1O = myVal < 10; . ...

U ovom kodu bie dodeljena vrednost true promenljivoj isLessThan1O, ako je vrednost promenljive myVal manja od 10, u suprotnom bie dodeljena vrednost false. Ove operatore poreenja moemo koristiti i na drugim tipovima, kao to su stringovi:bool isPetar; isPetar =myString == "Petar";

Ovde e isPetar biti istinita samo ako myString u sebi ima string "Petar". Takoe se moemo fokusirati i na logike vrednosti:bool isTrue; isTrue = myBool == true;

Ipak, ovde smo ogranieni na korienje samo operatora == i ! =.Upamtite da e doi do greke u kodu ako sluajno pretpostavite da va11>va12 mora biti true zato to je va11 maxProm) { maxProm = intArray [i] ; maxIndex = i; } return maxProm; } Moemo koristiti funkciju na sledei nain: int [] myArray = (1, 8, 3, 6, 2, 5, 9, 3, 0, 2); int maxIndex Console.Write("Maksimalna vrednost u nizu myArray je {0)", MaxVrednost(myArray, out maxIndex); Console.WriteLine{"Maksimalna vrednost niza je (0) element u nizu", maxindex+1); Rezultat ovoga je: Maksimalna vrednost u nizu myArray je 9 Maksimalna vrednost niza je 7 element u nizu Ovde je vano naglasiti da se kljuna re out mora upotrebiti u pozivu funkcije, ba kao i kljuna re ref. Upamtite daje vrednosti maxIndex dodato jedan, i vraa se ovde dok je ispisujemo na ekran. To je zato da bismo indeks preveli u razumljiviji oblik, tako da se prvi element u nizu ne oznaava sa 0 ve sa 1.

12

Opseg vaenja promenljive

Moda ste se upitali zato je uopte potrebna razmena podataka sa funkcijama. Razlog je taj to se promenljivama u C#-u moe pristupiti samo iz lokalnih regiona koda. Za datu promenljivu kae se da ima opseg vaenja unutar koga joj se moe pristupiti. Opseg vaenja promenljive je vana tema i najbolje emo je predstaviti preko primera. Definisanje i korienje osnovnih funkcija.

Veba br. 12.Napravite novi projekat konzolne aplikacije birajui File | New | Project... iz menija: Izaberite Visual C# Projects direktorijum unutar prozora Project Types: i tip projekta Console Application u okviru prozora Templates: (za ovo ete morati malo da pomerite prozor na dole). U okviru za tekst Location; promenite putanju u C:\Temp\SoftIng\LecturesCode\Vezba12 (ovaj e direktorijum biti automatski napravljen ukoliko ve ne postoji), i ostavite podrazumevani tekst u okviru za tekst Name: PrimerOpsegParam. Dodajte sledei kod u Class1.cs:

Kompajlirajte kod i obratite panju na greku i upozorenje koji se pojavljuju u listi zadataka:

13

Kako to radiSta je krenulo loe? Promenljivoj mojString, definisanoj u glavnom delu programa (u funkciji Main ()), nije mogue pristupiti iz funkcije Write (). Razlog za ovu nepristupanost jeste to to promenljiva ima svoje podruje vaenja unutar koga je validna. To podruje podrazumeva blok koda u kom je deformisana i bilo koje direktno ugnedene blokove koda. Blokovi koda u funkcijama odvojeni su od blokova koda iz kojih se pozivaju. Unutar funkcije Write() ime mojString je nedefinisano, pa je i promenljiva mojString deformisana u funkciji Main() van opsega vaenja - ona se moe koristiti samo u funkciji Main(). Moemo imati potpuno nezavisnu promenljivu u funkciji Write(), nazvanu mojString. Pokuajte da izmenite kod na sledei nain:

Veba br. 13.Napravite novi projekat konzolne aplikacije birajui File | New | Project... iz menija: Izaberite Visual C# Projects direktorijum unutar prozora Project Types: i tip projekta Console Application u okviru prozora Templates: (za ovo ete morati malo da pomerite prozor na dole). U okviru za tekst Location; promenite putanju u C:\Temp\SoftIng\LecturesCode\Vezba13 (ovaj e direktorijum biti automatski napravljen ukoliko ve ne postoji), i ostavite podrazumevani tekst u okviru za tekst Name: PrimerParam2. Dodajte sledei kod u Class1.cs:

Ovaj kod e se kompajlirati i rezultat e biti:

14

Operacije koje izvodi ovaj kod su sledee: Main() definie i inicijalizuje promenljivu tipa string sa imenom mojString. Main() prebacuje kontrolu na funkciju Write(). Write() definie i inicijalizuje promenljivu tipa string sa imenom mojString, koja nije isto to i promenljiva mojString definisana u funkciji Main(). Write() ispisuje niz znakova na konzolu koji sadri vrednost mojString definisan unutar funkcije Write(). Write() vraa kontrolu funkciji Main(). Main() Main(). ispisuje na konzolu vrednost koju sadri mojString definisan unutar funkcije

Promenljive iji opseg vaenja na ovaj nain pokriva samo jednu funkciju, poznate su kao lokalne promenljive. Takoe je mogue imati globalne promenljive, iji opseg vaenja pokriva vie funkcija. Izmenite kod na sledei nain:

15

Rezultat je sada:

Ovde smo dodali jo jednu promenljivu pod imenom mojString, ovaj put na viem nivou hijerarhije imena. Ova promenljiva je definisana na sledei nain: static string mojString; Primetiete da opet koristimo kljunu re static. Pomenimo da u konzolnim aplikacijama, pri navoenju globalnih promenljivih u ovom obliku, moramo koristiti kljune rei static ili const. Ako elimo da menjamo vrednost globalne promenljive, moramo navesti static, jer const zabranjuje menjanje vrednosti promenljive. Da bismo napravili razliku izmeu ove promenljive i lokalnih promenljivih istog imena u funkcijama Main() i Write(), moramo se obratiti promenljivoj koristei puno kvalifikovano ime. Ovde se globalnoj promenljivoj obraamo sa Class1.mojString. To je neophodno samo kada imamo globalne i lokalne promenljive sa istim imenom. Kada ne bi bilo lokalne promenljive mojString, globalnu promenljivu bismo mogli upotrebljavati jednostavno sa mojString umesto Class1.mojString. Kada imamo lokalnu promenljivu koja ima isto ime kao i globalna promenljiva, za globalnu se kae da je skrivena. Vrednost globalne promenljive postavljena je u funkciju Main() sa: Class1.mojString = "Globalni string"; A unutar funkcije Write() pristupa joj se sa: Console.WriteLine("Globalni mojString = (0)", Class1.mojString); Sigurno se pitate zato ne bismo ovu tehniku koristili za razmenu podataka sa funkcijama, umesto to dodajemo parametre kako smo ranije videli. Postoje situacije kada je ovakav nain poeljniji za razmenu podataka, ali ih ima isto toliko (ako ne i vise) kod kojih to nije sluaj. Izbor - da li koristiti globalnu promenljivu, zasniva se na nainu na koji e se koristiti funkcija. Globalne promenljive uglavnom nisu pogodne za opte namenske funkcije koje su sposobne da rade sa bilo kojim podacima koje obezbedimo, i nisu ograniene samo na podatke u specifinim globalnim promenljivama. Kasnije emo detaljnije govoriti o tome.

Opseg vaenja promenljive u drugim strukturama

Jedna od stvari koju smo objasnili u prolom delu ima posledice na opseg vaenja izvan funkcija. Opseg vaenja promenljivih ukljuuje blok koda u kom su definisane, i bilo koje direktno ugnedene blokove koda. To se odnosi i na druge blokove koda, kao to su grananja i petlje. Razmotrite sledei kod:

16

Veba br. 14.Napravite novi projekat konzolne aplikacije birajui File | New | Project... iz menija: Izaberite Visual C# Projects direktorijum unutar prozora Project Types: i tip projekta Console Application u okviru prozora Templates: (za ovo ete morati malo da pomerite prozor na dole). U okviru za tekst Location; promenite putanju u C:\Temp\SoftIng\LecturesCode\Vezba14 (ovaj e direktorijum biti automatski napravljen ukoliko ve ne postoji), i ostavite podrazumevani tekst u okviru za tekst Name: PrimerOpsegParam2. Dodajte sledei kod u Class1.cs:

Ovde je promenljiva tipa string pod imenom text lokalna za for petlju. Taj kod se nee kompajlirati zato to poziv za Console.WriteLine(), koji se dogaa van petlje, pokuava da koristi promenljivu text koja je izvan opsega vaenja kada je van petlje. Pokuajte da promenite kod na sledei nain:

17

Ovaj kod takoe nee raditi zbog toga to promenljiva mora biti deklarisana i inicijalizovana pre upotrebe, a text je inicijalizovana samo u for petlji. Vrednost dodeljena promenljivoj text gubi se kada se izae iz petlje. Ipak, moemo napraviti sledeu promenu:

Promenljiva text e biti inicijalizovana van petlje pa moemo pristupiti njenoj vrednosti. Rezultat ovog jednostavnog koda je sledei:

Ovde je poslednja vrednost, dodeljena promenljivoj text u petlji, dostupna i izvan petlje. U svetlu prethodnih primera, nije odmah oigledno zato promenljiva text posle petlje ne zadrava prazan niz zna