Tabele v C#

Tabele v C#

Avtor: Gregor Šoln

Kaj je tabela?

Tabela (Array) je sestavljena podatkovna struktura, ki jo običajno uporabljamo za hranjenje večje količine podatkov istega podatkovnega tipa.

Tabelo si lahko predstavljamo kot matriko, ki vsebuje le eno vrstico. Elementi matrike (z eno vrstico) so elementi tabele. Vsak element ima svojo indentifikacijsko število, preko katerega diostopamo na ustrezen podatek v tabeli.

Kot smo že omenili lahko v tabeli hranimo večjo količino podatkov. Pri tem pa je poterbno omeniti to, da morajo biti vsi podatki, ki jih želimo shraniti v tabeli, istega podatkovnega tipa.
Kot je mogoče komu poznano, se v določenih programskih jezikih pojavljajo tabele, ki lahko hranijo različne podatkovne tipe hkrati. Pri programskem jeziku C# te možnosti ni. Preden Lahko tabelo uporabimo, jo je potrebno najprej deklarirati.

Ker se v praksi ne pojavljajo samo tabele z eno vrstico, je potrebno omeniti, da se pogostjeje pojavljajo tabele večjih razsežnosti.

Kako tabele deklariramo, si bomo pogledali v naslednjih poglavjih. Prav tako se bomo naučili dostopati do podatkov in podatke iz tabel brati. Na koncu, se bomo v poglavju Razširjanje tabele naučili, kako tabelo razširiti.

(tabela.png)

Osnovne informacije o tem, kaj tabela je in kako si jo predstavljamo si oglejmo na spodnji povezavi:
Kaj je tabela?

Podatkovni tipi tabel

Kot smo že omenili lahko v tabeli hranimo le podatke, kateri ustrezajo podatkovnem tipu tabele.
V tabeli tako ne morem hraniti elementov različnega podatkovnega tipa. Kot na primer, v tabeli vrednosti, ki je podatkovnega tipa int[] , lahko hrani samo takšne podatke, ki so podatkovnega tipa integer. Torej podatek podatkovnega tipa double ne moremo hraniti v tabelo vrednosti.

Podatkovni tipi za predstavitev števil, znakov, nizov, logičnih vrednosti in poljubnih objektov

(podatkovni.png)

Utemeljitev

Različna števila predstavimo z različnimi podatkovnimi tipi. Za hranjenje decimalnih števil lahko uporabimo podatkovni tip decimal[]. Za realna števila sta rezervirana podatkovna tipa double[] in float[], za cela števila pa int[] ter pa long[].

Za predstavitev elementov, ki so znaki ali nizi, uporabimo podatkovna tipa char[] in string[]. Prvi omogoča hranjenje znakov. String[] pa omogoča, da v tabeli hranimo nize različnih dolžin.

Za hranjenje podatkov o logičnih vrednostih uporabimo tabelo s podatkovnim tipom bool[]. Lahko pa deklariramo tabelo, ki omgoča hranjenje objektov, ki smo jih zgradili sami.

Pri podatkovnih tipih tabel je potrebno omeniti to, da s tem ko napovemo za kater podatkovni tip gre, vnaprej določimo kakšne podatke naša tabela sprejme in kakšne ne.

Kako deklariramo tabelo?

Deklaracija tabele nam omogoča, da lahko tabelo sploh uporabljamo. Če tabele ne deklariramo ali jo deklariramo napačno, se lahko zgodi, da bomo kasneje naleteli na težave.

Tabelo lahko deklariramo na več različnih načinov. Lahko samo rezerviramo spremenljivko, ki bo hranila naslov tabele. V tem primeru dejansko nismo shranili tabele, ker je še ni, ampak smo shranili le njen naslov, kje na pomnilniku se bo tabela nahajala.

