RP 3predavanje 02 Programski jezik C q Tipovi

  • Slides: 67
Download presentation
RP 3/predavanje 02 Programski jezik C#: q Tipovi 22/11/2020 ----- Računarski praktikum 3 -----Maja

RP 3/predavanje 02 Programski jezik C#: q Tipovi 22/11/2020 ----- Računarski praktikum 3 -----Maja Starčević 1

Primjer C# programa using System; class Test { static void Main( ) { int

Primjer C# programa using System; class Test { static void Main( ) { int x=26; Console. Write. Line(x); } } 22/11/2020 Uključivanje imeničkog prostora. Using se koristi samo za prostore, ne i za tipove. Dakle, greška je pisati: using System. Console; Definicija klase Definicija metode Console=System. Console -------Računarski praktikum 3 ------- 2

Primjer C# programa Konzolna aplikacija u Visual Studiu: using System; using System. Collections. Generic;

Primjer C# programa Konzolna aplikacija u Visual Studiu: using System; using System. Collections. Generic; using System. Linq; using System. Text; namespace Console. Application 1 { class Program { static void Main(string[ ] args) { ……. . } } } 22/11/2020 -------Računarski praktikum 3 ------- 3

Ključne riječi 22/11/2020 abstract add alias as ascending base bool break by byte case

Ključne riječi 22/11/2020 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 foreach -------Računarski praktikum 3 ------- 4

Ključne riječi 22/11/2020 from get global goto group if implicit in into interface internal

Ključne riječi 22/11/2020 from get global goto group if implicit in 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 -------Računarski praktikum 3 ------- 5

Ključne riječi sealed select set short sizeof stackalloc static string struct switch this throw

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 where yield 22/11/2020 -------Računarski praktikum 3 ------- 6

Ključne riječi Napomena: ključna riječ se može koristiti kao identifikator s @ prefiksom, npr:

Ključne riječi Napomena: ključna riječ se može koristiti kao identifikator s @ prefiksom, npr: class @class { … }. 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. 22/11/2020 -------Računarski praktikum 3 ------- 7

Identifikatori Kod identifikatora (imena varijabli, funkcija, klasa…) razlikujemo velika i mala slova. Uobičajeno je

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. prva. Klasa, broj. Ucitanih. Podataka …). Ostale identifikatore pišemo koristeći Pascal notaciju (npr. Moja. Prva. Metoda). 22/11/2020 -------Računarski praktikum 3 ------- 8

Kontrola toka se vrši jednako kao i u C++-u pomoću ključnih riječi for, while,

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. 22/11/2020 -------Računarski praktikum 3 -------

Switch 22/11/2020 string[] dani = { "Pon", "Uto", "Sri", "Cet", "Pet", "Sub" }; foreach

Switch 22/11/2020 string[] dani = { "Pon", "Uto", "Sri", "Cet", "Pet", "Sub" }; foreach (string dan in dani) { switch (dan) { case "Pon": Console. Write. Line("Radno vrijeme : 8 -17"); break; case "Uto": case "Sri": Console. Write. Line("Radno vrijeme : 8 -20"); break; case "Cet": goto case "Pon"; case "Pet": Console. Write. Line("Radno vrijeme : 8 -15"); break; default: Console. Write. Line("Niste odabrali radni dan"); break; } } -------Računarski praktikum 3 ------- Ako izbacimo break, kompilator javlja grešku.

Tipovi Vrijednosni tipovi: o Cjelobrojni s predznakom: sbyte, short, int, long o Cjelobrojni bez

Tipovi Vrijednosni tipovi: o Cjelobrojni s predznakom: sbyte, short, int, long o Cjelobrojni bez predznaka: byte, ushort, uint, ulong o Realni: float, double, decimal o Logički: bool o Znakovni: char o Strukture: struct o Enumeracije: enum 22/11/2020 Referentni tipovi: o Klase: class o Delegati: delegate o Sučelja: interface Pokazivački tipovi -------Računarski praktikum 3 -------

