predavanje02

Download Report

Transcript predavanje02

RP3/predavanje02
Programski jezik C#:
 Tipovi
13/04/2015
---------- Računarski praktikum 3 ---------Maja Starčević
1
Primjer C# programa
using System;
class Test
{
static void Main( )
{
int x=26;
Console.WriteLine(x);
}
}
13/04/2015
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;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[ ] args)
{
……..
}
}
}
13/04/2015
-------Računarski praktikum 3-------
3
Ključne riječi
13/04/2015
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
-------Računarski praktikum 3-------
4
Ključne riječi
13/04/2015
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
-------Računarski praktikum 3-------
5
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
13/04/2015
-------Računarski praktikum 3-------
6
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.
13/04/2015
-------Računarski praktikum 3-------
7
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).
13/04/2015
-------Računarski praktikum 3-------
8
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.
13/04/2015
-------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");
break;
case "Cet":
goto case "Pon";
case "Pet":
Console.WriteLine("Radno vrijeme : 8-15");
break;
default:
Console.WriteLine("Niste odabrali radni dan");
break;
}
}
13/04/2015
-------Računarski praktikum 3-------
Ako izbacimo
break, kompilator
javlja grešku.
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
13/04/2015
Referentni tipovi:
 Klase: class
 Delegati: delegate
 Sučelja: interface