Druga možnost je, da poleg tega, ko rezerviramo spremenlijivko, ki bo hranila naslov tabele, deklariramo še tabelo. V tem primeru uporabimo ukaz new, ki ustvari tabelo določene dolžine. Potem je tabela pripravljena za hranjenje podatkov.

Tabeli lahko ob deklaraciji določimo katere elemente vsebuje. Navadno jih navedemo tako, da jih napišemo v oklepajih, kot bomo prikazali v naslednjih straneh.

Kot zadnjo možnost deklaracije tabele pa bomo spoznali način, s katerim najprej rezerviramo spremenljivko, ki bo hranila naslov tabele. Z naštevanje elementov, brez ukaza new spremenljivki dodelimo vsebino tabele.

Pri deklaraciji tabele je pomembno to, da navedemo ustrezen podatkovni tip. Za celo tabelo velja, da lahko prejme le elemente navedenega podatkovi tipa. Težave se lahko pojavijo, če želimo v tabelo vnesti element, ki je drugačnega podatkovnega tipa, kot ga sprejme tabela.

V naslednjih straneh bomo spoznali načine kako lahko deklariramo tabele. Prikazani so zgledi deklaracij in ustrezna razlaga, kaj z deklaracijo dosežemo.

Osredotočili se bomo predvsem na enodimenzionalne tabele. Proti koncu pa bomo spoznali tudi dvo in tro - dimenzionalne tabele.

1. NAČIN Deklaracija tabele z opreatorjem new

Tabelo deklariramo s pomočjo ukaza new, ki rezervira prostor v pomnilniku za hranjenje tabele dolžine, ki jo podamo med oglate oklepaje ([dolžina_tabele]).

(dek1.png)

Utemeljitev deklaracije

  • int dolzina = 10; 
    Spremenljivki tipa integer priredimo vrednost . S pomočjo te vrednosti bomo določali dolžino tabele. Tabelo lahko deklariramo tudi tako, da dolžino podamo direktno, kot lahko to vidimo v zadnjem primeru.
  • int[] tabela_2 = new int[dolzina]; 
    Spremenljivka tabela_2 je spremenljivka podatkovnega tipa int[] ki pomeni, da gre za tabelo, ki lahko hrani le podatke, ki so tipa integer.
    Z ukazom new določimo, da se v pomnilniku takoj rezervira prostor, ki je namenjen hranjenju desetih elementov (ker je vrednost spremenljivke dolzina 10).
  • int[] tabela_1; Spremenljivki tabela_1 določimo naslov, kje se bo tabela nahajala. Ob izvedbi tega ukaza se tabela ne ustvari, ampak se zanjo ustvari le naslov. Za ustvarjanje tabele potrebujemo ukaz new.
  • tabela_1 = new int[4];
    Na naslovu, ki ga hrani spremenljivka tabela_1, kateri smo prej določili le naslov kjer se nahaja tabla, smo z ukazom new ustvarili tabelo. Tabela lahko hrani največ štiri podatke tipa integer. Dolžino tabele smo v tem primeru določili direktno s številko med oglatimi oklepaji.

Pri tem načinu deklaracije, je tabela, ki smo jo ustvarili prazna. Pri podatkovnem tipu int[] se vrednosti na tabeli ob ustvarjanju nastavijo na . Tako imamo na začetku napolnjeno tablo z vrednostimi .

Video: Deklaracija z opreatorjem new

2. NAČIN Najava tabele z operatorjem new in naštevanjem elementov

Tabelo deklariramo tako, da uporabimo ukaz new, s katerim rezerviramo prostor v pomniliniku. Nato v zavitih oklepajih ({ }) napovemo vrednosti, za katere želimo, da se ob deklaraciji po vrsti vnesejo v tabelo.

(dek2.png)