Tipovi Napomena: svi vrijednosni tipovi (osim enumeracija) su u biti strukture. Vrijednosni tipovi su

Tipovi Napomena: svi vrijednosni tipovi (osim enumeracija) su u biti strukture. Vrijednosni tipovi su izvedeni iz System. Value. Type klase koja direktno nasljeđuje klasu System. Object. Bazna klasa za enumeracije je System. Enum koja isto nasljeđuje System. Value. Type. Klase Value. Type i Enum su apstraktne klase. 22/11/2020 -------Računarski praktikum 3 -------

. NET tipovi C# tip 22/11/2020 . NET tip Sufiks Veličina (bit) Raspon sbyte

. NET tipovi C# tip 22/11/2020 . NET tip Sufiks Veličina (bit) Raspon sbyte System. Sbyte 8 -2^7 do 2^7 -1 short System. Int 16 16 -2^15 do 2^15 -1 int System. Int 32 32 -2^31 do 2^31 -1 long System. Int 64 64 -2^63 do 2^63 -1 byte System. Byte 8 0 do 2^8 -1 ushort System. UInt 16 16 0 do 2^16 -1 uint System. UInt 32 32 0 do 2^32 -1 L U -------Računarski praktikum 3 ------- 13

. NET tipovi C# tip . NET tip Sufiks Veličina (bit) Raspon ulong System.

. NET tipovi C# tip . NET tip Sufiks Veličina (bit) Raspon ulong System. UInt 64 UL 64 0 do 2^64 -1 float System. Single F 32 ±(~10^(-45) do 10^38) double System. Double D 64 ±(~10^(-324) do 10^308) decimal System. Decimal M 128 ±(~10^(-28) do 10^28) char System. Char 2 bool System. Boolean 2 22/11/2020 -------Računarski praktikum 3 ------- true, false 14

Vrijednosni tipovi Varijable ili konstante vrijednosnog tipa su naprosto vrijednosti. Definicija strukture SPoint: public

Vrijednosni tipovi Varijable ili konstante vrijednosnog tipa su naprosto vrijednosti. Definicija strukture SPoint: public struct SPoint { X public int X; public int Y; } 22/11/2020 Instanca strukture SPoint u memoriji: Članovi strukture su implicitno private ! -------Računarski praktikum 3 ------- Y 15

Vrijednosni tipovi Operator new nije nužan. Možemo zamijeniti s: Point p 1; Međutim, u

Vrijednosni tipovi Operator new nije nužan. Možemo zamijeniti s: Point p 1; Međutim, u tom slučaju varijable strukture nisu inicijalizirane. Moramo ih inicijalizirati prije pristupa. SPoint p 1=new SPoint (); p 1. X=2; SPoint p 2=p 1; Console. Write. Line(p 1. X); Console. Write. Line(p 2. X); // 2 p 1. X=5; Console. Write. Line(p 1. X); // 5 Console. Write. Line(p 2. X); // 2 Pridruživanjem instance vrijednosnog tipa zapravo se vrši kopiranje vrijednosti instance. Ne utječe na p 2. 22/11/2020 -------Računarski praktikum 3 ------- 16

Vrijednosni tipovi U memoriji imamo na kraju sljedeće: p 1 22/11/2020 p 2 5

Vrijednosni tipovi U memoriji imamo na kraju sljedeće: p 1 22/11/2020 p 2 5 2 0 0 -------Računarski praktikum 3 ------- 17

Ugrađeni tipovi U C#-u tip int je isto što i System. Int 32 koji

Ugrađeni tipovi U C#-u tip int je isto što i System. Int 32 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. Int 32 (pritom moramo koristiti ime tipa, System. Int 32 ili int) te ćemo pozvati jednu metodu. int i = int. Max. Value; int j = int. Min. Value; Console. Write. Line(i. Compare. To(j)); 22/11/2020 -------Računarski praktikum 3 ------- 18

