"Promenljive i izrazi
Računarski program je, najpreciznije rečeno, serija operacija koja manipuliše podacima. To važi i za najkomplikovanije primere kao što su obimne i višenamenske Windows aplikacije (Microsoft Office, na primer). Najčešće skriven od pogleda korisnika, taj skup operacija se uvek odvija u pozadini. Ono što vidite na vašem monitoru toliko vam je poznato, da je teško zamisliti da je cela priča nešto vise od „pokretnih slika". U stvari, ono što vidite jeste samo predstava nekih podataka, čija gruba forma nije ništa drugo do niz nula i jedinica smeštenih negde u unutrašnjosti memorije vašeg računara. Sve što uradite na ekranu, bez obzira na to da li se radi o pokretanju pokazivača miša, pritiska na neku ikonu, ili unosa teksta u program za uređivanje teksta, rezultiraće naizmeničnom razmenom podataka u memoriji. Naravno, postoje i manje apstraktne situacije koje vam mogu pokazati isto. Ukoliko uključite aplikaciju kalkulator, obezbedićete podatke u obliku brojeva i izvesti određene operacije sa njima na način na koji biste to uradili i na papiru, samo što je ovako mnogo brže. Ako je računarski program u osnovi izvođenje operacija nad podacima, to znači da je nama potreban način na koji možemo uskladištiti neke podatke, kao i utvrđivanje metoda manipulacije njima. Ove dve funkcije se obezbeđuju preko promenljivih i izraza respektivno, a u ovom predavanju istražićemo šta to uopšteno i detaljno znači. Prethodno je potrebno da se upoznamo sa osnovnom sintaksom jezika C#.
Osnove C# sintakse
Izgled i osećaj rada sa jezikom C# vrlo je sličan C++-u i Javi. U početku sintaksa izgleda prilično zbunjujuće, a i manje je nalik pisanom engleskom nego neki drugi jezici. Pa ipak, kako započnete sa programiranjem u jeziku C# shvatićete da je sintaksa razumljiva i da je moguće napisati vrlo jasan i čitljiv kod bez mnogo muke. Za razliku od kompajlera za neke druge jezike, C# kompajler ne obraća pažnju na dodatne razmake unutar koda, bez obzira na to da li se sastoje od blanko znakova, tabulatora ili znakova za novi red. To znači da imamo priličnu slobodu u formatiranju našeg koda, iako se pridržavanjem određenih pravila čitanje koda može znatno olakšati. C# kod je sastavljen od niza iskaza, a svaki od njih se završava tačkom-zarezom. Kako se beli (prazan) prostor ignoriše, moguće je u jedan red staviti vise iskaza, ali zarad čitljivosti uobičajeno je preći u novi red nakon tačke-zareza. Na taj način izbegavamo vise iskaza u jednom redu. Savršeno je prihvatljivo (čak i prilično normalno) da se jedan iskaz unese u vise redova. C# spada u jezike sa blokovskom strukturom, što znači da su svi iskazi delovi bloka unutar koda. Ovi blokovi, koji su oivičeni vitičastom zagradom ({i}), mogu da sadrže bilo koju vrstu iskaza, a i ne moraju ni jednu. Zapamtite da vitičaste zagrade ne zahtevaju tačku-zarez iza sebe. Na primer, blok C# koda može izgledati ovako: { <red koda 1, iskaz 1 >; <red koda 2, iskaz 2 > <red koda 3, iskaz 3>;
}
Ovde naravno <red koda x, iskaz y> nisu pravi izgled C# koda - kroz ovaj tekst je samo prikazano gde bi trebalo staviti C# iskaze. Primetite da su u ovom slučaju red 2 i red 3 deo istog iskaza zbog toga što na kraju reda dva ne postoji tačka-zarez.
1
U ovom jednostavnom primeru način na koji je uvučen tekst tipičan je za C#. To nije izmišljeni metod pisanja C# koda, već ustaljena praksa; VS će sam uraditi sličnu stvar. Uopšteno, svaki blok koda ima svoj stepen uvlačenja, koliko će desno biti postavljen u odnosu na levu ivicu. Blokovi koda mogu biti ugneždeni jedan u drugi (odnosno, blokovi mogu sadržati druge blokove), i u torn slučaju se ugneždeni blokovi uvlače još više: { <red koda 1>; { <red koda 2>; <red koda 3>; } <red koda 4>; } Takođe, redovi koda koji predstavljaju nastavak prethodnog reda uvlače se još vise, kao u prvom primeru u redu 3. Zapamtite da ovaj stil pisanja ničim nije uslovljen. Međutim, ukoliko ga ne koristite, stvari mogu postati vrlo konfuzne! Još jedna stvar koju često nalazimo u C# kodu jesu komentari. Komentari, strogo govoreći, uopšte nisu deo C# koda, ali na svu sreću postoje unutar njega. Komentari rade ono što im ime kazuje: omogućavaju dodavanje opisnog teksta vašem kodu - i to na srpskom (engleskom, francuskom, nemačkom, mongolskom i tako dalje) jeziku, a to će kompajler u potpunosti ignorisati. Kada se budemo bavili nekim delovima koda koji su duži, biće 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# sadrži dva načina da se to izvede. Možemo postaviti markere na početku i na kraju komentara, ili možemo upotrebiti marker koji označava da je sve do kraja ovog reda komentar. Ovaj poslednji metod je izuzetak od pravila koje smo gore pomenuli, da C# kompajler ignoriše prelazak u novi red. Za obeležavanje komentara prvom metodom koristimo znakove „ / * " na početku komentara, i znakove „ * / " na kraju. Ovo možete koristiti za jedan red i za vise njih, ali u torn slučaju svi redovi izmedu markera postaju deo komentara. Jedina stvar koju ne možemo unositi unutar markera jeste „ * / ", jer bi to bilo shvaćeno kao kraj komentara. Tako da je prihvatljivo sledeće: /* Ovo je komentar */ /* Takođe... ... i ovo */ Ali sledeće bi izazvalo probleme: /* Komentari se cesto završavaju " */" znakovima */ Ovde će kraj komentara (znakovi posle „ * / ") biti prepoznat kao C# kod i doći će do greške. Drugi pristup komentarima uključuje započinjanje komentara znakom „ / / ". U nastavku možete unositi šta god vam je volja sve dok ste u istom redu! Sledeće ispravno: // Ovo je druga vrsta komentara. Ali, sledeće neće raditi, zato što će drugi red biti interpretiran kao C# kod: // Takođe je i ovo, ali ovo nije.
2
Ova vrsta komentara je korisna za dokumentovanje iskaza, jer može biti postavljena u istom redu kao i iskaz: <Iskaz>; // Objašnjenje iskaza Treći tip komentara u jeziku C# dozvoljava vam da dokumentujete vaš kod. To su pojedinačni redovi komentara koji počinju sa tri „ / " simbola umesto sa dva, na primer: /// Poseban komentar Pod normalnim okolnostima kompajler ignoriše ovakve komentare kao i sve druge, ali VS možete konfigurisati tako da on pravi posebno formatirane tekstualne datoteke kada se projekat kompajlira, koje nam kasnije mogu koristiti da napravimo prateću dokumentaciju. Vrlo je važno naglasiti da je C# kod osetljiv na upotrebu malih i velikih slova. Za razliku od nekih drugih jezika, kod se mora unositi pazeći na upotrebu velikih i malih slova. Ukoliko se toga ne pridržavamo, zaustavićemo 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> /// Summary description for Class1. /// <summary> class Classl1 { static void Main(string [] args) { // // TODO: Add code to start application here // Console.WriteLine("Pozdrav svete na jeziku C# !"); } } } Možemo odmah uočiti sve elemente sintakse o kojima smo malopre pričali. Vidimo tačkuzarez, vitičaste zagrade, komentare zajedno sa odgovarajućim uvlačenjem. Najvažniji 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 izvršava kada se konzolna aplikacija startuje, ili još preciznije, izvršava se blok koda oivičen vitičastim zagradama. Jedini red koda koji će nešto 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 tačan 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 izvršavanja aplikacija dolazi do tačke gde se poziva Console.WriteLine (). Kasnije ćemo razjasniti značaj ovog dodatnog koda.
Promenljive
Kako je naznačeno u uvodu ovog predavanja, promenljive nam služe da u njih skladištimo podatke. U osnovi, o promenljivima unutar memorije računara razmišljamo kao o malim kutijama koje su poređane u nekoj polici. Te kutije možemo puniti raznim stvarima i prazniti ih, ili možemo samo zaviriti u njih. Iako u osnovi svi računarski podaci u suštini sadrže istu stvar (nizove jedinica i nula), promenljive imaju vise tipova. Ponovo kroz analogiju sa kutijama možemo zamisliti da one dolaze u različitim veličinama i oblicima, tako da određene stvari mogu stati samo u određene kutije. Glavni razlog za ovakav način raspodele po tipovima leži u tome što postoje različiti tipovi podataka kojima se na drugačiji način manipuliše, tako da ograničavajući promenljive po tipu izbegavamo zabunu. Na primer, ne bi bilo logično tretirati na isti način nizove jedinica i nula koje zajedno čine digitalnu sliku kao i zvučne datoteke. Da bismo koristili promenljive, one moraju biti deklarisane. To znači da moramo da im dodelimo ime i tip. Jednom kad ih deklarišemo, koristićemo ih za smeštanje onog tipa podataka koji je naznačen u deklaraciji. Da bi se promenljiva navela u jeziku C# koristi se tip i ime kao u sledećem primeru: <tip> <ime>; Ako probamo da upotrebimo promenljivu koja nije deklarisana, kod se neće kompajlirati, ali u torn slučaju kompajler će vas tačno obavestiti šta je problem. Pored toga, ako pokušate da upotrebite promenljivu kojoj niste dodelili neku vrednost, to će takođe prouzrokovati grešku, ali kompajler će i to primetiti. Činjenica je da postoji neograničen broj tipova koje možemo koristiti. To nam omogućava da sami definišemo svoje tipove ma koliko zamršeni oni bili. Kada smo već kod toga, postoje određeni tipovi podataka koje će svi poželeti da koriste u određenom trenutku, na primer promenljive koje sadrže brojeve. Iz tog razloga postoje prosti unapred definisani tipovi promenljivih koje bi trebalo znati.
Prosti tipovi promenljivih
Prosti tipovi su recimo brojevne ili logičke vrednosti (tačno ili netačno) koje sačinjavaju osnovne blokove za izgradnju naših aplikacija, kao i za izgradnju drugih, složenijih tipova. Većina prostih tipova su brojevni, što nam u prvi mah izgleda malo čudno - zar nam ne treba samo jedan tip promenljivih da bismo uskladištili brojeve? Razlog za podelu tipova brojevnih promenljivih leži u samom mehanizmu smeštanja brojeva kao nizova jedinica i nula u memoriju računara. Za celobrojne vrednosti jednostavno uzimamo određen broj bitova (nezavisnih cifri koje mogu biti jedinice ili nule) i predstavljamo naš broj u binarnom formatu. Promenljiva koja smešta N bitova dozvoljava nam da preko nje prikažemo bilo koji broj izmedu 0 i (2n- 1). Bilo koji broj iznad ove vrednosti biće prevelik da se smesti u promenljivu. Recimo da imamo promenljivu u koju možemo 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, omogućiti smeštanje brojeva od 0 do 7). Nezaobilazan zaključak bi bio da nam za sve brojeve koje možemo zamisliti treba beskonačna količina bita, što baš i neće stati u naš verni PC. Čak i da postoji odgovarajući 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 protraćen). Četiri bita bi nam ovde završila posao, dozvoljavajući nam da u isti memorijski prostor smestimo znatno vise vrednosti iz ovog opsega. Umesto toga, imamo određen broj različitih celobrojnih tipova koje demo koristiti za različite opsege brojeva, čime ćemo zauzimati i različite količine memorije (sve do 64 bita). Sledi njihova lista: Zapamtite da svaki od ovih tipova koristi jedan ili više standardnih tipova definisanih u .NET okruženju. Kao što smo razmotrili u prvom predavanju, korišćenje standardnih tipova nam omogućuje kombinovanje vise različitih jezika u jedan projekat ili rešenje. Nazivi koje koristimo za tipove u jeziku C# predstavljaju pseudonime za tipove koji su definisani u okruženju. Ova tabela je lista imena ovih tipova, i onoga šta predstavljaju unutar biblioteke .NET okruženja.
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 između -128 i 127. ceo broj između 0 i 255. ceo broj između -32768 i 32767. ceo broj O i 65535. ceo broj između -2147.483.648 i 2147.483.647. ceo broj između 0 i 4294967295. ceo broj između -9223.372.036.854.775.808 i 9223.372.036.854.775.807. ceo broj između 0 i 1846.744.073.709.551.615.
Znak „u" koji stoji ispred imena nekih promenljivih jeste skraćenica za „unsigned" (neoznačeno), što znači da u taj tip promenljivih ne možemo smeštati negativne brojeve, što se može videti iz kolone dozvoljenih vrednosti u prethodnoj tabeli. Pored celobrojnih, potreban nam je i način 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 sledećoj 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 pojedinačan Unicode znak, smešten kao ceo broj između 0 i 65535. logička vrednost, true ili f a l s e . niz znakova.
Zapazite da ne postoji gornja granica za niz znakova koji sačinjavaju string. To je zbog toga što količina memorije koju on zauzima može biti promenljiva. Logički tip bool je jedan od najčešće korišćenih tipova promenljivih u jeziku C#. Slični tipovi se najčešće koriste i u drugim jezicima. Vrlo je važno imati promenljivu koja može imati vrednosti true ili false, zbog logičkog toka aplikacije. Uzmite u razmatranje, na primer, na koliko pitanja može biti odgovoreno sa true ili false (odnosno, sa da ili ne). Poređenje vrednosti dve promenljive ili potvrđivanje nekog unosa podataka, predstavljaju samo dva od mnogih načina primene logičkih promenljivih koje ćemo uskoro isprobati. Pošto smo se upoznali sa tipovima promenljivih, uradimo kratak primer kako ih deklarisati i koristiti.
Vežba br. 2.
Napravite novi projekat konzolne aplikacije birajući 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 sledeći kod u Classl.cs (obrišite redove sa komentarom na torn mestu):
Pokrenite program (ukoliko vam nije isključen režim za otklanjanje grešaka, konzolna aplikacija će se zatvoriti pre nego što vidite šta se dogodilo):
Kako to radi
Kod koji ste dodali uradi sledeće:
deklariše dve promenljive; dodeljuje vrednosti promenljivima; preko konzole ispisuje te dve vrednosti.
7
Promenljive se deklarišu u sledećem kodu: int MojInteger; string MojString; Prvi red deklariše promenljivu tipa int i to pod imenom MojInteger, a dragi red deklariše promenljivu tipa string nazvanu MojString.
Zapamtite da je dodeljivanje imena promenljivima ograničeno, odnosno ne može baš sve biti ime promenljive. O ovome ćemo pričati u delu koji se bavi imenovanjem promenljivih.
Sledeća dva reda koda deklarišu vrednosti: MojInteger = 17; MojString = "Moj Ceo Broj \"MojInteger\" je:"; Ovde dodeljujemo dve fiksne vrednosti (poznatije kao vrednosti literala unutar koda) našim promenljivima koristeći 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 (uključujući i navodnike). Kada se dodeljuju znakovne vrednosti literala, zapamtite da moraju biti oivičene navodnicima. Da bi se to izvelo kako treba, neke znakove ne smemo koristiti unutar navodnika (na primer-same navodnike), ili ih moramo označiti 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 označili 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 greška. Pri dodeljivanju znakova literala moramo biti oprezni sa prelazima u novi red - C# kompajler će odbaciti literale koji su veći od jednog reda. Ako želimo da proširimo literal na vise od jednog reda, moramo koristiti escape sekvencu \n. Na primer, sledeća dodela: MojString = "Ovaj string ima \nprelazaka u novi red. "; biće prikazana u dva reda u okviru konzolnog prozora. Sve iskočne (engl. escape) sekvence sastoje se iz znaka obrnute kose crte ( \ ) koji prati nekoliko znakova (videćemo kasnije koji su to znakovi). Pošto je znak obrnute kose crte iskorišćen 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 proučili: Console.WriteLine("{0} {1}.", MojString, MojInteger);
8
Ovo je jako slično metodi ispisivanja teksta unutar konzole koju smo koristili u prvom primeru, ali smo sada naveli i naše 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 sadrži nikakav koristan tekst. Ali kada se program pokrene, vidimo da taj string u stvari predstavlja šablon u koji ubacujemo sadržaj naših promenljivih. Svaki znak oivičen vitičastim zagradama predstavlja mesto na koje se smešta sadržaj naših promenljivih. A svako mesto (ili string za formatiranje) predstavljeno je celobrojnom vrednošću oivičenom vitičastim zagradama. Celobrojne vrednosti počinju od nule i uvećavaju se za jedan, a ukupan broj mesta treba da bude jednak broju promenljivih koje su navedene u produžetku stringa i odvojene su zarezima. Kada se tekst ispiše na konzoli, svako mesto biva zamenjeno odgovarajućom vrednošću predviđene promenljive. U gore navedenom primeru { 0 } je zamenjena stvarnom vrednošću prve promenljive MojString, a {1} je zamenjeno sadržajem promenljive MojInteger. Ovaj metod ispisa teksta na konzolu koristićemo i u narednim primerima.
9
..."
|
You need to upgrade your Flash Player , or try to enable javascript in order see this document properly.
|
|