Utemeljitev deklaracije

  • int[] tabela = new int[5] {5, 6, 4, 2, 3}
    Z ukazom new smo zasedli prstor v pomnilniku namenjen tabeli, dolžine 5 znakov. Elementi, ki so našteti na koncu v zavitih oklepajih, se ob deklaraciji tabale avtomatsko vnesejo v tabelo po vrsti. Tako ima tabela določene elemente. Kot smo omenili na prejšnih straneh, se navadno vnesejo elementi z vrednostjo . V tem primeru se to ne zgodi, saj smo napovedali katere vrednosti želimo v tabeli. Med zavite oklepaje je potrebno vnesti toliko elementov, kolikor smo namenili dolžino tabele. Torej če je dolžina tabele pet elementov, se v zavite oklepaje našteje točno pet elementov. V nasprotnem primeru pride do napake.
  • bool[] tabela_2; 
    V tem primeru smo uporabili podatkovni tip boolean. Za tabelo nismo rezervirali prostora v pomnilniku, saj nismo uporabili ukaza new.
  • tabela_2 = new bool[2] {true, true} 
    Sedaj je na naslovu, ki ga hrani spremenljivka tabela_2 rezerviran prostor za tabelo dolžine dveh elementov. Z ukazem new smo rezervirali pomnilniški prstor za dva elementa.
    Na koncu v zavitih oklepajih napovemo vrednosti, za katere želimo, da se ob deklaraciji vnesejo v tabelo. Tako se bo dvakrat vnesela vrednost true. V nasprotnem primeru, če ne bi napovedali vsebine, bi se v tabelo avtomatsko vnesle vrednosti false.

Video: Deklaracija z operatorjem new in naštevanjem elementov

3. NAČIN Najava tabele z naštevanjem elementov

Kot ena izmed možnosti deklaracije tabele je deklaracija z naštevanjem elementov, brez predhodne rezervacije pomnilniškega prostora.

(dek3.png)

Utemeljitev deklaracije

V tem načinu deklaracije tabele napovemo samo za kakšen podatkovi tip elementov gre. V zavitih oklepajih naštejemo vse elemente, ki jih želimo v tabeli. Ni potrebno podati podatka o dolžini tabele, ampak se rezervacija pomnilniškega prostora izvede samodejno. Tako se dolžina tabele določi glede na število elementov, ki smo jih navedli z zavite oklepaje.

Kako vnesemo podatek v tabelo?

Podatke lahko v tabelo vnesemo ob deklaraciji tabele in so s tem takoj pripravljeni za nadaljno uporabo. Obstaja pa druga možnost, da ob deklaraciji navedemo samo dolžino tabele, elementov pa ne naštejemo. S tem tabela ni ostala prazna ampak so se ji priredili elementi z vrednostjo .

Podatek pa lahko vstavimo na ustrezno mesto v tabeli le, če poznamo njegov ključ. Preko ključa oz. indeksa elementa dostopamo do ustreznega mesta v tabeli.

(direkt.png)

Utemeljitev

Najprej smo deklarirali tabelo podatkovnega tipa int[], ki hrani le podatke tipa integer. Ker ob deklaraciji nismo navedli elementov, ki bi se (lahko) vnesla v tabelo, so v tabeli tako vrednosti .

Po izvedbi ukaza tab_int[3] = 9; se vsebina tabele spremeni. Na četrtem mestu od leve (indekse začnemo označevati z 0) se vrednost nadomesti z .

Do ustreznega mesta v tabeli, kamor želimo element vstaviti, pa lahko dostopamo tudi preko spremenljivke, ki določa vrednost ustreznega indeksa. Indeks podamo posredno preko spremenljivke i. Tak princip se pojavi, če do elementov tabele dostopamo s pomočjo zanke.

(direkt2.png)

Kako dostopamo do podatkov v tabeli?

Do podatkov dostopamo na podoben način, kot smo podatke v tabelo vstavljali. Indeksi oz. ključi so tudi pri samem dostopu do elementov ključnega pomena.

Kot smo že omenili se številčenje indeksov prične z . Prvi element v tabeli je predstavljen z indeksom , takoj naslednji pa z indeksom . Vsak naslednji element ima za ena večji indeks kot njegov predhoni element.