Referentni tipovi Referentni tip je nešto složeniji od vrijednosnog tipa jer se uz objekt

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 { referenca public int X; public int Y; X } 22/11/2020 Metapodaci objekta Y -------Računarski praktikum 3 ------- 19

Referentni tipovi CPoint p 1=new CPoint (); p 1. X=2; CPoint p 2=p 1;

Referentni tipovi CPoint p 1=new CPoint (); p 1. X=2; CPoint p 2=p 1; Console. Write. Line(p 1. X); Console. Write. Line(p 2. X); // 2 Kopiranje reference (p 1 i p 2 su reference na isti objekt) p 1. X=5; Console. Write. Line(p 1. X); // 5 Console. Write. Line(p 2. X); //5 22/11/2020 -------Računarski praktikum 3 ------- 20

Referentni tipovi Prikaz u memoriji: Referenca p 1 Metapodaci objekta Referenca p 2 5

Referentni tipovi Prikaz u memoriji: Referenca p 1 Metapodaci objekta Referenca p 2 5 0 22/11/2020 -------Računarski praktikum 3 ------- 21

Null Referenci se može dodijeliti literal null. U tom slučaju referenca ne pokazuje ni

Null Referenci se može dodijeliti literal null. U tom slučaju referenca ne pokazuje ni na jedan objekt. Point p=null; Console. Write. Line (p. X) //error Vrijednosnim tipovima se ne može dodijeliti vrijednost null. Napomena: vidi “nullable” tipove. 22/11/2020 -------Računarski praktikum 3 ------- 22

Pokazivači C# pruža podršku i za direktno upravljanje memorijom pomoću pokazivača međutim blokovi koda

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 } 22/11/2020 -------Računarski praktikum 3 ------- 23

Memorijski blokovi Stog (stack) je memorijski blok za pohranu varijabli (objekata kod vrijednosnih tipova,

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. 22/11/2020 -------Računarski praktikum 3 ------- 24

Memorijski blokovi Na heap se također smještaju i statičke varijable članice, kao i konstante

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). 22/11/2020 -------Računarski praktikum 3 ------- 25

Lokalne varijable Nije dozvoljeno deklarirati varijablu istog imena u istom ili ugniježdenom bloku: static

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 } 22/11/2020 -------Računarski praktikum 3 ------- 26

Inicijalizacija Izvan unsafe konteksta nemoguće je pristupiti neinicijaliziranoj memoriji. Konkretno: o Lokalnim varijablama se

Inicijalizacija Izvan unsafe konteksta nemoguće je pristupiti neinicijaliziranoj memoriji. Konkretno: o Lokalnim varijablama se mora dodijeliti vrijednost prije čitanja. o Argumentima funkcije se mora dodijeliti vrijednost prije poziva funkcije. o Automatski se inicijaliziraju elementi polja (polje je zapravo samo specijalan primjer klase). 22/11/2020 -------Računarski praktikum 3 ------- 27

