Download presentation
Presentation is loading. Please wait.
Published byWidyawati Hartanto Modified over 6 years ago
1
---------- Računarski praktikum 3 ----------
RP3/predavanje02 Programski jezik C#: Tipovi 12/11/2018 Računarski praktikum Maja Starčević
2
Primjer C# programa Uključivanje imeničkog prostora. Using se koristi samo za prostore, ne i za tipove. Dakle, greška je pisati: using System.Console; using System; class Test { static void Main( ) int x=26; Console.WriteLine(x); } Definicija klase Definicija metode Console=System.Console 12/11/2018 Računarski praktikum
3
-------Računarski praktikum 3-------
Primjer C# programa Konzolna aplikacija u Visual Studiu: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program static void Main(string[ ] args) …….. } 12/11/2018 Računarski praktikum
4
-------Računarski praktikum 3-------
Ključne riječi abstract add alias as ascending base bool break by byte case catch char checked class const continue decimal default delegate descending do double dynamic else enum equals event explicit extern false finally fixed float for foreach 12/11/2018 Računarski praktikum
5
-------Računarski praktikum 3-------
Ključne riječi from get global goto group if implicit in int into interface internal is join let lock long namespace new null object on operator orderby out override params partial private protected public readonly ref remove return sbyte 12/11/2018 Računarski praktikum
6
-------Računarski praktikum 3-------
Ključne riječi sealed select set short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using value var virtual void volatile while where yield 12/11/2018 Računarski praktikum
7
-------Računarski praktikum 3-------
Ključne riječi Napomena: ključna riječ se može koristiti kao identifikator s @ prefiksom, npr: { … } . Neke ključne riječi su kontekstualne (u zelenim poljima). Kontekstualne riječi imaju posebno značenje u određenim dijelovima programa dok se u ostalim dijelovima mogu koristiti kao identifikatori. Ostale riječi se ne mogu koristiti kao identifikatori ni u jednom dijelu programa. 12/11/2018 Računarski praktikum
8
-------Računarski praktikum 3-------
Identifikatori Kod identifikatora (imena varijabli, funkcija, klasa…) razlikujemo velika i mala slova. Uobičajeno je argumente, lokalne varijable i privatne varijable članice klasa pisati camel notacijom (npr. prvaKlasa, brojUcitanihPodataka …). Ostale identifikatore pišemo koristeći Pascal notaciju (npr. MojaPrvaMetoda). 12/11/2018 Računarski praktikum
9
-------Računarski praktikum 3-------
Kontrola toka Kontrola toka se vrši jednako kao i u C++-u pomoću ključnih riječi for, while, do, if, switch, case. Nove ključne riječi u tom kontekstu u C#-u su foreach i in koje se koriste za iteriranje kroz kolekcije (spremnike). Kod switch bloka postoje male razlike u odnosu na C++ kao što se vidi iz sljedećeg primjera. t 12/11/2018 Računarski praktikum
10
-------Računarski praktikum 3-------
Switch string[] dani = { "Pon", "Uto", "Sri", "Cet", "Pet", "Sub" }; foreach (string dan in dani) { switch (dan) case "Pon": Console.WriteLine("Radno vrijeme : 8-17"); break; case "Uto": case "Sri": Console.WriteLine("Radno vrijeme : 8-20"); case "Cet": goto case "Pon"; case "Pet": Console.WriteLine("Radno vrijeme : 8-15"); default: Console.WriteLine("Niste odabrali radni dan"); } t Ako izbacimo break, kompilator javlja grešku. 12/11/2018 Računarski praktikum
11
-------Računarski praktikum 3-------
Tipovi Vrijednosni tipovi: Cjelobrojni s predznakom: sbyte, short, int, long Cjelobrojni bez predznaka: byte, ushort, uint, ulong Realni: float, double, decimal Logički: bool Znakovni: char Strukture: struct Enumeracije: enum Referentni tipovi: Klase: class Delegati: delegate Sučelja: interface Pokazivački tipovi 12/11/2018 Računarski praktikum
12
-------Računarski praktikum 3-------
Tipovi Napomena: svi vrijednosni tipovi (osim enumeracija) su u biti strukture. Vrijednosni tipovi su izvedeni iz System.ValueType klase koja direktno nasljeđuje klasu System.Object. Bazna klasa za enumeracije je System.Enum koja isto nasljeđuje System.ValueType. Klase ValueType i Enum su apstraktne klase. t 12/11/2018 Računarski praktikum
13
-------Računarski praktikum 3-------
.NET tipovi C# tip .NET tip Sufiks Veličina (bit) Raspon sbyte System.Sbyte 8 -2^7 do 2^7-1 short System.Int16 16 -2^15 do 2^15-1 int System.Int32 32 -2^31 do 2^31-1 long System.Int64 L 64 -2^63 do 2^63-1 byte System.Byte 0 do 2^8-1 ushort System.UInt16 0 do 2^16-1 uint System.UInt32 U 0 do 2^32-1 12/11/2018 Računarski praktikum
14
-------Računarski praktikum 3-------
.NET tipovi C# tip .NET tip Sufiks Veličina (bit) Raspon ulong System.UInt64 UL 64 0 do 2^64-1 float System.Single F 32 ±(~10^(-45) do 10^38) double System.Double D ±(~10^(-324) do 10^308) decimal System.Decimal M 128 ±(~10^(-28) do 10^28) char System.Char 2 bool System.Boolean true, false 12/11/2018 Računarski praktikum
15
-------Računarski praktikum 3-------
Vrijednosni tipovi Varijable ili konstante vrijednosnog tipa su naprosto vrijednosti. Definicija strukture SPoint: Instanca strukture SPoint u memoriji: public struct SPoint { public int X; public int Y; } X Y Članovi strukture su implicitno private ! 12/11/2018 Računarski praktikum
16
-------Računarski praktikum 3-------
Vrijednosni tipovi Operator new nije nužan. Možemo zamijeniti s: Point p1; Međutim, u tom slučaju varijable strukture nisu inicijalizirane. Moramo ih inicijalizirati prije pristupa. SPoint p1=new SPoint (); p1.X=2; SPoint p2=p1; Console.WriteLine(p1.X); // 2 Console.WriteLine(p2.X); // 2 p1.X=5; Console.WriteLine(p1.X); // 5 Console.WriteLine(p2.X); // 2 Pridruživanjem instance vrijednosnog tipa zapravo se vrši kopiranje vrijednosti instance. Ne utječe na p2. 12/11/2018 Računarski praktikum
17
-------Računarski praktikum 3-------
Vrijednosni tipovi U memoriji imamo na kraju sljedeće: p1 p2 5 2 12/11/2018 Računarski praktikum
18
-------Računarski praktikum 3-------
Ugrađeni tipovi U C#-u tip int je isto što i System.Int32 koji je primjer strukture. Na varijablama ugrađenih tipova možemo zvati i metode. U sljedećem primjeru dohvatit ćemo dvije konstante iz strukture System.Int32 (pritom moramo koristiti ime tipa, System.Int 32 ili int) te ćemo pozvati jednu metodu. int i = int.MaxValue; int j = int.MinValue; Console.WriteLine(i.CompareTo(j)); 12/11/2018 Računarski praktikum
19
-------Računarski praktikum 3-------
Referentni tipovi Referentni tip je nešto složeniji od vrijednosnog tipa jer se uz objekt kreira i referenca na taj objekt. Varijabla ili konstanta referentnog tipa je zapravo referenca na objekt koji sadrži vrijednosti. public class CPoint { public int X; public int Y; } Metapodaci objekta X Y referenca 12/11/2018 Računarski praktikum
20
-------Računarski praktikum 3-------
Referentni tipovi CPoint p1=new CPoint (); p1.X=2; CPoint p2=p1; Console.WriteLine(p1.X); // 2 Console.WriteLine(p2.X); // 2 p1.X=5; Console.WriteLine(p1.X); // 5 Console.WriteLine(p2.X); //5 Kopiranje reference (p1 i p2 su reference na isti objekt) 12/11/2018 Računarski praktikum
21
-------Računarski praktikum 3-------
Referentni tipovi Prikaz u memoriji: Referenca p1 Metapodaci objekta 5 Referenca p2 12/11/2018 Računarski praktikum
22
-------Računarski praktikum 3-------
Null Referenci se može dodijeliti literal null. U tom slučaju referenca ne pokazuje ni na jedan objekt. Point p=null; Console.WriteLine (p.X) //error Vrijednosnim tipovima se ne može dodijeliti vrijednost null. Napomena: vidi “nullable” tipove. 12/11/2018 Računarski praktikum
23
-------Računarski praktikum 3-------
Pokazivači C# pruža podršku i za direktno upravljanje memorijom pomoću pokazivača međutim blokovi koda u kojima se koriste pokazivači moraju biti označeni ključnom riječi unsafe (i kompilirani s /unsafe opcijom). Pokazivački tipovi se u pravilu koriste za inteoperabilnost s C-ovskim APIjima i hvatanje memorije izvan upravljane hrpe. unsafe { // kod s pokazivačima } 12/11/2018 Računarski praktikum
24
-------Računarski praktikum 3-------
Memorijski blokovi Stog (stack) je memorijski blok za pohranu varijabli (objekata kod vrijednosnih tipova, referenci za referentne objekte). Radi standardno na principu last-in first-out. “Hrpa” (heap) je memorijski blok u koji se smještaju referentni objekti. Referenca na objekt smješta se na stog. “Sakupljač otpada” (Garbage Collector - GC) periodički uklanja objekte s heap-a. Da bi se to dogodilo, objekt ne smije imati referencu na sebe. 12/11/2018 Računarski praktikum
25
-------Računarski praktikum 3-------
Memorijski blokovi Na heap se također smještaju i statičke varijable članice, kao i konstante (za njih nije zadužen GC). Primjer: Ako unutar neke funkcije kreiramo lokalni objekt referentnog tipa, objekt se smješta na heap, a referenca na njega na stog. Pri izlasku iz funkcije referenca se briše sa stoga, objekt više nema referencu na sebe i GC ga može pokupiti. Važno: ne možemo eksplicitno izbrisati objekte (kao u C++-u). 12/11/2018 Računarski praktikum
26
-------Računarski praktikum 3-------
Lokalne varijable Nije dozvoljeno deklarirati varijablu istog imena u istom ili ugniježdenom bloku: static void Main(string[] args) { int a; int b; } int a; // greška int b; // u redu for (int i = 0; i < 5; ++i) Console.Write(i); int i = 15; // greška 12/11/2018 Računarski praktikum
27
-------Računarski praktikum 3-------
Inicijalizacija Izvan unsafe konteksta nemoguće je pristupiti neinicijaliziranoj memoriji. Konkretno: Lokalnim varijablama se mora dodijeliti vrijednost prije čitanja. Argumentima funkcije se mora dodijeliti vrijednost prije poziva funkcije. Automatski se inicijaliziraju elementi polja (polje je zapravo samo specijalan primjer klase). 12/11/2018 Računarski praktikum
28
-------Računarski praktikum 3-------
Inicijalizacija class Program { static void Main(string[] args) string s; int i; int[] matrica = new int[4]; Klasa k = new Klasa(); Console.WriteLine("{0}, {1}, {2}, {3}", i, s, k.i, k.s); foreach (int j in matrica) Console.WriteLine(j); } Zadatak: Što će ispisati sljedeći kod? class Klasa { public int i; public string s; } 12/11/2018 Računarski praktikum
29
-------Računarski praktikum 3-------
Inicijalizacija class Program { static void Main(string[] args) string s=“neki tekst”; int i=13; int[] matrica = new int[4]; Klasa k = new Klasa(); Console.WriteLine("{0}, {1}, {2}, {3}", i, s, k.i, k.s); foreach (int j in matrica) Console.WriteLine(j); } Odgovor: Kompilator javlja grešku (lokalnim varijablama nije dodijeljena vrijednost prije čitanja). Popravimo 12/11/2018 Računarski praktikum
30
-------Računarski praktikum 3-------
Inicijalizacija Nakon ispravljanja koda, izlaz je sljedeći: 13, neki tekst, 0, k.s=null Primijetimo da su elementi polja matrica automatski inicijalizirani na 0. Automatski su inicijalizirani i članovi objekta k. 12/11/2018 Računarski praktikum
31
-------Računarski praktikum 3-------
Inicijalizacija Vrijednosti za p.X i p.Y su dodijeljene preko (implicitno definiranog) konstruktora strukture. Lokalnoj varijabli t nisu dodijeljene vrijednosti prije čitanja. class Program { static void Main(string[] args) SPoint p=new SPoint(); SPoint t; Console.WriteLine("{0}, {1}", p.X, p.Y); Console.WriteLine("{0}, {1}", t.X, t.Y); } error struct SPoint { public int X; public int Y; } 12/11/2018 Računarski praktikum
32
-------Računarski praktikum 3-------
Inicijalizacija class Program { static void Main(string[] args) SPoint p=new SPoint(); SPoint t; t.X=1; t.Y=2; Console.WriteLine("{0}, {1}", p.X, p.Y); Console.WriteLine("{0}, {1}", t.X, t.Y); } Kompilator javlja grešku za prethodni kod. Moramo dodijeliti vrijednosti za t.X i t.Y. struct SPoint { public int X; public int Y; } Output: 0, 0 1, 2 12/11/2018 Računarski praktikum
33
-------Računarski praktikum 3-------
Tip object System.Object je najviše rangirana temeljna klasa za sve tipove. Sadrži sljedeće članove: public class Object { public Object( ); public extern Type GetType ( ); public virtual bool Equals (object obj); public static bool Equals (object objA, object objB); public static bool ReferenceEquals (object objA, object objB); public virtual int GetHashCode( ); public virtual string ToString( ); protected override void Finalize( ); protected extern object MemberwiseClone( ); } 12/11/2018 Računarski praktikum
34
-------Računarski praktikum 3-------
Pakiranje Pakiranje (engl. boxing) nam omogućava da vrijednosni tip pretvorimo u referentni. Konkretno, vrijednost pakiramo u instancu klase object (koja je naravno referentni tip). int i = 10; object o = (object)i; //pakiramo int u object eksplicitno // object o=i; // možemo to napraviti i implicitno int k = (int)o; //raspakiramo object i dobivamo int Možemo raspakirati (engl. unboxing) samo referencu na objekt koji je nastao pakiranjem i pritom tip u koji ćemo raspakirati mora odgovarati tipu koji je bio pakiran (inače se baca InvalidCastException). Pakiranje se smatra skupom operacijom. 12/11/2018 Računarski praktikum
35
-------Računarski praktikum 3-------
Vrijednosni tipovi Zadatak: pronađite greške u kodu. static void Main(string[] args) { SPoint p = new SPoint(); p = null; object o = p; o = null; SPoint r; object oo = r; } 12/11/2018 Računarski praktikum
36
-------Računarski praktikum 3-------
Vrijednosni tipovi static void Main(string[] args) { SPoint p = new SPoint(); //objekt se kreira pomoću default konstruktora (inicijaliziran je) p = null; // varijabli vrijednosnog tipa se ne može pridružiti null object o = p; // pakiranje tipa u referentni (boxing) o = null; // sad je u redu SPoint r; // ova varijabla je samo deklarirana, a ne i inicijalizirana object oo = r; // pridruživanje neinicijalizirane varijable je greška } 12/11/2018 Računarski praktikum
37
-------Računarski praktikum 3-------
Vrijednosni tipovi Zadatak: koje će se metode pozvati u sljedećem primjeru? struct S { int x, y; public override string ToString() return "U strukturi su " + x + " i " + y; } 12/11/2018 Računarski praktikum
38
-------Računarski praktikum 3-------
Vrijednosni tipovi class Program { static void f(object o) Console.WriteLine("f(object) " + o); } static void f(string s) Console.WriteLine("f(string) " + s); static void Main(string[] args) { S str = new S(); f(str); // pakiranje f(str.ToString()); } 12/11/2018 Računarski praktikum
39
-------Računarski praktikum 3-------
Vrijednosni tipovi 12/11/2018 Računarski praktikum
40
-------Računarski praktikum 3-------
Inicijalizacija Konstruktor ne sadrži inicijalizacijsku listu (kao u C++-u), već se inicijalizacija događa ili implicitno ili direktno pri deklaraciji. class PrvaKlasa { public int i; //implicitna inicijalizacija } class DrugaKlasa public int p=2; public PrvaKlasa pk=new PrvaKlasa(); /* eksplicitna inicijalizacija pri deklaraciji */ class Program { static void Main(string[] args) DrugaKlasa dk=new DrugaKlasa(); Console.WriteLine("{0},{1}", dk.p, dk.pk.i); } Output: 2, 0 12/11/2018 Računarski praktikum
41
-------Računarski praktikum 3-------
Literali Integralni literali koriste decimalnu ili heksadecimalnu notaciju, dok realni koriste decimalnu ili eksponencijalnu notaciju. int x=100, y=0x2B; double a=2.45, b=2E05; Ukoliko literal sadrži decimalnu točku ili E, tretira se kao double. Inače mu se dodjeljuje prvi odgovarajući tip iz liste int, uint, long, ulong. 12/11/2018 Računarski praktikum
42
-------Računarski praktikum 3-------
Literali Pomoću numeričkih sufiksa eksplicitno definiramo tip literala. Najčešće se koriste sufiksi za specificiranje float i decimal literala jer se bez sufiksa literal tretira kao double. To predstavlja problem jer ne postoji implicitna konverzija iz tipa double u tipove decimal i float. float f=3.45; // greška float f=3.45F; //ispravno 12/11/2018 Računarski praktikum
43
-------Računarski praktikum 3-------
Konverzije Float tip se implicitno konvertira u double. Obrnuta konverzija mora biti eksplicitna. Svi integralni tipovi se implicitno konvertiraju u realne. Obrat zahtjeva eksplicitnu konverziju. Napomena: byte, sbyte, short i ushort ne definiraju aritmetičke operatore. Kod tih operacija stoga dolazi do implicitne konverzije u širi tip (int). 12/11/2018 Računarski praktikum
44
-------Računarski praktikum 3-------
Konverzije Zadatak: što ispisuje sljedeći kod? int a = 0; if (a = 1) { } Console.Write(a); 12/11/2018 Računarski praktikum
45
-------Računarski praktikum 3-------
Konverzije Rješenje: kod se ne može kompilirati jer nije definirana implicitna konverzija iz int u bool. Napomena: C++ ispisuje 1. U C#-u if radi samo s bool varijablom: int a = 0; if (a == 1) { } Console.Write(a); // 0 12/11/2018 Računarski praktikum
46
-------Računarski praktikum 3-------
var Ukoliko se varijabla deklarira i inicijalizira u jednom retku, kompilator je ponekad u stanju sam odrediti njezin tip. U tom slučaju nije potrebno navoditi tip varijable, već se on može zamijeniti s ključnom riječi var. var p=4; // ekvivalentno s // int p=4; 12/11/2018 Računarski praktikum
47
Specijalne float i double vrijednosti
Specijalna vrijednost Double konstanta Float konstanta NaN double.NaN float.NaN +∞ Double.PositiveInfinity Float.PositiveInfinity -∞ Double.NegativeInfinity Float.NegativeInfinity -0 -0.0 -0.0f Console.WriteLine (1.0/0.0); // Infinity Console.WriteLine (1/0); // error Console.WriteLine (0.0/0.0); // NaN Console.WriteLine(0.0/0.0 ==double. NaN); // False Console.WriteLine(double.isNan(0.0/0.0)); // True 12/11/2018 Računarski praktikum
48
-------Računarski praktikum 3-------
checked operator Ovaj operator provjerava izraze s +, -, *, /, ++, --, unarnim –. int a= , b= ; int c; ili checked { c=a*b; } int c=checked (a*b); // Unhandled Exception: System.OverflowException: Arithmetic Operation resulted in an overflow 12/11/2018 Računarski praktikum
49
-------Računarski praktikum 3-------
checked operator Primjer 1: static void Main(string[] args) { int x = , y = ; int z = x * y; Console.Write(z); // unchecked int xx = , yy = ; int zz = xx * yy; Console.Write(zz); // } 12/11/2018 Računarski praktikum
50
-------Računarski praktikum 3-------
checked operator try { checked int a = , b = ; int c = a * b; Console.Write(c); } catch (OverflowException e) { Console.WriteLine("Uhvatio overflow"); } catch (Exception e) {Console.WriteLine(e.ToString()); } 12/11/2018 Računarski praktikum
51
-------Računarski praktikum 3-------
checked operator Primjer 2: static void Main(string[] args) { checked try int a = , b = ; int c = unchecked(a * b); // poništava checked Console.Write(c); } catch (OverflowException e) Console.WriteLine("Uhvatio overflow"); 12/11/2018 Računarski praktikum
52
-------Računarski praktikum 3-------
Enumeracije Enumeracija je vrijednosni tip koji grupira imenovane numeričke konstante. class Program { enum RadniDani { Pon, Uto, Sri, Cet, Pet }; static void Main(string[] args) RadniDan zadnjiDan = RadniDan.Pet; } 12/11/2018 Računarski praktikum
53
-------Računarski praktikum 3-------
Enumeracije Svakom članu enumeracije je implicitno pridružena integralna vrijednost tipa int (konkretno radi se o vrijednostima 0,1,2,… u skladu s poretkom pri deklaraciji). Pridruženi integralni tip i pripadne vrijednosti se mogu i promijeniti. Ukoliko eksplicitno promijenimo pridruženu vrijednost nekoj od konstanti, vrijednost sljedećih se uvećava za po jedan (ako nisu eksplicitno zadane). enum RadniDani : byte { Pon=1, Uto, Sri, Cet, Pet }; //Promijenili smo pridruženi integralni tip u byte. // Pridružene vrijednosti su redom1, 2, 3, 4, 5. 12/11/2018 Računarski praktikum
54
-------Računarski praktikum 3-------
Enumeracije class Program { enum RadniDani : byte { Pon, Uto, Sri, Cet, Pet }; static void Main(string[] args) RadniDani zadnjiDan = RadniDani.Pet; byte b = (byte)zadnjiDan; RadniDani r = (RadniDani)b; Console.WriteLine(zadnjiDan); } 12/11/2018 Računarski praktikum
55
-------Računarski praktikum 3-------
Polja Polja predstavljaju fiksan broj elemenata određenog tipa smještenih uzastopno u memoriji. char[ ] samoglasnici = new char[5]; samoglasnici[0]=‘a’; samoglasnici[1]=‘e’; samoglasnici[2]=‘i’; samoglasnici[3]=‘o’; samoglasnici[4]=‘u’; char[ ] samoglasnici = new char[ ] {‘a’, ‘e’, ‘i’, ‘o’, ‘u’}; ili char[ ] samoglasnici = {‘a’, ‘e’, ‘i’, ‘o’, ‘u’}; ili 12/11/2018 Računarski praktikum
56
-------Računarski praktikum 3-------
Array Sva polja izvedena su iz System.Array (klasa System.Array je apstraktna, tj. ne može se instancirati). Možemo deklarirati polje samoglasnici s char[] samoglasnici; Da bismo zauzeli mjesto na heap-u, moramo koristiti operator new samoglasnici = new char[5]; 12/11/2018 Računarski praktikum
57
-------Računarski praktikum 3-------
Array Klasa System.Array definira uobičajene metode i svojstva za sva polja. Sadrži svojstva Length i Rank i statičke metode CreateInstance, GetValue, SetValue, Sort, Copy, IndexOf, LastIndexOf, Find, FindIndex, FindLastIndex, ... Matrice također implementiraju sučelje IEnumerable<T>, stoga je moguće koristiti foreach za iteriranje po elementima foreach (c in samoglasnici) Console.Write(c); //aeiou 12/11/2018 Računarski praktikum
58
Višedimenzionalna polja
Višedimenzionalna polja mogu biti: Pravokutna int [ , ] matrica = new int [2,3]; 2. Neravnomjerna int[ ][ ] matrica= new int [3][ ]; 12/11/2018 Računarski praktikum
59
Višedimenzionalna polja
Pravokutno polje može biti inicijalizirano na sljedeći način: int[ , ] matrix = new int[ , ] { {0, 2, 4}, {3, 6, 9}, {3, 7, 8} }; int[ , ] matrix = { {0, 2, 4}, {3, 6, 9}, {3, 7, 8} }; ili kraće: 12/11/2018 Računarski praktikum
60
Višedimenzionalna polja
Kod neravnomjernih polja inicijalizacija se vrši ovako: int[ ][ ] matrix = new int[ ][ ] { new int[] {0, 2, 4, 5, 7}, new int[] {3, 6, 9}, new int[] {3, 7, 8, 3} }; int[ ][ ] matrix = { new int[ ] {0, 2, 4, 5, 7}, new int[ ] {3, 6, 9}, new int[ ] {3, 7, 8, 3} }; ili 12/11/2018 Računarski praktikum
61
Inicijalizacija polja
struct SPoint { public int X; public int Y; } class Program static void Main() SPoint[ ] p=new SPoint[50]; int a=p[20].X; // 0 Struktura je vrijednosni tip, dakle vrijednosti svih elemenata se smatraju dijelom polja p, tj. moraju biti alocirane kao dio polja. Automatski im se dodjeljuje vrijednost 0. 12/11/2018 Računarski praktikum
62
Inicijalizacija polja
class CPoint { public int X; public int Y; } class Program static void Main() CPoint[ ] p=new CPoint[50]; int a=p[20].X; //NullReferenceException Klasa je referentni tip pa kreiranjem polja p alociramo 50 referenci koje se postavljaju na null. Trebalo bi stoga instancirati svaki od objekata posebno: for (int i=0; i<p.Length,++i) p[i]= new Point(); 12/11/2018 Računarski praktikum
63
Inicijalizacija polja
Zadatak: što ispisuje sljedeći kod (popravite greške)? class C { public int broj;} class Program { static void Main(string[] args) C obj1; Console.WriteLine("{0}, {1}", obj1.broj, obj1 == null); C obj2 = new C(); Console.WriteLine("{0}, {1}", obj2.broj, obj2 == null); C[] polje=new C[3]; Console.WriteLine("{0}, {1}", polje[0].broj, polje[0] == null); } 12/11/2018 Računarski praktikum
64
Inicijalizacija polja
class C { public int broj;} class Program { static void Main(string[] args) C obj1; // Console.WriteLine("{0}, {1}", obj1.broj, obj1 == null); C obj2 = new C(); Console.WriteLine("{0}, {1}", obj2.broj, obj2 == null); C[] polje=new C[3]; //Console.WriteLine("{0}, {1}", polje[0].broj, polje[0] == null); Console.WriteLine(polje[0] == null); } Varijabla obj1 nije inicijalizirana. Članovi polja su automatski inicijalizirani na null. 12/11/2018 Računarski praktikum
65
-------Računarski praktikum 3-------
Array Napomena: Pri izvršavanju se provjeravaju sve granice polja. Ukoliko se pokuša dohvatiti indeks izvan granica, baca se IndexOutOfRangeException iznimka. Provjeravanje se može izbjeći samo u unsafe kodu: unsafe { int* a = stackalloc int[100]; Console.Write("{0}, {1}", a[0], a[100]); } 12/11/2018 Računarski praktikum
66
-------Računarski praktikum 3-------
Array static void Main(string[] args) { int[] p = new int[3]; try Console.WriteLine(p[2]); Console.WriteLine(p[4]); // baca se iznimka } catch(IndexOutOfRangeException e) Console.WriteLine("Indeks izvan dopustenog"); 12/11/2018 Računarski praktikum
67
-------Računarski praktikum 3-------
Array, List Tip Array ima fiksnu veličinu. Ukoliko je potrebno dinamički povećavati broj objekata, koristi se klasa List (List<T>) za koju nije potrebno prethodno definirati broj objekata koje će sadržavati. Dodavanje objekata vrši se metodom Add. 12/11/2018 Računarski praktikum
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.