Sedaj ko vemo kakšen naslov imajo elementi tabele, lahko dostopamo do ustreznih elementov.

(ddirekt.png)

Utemeljitev

V zgornjem primeru imamo tabelo, ki ji ob deklaraciji dodamo vsebino elementov: , , , , in . Ker vemo da so indeksi elementov urejeni prav tako po vrsti, do drugega elementa tabele dostopamo z ukazom tabela[1] . Ampak s tem si vrednosti nismo shranili. Če želimo vrednost v nadalnje uporabljati jo je potrebno ustrezno shraniti. Zato jo shranimo v spremenljivko prebrano, ki je tipa integer. Sedaj smo prebrali vrednost drugega elementa po vrsti v tabeli.

(zdirekt.png)

Utemeljitev

Do elementov pa navadno dostopamo tudi s pomočjo zanke. V zgornjem primeru vidimo, da smo za sprehod po tabeli uporabili zanko for. Spremenljivka i predstavlja indeks. Preko vrednosti indeksa bomo dostopali do ustrznih elementov.

Torej, i se bo ob vsakem ponovnem vstopu v zanko za ena povečal. Tako bomo s pomočjo zanke prebrali vse elemente zanke. Spremenljivka prebrano, bo v vsakem krogu zanke dobila novo vrednost. Na koncu izvajanja zanke bo vrednost spremenljivke prebrano enaka , saj je zadnji element tabele.

Video: Kako dostopamo do podatkov v tabeli?

Izpis vsebine tabele

IZPIS VSEBINE TABELE

Do sedaj smo si ogledali kako dostopamo do elementov tabele. Sedaj pa si bomo ogledali kako lahko vsebino tabele na več različnih načinov izpišemo.


int[] tabela = new int[3] {1, 2, 3};
Console.WriteLine(tabela);

Utemeljitev

Zgornji primer prikazuje kaj se izpiše, ko se izvede ukaz Console.WriteLine(tabela); . Ker spremenljivka tabela hrani le naslov kjer se tabela nahaja, se zato izpiše le vrsta podatkovnega tipa tabele. Če želimo izpisati njeno vsebino je potrebno izpisati vsak element tabele posebej.

Za izpis celotne vsebine tabele navadno uporabimo zanki for in foreach. Kako delujeta omenjeni zanki si bomo pogledali na naslednjih straneh.
Na spodnjih primerih si bomo ogledali več različnih primerov izpisov tabele podatkovnega tipa string. Pristopi so v vseh primerih enaki. Sprehodimo se po celotni tabeli in sproti izpisujemo elemente.


foreach(var item in array)
    Console.Write(item.ToString() + " ");
Console.Write(string.Join(" ", array));
int[] array = new int[] { 1, 2, 3 };
foreach(var item in array)
{
    Console.WriteLine(item.ToString());
}

Izpis z uporabo zanke FOR

for ( int i=0; i<tabela.Lenght(); i++) Console.WriteLine(tabela[i]);

Vsebino tabele izpišemo z uporabo zanke for. Za pravilen izpis potrebujem dodaten števec i, ki ga definiramo ob deklaraciji zanke for in ima obliko int i=0 . Števec bomo na vsakem ponovnem obhodu zanke povečali za ena, kar napovemo z ukazom i++ . Zaustavitveni pogoj ima obliko i<tabela.Lenght() , kar pomeni, da se števec povečuje, dokler ne doseže vrednosti, ki je manjša od dolžine tabele.

Izpis z uporabo zanke FOREACH


foreach(var item in array)
{
    Console.WriteLine(item.ToString());
}
Pri izpisu vsebine tabele z zanko foreach ne potrebujemo dodatnega števca, s katerim bi določali ustrezen ključ elementov tabele. Z ukazom foreach(var element in tabela) , definiramo spremenljivko element, tipa var. Podatkovni tip var sprejme kateri koli podatkovni tip.
Tako bo na vsakem obhodu zanke spremenljivka element dobila novo vrednost iz tabele. Z ukazom Console.WriteLine(element.ToString()) pa izpišemo trenutno vrednost spremenljivke element.