Pokazivački tipovi
-------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.
13/04/2015
-------Računarski praktikum 3-------
.NET tipovi
C# tip
13/04/2015
.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
64
-2^63 do 2^63-1
byte
System.Byte
8
0 do 2^8-1
ushort
System.UInt16
16
0 do 2^16-1
uint
System.UInt32
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.UInt64
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
13/04/2015
-------Računarski praktikum 3-------
true, false
14
Vrijednosni tipovi
Varijable ili konstante vrijednosnog tipa su naprosto
vrijednosti.
Definicija strukture SPoint:
Instanca strukture
SPoint u memoriji:
public struct SPoint
{
X
public int X;
public int Y;
}
13/04/2015
Članovi strukture
su implicitno
private !
-------Računarski praktikum 3-------
Y
15
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);
Console.WriteLine(p2.X);
// 2
// 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.
13/04/2015
-------Računarski praktikum 3-------
16
Vrijednosni tipovi
U memoriji imamo na kraju sljedeće:
p1
13/04/2015
p2
5
2
0
0
-------Računarski praktikum 3-------
17
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));
13/04/2015
-------Računarski praktikum 3-------
18
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
}
13/04/2015
Metapodaci
objekta
Y
-------Računarski praktikum 3-------
19
Referentni tipovi
CPoint p1=new CPoint ();
p1.X=2;
CPoint p2=p1;
Console.WriteLine(p1.X);
Console.WriteLine(p2.X);
// 2
// 2
Kopiranje reference
(p1 i p2 su reference
na isti objekt)
p1.X=5;
Console.WriteLine(p1.X); // 5
Console.WriteLine(p2.X); //5
13/04/2015
-------Računarski praktikum 3-------
20
Referentni tipovi
Prikaz u memoriji:
Referenca p1
Metapodaci
objekta
Referenca p2
5
0
13/04/2015
-------Računarski praktikum 3-------
21
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.
13/04/2015
-------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 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
}
13/04/2015
-------Računarski praktikum 3-------
23
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.
13/04/2015
-------Računarski praktikum 3-------
24
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).
13/04/2015
-------Računarski praktikum 3-------
25
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
}
13/04/2015
-------Računarski praktikum 3-------
26
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).
13/04/2015
-------Računarski praktikum 3-------
27
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.WriteLine("{0}, {1}, {2}, {3}", i, s, k.i, k.s);
class Klasa
{
public int i;
public string s;
}
13/04/2015
foreach (int j in matrica)
Console.WriteLine(j);
}
}
-------Računarski praktikum 3-------
28
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.WriteLine("{0}, {1}, {2}, {3}", i, s, k.i, k.s);
foreach (int j in matrica)
Console.WriteLine(j);
Popravimo
}
}
13/04/2015
-------Računarski praktikum 3-------
29
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.
13/04/2015
-------Računarski praktikum 3-------
30
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.WriteLine("{0}, {1}", p.X, p.Y);
struct SPoint
{
public int X;
public int Y;
}
13/04/2015
Console.WriteLine("{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 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.WriteLine("{0}, {1}", p.X, p.Y);
{
Console.WriteLine("{0}, {1}", t.X, t.Y);
public int X;
}
Output: 0, 0
public int Y;
}
1, 2
}
13/04/2015
-------Računarski praktikum 3-------
32
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( );
}
13/04/2015
-------Računarski praktikum 3-------
33
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;
// 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
InvalidCastException). Pakiranje se smatra skupom operacijom.
13/04/2015
-------Računarski praktikum 3-------
34
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;
}
13/04/2015
-------Računarski praktikum 3-------
35
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
}
13/04/2015
-------Računarski praktikum 3-------
36
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;
}
}
13/04/2015
-------Računarski praktikum 3-------
37
Vrijednosni tipovi
class Program
{
static void Main(string[] args)
{
static void f(object o)
{
Console.WriteLine("f(object) " + o);
}
S str = new S();
f(str);
// pakiranje
f(str.ToString());
}
static void f(string s)
{
Console.WriteLine("f(string) " + s);
}
13/04/2015
}
-------Računarski praktikum 3-------
38
Vrijednosni tipovi
13/04/2015
-------Računarski praktikum 3-------
39
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 */
}
13/04/2015
class Program
{
static void Main(string[] args)
{
DrugaKlasa dk=new DrugaKlasa();
Console.WriteLine("{0},{1}", dk.p, 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
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.
13/04/2015
-------Računarski praktikum 3-------
41
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
13/04/2015
-------Računarski praktikum 3-------
42
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).
13/04/2015
-------Računarski praktikum 3-------
43
Konverzije
Zadatak: što ispisuje sljedeći kod?
int a = 0;
if (a = 1) { }
Console.Write(a);
13/04/2015
-------Računarski praktikum 3-------
44
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);
13/04/2015
// 0
-------Računarski praktikum 3-------
45
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;
13/04/2015
-------Računarski praktikum 3-------
46
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
13/04/2015
-------Računarski praktikum 3-------
47
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.OverflowException: Arithmetic Operation
resulted in an overflow
13/04/2015
-------Računarski praktikum 3-------
48
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);
}
13/04/2015
-------Računarski praktikum 3-------
// -727379968
// -727379968
49
checked operator
try
{
checked
{
int a = 1000000, b = 1000000;
int c = a * b;
Console.Write(c);
}
}
catch (OverflowException e) { Console.WriteLine("Uhvatio overflow");
}
catch (Exception e) {Console.WriteLine(e.ToString()); }
}
13/04/2015
-------Računarski praktikum 3-------
50
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 (OverflowException e)
{
Console.WriteLine("Uhvatio overflow");
}
}
}
13/04/2015
-------Računarski praktikum 3-------
51
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;
}
}
13/04/2015
-------Računarski praktikum 3-------
52
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.
13/04/2015
-------Računarski praktikum 3-------
53
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);
}
}
13/04/2015
-------Računarski praktikum 3-------
54
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’;
13/04/2015
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. 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];
13/04/2015
-------Računarski praktikum 3-------
56
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
13/04/2015
-------Računarski praktikum 3-------
57
Višedimenzionalna polja
Višedimenzionalna polja mogu biti:
1. Pravokutna
int [ , ] matrica = new int [2,3];
2. Neravnomjerna
int[ ][ ] matrica= new int [3][ ];
13/04/2015
-------Računarski praktikum 3-------
58
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:
13/04/2015
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 = new int[ ][ ]
{
new int[] {0, 2, 4, 5, 7},
new int[] {3, 6, 9},
new int[] {3, 7, 8, 3}
};
13/04/2015
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
{
static void Main()
{
SPoint[ ] p=new SPoint[50];
int a=p[20].X;
// 0
}
}
13/04/2015
-------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
{
static void Main()
{
CPoint[ ] p=new CPoint[50];
int a=p[20].X;
//NullReferenceException
}
}
13/04/2015
-------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 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);
}
}
13/04/2015
-------Računarski praktikum 3-------
63
Inicijalizacija polja
class C { public int broj;}
class Program
{
static void Main(string[] args)
{
C obj1;
// Console.WriteLine("{0}, {1}", obj1.broj, obj1 == null);
Varijabla obj1
nije inicijalizirana
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);
}
}
13/04/2015
-------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 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]);
}
13/04/2015
-------Računarski praktikum 3-------
65
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");
}
}
13/04/2015
-------Računarski praktikum 3-------
66
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.
13/04/2015
-------Računarski praktikum 3-------
67