Professional Documents
Culture Documents
C PDF
C PDF
Tema:
Veb prezentacija programskog jezika C#
Maturski rad Veb prezentacija programskog jezika C#
Sadržaj
I. Uvod u C# .........................................................................................................................................................4
I - 1. Šta je .NET okruženje? ................................................................................................................................................... 4
I - 2. Šta se nalazi unutar .NET okruženja? ............................................................................................................................ 4
I - 3. Kako napisati aplikaciju koristeći .NET okruženje? ....................................................................................................... 4
MSIL i JIT ......................................................................................................................................................................4
Sklopovi .......................................................................................................................................................................4
Povezivanje...................................................................................................................................................................4
Konzolna aplikacija..........................................................................................................................................................6
Pravila imenovanja..........................................................................................................................................................8
II - 1- 4. Izrazi ........................................................................................................................................................10
II - 1- 8. Imenovani prostori.......................................................................................................................................11
II - 2 - 3. Grananje ...................................................................................................................................................13
II - 2 - 4. Iskaz IF .....................................................................................................................................................13
II - 2 - 5. Iskaz switch................................................................................................................................................14
II - 2 - 6. Petlje .......................................................................................................................................................14
Dino Dedić 2
Maturski rad Veb prezentacija programskog jezika C#
II - 3 - 3. Parametri ..................................................................................................................................................17
II - 3 - 6. Izlazni parametri..........................................................................................................................................18
Delegati .....................................................................................................................................................................22
Osobine .....................................................................................................................................................................29
Dino Dedić 3
Maturski rad Veb prezentacija programskog jezika C#
I. Uvod u C#
I - 1. Šta je .NET okruženje?
Projektno okruženje .NET je nova platforma za razvoj aplikacija napravljena od strane Microsoft-a, a
dizajnirano je tako da se može koristiti od strane bilo kog programskog jezika. Ovo uključuje C#, kao i C++, Visual
Basic i Jscript. Svi ovi programski jezici imaju pristup projektnom okruženju .NET i mogu međusobno da
komuniciraju. Sasvim je moguće kod programiranja u C# koristiti kôd napisan u Visual Basic.NET, kao i obrnuto.
I - 2. Šta se nalazi unutar .NET okruženja?
Projektno okruženje .NET najvećim dijelom se sastoji od ogromne biblioteke kodova koju upotrebljavamo
preko klijentskih jezika. Ova biblioteka podijeljena je na različite module koje koristimo u zavisnosti od našeg
zadatka. Neki moduli su podijeljeni u različite podmodule.
I - 3. Kako napisati aplikaciju koristeći .NET okruženje?
Pisanje aplikacija unutar .NET projektnog okruženja u stvari znači pisanje koda uz pomoć .NET biblioteke
koda. Preporučuje se korišćenje Visual Studio-ja za programiranje. Prednost ovog okruženja je lakoća kojom se
mogućnosti .NET tehnologije mogu integrisati u naš kôd. Da bi se C# kôd izvršio neophodno ga je prevesti u izvorni
ili originalni kôd (kompajliranje kôda). Unutar .NET okruženja ta operacija ima dvije faze.
MSIL i JIT
Kada kompajliramo kôd koristeći biblioteku .NET okruženja mi kompajliramo u kôd Microsoftovog
posrednog jezika (Microsoft Intermediate Language - MSIL).
Da bi se program izvršio potrebno je još rada. Za taj posao zadužen je kompajler pravo-na-vrijeme (engl.
Just-In-Time - JIT), koji prevodi MSIL u izvorni kôd. Tek tada OS može izvršiti program. Dio imena „pravo-na-
vrijeme” odnosi se na to da se MSIL kôd kompajlira samo kada je to potrebno.
Sklopovi
Kada kompajliramo aplikaciju MSIL kôd se smiješta u posebne programske skupove. Takvi skupovi sadrže i
izvršne programske datoteke. Programski skupovi pored MSIL-a sadrže i takozvane meta informacije (dodatne
podatke koje koristi MSIL, kao što su zvukovi i slike). Meta podatci dozvoljavaju programskim skupovima da budu
potpuno samoopisujući. Ne trebaju nam nikakve dodatne informacije da bi smo koristili programske skupove. Ovo
u stvari zanči da je razvoj aplikacija jednostavan.
Upravljivi kôd
CLR vodi računa o našoj aplikaciji kroz upravljanje memorijom, obezbjeđivanjem sigurnosti, dozvoljava
međujezičko otklanjanje grešaka itd. Suprotno ovome, aplikacije koje ne rade pod kontrolom CLR-a nazivaju se
neupravljive. U C# možemo napisati samo onaj kôd koji radi pod upravljivim okruženjem.
Sakupljanje otpada
Jedna od najvažnijih mogućnosti upravljivog koda je sistem kolekcije otpada. Ovo je metod .NET-a koji se
brine o tome da memorija koju je aplikacija koristila tokom svog izvršenja bude obavezno ispražnjena kada
aplikacija više nije u upotrebi.
Uklapanje u cjelinu
Da bi smo napravili .NET aplikaciju potrebno je:
1. Kôd za aplikaciju napisati koristeći .NET jezik kao što je C#.
2. Ovaj kôd se kompajlira u MSIL, koji je smješten u programski skup.
3. Kôd koji se izvršava mora se predhodno kompajlirati kroz JIT kompajler u izvorni kôd.
4. Izvorni kôd se izvršava preko upravljive metode CLR.
Povezivanje
C# kôd koji se kompajlira u MSIL u koraku 2. ne mora da bude smješten u jednu datoteku. Moguće je
podijeliti kôd aplikacije u različite datoteke koje će se tokom kompajliranja objediniti u programski skup odnosno
assembly. Razlog ove podjele je taj što je mnogo lakše raditi sa više manjih datoteka nego sa jednom ogromnom.
Šta je C#?
C# je jedan od jezika koji služi za izradu aplikacija koje mogu raditi pod .NET CLR-om. To je evolucija C i C++
jezika koju je kreirao Microsoft da bi se radilo sa .NET okruženjem.
Dino Dedić 4
Maturski rad Veb prezentacija programskog jezika C#
Programiranje aplikacije u C# je jednostavnije nego u C++, jer je sintaksa prostija. Kôd C# je malo razumljiviji
od C++ koda. Kod koda je jednostavnije otkloniti greške, .NET u svakom trenutku može odrediti kojem tipu pripada
traženi podatak. C# je samo jedan od jezika koji omogućava rad sa .NET razvojnim okruženjem.
Kakve aplikacije možemo pisati u C#-u?
C# nema ograničenja u vezi toga kakve sve aplikacije možemo napraviti. C# koristi okruženje i samim tim
nema ograničenja u vezi sa mogućim aplikacijama. Tipovi najčešće pravljenih aplikacija su:
Windows aplikacije – To su aplikacije tipa Microsoft Office-a koje imaju izgled standardnih Windows
aplikacija. Ovo je pojednostavljeno korištenjem modula Windows obrazaca unutar .NET okruženja, koji u stvari čini
biblioteka kontrola (kao što su dugmići, palete alatki, meniji i tako dalje), a koje nam koriste pri izradi Windows
korisničkog interfejsa (UI).
Web aplikacije – To su web strane koje možemo videti kroz bilo koji web pretraživač. Ovaj sistem se naziva
Active Server Pages.NET (ASP.NET), a C# možemo koristiti za izradu ASP.NET aplikacija uz pomoć web obrazaca.
Web servisi – Oni su nov i uzbudljiv način izrade aplikacija koje su razmenljive prirode. Koristeći web serviše
preko Interneta možemo razmenjivati bilo koju vrstu podataka, koristeći prostu sintaksu, ne vodeći računa o tome
u kom jeziku je napisana aplikacija niti na kom sistemu je postavljena.
I - 4. Visual Studio.NET
Visual Studio.NET (VS) koristi se za izradu aplikacija sastavljenih od prostih linijskih komandi pa sve do
kompleksnih tipova projekata. VS nije neophodan za programiranje u C#, ali nam mnogo olakšava stvari. Slijedi
kratka lista razloga zbog kojih je VS pravi izbor za .NET razvojno okruženje:
VS tekst editor je povezan sa jezicima VS-a (uključujući C#) i to tako da omogućava pametnu detekciju
grešaka i sugeriše odgovarajući kôd na pravom mestu dok mi tipkamo.
VS sadrži i dizajnerske alate za aplikacije koje uključuju Windows obrasce, kao i web obrasce, a koji vam
omogućavaju prost drag-and-drop dizajn UI elemenata.
VS sadrži nekoliko čarobnjaka ili vodiča koji vam automatizuju zadatke opšte namjene, koji mogu dodati
odgovarajući kôd postojećim datotekama, a da mi o tome ne brinemo.
Rješenja u Visual Studio-u
Kada koristimo VS za razvoj aplikacija, to radimo kreiranjem rješenja. Rješenja sadrže projekte koji mogu biti
zasnovani na Windows formularima, Web formularima itd. Rješenja mogu sadržati i više projekata, tako da
možemo grupisati srodan kôd na jedno mesto, iako će se oni kompajlirati u različite sklopove na različitim mjestima
na disku.
Pisanje programa u jeziku C#
VS je ogroman i komplikovan proizvod. Prva aplikacija koja se uobićajeno kreira je jednostavna aplikacija
koja se pokreće iz komandne linije. Kompleksnije aplikacije su bazirane na Windows formularima i njihova sintaksa
je mnogo komplikovanija.
Dino Dedić 5
Maturski rad Veb prezentacija programskog jezika C#
Dino Dedić 6
Maturski rad Veb prezentacija programskog jezika C#
U C# kodu poželjno je pisati komentare, koji uopšte nisu dio C# koda, ali postoje unutar njega. Komentari
omogućavaju da se lakše snalazimo u kodu C#. Postoje dva načina pisanja komentara, a to su:
/* Ovo je komentar */
/* Također...
... i ovo */
// Ovo je druga vrsta komentara.
Ovaj dio koda se izvršava prilikom pokretanja konzolne aplikacije. Jedini red koda koji će nešto uraditi jeste
onaj koji smo dodali automatski generisanom kodu.
II - 1- 3. Promjenljive
Promjenljive nam služe da u njih pohranimo podatke. Promjenljive imaju više tipova. Glavni razlog za ovakav
način raspodjele po tipovima leži u tome što postoje različiti tipovi podataka kojima se na drugačiji način
manipuliše. Da bismo koristili promjenljive one moraju biti deklarisane. To znači da moramo da im dodjelimo ime i
tip. Da bi se promjenljiva navela u jeziku C# koristi se tip. Npr.:
<tip> <ime>;
Promjenljiva koja nije deklarisana ili kojoj nije dodjeljena vrijednosti neće se kompajlirati.
Prosti tipovi promjenljivih
Prosti tipovi su brojčane ili logičke vrijednosti (tačno ili netačno). Većina prostih tipova su brojevi. Razlog za
podjelu tipova brojnih promjenljivih leži u samom mehanizmu smeštanja brojeva kao nizova jedinica i nula u
Dino Dedić 7
Maturski rad Veb prezentacija programskog jezika C#
memoriju računara. Za cjelobrojne vrijednosti jednostavno uzimamo određen broj bitova (nezavisnih cifri koje
mogu biti jedinice ili nule) i predstavljamo naš broj u binarnom formatu. Promjenljiva koja smješta N bitova
dozvoljava nam da preko nje prikažemo bilo koji broj izmedu 0 i . Bilo koji broj iznad ove vrijednosti biće
prevelik da se smjesti u promjenljivu.
Tabela 1. Opseg vrijednosti u odnosu na tip podataka
Znak u koji stoji ispred imena nekih promjenljivih označava da u taj tip promjenljivih ne možemo smještati
negativne brojeve, što se može vidjeti iz kolone dozvoljenih vrijednosti u tabeli.
Pravila imenovanja
Programeri su do sada shvatili da je najbolje imenovati promjenljivu prema njenoj namjeni. U VS-u dovoljno
je da pokazivač miša namjestimo na ime promjenljive kojoj želimo da otkrijemo tip i ispisaće se poruka koja nas o
tome obavještava. Preporuka Microsoft-a je da koristimo konvenciju PascalCase.
Npr :
PrezimeUcenika
ZimaNasegNezadovoljstva
Tabela 2. Prefiksi tipova podataka
Dino Dedić 8
Maturski rad Veb prezentacija programskog jezika C#
Vrijednosti literala
U prethodnom primjeru vidjeli smo dvije vrijednosti literala - cjelobrojnu i znakovnu. I drugi tipovi
promjenljivih takođe mogu imati vrijednosti literala, što će biti prikazano u sljedećoj tabeli. Mnogi od njih uključuju
sufikse, odnosno nizove znakova koji se dodaju na kraju literala da bi se naznačio željeni tip. Neki literali imaju više
različitih tipova koje na osnovu konteksta određuje kompajler za vrijeme kompajliranja:
String literali
Tabela 5. Escape sekvence
Escape sekvence Znak koji pravi Vrednost znaka u unicode-u
\` jednostruki navodnik 0x0027
\" dvostruki navodnik 0x0022
\\ obrnuta kosa crta 0x005C
\0 nula 0x0000
\a alarm(pravi pištanje) 0x0007
\b unazad za jedan znak 0x00080
\f prelazak na sledeću stranicu 0x000C
\n novi red 0x000A
\r prenos u novi red 0x000D
\t horizontalni tabulator 0x0009
\v vertikalni tabulator 0x000B
Posljednja kolona ove tabele prikazuje Unicode vrijednosti. Za svaki Unicode znak možemo navesti
odgovarajuću escape sekvencu, kao u tabeli. Sekvenca se uvijek sastoji od znaka \ iza koga slijedi četvorocifrena
heksadecimalna vrijednost. To znači da su sljedeća dva stringa ekvivalentna:
"Petar\’s string."
"Petar\u0027s string"
Promjenljive moraju biti inicijalizovane pre nego što ih upotrijebimo. Možemo navesti više različitih
promjenljivih istog tipa u isto vrijeme ako ih odvojimo zarezom:
int xVelicina, yVelicina;
Druga tehnika koju ćete sretati jeste dodjeljivanje vrijednosti promjenljivim dok ih deklarišemo:
int godiste = 25;
Dino Dedić 9
Maturski rad Veb prezentacija programskog jezika C#
II - 1- 4. Izrazi
C# kôd sadrži veći broj operatora koji služe manipulaciji promjenjivih, uključujući i operator dodeljivanja.
Kombinovanjem operatora sa promenljivima i literalima možemo formirati izraze.
Postoji širok spektar operatora. Prosti uključuju sve osnovne matematičke operacije, kao što je operator +
za sabiranje, a oni komplikovaniji manipulaciju nad sadržajem promenljive. Postoje i logički operatori koji služe u
radu sa logičkim promenljivima. 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
II - 1- 5. Matematički operatori
U donjoj tabeli navedeni su svi operatori zajedno sa kratkim primjerom njihove upotrebe i rezultatima.
Tabela 6. Operatori
Operator Kategorija Kategorija Rezultat
+ binarni var1 = var2 + var3; var1 je dodjeljena vrijednost sume
- binarni var1 = var2 - var3; var1 je dodejljena vrijednost razlike
* binarni var1 = var2 * var3 var1 je dodjeljena vrijednost proizvoda
/ binarni var1 = var2 /var3 var1 je dodjeljena vrijednost dijeljenja
% binarni var1 = var2 % var3 var1 je dodjeljena vrijednost koja je ostatak dijeljenja
+ unarni var1 = + var2 var1 je dodjeljena vrijednost var2
- unarni var1 = - var2 var1 je dodjeljena vrijednost var2
Operator ++ uvijek uvećava svoj 1 operand za 1, a - - ga uvijek umanjuje za 1. Stavljanje operatora prije
operanda znači da se operand mijenja prije nego što se izvrše dalja izračunavanja i obrnuto.
II - 1- 6. Operatori dodjeljivanja
U donjoj tabeli navedeni su operatori dodjeljivanja zajedno sa primjerom njihove upotrebe i rezultata.
Tabela 8. Operatori dodeljivanja
Dino Dedić 10
Maturski rad Veb prezentacija programskog jezika C#
II - 1- 7. Prvenstvo operatora
Kada računar obrađuje izraz, on izvršava svaki operator prema redoslijedu. To ne znači da se operatori
uvijek izračunavaju s lijeva na desno. Jednostavan primjer gdje se prvo izvršava operator + pa tek onda = :
var1 = var2 + var3;
Postoje i druge situacije kada prvenstvo izvođenja operatora nije očigledno, na primjer:
var1 = var2 + var3 * var4;
Ovdje je redoslijed izvršavanja sljedeći: prvo operator * , zatim + i na kraju =. Tu možemo odrediti prvenstvo
izvršavanja koristeći zagrade. Npr. :
var1 = (var2 + var3) * var4;
II - 1- 8. Imenovani prostori
Imenovani prostori se također koriste i prilikom kategorisanja objekata .NET okruženja. C# kôd sadrži u
globalnim imenovanim prostorima. To znači da se tom kodu može pristupiti iz nekog drugog koda koji je unutar
globalnih imenovanih prostora tako što se navede njegovo ime. Možemo koristiti i ključnu riječ namespace, da
bismo definisali imenovani prostor u bloku koda. Takva imena moraju biti kvalifikovana, ukoliko će ih koristiti kôd
izvan imenovanog prostora.
Kvalifikovano ime je ono koje sadrži sve informacije o svojoj hijerarhiji. Kvalifikovana imena koriste znak (.)
između nivoa imenovanog prostora.
namespace LevelOne
{
//kôd u imenovanom prostoru LevelOne
//ime "NameOne" definisano
}
//kôd u globalnom imenovanom prostoru
Ovaj kôd definiše jedan imenovani prostor LevelOne kao i jedno ime u njemu, NameOne. Kôd napisan
unutar LevelOne imenovanog prostora poziva ovo ime upotrebom "NameOne“. Kôd u globalnom imenovanom
prostoru mora pozivati ovo ime na sljedeći način: "LevelOne.NameOne".
U okviru imenovanih prostora možemo definisati ugnježdene imenovane prostore, također koristeći
ključnu riječ namespace. Ugnježdeni imenovani prostori se pozivaju preko svoje hijerarhije. Npr. :
namespace LevelOne
{
//kôd u imenovanom prostoru LevelOne
namespace LevelTwo
{
//kôd u imenovanom prostoru LevelOne.LevelTwo
//ime "NameTwo" definisano
}
}
//kôd u globalnom imenovanom prostoru
Dino Dedić 11
Maturski rad Veb prezentacija programskog jezika C#
namespace LevelOne
{
//ime "NameThree" definisano
namespace LevelTwo
{
//ime "NameThree" definisano
}
}
Ovdje smo definisali dva imena, LevelOne.NameThree i LevelOne.LevelTwo.NameThree, koja se mogu
koristiti nezavisno jedno od drugoga. Kada definišemo imenovani prostor, možemo pojednostaviti pristup imenima
koje sadrže pomoću iskaza using. Npr. u sljedećem kodu 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 možemo pozvati ime LevelTwo.NameTwo pomoću "NameTwo".
II - 2. Kontrola toka programa
Postoje dvije metode kontrole toka programa, odnosno redosljeda izvršenja redova u C# kodu.
Grananje – gdje se izvršava kôd uslovno u zavisnosti od rezultata nekog poređenja.
Petlje - ponavljanje izvršenja istih iskaza (određeni broj puta do unaprijed zadatog
uslova).
II - 2 - 1. Bulova logika
Tip bool može sadržati samo dvije vrijednosti: true ili false. Uglavnom se tipovi bool koriste da snimi rezultat
nekog poređenja. Poređenje zahtjeva upotrebu relacionih operatora koji su prikazanih u donjoj tabeli.
Tabela 10. Operatori poređenja
Operator Kategorija Primjer izraza Rezultat
var1 je dodjeljena vrijednost true ako je
== binarni var1=var2== var3;
var2 jednaka var3, u suprotnom false.
var1 je dodjeljena vrijednost true ako je
!= binarni var1=var2!= var
var2 nije jednaka var3, u suprotnom false.
var1 je dodjeljena vrijednost true ako je
< binarni var1=var2< var3
var2 manja od var3, u suprotnom false.
var1 je dodjeljena vrijednost true ako je
> binarni var1=var2>var3;
var2 veća od var3, u suprotnom false.
var2 manja ili jednaka var3, u suprotnom
<= binarni var1=var2<= var3;
false.
var2 veća ili jednaka var3, u suprotnom
>= binarni var1=var2>= var3;
false.
Dino Dedić 12
Maturski rad Veb prezentacija programskog jezika C#
Njihov rezultat je potpuno isti kao & i |, ali postoji bitna razlika u načinu na koji se dobija njihov rezultat, što
može dati bolje performanse programa. Oba operatora prvo ispituju vrijednost prvog operanda (var2, pa na
osnovu vrijednosti ovog operanda možda neće biti potrebno da se ispita drugi operand (var 3).
II - 2 - 2. Iskaz goto
Jezik C# dozvoljava da se određeni dijelovi koda obilježe i da se na ta mesta direktno skače pomoću iskaza
goto. Galvna korist je u tome što možemo na jednostavan način kontrolisati šta se u kodu izvršava i kada. Iskaz
goto se koristi na sljedeći način:
goto <imeOznake>;
Npr.:
int myInteger = 5;
goto myLabel;
myInteger +=10;
myLabel;
Console.WriteLine("myInteger = {0}", myInteger);
Ovdje se ispituje <test> da bi se dobila logička vrednost, pa je rezultat operator <resultIfTrue> ili
<resultIfFalse> u zavisnosti od te vrijednosti.
II - 2 - 4. Iskaz IF
Iskaz if je mnogo bolji način za donošenje odluka. Ovaj iskaz koristimo da uslovno izvršimo druge iskaze.
Najjednostavnije korištenje iskaza if je sledeće:
Dino Dedić 13
Maturski rad Veb prezentacija programskog jezika C#
If (<test>):
<kôd se izvršava ako je test istinit >;
Ovdje se <test> izračunava (mora biti logička vrednost da bi se kôd kompajlirao), a iskaz ispod se izvršava
ako uslov <test> ima vrednost true. Nakon izvršenja tog koda, ili ukoliko <test> imao rezultat false, program se
nastavlja od sledećeg reda koda.
Možemo navesti i dodatni kôd koristeći iskaz else u kombinaciji sa iskazom if. Ovaj iskaz se izvršava ako
<test> ima vrednost false:
if (<test>)
<kôd se izvršava ako je <test> true>;
else
<kôd se izvršava ako je <test> false>;
Da bi ste probali jednostavan ispis na ekranu u okviru velikih zgrada upišite tekst tačno kao što je prikazano:
static void Main(string[] args) {
string poredjenje;
Console.WriteLine("Dobar dan.");
Console.WriteLine("Unesite prvi broj");
double prvi = Convert.ToDouble(Console.ReadLine());
Da biste probali jednostavan ispis na ekranu upišite tekst tačno kao što je prikazano:
Dino Dedić 14
Maturski rad Veb prezentacija programskog jezika C#
class Program
{
static void Main(string[] args)
{
int i = 1;
do {
Console.WriteLine(i++);
}
while (i < 11);
Console.ReadKey(); Slika 4. Rezultat izvršavanja
} navedenog programa
}
Ako je kôd ispravno napisan, pojavljuje se prozor komandne linije sa ispisanim tekstom:
Petlja while
Kod while petlji logički test se izvršava na početku. Ukoliko je rezultat testa false, ciklus petlje se nikad ne
izvrši, nego se prelazi na red koda koji se nalazi iza petlje. Petlje while se definišu na sledeći način:
while (<test>)
{
<kôd unutar petlje>
}
int i=1;
Da biste probali jednostavan ispis na ekranu upišite tekst tačno kao što je prikazano:
class Program
{
static void Main(string[] args)
{
int i = 1;
while (i <= 11) {
Console.WriteLine(i++);
}
Console.ReadKey();
}
} Slika 5. Rezultat izvršavanja
navedenog programa
Ako je kôd ispravno napisan, pojavljuje se prozor komandne linije sa
ispisanim tekstom:
Petlja for
Petlja for se izvršava unapred određeni broj puta i održava svoj sopstveni brojač. Ako želimo petlju sa
brojačem koji se povećava od 1 do 10 u koracima po jedan, početna vrednost je 1 - uslov je da brojač bude manji ili
jednak 10, a operacija koja se izvodi na kraju svakog ciklusa je povećavanje brojača za jedan.
int i;
for (i=1; i<=10; ++ i) {
Console.Writeline(i); }
Da biste probali jednostavan ispis na ekranu upišite tekst tačno kao što je prikazano:
class Program {
static void Main(string[] args) {
int i;
for (i = 1; i <= 10; ++i) {
Console.WriteLine(i); }
Console.ReadKey();
}
Dino Dedić 15
Maturski rad Veb prezentacija programskog jezika C#
Kôd će ispisati brojeve od 1 do 5, zatim će komanda break prouzrokovati izlaz kada bude jednako 5.
Continue zaustavlja samo trenutni ciklus, a ne cijelu petlju. Npr. :
int i = 1;
for (i=l; i<=10; i++) {
if ( (i. % 2)==0)
continue;
Console.WriteLine(i) ;
}
Treći metod je korištenje iskaza goto kao što smo videli ranije, na primjer:
int i = 1;
while (i <=10) {
if (i == 6)
goto TackaIzlaza;
Console.WriteLine i++) ;
}
Console.WriteLine ("Ovaj kôd se nikad neće izvršiti .“);
TackaIzlaza;
Console.WriteLine ("Ovaj kôd se izvršava kad se iz petlje izađe uz pomoć goto. ");
Beskonačne petlje
Moguće je (greškom ili namjerno), definisati petlje koje se nikada ne završavaju, tzv. beskonačne petlje. Kao
vrlo jednostavan primjer pogledajte sledeće:
while (true)
{
// kôd u petlji
}
Funkcije
Izvođenje operacije nad podacima podrazumijevalo je postavljanje koda na tačno određeno mesto gde on
treba da funkcioniše.Takva programska struktura je ograničena. Ovaj problem rješavamo uz pomoć funkcija.
Funkcije u jeziku C# predstavljaju sredstva kojima se obezbjeđuje blok koda koji može biti izvršen na bilo kom
mjestu u aplikaciji.
Potrebno je da samo jednom napišemo kôd, i svaka promjena koju unesemo odraziće se na sva mesta na
kojima se kôd izvršava. Koristeći funkcije smanjujemo glavni dio kôda u aplikaciji, zato što se sporedni delovi
izvršavaju izvan glavnog.
II - 3 - 1. Definisanje i korištenje funkcija
Da biste probali jednostavan ispis na ekranu, u okviru velikih zgrada upišite tekst tačno kao što je prikazano:
class Program {
static void Main(string[] args {
Write();
Console.ReadKey();
}
static void Write() {
Slika 7. Rezultat izvršavanja funkcije programa
Dino Dedić 16
Maturski rad Veb prezentacija programskog jezika C#
Console.WriteLine("Dobar dan");
Console.WriteLine("Ovo je tekst iz funkcije.");} }
Ako je kôd ispravno napisan, pojavljuje se prozor komandne linije sa ispisanim tekstom:
II - 3 - 2. Povratne vrijednosti
Najjednostavniji način za razmjenu podataka sa funkcijom jeste korištenje povratne vrijednosti. Povratne
vrijednosti kao i promenljive imaju svoj tip. Npr. možemo imati funkciju sa imenom getString() čija je povratna
vrijednost tipa string. To možemo koristiti u kodu na sljedeći način:
string mojString;
mojString = getString() ;
Povratne vrijednosti su obično rezultat proračuna izvedenog unutar funkcije. Kada dođe do iskaza return,
izvršavanje programa se vraća na pozivajući kôd. Redovi unutar funkcije koji se nalaze iza ovog iskaza neće biti
izvršeni. To ne znači da se return mora postaviti na kraj funkcije. Iskaz return možemo koristiti prije toga.
II - 3 - 3. Parametri
Kada funkcija treba da prihvati parametre, moramo navesti listu parametara koje funkcija prihvata, (zajedno
sa njihovim tipovima unutar definicije funkcije) i odgovarajuću listu parametara u svakom pozivu funkcije. Npr.
prosta funkcija može imati dva parametra tipa double i vratiti njihov proizvod:
static double product (double param1, double param2) {
return param1 * param2;
}
II - 3 - 4. Nizovi parametara
C# nam dozvoljava da definišemo samo jedan poseban parametar za funkciju. Ovaj parametar poznat je
kao niz parametara. Nizovi parametara dozvoljavaju nam da pozivamo funkcije koristeći promenljivu količinu
parametara, a definisani su ključnom reči params.
Nizovi parametara mogu biti korisni za pojednostavljivanje koda, jer ne moramo prosljeđivati nizove iz
našeg pozivajućeg koda. Sljedeći kôd je potreban da bi se definisala funkcija koja koristi niz parametara:
static <returnType> <functionName>(<p1Type><p1Name>, . . . , params <type> []
<name>) {
.....
.....
return <returnValue>;
}
Ovdje su <val1>, <val2> vrijednosti tipa <type> koji je korišten da bi se inicijalizovao niz <name>. Ne postoji
ograničenje u broju parametara koje možemo navesti, jedino ograničenje je da su svi tipa <type>.
Da biste probali jednostavan ispis na ekranu, u okviru velikih zgrada upišite tekst tačno kao što je prikazano:
class Program
{
static int sumProm(params int[] vals) {
int sum = 0;
foreach (int prom in vals) {
sum += prom; Slika 8. Rezultat izvršavanja funkcije
} kojoj se prosljeđuju nizovi parametara
return sum;
}
static void Main(string[] args) {
Dino Dedić 17
Maturski rad Veb prezentacija programskog jezika C#
II - 3 - 6. Izlazni parametri
Možemo definisati da je dati parametar izlazni parametar, preko ključne reči out koja se koristi na isti način
kao i ključna reč ref (kao modifikator parametra u definiciji funkcije, i pri njenom pozivanju). Rezultat toga je isto
ponašanje kao i kod referentnog parametra, u smislu da se vrijednost parametra na kraju funkcije vraća
promjenjivoj koja je upotrebljena u njenom pozivu. Međutim, postoje i važne razlike. Dok za parametre tipa ref
nije dozvoljeno koristiti promjenljive kojima nije dodijeljena vrijednost, kod parametara out to možemo raditi.
Pored toga, out parametar se mora tretirati kao da mu nije dodijeljena vrijednost od strane funkcije koja ga koristi.
Dino Dedić 18
Maturski rad Veb prezentacija programskog jezika C#
To znači da, iako je dozvoljeno koristiti promjenljivu kojoj je dodijeljena vrijednost kao izlazni parametar, vrijednost
koju ona sadrži u pozivu funkcije biti će izgubljena nakon izvršenja te funkcije.
Na primer, razmotrite proširenje funkcije MaxVrednost() koja vraća najveću vrijednost u nizu. Izmijenit
ćemo funkciju tako da vrati indeks elementa sa najvećom vrijednosti unutar niza. Da bi bilo jednostavnije vratit
ćemo samo indeks prve pojave najvećeg elementa, ukoliko ih ima više. Da bismo ovo uradili dodajemo izlazni
parametar mijenjajući funkciju na sljedeći način:
static int MaxVrijednost(int[] intArray, out in maxIndex) {
int maxProm = intArray [0];
maxIndex =0;
for (int i = 1; i < intArray.Length; i++)
{
if (intArray[i] > maxProm)
}
maxProm = intArray [i] ;
maxIndex = i;
return maxProm;
}
Možemo koristiti funkciju na sljedeći način:
int [] myArray = (1, 8, 3, 6, 2, 5, 9, 3, 0, 2);
int maxIndex
Console.Write("Maksimalna vrijednost u nizu myArray je {0)", MaxVrijednost(myArray, out maxIndex);
Console.WriteLine{"Maksimalna vrijednost 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 važno naglasiti da se ključna riječ out mora upotrijebiti u pozivu funkcije, baš kao i ključna riječ ref.
Upamtite daje vrijednosti maxIndex dodato jedan, i vraća 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 označava sa 0 već sa 1.
II - 3 - 7. Opseg važenja promjenljive
Možda ste se upitali zašto je uopšte potrebna razmjena podataka sa funkcijama. Razlog je taj što se
promjenljivama u C#-u može pristupiti samo iz lokalnih regiona koda. Za datu promjenljivu kaže se da ima opseg
važenja unutar koga joj se može pristupiti. Opseg važenja promjenljive je važna tema i najbolje ćemo je predstaviti
preko primjera..
Da biste probali jednostavan ispis na ekranu, u okviru velikih zgrada upišite tekst tačno kao što je prikazano:
class Program {
static void Write() {
string mojString = "Sada definisan je u Write()";
Console.WriteLine("Sada je u Write()");
Console.WriteLine("mojString = ", mojString);
}
static void Main(string[] args) {
string mojString = "Sada je definisan u Main().";
Write();
Console.WriteLine("");
Console.WriteLine("Sada je u Main().");
Console.WriteLine("mojString = ", mojString);
Console.ReadKey();
}
}
Ako je kôd ispravno napisan, pojavljuje se prozor komandne linije sa ispisanim tekstom:
Operacije koje izvodi ovaj kôd su sledeće:
Main() definiše i inicijalizuje
promjenjivu tipa string sa imenom
mojString.
Main() prebacuje kontrolu na
Slika 9. Rezultat izvršavanja funkcije i opseg važenja
funkciju Write(). promjenljive
Write() definiše i inicijalizuje
Dino Dedić 19
Maturski rad Veb prezentacija programskog jezika C#
promjenjivu tipa string sa imenom mojString, koja nije isto što i promjenjiva mojString
definisana u funkciji Main().
Write() ispisuje niz znakova na konzolu koji sadrži vrijednost mojString definisan unutar
funkcije Write().
Write() vraća kontrolu funkciji Main().
Main() ispisuje na konzolu vrijednost koju sadrži mojString definisan unutar funkcije
Main().
Promjenljive čiji opseg važenja na ovaj način pokriva samo jednu funkciju, poznate su kao lokalne
promenljive. Također je moguće imati globalne promenljive, čiji opseg važenja pokriva više funkcija. Izmjenite kôd
na sljedeći način:
class Class1 {
static string mojString;
static void Write() {
string mojString = "Sada je definisan u Write()";
Console.WriteLine("Sada je u Write()");
Console.WriteLine("Lokalna mojString = String definisan u Write()", mojString);
Console.WriteLine("Globalna mojString = Globali string", Class1.mojString);
}
static void Main(string[] args) {
string mojString = "Sada je definisan u Main().";
Write();
Console.WriteLine("");
Console.WriteLine("Sada je u Main().");
Console.WriteLine("Lokalna mojString = String definisan u Write()", mojString);
Console.WriteLine("Globalna mojString = Globali string", Class1.mojString);
Console.ReadKey();
}
}
Ako je kôd ispravno napisan, pojavljuje se prozor komandne linije sa ispisanim tekstom:
Ovde smo dodali još jednu promjenljivu pod imenom mojString, ovaj put na višem nivou hijerarhije imena.
Ova promjenljiva je definisana na sljedeći način:
static string mojString;
Primjetićete da opet koristimo ključnu reč static. U konzolnim aplikacijama, prilikom navođenja globalnih
promjenjivih u ovom obliku, moramo koristiti ključne reči static ili const. Ako želimo da mijenjamo vrijednost
globalne promjenljive, moramo navesti static, jer const zabranjuje mijenjanje vrijednosti promjenljive.
Da bismo napravili razliku između ove promjenljive i lokalnih promjenjivih istog imena u funkcijama Main() i
Write(), moramo se obratiti promjenljivoj koristeći puno kvalifikovano ime. Ovde se globalnoj promjenljivoj
obraćamo sa Class1.mojString. To je neophodno samo kada imamo globalne i lokalne promjenljive sa istim
imenom.
II - 3 - 8. Opseg važenja promenljive u drugim strukturama
Opseg važenja promjenljivih uključuje blok koda u kom su definisane i bilo koje direktno ugniježdene
blokove koda. To se odnosi i na druge blokove koda, kao što su grananja i petlje.
Da biste probali jednostavan ispis na ekranu, u okviru velikih zgrada upišite tekst tačno kao što je prikazano:
class class1 {
static void Main(string[] args) {
int i;
string text = " ";
Dino Dedić 20
Maturski rad Veb prezentacija programskog jezika C#
Parametar args funkcije Main() je metod za prihvatanje informacija izvan aplikacije, navedenih u toku
izvršenja programa. Ova informacija uzima oblik parametara komandne linije.
Kada izvršavamo aplikaciju preko komandne linije, često smo u mogućnosti da direktno navedemo
informaciju kao što je datoteka koja se učitava u izvršenju aplikacije. Npr. pogledajte aplikaciju Notepad u
Windowsu. Možemo je pokrenuti tako što upišemo notepad u komandnu liniju, ili u okviru prozora koji se
pojavljuje kada odaberemo opciju Run iz Windows menija Start. Takođe, možemo uneti nešto nalik na notepad
"myfile.txt" na ovim lokacijama. Rezultat će biti to da će Notepad učitati datoteku "myfile.txt" kada se pokrene, ili
će ponuditi da napravi ovu datoteku. Ovde je "myfile.txt" argument komandne linije. Možemo napisati konzolnu
aplikaciju koja radi na sličan način koristeći parametar args.
Kada se konzolna aplikacija pokrene, svaki parametar komandne linije koji je naveden smešta se u niz args.
Zatim te parametre možemo koristiti u aplikaciji.
Funkcije članice struktura
Tip struct služi za smještanje različitih elemenata podataka na jedno mesto. Strukture su sposobne i za
mnogo više od toga. Važna dodatna sposobnost koju nude jeste mogućnost da sadrže funkcije isto kao i podatke.
Ovo na prvi pogled može djelovati čudno, ali je u stvari izuzetno korisno.
Npr. pogledajmo sljedeću strukturu:
struct ImeKupac
{
public string Ime, Prezime;
}
Ako imamo promjenljivu tipa ImeKupac, a želimo da ispišemo njeno puno ime na konzoli, morat ćemo da
napravimo ime iz sastavnih delova. Možemo koristiti sledeću sintaksu za promenljivu tipa ImeKupac sa imenom
kupac, na primer:
ImeKupac mojKupac;
mojKupac.Ime = "Petar";
mojKupac.Prezime = "Petrović";
Console.WriteLine("{0} {1} ", kupac.Ime, kupac.Prezime);
Dodajući funkciju strukturi, ovo možemo pojednostaviti tako što ćemo centrirati obradu standardnih
zadataka kao što je ovaj. Toj strukturi možemo dodati odgovarajuću funkciju na sledeći način:
struct ImeKupac
{
public string Ime, Prezime;
public string ImePrezime() {
return Ime + " " + Prezime;
}
}
Ovo liči na bilo koju funkciju koju smo do sada vidjeli, osim što nije korišten modifikator static. Treba znati
da ova ključna reč nije potrebna za funkcije članice struktura. Tu funkciju možemo koristiti na sljedeći način:
ImeKupac mojKupac;
mojKupac.Ime = "Petar";
mojKupac.Prezime = "Petrović";
Console.WriteLine (kupac.ImePrezime());
Dino Dedić 22
Maturski rad Veb prezentacija programskog jezika C#
referencu na bilo koju funkciju koja ima isti potpis kao i delegat. Kada to uradimo, možemo pozvati funkciju
koristeći promenljivu delegata kao da je funkcija.
Kada imamo promjenjivu koja pokazuje na funkciju, možemo izvesti druge operacije koje bi bilo nemoguće
izvesti nekom drugom metodom. Npr. možemo proslijediti delegat nekoj funkciji kao parametar, zatim ta funkcija
može pomoću delegata pozvati funkciju na koju on ukazuje, ne znajući koja će to funkcija biti sve do izvršenja.
Da biste probali jednostavan ispis na ekranu, u okviru velikih zgrada upišite tekst tačno kao što je prikazano:
class Class1
{
delegate double procesDelegati (double param1, double param2);
static double Pomnozi(double param1, double param2) {
return param1 * param2;
}
static double Podjeli(double param1, double param2) {
return param1 / param2;
}
static void Main(string[] args) {
procesDelegati process;
Console.WriteLine("Dobar dan.");
Console.WriteLine("Unesite dva broja odvojena zarezom.");
string ulaz = Console.ReadLine();
int pozZareza = ulaz.IndexOf(" , ");
double param1 = Convert.ToDouble(ulaz.Substring(0,pozZareza));
double param2 = Convert.ToDouble(ulaz.Substring(pozZareza + 1, ulaz.Length-pozZareza - 1));
Console.WriteLine(" Pritisnite taster M za množenje ili taster D za djeljenje.");
ulaz = Console.ReadLine();
if (ulaz == "N") {
process = new procesDelegati(Pomnozi);
Console.WriteLine("Rezultat je : (0}", process(param1, param2));
}
else
if (ulaz == "D") {
process = new procesDelegati(Podjeli);
Console.WriteLine("Rezultat je : (0}", process(param1, param2));
}
else
Console.WriteLine("Utipkali ste pogresnu tipku, pokusajte ponovo.");
}
}
}
Ako je kôd ispravno napisan, pojavljuje se prozor komandne linije sa ispisanim tekstom:
Slika 13. prosljediti delegat nekoj funkciji kao parametar, zatim ta funkcija može
pomoću delegata pozvati funkciju na koju on ukazuje
II - 3 - 11. Događaji
Šta je događaj?
Događaji su slični izuzetcima u tome što su aktivirani od strane objekata, a mi možemo obezbjediti kôd koji
reaguje na njih. Međutim, postoje i neke razlike. Jedna od najvažnijih je da nema ekvivalentne try. . . catch
strukture za obradu događaja. Umesto toga, moramo se prijaviti na događaj. Prijavljivanje na događaj
podrazumjeva pisanje koda koji će se izvršiti kada je događaj aktiviran, u obliku rutine za obradu događaja.
Događaj može imati više rutina za obradu događaja, koje će sve biti pozvane kada je događaj aktiviran.
Rutine za obradu događaja mogu biti dio iste klase kojoj pripada objekat koji aktivira događaj, a mogu pripadati i
nekim drugim klasama. Rutine za obradu događaja su jednostavne funkcije. Jedina restrikcija za ove funkcije jeste
ta da se potpis (tip podatka koji se vraća i parametri) mora podudarati sa onim što zahtjeva događaj. Ovaj potpis je
dio definicije događaja određen od strane delegata.
Dino Dedić 23
Maturski rad Veb prezentacija programskog jezika C#
Creates
Application Connection
Drugo - aplikacija se prijavljuje na događaj. Ovo bismo mogli postići definisanjem funkcije koja bi se koristila
sa delegat tipom koji je odredio događaj i koja bi imala parametar - referencu na događaj. Rutina za obradu
događaja može biti metoda na nekom drugom objektu. Neka to bude, npr. objekt koji predstavlja uređaj za prikaz
instant poruke.
Application Connection
Creates
Subscribes to
Display
Kada je događaj aktiviran, aplikacija je obavještena. Kada stigne instant poruka kroz objekat veze, bude
pozvana rutina za obradu događaja na uređaju za prikaz. Pošto koristimo standardnu metodu, objekt koji aktivira
događaj može proslijediti kroz parametre bilo koju relevantnu informaciju praveći tako raznovrsne događaje. U
našem slučaju, jedan parametar može biti tekst iz instant poruke. Ovaj tekst može se prikazati pomoću rutine za
obradu događaja na uređaju za prikaz.
Application Connection
Creates
Display
Calls
Pozdrav
Korištenje događaja
Za obradu događaja neophodno je prijaviti događaj, što znači obezbjediti rutinu za obradu događaja čiji se
potpis podudara sa delegatom koji koristi događaj. Pogledajmo primjer koji koristi jednostavan objekat Timer koji
aktivira događaj, posle čega će biti pozvana rutina za obradu događaja.
Da biste probali jednostavan ispis na ekranu, u okviru velikih zgrada upišite tekst tačno kao što je prikazano:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;
namespace Dogadjaji1 {
class Calss1 {
static int brojac = 0;
static string displayString ="Ovo je string koji se ponavlja poslije zavrsetka prikaza teksta, a prekida
poslije 100 milsec.";
static void Main(string[] args) {
Timer mojTimer = new Timer(100);
mojTimer.Elapsed += new ElapsedEventHandler(WriteChar);
mojTimer.Start();
Console.ReadLine();
}
static void WriteChar(object source, ElapsedEventHandler e) {
Dino Dedić 24
Maturski rad Veb prezentacija programskog jezika C#
Console.Write(displayString[brojac++ % displayString.Length]);
}
}
}
Ako je kôd ispravno napisan, pojavljuje se prozor komandne linije sa ispisanim tekstom:
Slika 14. Za obradu događaja neophodno je prijaviti događaj, što znači obezbjediti rutinu za obradu događaja čiji se
potpis podudara sa delegatom koji koristi događaj
Definisanje događaja
Pogledajmo kako da definišemo i koristimo naše sopstvene događaje. Implementirat ćemo verziju primjera
za instant poruke. Kreiraćemo objekat Konekcija koji aktivira događaje obrađene od strane objekta Display.
Da biste probali jednostavan ispis na ekranu, u okviru velikih zgrada upišite tekst tačno kao što je prikazano:
namespace Dogadjaji2 {
public delegate void MessageHandler(string messageText);
public class Konekcija {
public event MessageHandler MessageArrived;
private Timer pollTimer;
public Konekcija() {
pollTimer = new Timer(100);
pollTimer.Elapsed += ElapsedEventHandler(PromjeraPoruke);
}
public void Connect() {
pollTimer.Start();
}
public void Disconnect() {
pollTimer.Stop();
}
static void PromjeraPoruke(object source, ElapsedEventHandler e) {
Console.WriteLine("Provjera nove poruke.");
Random random = new Random();
if ((random.Next(9) == 0) && (MessageArrived != null)) {
MessageArrived("#### Pozdrav MAMA ####");
}
}
}
}
Dodajte novu klasu Display u Display.cs:
namespace Dogadjaji2 {
public class Display {
public void DisplayMessage(string poruka) {
Console.WriteLine("Poruka koj je stigla : ", poruka);
}
}
Izmjenite kodu Class1.cs:
{
class Class1 {
static void Main(string[] args) {
Konekcija mojaKonekcija = new Konekcija();
Display myDisplay = new Display();
mojaKonekcija.MessageArrived += new MessageHandler(myDisplay.DisplayMessage);
mojaKonekcija.Connect();
Console.ReadLine();
}
}
}
Ako je kôd ispravno napisan, pojavljuje se prozor komandne linije sa ispisanim tekstom:
Dino Dedić 25
Maturski rad Veb prezentacija programskog jezika C#
Slika 15. Objekat Konekcija aktivira događaje obrađen od strane objekta Display
Višenamjenske rutine za obradu događaja
Potpis koji smo videli ranije za događaj Timer.Elapsed, sadrži dva parametra čiji se tipovi često sreću u
rutinama za obradu događaja. Ti parametri su:
object source - referenca na objekat koji aktivira događaj.
ElapsedEventArgs e - parametri koje šalje događaj.
Razlog zbog kojeg koristimo parametar tipa object za ovaj događaj, kao i za mnoge druge događaje, je što
ćemo često htjeti da koristimo jednu rutinu za obradu događaja za više identičnih događaja aktiviranih od strane
različitih objekata. Na ovaj način možemo tačno znati koji objekt aktivira događaj.
Da biste probali jednostavan ispis na ekranu, u okviru velikih zgrada upišite tekst tačno kao što je prikazano:
using System;
namespace Dogadjaji3 {
public class MessageAmvedEventArgs : EventArgs {
private string poruka;
private string Poruka; {
get {
return poruka;
}
}
public class MessageAmvedEventArgs() {
Poruka = "Niti jedna poruka nije poslata“;
}
public class MessageAmvedEventArgs(string novaPoruka){
poruka =novaPoruka;
}
}
}
Izmjenite Connection.cs:
using System.Text;
using System.Timers;
namespace Dogadjaji3 {
public delegate void MessageHandler(Konekcija source, MessageArrivedEventArgs e);
public class Konekcija {
public event MessageHandler MessageArrived;
private string naziv;
private string Naziv; {
get {
return naziv;
}
Set {
naziv = value;
}
}
private Timer pollTimer;
public Konekcija() {
pollTimer = new Timer(100);
pollTimer.Elapsed += ElapsedEventHandler(PromjeraPoruke);
}
public void Connect() {
pollTimer.Start();
Dino Dedić 26
Maturski rad Veb prezentacija programskog jezika C#
}
public void Disconnect() {
pollTimer.Stop();
}
static void PromjeraPoruke(object source, ElapsedEventHandler e) {
Console.WriteLine("Provjera nove poruke.");
Random random = new Random();
if ((random.Next(9) == 0) && (MessageArrived != null)) {
MessageArrived(this, new MessageArrivedEventArgs "#### Pozdrav MAMA
####");
}
}
}
}
Izmjenite Display.cs:
namespace Dogadjaji3 {
public class Display {
public void DisplayMessage(Konekcija source, MessageArrivedEventArgs e) {
Console.WriteLine("Poruka koj je stigla : ", source.Naziv);
Console.WriteLine("Tekst poruke : ", e.Poruka);
}
}
Izmjenite Class1.cs:
static void Main(string[] args) {
Konekcija mojaKonekcija1 = new Konekcija();
mojaKonekcija1.naziv = "Prva konekcija.";
Konekcija mojaKonekcija1 = new Konekcija();
mojaKonekcija2.naziv = "Druga konekcija.";
Display myDisplay = new Display();
mojaKonekcija1.MessageArrived += new MessageHandler(myDisplay.DisplayMessage);
mojaKonekcija2.MessageArrived += new MessageHandler(myDisplay.DisplayMessage);
mojaKonekcija1.Connect();
mojaKonekcija2.Connect();
Console.ReadLine();
}
}
}
Ako je kôd ispravno napisan, pojavljuje se prozor komandne linije sa ispisanim tekstom:
Slika 16. rutinu za obradu događaja za više identičnih događaja aktiviranih od strane
različitih objekata
Povratne vrijednosti i rutina za obradu događaja
Svi moduli koje smo do sada vidjeli imali su povratni tip void. Moguće je obezbjediti neki drugi tip, ali to
dovodi do problema zato što neki događaj može imati za posljedicu pozivanje nekoliko rutina za obradu događaja.
Ako sve ove rutine vrate neku vrijednost postaje nejasno koju od vrijednosti uzimamo.
Sistem rješava problem tako što dozvoljava pristup samo posljednjoj vraćenoj vrijednosti. Ovo je vrijednost
koju vraća posljednja rutina za obradu događaja koja se odnosi na neki događaj.
Dino Dedić 27
Maturski rad Veb prezentacija programskog jezika C#
Server Explorer, a predstavljen je ikonama na kojoj su nacrtani računari, iznad jezička kartice Toolbox. Ovo se može
posmatrati i kao kraća verzija Windows Control Panela. Odavde možete pretraživati mrežu, dodavati ili uklanjati
veze sa bazama podataka i još mnogo toga drugog.
Sa desne strane prozora nalaze se dva panela. Gornji je Solution Explorer i pregled klasa. U Solution
Explorer-u možete vidjeti sve otvorene projekte i njihove pridružene datoteke. Ako pritisnete na karticu pri dnu
Solution Explorer-a, aktivirate Class Viewer (pregled klasa). Ovdje možete pregledati sve klase korištene u
projektima, kao i sve izvedene klase. U donjem desnom dijelu prozora nalazi se panel Properties. Ovaj panel sadrži
sva svojstva izabranog objekta, koja se lako mogu pročitati ili izmeniti, tj. dopuniti.
Takođe, u ovom panelu vidi se i kartica Dynamic Help. Ovde se prikazuju svi savjeti i uputstva za izabrani
objekt ili kôd, čak i dok tipkate.
III - 1 - 2. Okvir sa alatima
Pogledajmo malo bolje okvir sa alatima - Toolbox. Ako već to
niste uradili, pomjerite pokazivač miša do okvira na lijevoj strani
ekrana, i pritisnite pin u gornjem desnom uglu panela, tako da cijeli
panel bude vidljiv.
Ako slučajno pritisnete × umesto pribadače i tako uklonite okvir
sa alatima, možete ga ponovo vratiti u prozor. Izaberite Toolbox iz
menija View, ili pritisnite tastere Ctrl+Alt+X.
Object
MarshalByRefObject
Component
Control
Osobine
Sve kontrole imaju određene osobine koje određuju kako će se neka kontrola ponašati. Osnova klasa za
većinu kontrola Control sadrži određen broj svojstava koje kontrole ili direktno nasleđuju ili redefinišu u slučaju da
se želi neko drugačije ponašanje kontrole.
Tabela ispod pokazuje najvažnije osobine klase Control.
Dino Dedić 29
Maturski rad Veb prezentacija programskog jezika C#
Ove dvije osobine su naročito korisne kada dizajnirate obrazac. Osigurati da prozor normalno izgleda poslije
promjene veličine prozora nije lako. Mnogi programi rješavaju ovaj problem tako što ne dozvoljavaju da se mijenja
veličina prozora. Svojstva Anchor i Dock omogućavaju vam da riješite ovaj problem bez pisanja koda. Svojstvo
Anchor određuje kako se kontrola ponaša kada korisnik promijeni veličinu prozora u kojem se kontrola nalazi.
Svojstvo Dock je povezano sa svojstvom Anchor. Određuje da li kontrola treba da bude pripojena uz ivicu prozora
kojem pripada. Ukoliko korisnik promijeni veličinu prozora, kontrola će i dalje biti pripojena uz ivicu.
Događaji
Kada korisnik programa pritisne dugme ili taster, programer bi htio da zna da se to zaista desilo. Da bi ovo
bilo moguće kontrole koriste događaje. Klasa Control definiše brojne događaje koji su zajednički za kontrole.
Tabela ispod opisuje neke od ovih događaja MSDN biblioteka :
Dino Dedić 30
Maturski rad Veb prezentacija programskog jezika C#
Opisat ćemo osobine kao članove klase Button. Samo one najčešće korištene opisane su u tabeli.
Najkorišteniji događaj dugmeta jeste događaj Click. Dešava se kada korisnik pritisne na dugme. Takođe, do
događaja Click dolazi kada je dugme u fokusu i kada korisnik pritisne taster Enter. Ako imate dugme na formularu,
uvijek treba obraditi ovaj događaj.
Dino Dedić 31
Maturski rad Veb prezentacija programskog jezika C#
Dino Dedić 32
Maturski rad Veb prezentacija programskog jezika C#
Ime Opis
Ovaj događaj se šalje kada se mijenja potvrda radio dugmeta. Ako ima više kontrola RadioButton na
CheckChanged formularu ili unutar jednog grupnog okvira ovaj događaj se šalje dva puta: prvo kontroli koja je bila
potvrđena, a sada više nije, a zatim i kontroli koja postaje potvrđena.
Click Ovaj događaj se šalje svaki put kada se pritisne na radio dugme. Ovo nije isto kao i događaj
CheckChanged.
Osobine i događaji ove kontrole su slični onima za RadioButton ali tu su i dvije nove:
Ime osobine Dostupnost Opis
Polje za potvrdu može imati tri statusa: Checked, Indeterminate i Unchecked
CheckState Čitanje/upis
(potvrđeno, neodređeno i nepotvrđeno).
Ako je ovo svojstvo podešeno na false korisnik neće moći da izmijeni status kontrole
ThreeState Čitanje/upis
na Indeterminata, ali može izmijeniti status u kodu.
Ime Opis
CheckedChanged Dešava se kada se mijenja svojstvo Checked kontrole. Kod kontrola sa osobinom ThreeState
podešenom na true moguće je pritisnuti na polje za potvrdu bez promene Checked osobine.
Dešava se kada se mijenja svojstvo CheckedState kontrole. Kako su Checked i Unchecked moguće
CheckedStateChanged vrijednosti za svojstvo CheckedState, ovaj događaj će biti poslan uvijek kada se mijenja svojstvo
Checked.
RichTextBox ima nove osobine. Sljedeća tabela opisuje neke najčešće korištene osobine:
Ime osobine Dostupnost Opis
Vrijednost ove osobine je true, ako nešto što je poništeno može biti
CanRedo Samo čitanje
ponovljeno, u suprotnom je false.
Dino Dedić 33
Maturski rad Veb prezentacija programskog jezika C#
Većina događaja koji se koriste u obogaćenim okvirima za tekst isti su kao i za obične okvire za tekst. Ima i
nekoliko novih:
Sve osobine opisane u tabeli koja slijedi važe i za ListBox i za CheckedListBox, osim ako nije drugačije
naznačeno:
Dino Dedić 34
Maturski rad Veb prezentacija programskog jezika C#
Tabela koja slijedi opisuje samo najčešće korištene metode. Metode važe i za kontrolu ListBox i za
CheckedListBox osim ako nije drugačije naznačeno:
Ime Opis
ClearSelected Poništava izbor u okviru liste.
FindString Pronalazi prvi string u listi koji počinje željenim stringom.
FindstringExact Kao i FindString s tim što se kompletan string mora podudarati.
GetSelected Vraća vrijednost koja pokazuje da li je element izabran ili nije.
SetSelected Podešava da element bude izabran ili briše element iz liste izabranih elemenata.
ToString Vraća trenutno izabrani element.
GetltemChecked Samo za kontrolu CheckedListBox: vraća vrijednost koja pokazuje da li je elemant
potvrđen ili ne.
SetltemCheckState Samo za kontrolu CheckedListBox: vraća vrijednost koja pokazuje stanje
elemenata.
SetltemChecked Samo za kontrolu CheckedListBox: podešava određeni element tako da bude
potvrđen.
SetltemCheckState Samo za kontrolu CheckedListBox: podešava stanje elementa.
Događaji kojih želite da budete svjesni dok radite sa kontrolama ListBox i CheckedListBox jesu oni
događaji koji se odnose na izbor korisnika:
Ime Opis
ItemCheck Samo za kontrolu CheckedListBox: dešava se prilikom mijenjanja stanja elementa.
SelectedlndexChanged Dešava se prilikom mjenjanja indeksa izabranog elementa.
Kako kontrola ComboBox posjeduje mogućnosti kontrola TextBox i ListBox, mnoge osobine kombinovanog
okvira mogu se naći i u dvije pomenute kontrole. Zbog ovoga postoji ogroman broj svojstava i događaja kontrole
ComboBox.
Pokazuje da li je lista prikazana ili nije. Ako podesite ovu osobinu na true, lista će se
DropDown Čitanje/upis
prikazati.
Items Samo čitanje Kolekcija koja sadrži sve elemente liste iz kombinovanog okvira.
Podešavanjem ove osobine na broj veći od nule, određujete maksimalan broj
MaxLength Čitanje/upis
karaktera koji je moguće uneti u tekstualni dio kontrole.
Selectedlndex Čitanje/upis Pokazuje indeks trenutno izabranog elementa liste.
Selectedltem Čitanje/upis Pokazuje trenutno izabrani element liste.
SelectedText Čitanje/upis Predstavlja tekst koji je izabran u tekstualnom dijelu kontrole.
Predstavlja indeks prvog karaktera dijela teksta koji je izabran u tekstualnom dijelu
SelectionStart Čitanje/upis
kontrole.
SelectionLength Čitanje/upis Predstavlja dužinu izabranog teksta u tekstualnom dijelu kontrole.
Ako podesite ovu osobinu na true kontrola će sortirati elemente liste po
Sorted Čitanje/upis
abecednom redu.
Ako podesite ovu osobinu na vrednost null ništa neće biti izabrano. Ako podesite na
Text Čitanje/upis vrijednost koja postoji u listi ta vrijednost će biti izabrana. Ako tražena vrijednost
ne postoji u listi tekst će biti prikazan u tekstualnom dijelu kontrole
Dino Dedić 36
Maturski rad Veb prezentacija programskog jezika C#
Checkedlterns potvrđeni.
Kontrola ListView može imati kolone. Ovo svojstvo obezbeđuje pristup kolekciji
Columns Samo čitanje
kolona kroz koju možete dodavati ili uklanjati kolone.
Focusedltem Samo čitanje Ovo svojstvo sadrži element koji ima fokus. Ako ništa nije izabrano, vrednost je nula.
Ako je ovo svojstvo podešeno na true, kada se pritisne na neki element, onda će cijeli
FullRowSelect Čitanje/upis red u kom se element nalazi biti naglašen. Ako je podešenona false samo će element
biti naglašen.
Podešavanjem ove osobine na true pokazat će se linije mreže između redova i kolona.
GridLines Čitanje/upis
Podešavanje ove osobine ima efekta samo ako je svojstvo view podešeno na Details.
Možete kontrolisati kako će biti prikazano zaglavlje kolone. Postoje tri stila:
- Clickable: zaglavlje kolone se ponaša kao dugme.
HeaderStyle Čitanje/upis
- NonClickable: zaglavlje kolone ne reaguje na pritisak mišem.
- None: zaglavlja kolona nisu prikazana.
Kada je ovo svojstvo podešeno na true korisnik može izabrati element postavljanjem
HoverSelection Čitanje/upis
miša na element.
Kada je vrijednost ovog svojstva podešena na true korisnik može uređivati sadržaj
LabelEdit Čitanje/upis
prve kolone u prikazu Details.
Kada je ovo svojstvo podešeno na true oznake će se protezati na koliko god je redova
LabelWrap Čitanje/upis
potrebno za prikazivanje cijelog teksta.
Klasa ListViewltem
Element liste je uvijek objekat klase ListViewltem. Klasa ListViewltem sadrži informacije kao što su tekst i
indeks ikone koje treba prikazati. Sadrži kolekciju koja se zove SubItems. Ova kolekcija sadrži objekte klase
ListViewSubItems. Ovi podelementi su prikazani ako je kontrola ListView u režimu Details. Svaki od podelemenata
predstavlja kolonu. Osnovna razlika između elementa i podelementa jeste ta što podelement ne može prikazati
ikonu.
Klasa ColumnHeader
Za prikazivanje zaglavlja kolona dodajete objekte klase ColumnHeader kontroli ListView kroz kolekciju
Columns. Klasa ColumnHeader obezbjeđuje zaglavlje za kolone koje će se prikazati kada je ListView u režimu
Details.
III - 1 - 3 - 12. Kontrola ImageList
Kontrola ImageList obezbjeđuje kolekciju koja se koristi za smeštanje slika koje mogu biti korištene u
drugim kontrolama. U liste slika mogu se stavljati slike bilo koje veličine, s tim da se u okviru jedne kontrole mogu
naći samo slike iste veličine. U slučaju kontrole ListView potrebne su dvije kontrole ImageList za smeštanje malih i
velikih slika. ImageList ne prikazuje svoj sadržaj u vrijemenu izvršavanja programa. Kada dovučete ovu kontrolu na
formular za vrijeme dizajniranja, ona ne postaje dio samog formulara već se nalazi u bloku ispod formulara koji
smešta sve slične objekte. Ovo zanimljivo svojstvo ne dopušta kontrolama koje nisu dio grafičkog interfejsa da
zatrpavaju dizajner formulara. Kontrolom ImageList se rukuje kao i svakom drugom kontrolom, ali je ne možete
pomerati.
Dino Dedić 37
Maturski rad Veb prezentacija programskog jezika C#
Možete podesiti svojstvo Text statusne linije za prikazivanje nekog teksta ali je moguće praviti panele u iste
svrhe:
Ime osobine Dostupnost Opis
Backgroundlmage Čitanje/upis Moguće je dodijeliti sliku statusnoj liniji koja će se iscrtati u pozadini.
Ovo je kolekcija panela u statusnoj liniji. Koristite ovu kolekciju za dodavanje i
Panels Čitanje/upis
uklanjanje panela.
ShowPanels Čitanje/upis Ako hoćete da prikažete panele ovo svojstvo mora biti podešeno na true.
Kada ne koristite panele ovo svojstvo sadrži tekst koji će se prikazati na
Text Čitanje/upis
statusnoj liniji.
Nema mnogo novih događaja za statusnu liniju, ali ako crtate panel ručno događaj DrawItem je od velike
važnosti:
Ime Opis
Dešava se kada panel sa OwnerDraw stilom treba ponovo iscrtati. Morate prijaviti ovaj događaj
DrawItem
ako želite sami da crtate sadržaj panela.
PanelClick Dešava se prilikom odabira panel.
Klasa StatusBarPanel
Svaki panel u statusnoj linije je objekat klase StatusBarPanel. Ova klasa sadrži informacije o svim panelima
kolekcije Panels. Može se podešavati tekst, položaj teksta u panelu, ikone ili stil panela. Ako želite sami da crtate
panel morate podesiti svojstvo panela Style na OwnerDraw i obraditi događaj DrawItem kontrole StatusBar.
III - 1 - 3 - 14. Kontrola TabControl
Kontrola TabControl obezbjeđuje lagan način organizovanja dijaloga u logičke jedinice kojima se može
pristupiti kroz jezičke kartica na vrhu kontrole. Kontrola TabControl sadrži kontrole TabPages koje su slične
grupnim okvirima.
Postoje dva reda koja sadrže jezičke kartica u vrhu kontrole. Pritiskom na bilo koji od njih prikazat će se
drugačija selekcija kontrola u ostatku dijaloga. Ovo je dobar primejr kako grupisati informacije koje su u nekoj vezi
jedna s drugom pa tako olakšavajući korisniku da pronade željenu informaciju. Korištenje kontrole TabControl je
veoma lako. Jednostavno dodate jezičke za kartice koje želite prikazati u kolekciju TabPages, a zatim ubacujete
ostale kontrole u odgovarajuće strane.
Svojstva kontrole TabControl
Osobine kontrole TabControl se uglavnom koriste za podešavanje izgleda kontenjera u kome se nalaze
kontrole TabPages tj. za izgled kartica:
Dino Dedić 38
Maturski rad Veb prezentacija programskog jezika C#
III. Zaključak
C# je objektno orjentisan programski jezik kojeg su razvili Andres Hejlsberg i drugi pripadnici Microsoft
firme. C# je evolucija C i C++ programskog jezika. U odnosu na C i C++ sintaksa C# je dosta prostija, greške je
jednostavnije otkloniti i sam kod je dosta razumljiviji.
Prema TIOBE-ovoj statistici C# je rangiran na 5. mjesto kao jedan od korištenijih programskih jezika, dok C i
C++ zauzimaju prva tri mjesta.
Ovaj maturski rad je obuhvatio samo dio onoga što programski jezik C# i .NET Framework pružaju. Sam
framework sadrži hiljade klasa koje možete iskoristiti u svojim programima. Za detaljan opis svih klasa, njihovih
metoda te mogućih načina upotrebe, trebalo bi biti napisane desetine hiljada stranica. Sam jezik C# nudi još puno
elemenata i metoda koje vam mogu olakšati posao programiranja. Posao programera zahtijeva konstantno učenje i
usavršavanje, razumijevanje kako određene mogućnosti mogu olakšati život, ali u nekim slučajevima i otežati.
Samo razumijevanje programerskih ideja, algoritama i principa, predstavlja samo početni korak prema razvoju
kvalitetnih sistema..
Dino Dedić 39
Maturski rad Veb prezentacija programskog jezika C#
IV. Literatura
Internet :
http://www.scribd.com/doc/27049359/C-Programiranje-skripta
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html 2.5.2012.
http://hr.wikipedia.org/wiki/C_Sharp 2.5.2012.
Dino Dedić 40