Vsebina je v obeh primerih izpisana v enakem vrstnem redu, od začetka do konca tabele.

Dimenzionalnost tabel

Primeri, ki smo jih spoznali do sedaj temeljijo na enodimenzionalnih tabelah. Enodimenzionalna tabela pomeni, da ima le eno dimenzijo. Enodimenzionalno tabelo, pa si lahko predstavljamo tudi kot matriko z eno samo vrstico. Tako bi tudi tabeli lahko rekli, da ima samo eno vrstico.

(1D.png)
kako si predstavljamo 1-dimenzionalno tabelo

Deklaracija: int[] tabela = new int[3]; Dostopa do elementov: tabela[0]; Vnos elementov ob dekalaraciji: int[] tabela = new int[] {1, 4, 5, 5}; Seveda se v praksi pojavljajo tabele, ki niso le enodimenzionalne, temveč imajo več dimenzij.

2D - tabela

Najpogosteje srečamo dvodimenzionalne tabele. Tabelo si predstavljamo v obliki matrike, ki ima več stolpcev in več vrstic. V takšne tabele lahko shranimo toliko elementov, kolikor znaša produkt števila vrstic in stolpcev.

(2D.png)
kako si predstavljamo 2-dimenzionalno tabelo

Deklaracija: int[,] tabela = new int[4,2];
Dostopa do elementov: tabela[0][0];
Vnos elementov ob deklaraciji: int[,] tabela = new int[,] {{1,2}, {3,4}, {5,6}, {7,8}};

3D - tabela

Pogosto pa se srečamo tudi z tabelami, ki imajo tri dimenzije. Večje dimenzije si že težko predstavljamo, zato se z njimi ne bomo ukvarjali.

(3dtabela.png)
kako si predstavljamo 3-dimenzionalno tabelo

Deklaracija: int[,,] tabela = new int[4,2,5];
Dostopa do elementov: tabela[0][0][0];
Vnos elementov ob deklaraciji:int[,,] tabela = new int[,,] {{1,7,2}, {2,4,1}};

Razširjanje tabele

Kot že vemo, moramo ob deklaraciji tabele določiti kakšen podatkovi tip podatkov bomo hranili v tabeli in kako velika bo ta tabela.

Najpogosteje se pojavljajo težave, ko je tabela polna, mi pa bi še potrebovali nekaj dodatnega prostora na koncu tabele.
V takih primerih ima C# vgrajeno funkcijo, ki za dano vrednost parametra razširi tabelo.

Primer: Imamo tabelo, ki jo deklariramo takole: int[] tabela = new int[20]; . Tabela lahko hrani 20 elementov, tipa integer. Ker želimo tabelo razširiti na dolžino 23, uporabimo funkcijo, ki nam dano tabelo razširi.


String[] tabela = {"The", "quick", "brown", "fox", "jumps"};

s tem ukazomsmo deklarirali tabelo, ki hrani podatke tipa String. Tabela ima dolžino 5. Sedaj želimo v tabelo dodati 3 nize. Ker ni več prostora, je potrebno tabelo razširiti.


Array.Resize(ref tabela, tabela.Length + 3);

Sedaj smo tabelo razširili za 3 elemente. Ukaz Array.Resize(tabela,dolžina_tabele); je vgrajena funkcija, ki prejme dva parametra. S prvim parametrom napovemo katero tabelo želimo razširiti. Kot drugi parameter pa podamo novo dolžino.
V našem primeru smo novo dolžino izračunali tako, da smo z funkcijo Lenght() prebrali trenutno dolžino tabele in ji nato prišteli vrednost 3. Tabela ima sedaj dolžino 8.

Literatura

0%
0%