Inicijalizacija Zadatak: Što će ispisati sljedeći kod? class Program { static void Main(string[] args)

Inicijalizacija Zadatak: Što će ispisati sljedeći kod? class Program { static void Main(string[] args) { string s; int i; int[] matrica = new int[4]; Klasa k = new Klasa(); Console. Write. Line("{0}, {1}, {2}, {3}", i, s, k. i, k. s); class Klasa { public int i; public string s; } 22/11/2020 foreach (int j in matrica) Console. Write. Line(j); } } -------Računarski praktikum 3 ------- 28

Inicijalizacija Odgovor: Kompilator javlja grešku (lokalnim varijablama nije dodijeljena vrijednost prije čitanja). class Program

Inicijalizacija Odgovor: Kompilator javlja grešku (lokalnim varijablama nije dodijeljena vrijednost prije čitanja). class Program { static void Main(string[] args) { string s=“neki tekst”; int i=13; int[] matrica = new int[4]; Klasa k = new Klasa(); Console. Write. Line("{0}, {1}, {2}, {3}", i, s, k. i, k. s); foreach (int j in matrica) Console. Write. Line(j); Popravimo } } 22/11/2020 -------Računarski praktikum 3 ------- 29

Inicijalizacija Nakon ispravljanja koda, izlaz je sljedeći: 13, neki tekst, 0, 0 0 k.

Inicijalizacija Nakon ispravljanja koda, izlaz je sljedeći: 13, neki tekst, 0, 0 0 k. s=null 0 0 Primijetimo da su elementi polja matrica automatski inicijalizirani na 0. Automatski su inicijalizirani i članovi objekta k. 22/11/2020 -------Računarski praktikum 3 ------- 30

Inicijalizacija Vrijednosti za p. X i p. Y class Program su dodijeljene { preko

Inicijalizacija Vrijednosti za p. X i p. Y class Program su dodijeljene { preko (implicitno static void Main(string[] args) definiranog) { konstruktora strukture. Lokalnoj varijabli t nisu SPoint p=new SPoint(); dodijeljene vrijednosti SPoint t; prije čitanja. Console. Write. Line("{0}, {1}", p. X, p. Y); struct SPoint { public int X; public int Y; } 22/11/2020 Console. Write. Line("{0}, {1}", t. X, t. Y); } } error -------Računarski praktikum 3 ------- 31

Inicijalizacija Kompilator javlja grešku class Program za prethodni kod. { Moramo dodijeliti static void

Inicijalizacija Kompilator javlja grešku class Program za prethodni kod. { Moramo dodijeliti static void Main(string[] args) vrijednosti za { t. X i t. Y. SPoint p=new SPoint(); SPoint t; t. X=1; t. Y=2; struct SPoint Console. Write. Line("{0}, {1}", p. X, p. Y); { Console. Write. Line("{0}, {1}", t. X, t. Y); public int X; } Output: 0, 0 public int Y; } 1, 2 } 22/11/2020 -------Računarski praktikum 3 ------- 32

Tip object System. Object je najviše rangirana temeljna klasa za sve tipove. Sadrži sljedeće

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 Get. Type ( ); public virtual bool Equals (object obj); public static bool Equals (object obj. A, object obj. B); public static bool Reference. Equals (object obj. A, object obj. B); public virtual int Get. Hash. Code( ); public virtual string To. String( ); protected override void Finalize( ); protected extern object Memberwise. Clone( ); } 22/11/2020 -------Računarski praktikum 3 ------- 33

Pakiranje (engl. boxing) nam omogućava da vrijednosni tip pretvorimo u referentni. Konkretno, vrijednost pakiramo

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; // object o=i; int k = (int)o; //pakiramo int u object eksplicitno // možemo to napraviti i implicitno //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 Invalid. Cast. Exception). Pakiranje se smatra skupom operacijom. 22/11/2020 -------Računarski praktikum 3 ------- 34

Vrijednosni tipovi Zadatak: pronađite greške u kodu. static void Main(string[] args) { SPoint p

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; } 22/11/2020 -------Računarski praktikum 3 ------- 35

Vrijednosni tipovi static void Main(string[] args) { SPoint p = new SPoint(); //objekt se

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 } 22/11/2020 -------Računarski praktikum 3 ------- 36

Vrijednosni tipovi Zadatak: koje će se metode pozvati u sljedećem primjeru? struct S {

Vrijednosni tipovi Zadatak: koje će se metode pozvati u sljedećem primjeru? struct S { int x, y; public override string To. String() { return "U strukturi su " + x + " i " + y; } } 22/11/2020 -------Računarski praktikum 3 ------- 37

Vrijednosni tipovi class Program { static void Main(string[] args) { static void f(object o)

Vrijednosni tipovi class Program { static void Main(string[] args) { static void f(object o) { Console. Write. Line("f(object) " + o); } S str = new S(); f(str); // pakiranje f(str. To. String()); } static void f(string s) { Console. Write. Line("f(string) " + s); } 22/11/2020 } -------Računarski praktikum 3 ------- 38

Vrijednosni tipovi 22/11/2020 -------Računarski praktikum 3 ------- 39

Vrijednosni tipovi 22/11/2020 -------Računarski praktikum 3 ------- 39

Inicijalizacija Konstruktor ne sadrži inicijalizacijsku listu (kao u C++-u), već se inicijalizacija događa ili

Inicijalizacija Konstruktor ne sadrži inicijalizacijsku listu (kao u C++-u), već se inicijalizacija događa ili implicitno ili direktno pri deklaraciji. class Prva. Klasa { public int i; //implicitna inicijalizacija } class Druga. Klasa { public int p=2; public Prva. Klasa pk=new Prva. Klasa(); /* eksplicitna inicijalizacija pri deklaraciji */ } 22/11/2020 class Program { static void Main(string[] args) { Druga. Klasa dk=new Druga. Klasa(); Console. Write. Line("{0}, {1}", dk. pk. i); } } -------Računarski praktikum 3 ------- Output: 2, 0 40

Literali Integralni literali koriste decimalnu ili heksadecimalnu notaciju, dok realni koriste decimalnu ili eksponencijalnu

Literali Integralni literali koriste decimalnu ili heksadecimalnu notaciju, dok realni koriste decimalnu ili eksponencijalnu notaciju. int x=100, y=0 x 2 B; double a=2. 45, b=2 E 05; 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. 22/11/2020 -------Računarski praktikum 3 ------- 41

Literali Pomoću numeričkih sufiksa eksplicitno definiramo tip literala. Najčešće se koriste sufiksi za specificiranje

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 f=3. 45; // greška float f=3. 45 F; //ispravno 22/11/2020 -------Računarski praktikum 3 ------- 42

Konverzije Float tip se implicitno konvertira u double. Obrnuta konverzija mora biti eksplicitna. Svi

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, short i ushort ne definiraju aritmetičke operatore. Kod tih operacija stoga dolazi do implicitne konverzije u širi tip (int). 22/11/2020 -------Računarski praktikum 3 ------- 43

Konverzije Zadatak: što ispisuje sljedeći kod? int a = 0; if (a = 1)

Konverzije Zadatak: što ispisuje sljedeći kod? int a = 0; if (a = 1) { } Console. Write(a); 22/11/2020 -------Računarski praktikum 3 ------- 44

Konverzije Rješenje: kod se ne može kompilirati jer nije definirana implicitna konverzija iz int

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); 22/11/2020 // 0 -------Računarski praktikum 3 ------- 45

var Ukoliko se varijabla deklarira i inicijalizira u jednom retku, kompilator je ponekad u

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 p=4; // ekvivalentno s // int p=4; 22/11/2020 -------Računarski praktikum 3 ------- 46

Specijalne float i double vrijednosti Specijalna vrijednost Double konstanta Float konstanta Na. N double.

Specijalne float i double vrijednosti Specijalna vrijednost Double konstanta Float konstanta Na. N double. Na. N float. Na. N +∞ Double. Positive. Infinity Float. Positive. Infinity -∞ Double. Negative. Infinity Float. Negative. Infinity -0 -0. 0 f Console. Write. Line (1. 0/0. 0); // Infinity Console. Write. Line (1/0); // error Console. Write. Line (0. 0/0. 0); // Na. N Console. Write. Line(0. 0/0. 0 ==double. Na. N); // False Console. Write. Line(double. is. Nan(0. 0/0. 0)); // True 22/11/2020 -------Računarski praktikum 3 ------- 47

checked operator Ovaj operator provjerava izraze s +, -, *, /, ++, --, unarnim

checked operator Ovaj operator provjerava izraze s +, -, *, /, ++, --, unarnim –. int a=1000000, b=1000000; int c; checked { c=a*b; } ili int c=checked (a*b); // Unhandled Exception: System. Overflow. Exception: Arithmetic Operation resulted in an overflow 22/11/2020 -------Računarski praktikum 3 ------- 48

checked operator Primjer 1: static void Main(string[] args) { int x = 1000000, y

checked operator Primjer 1: static void Main(string[] args) { int x = 1000000, y = 1000000; int z = x * y; Console. Write(z); unchecked { int xx = 1000000, yy = 1000000; int zz = xx * yy; Console. Write(zz); } 22/11/2020 -------Računarski praktikum 3 ------- // -727379968 49

checked operator try { checked { int a = 1000000, b = 1000000; int

checked operator try { checked { int a = 1000000, b = 1000000; int c = a * b; Console. Write(c); } } catch (Overflow. Exception e) { Console. Write. Line("Uhvatio overflow"); } catch (Exception e) {Console. Write. Line(e. To. String()); } } 22/11/2020 -------Računarski praktikum 3 ------- 50

checked operator Primjer 2: static void Main(string[] args) { checked { try { int

checked operator Primjer 2: static void Main(string[] args) { checked { try { int a = 1000000, b = 1000000; int c = unchecked(a * b); // poništava checked Console. Write(c); } catch (Overflow. Exception e) { Console. Write. Line("Uhvatio overflow"); } } } 22/11/2020 -------Računarski praktikum 3 ------- 51

Enumeracije Enumeracija je vrijednosni tip koji grupira imenovane numeričke konstante. class Program { enum

Enumeracije Enumeracija je vrijednosni tip koji grupira imenovane numeričke konstante. class Program { enum Radni. Dani { Pon, Uto, Sri, Cet, Pet }; static void Main(string[] args) { Radni. Dan zadnji. Dan = Radni. Dan. Pet; } } 22/11/2020 -------Računarski praktikum 3 ------- 52

Enumeracije Svakom članu enumeracije je implicitno pridružena integralna vrijednost tipa int (konkretno radi se

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 Radni. Dani : byte { Pon=1, Uto, Sri, Cet, Pet }; //Promijenili smo pridruženi integralni tip u byte. // Pridružene vrijednosti su redom 1, 2, 3, 4, 5. 22/11/2020 -------Računarski praktikum 3 ------- 53

Enumeracije class Program { enum Radni. Dani : byte { Pon, Uto, Sri, Cet,

Enumeracije class Program { enum Radni. Dani : byte { Pon, Uto, Sri, Cet, Pet }; static void Main(string[] args) { Radni. Dani zadnji. Dan = Radni. Dani. Pet; byte b = (byte)zadnji. Dan; Radni. Dani r = (Radni. Dani)b; Console. Write. Line(zadnji. Dan); } } 22/11/2020 -------Računarski praktikum 3 ------- 54

Polja predstavljaju fiksan broj elemenata određenog tipa smještenih uzastopno u memoriji. char[ ] samoglasnici

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’; 22/11/2020 ili char[ ] samoglasnici = new char[ ] {‘a’, ‘e’, ‘i’, ‘o’, ‘u’}; ili char[ ] samoglasnici = {‘a’, ‘e’, ‘i’, ‘o’, ‘u’}; -------Računarski praktikum 3 ------- 55

Array Sva polja izvedena su iz System. Array (klasa System. Array je apstraktna, tj.

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]; 22/11/2020 -------Računarski praktikum 3 ------- 56

Array Klasa System. Array definira uobičajene metode i svojstva za sva polja. Sadrži svojstva

Array Klasa System. Array definira uobičajene metode i svojstva za sva polja. Sadrži svojstva Length i Rank i statičke metode Create. Instance, Get. Value, Sort, Copy, Index. Of, Last. Index. Of, Find. Index, Find. Last. Index, . . . 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 22/11/2020 -------Računarski praktikum 3 ------- 57

Višedimenzionalna polja mogu biti: 1. Pravokutna int [ , ] matrica = new int

Višedimenzionalna polja mogu biti: 1. Pravokutna int [ , ] matrica = new int [2, 3]; 2. Neravnomjerna int[ ][ ] matrica= new int [3][ ]; 22/11/2020 -------Računarski praktikum 3 ------- 58

Višedimenzionalna polja Pravokutno polje može biti inicijalizirano na sljedeći način: int[ , ] matrix

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} }; ili kraće: 22/11/2020 int[ , ] matrix = { {0, 2, 4}, {3, 6, 9}, {3, 7, 8} }; -------Računarski praktikum 3 ------- 59

Višedimenzionalna polja Kod neravnomjernih polja inicijalizacija se vrši ovako: int[ ][ ] matrix =

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} }; 22/11/2020 ili -------Računarski praktikum 3 ------- int[ ][ ] matrix = { new int[ ] {0, 2, 4, 5, 7}, new int[ ] {3, 6, 9}, new int[ ] {3, 7, 8, 3} }; 60

Inicijalizacija polja struct SPoint { public int X; public int Y; } class Program

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 } } 22/11/2020 -------Računarski praktikum 3 ------- 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. 61

Inicijalizacija polja class CPoint { public int X; public int Y; } class Program

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; //Null. Reference. Exception } } 22/11/2020 -------Računarski praktikum 3 ------- 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(); 62

Inicijalizacija polja Zadatak: što ispisuje sljedeći kod (popravite greške)? class C { public int

Inicijalizacija polja Zadatak: što ispisuje sljedeći kod (popravite greške)? class C { public int broj; } class Program { static void Main(string[] args) { C obj 1; Console. Write. Line("{0}, {1}", obj 1. broj, obj 1 == null); C obj 2 = new C(); Console. Write. Line("{0}, {1}", obj 2. broj, obj 2 == null); C[] polje=new C[3]; Console. Write. Line("{0}, {1}", polje[0]. broj, polje[0] == null); } } 22/11/2020 -------Računarski praktikum 3 ------- 63

Inicijalizacija polja class C { public int broj; } class Program { static void

Inicijalizacija polja class C { public int broj; } class Program { static void Main(string[] args) { C obj 1; // Console. Write. Line("{0}, {1}", obj 1. broj, obj 1 == null); Varijabla obj 1 nije inicijalizirana C obj 2 = new C(); Console. Write. Line("{0}, {1}", obj 2. broj, obj 2 == null); C[] polje=new C[3]; //Console. Write. Line("{0}, {1}", polje[0]. broj, polje[0] == null); Console. Write. Line(polje[0] == null); } } 22/11/2020 -------Računarski praktikum 3 ------- Članovi polja su automatski inicijalizirani na null. 64

Array Napomena: Pri izvršavanju se provjeravaju sve granice polja. Ukoliko se pokuša dohvatiti indeks

Array Napomena: Pri izvršavanju se provjeravaju sve granice polja. Ukoliko se pokuša dohvatiti indeks izvan granica, baca se Index. Out. Of. Range. Exception 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]); } 22/11/2020 -------Računarski praktikum 3 ------- 65

Array static void Main(string[] args) { int[] p = new int[3]; try { Console.

Array static void Main(string[] args) { int[] p = new int[3]; try { Console. Write. Line(p[2]); Console. Write. Line(p[4]); // baca se iznimka } catch(Index. Out. Of. Range. Exception e) { Console. Write. Line("Indeks izvan dopustenog"); } } 22/11/2020 -------Računarski praktikum 3 ------- 66

Array, List Tip Array ima fiksnu veličinu. Ukoliko je potrebno dinamički povećavati broj objekata,

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. 22/11/2020 -------Računarski praktikum 3 ------- 67