Presentation is loading. Please wait.

Presentation is loading. Please wait.

RP3/predavanje02 Programski jezik C#: Tipovi 12/11/2018

Similar presentations


Presentation on theme: "RP3/predavanje02 Programski jezik C#: Tipovi 12/11/2018"— Presentation transcript:

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


Download ppt "RP3/predavanje02 Programski jezik C#: Tipovi 12/11/2018"

Similar presentations


Ads by Google