C# TABLICE


Teraz poznasz co to są tablice. Czasem będziesz chciał zautomatyzować proces tworzenia zmiennych, jak pamiętasz każdej zmiennej trzeba było nadać nazwę, prawda jest taka że tworząc zmienną int x, tak naprawdę tworzysz obiekt o nazwie ‘x’ klasy ‘int’, teraz dzięki operatorowi [] będziesz mógł indeksować ten obiekt jak tablicę, oczywiście możesz pojęcia tablice nie rozumieć jeżeli nigdy wcześniej nie programowałeś, ale tak naprawdę istota tablic nie zmienia się od wielu lat w językach programowania. Należy wspomnieć o tym, że tablice to jedne z najważniejszych aspektów każdego języka programowania. Ja zawsze jestem za obrazowym tłumaczeniem wszystkiego, więc postarajmy sobie wytłumaczyć obrazowo czym są tablice, postaraj sobie wyobrazić tablicę jako tabelę np. z wolnymi kratkami (ilość tych kratek to rozmiar tablicy), do których możesz zapisać jakąś wartość, a następnie ją odczytać, poprzez podanie numery kratki (tzn. indeksu tablicy). Może masz już jakieś wyobrażenie czym jest tablice, teraz zaczniemy od deklaracji tablicy jednowymiarowej, dodam, że istnieją tablice: jednowymiarowe, dwuwymiarowe, trzywymiarowe, wielowymiarowe oraz tablice nierównomierne, ale o nich wszystkich będziemy się uczyć w dalszej części lekcji. Zaczniemy tradycyjnie od ogólnej deklaracji, w tym przypadku tablicy jednowymiarowej:

typ[] nazwa_tablicy = new typ[rozmiar] ;

gdzie typ jest to, jeden z typów wbudowanych w C# lub dowolna klasa którą można indeksować, nazwa_tablicy – to nazwa pod którą istnieje tablica, rozmiar – to rozmiar tworzonej tablicy, podawany jest w liczbach całkowitych od 0 wzwyż.

Ok. napiszmy jakiś prosty program w którym deklarujemy  tablicę o rozmiarze 10 pól, a następnie te pola wypełniamy liczbami, poczym odczytujemy z niektórych pól te liczby:

Początek kodu:

using System ;

class Tablice
{
public static void Main()
{
int[] tablica = new int[10] ;
tablica[0] = 1305 ;
tablica[1] = 12 ;
tablica[2] = -3 ;
tablica[3] = 788 ;
tablica[4] = 2 ;
tablica[5] = 788 ;
tablica[6] = -10 ;
tablica[7] = 0 ;
tablica[8] = 9 ;
tablica[9] = -55 ;


Console.WriteLine(„Pole tablicy o numerze 4 jest równe: ” + tablica[4]);
Console.WriteLine(„Zmiana pola 4″);
tablica[4] = 233333 ;
Console.WriteLine(„Pole tablicy o numerze 4 jest po zmianie równe: ” + tablica[4]);
}

}

Koniec kodu:

Na samym początku deklarujemy tablicę typu int, jednowymiarową, to że jest jednowymiarowa rozpoznajemy po [] i że nie ma między tym [ a tym ] żadnego przecinka co symbolizowało by dodatkowe indeksy, w zapisie int[10] ustalamy rozmiar tablicy, czyli liczbę elementów jakie ona pomieści, w tym wypadku jest to 10. Potem przypisujemy do tablicy wartości typu int, musisz pamiętać o jednej z najważniejszej rzeczy, otóż w C# indeksujemy od 0 nie od 1, czyli jak tablica ma 10 elementów to ostatni element będzie miał indeks 9 a nie 10 bo indeksujemy od 0, jeżeli byśmy indeksowali od 1 to ostatni element miałby indeks 10 oczywiście w C# początkowy indeks o 0 – i musisz to sobie wbić do głowy! Jak wygląda przypisanie jakiejś wartości do tablicy, piszemy wtedy nazwa_tablicy[indeks] = wartość, gdzie wartość jest takiego samego typu jak tablica, to chyba logiczne, że do tablicy typu int nie można przypisać wartości double. Myśmy przypisali wartości w ten sposób:
tablica[0] = 1305 ;
tablica[1] = 12 ;
tablica[2] = -3 ;
tablica[3] = 788 ;
tablica[4] = 2 ;
tablica[5] = 788 ;
tablica[6] = -10 ;
tablica[7] = 0 ;
tablica[8] = 9 ;
tablica[9] = -55 ;
Oczywiście nie musisz tego robić po kolei, ani nie musisz wypełniać wszystkich pól w tablicy. Aby odczytać wartość jakiegoś pola z tablicy piszemy: nazwa_tablicy[indeks] ; to nam zwraca wartość pola o podanym indeksie. Jak wyglądają dane w tablicy możesz sobie prześledzić na poniższym schemacie:

Tablice C#

Patrząc na schemat możesz sobie prześledzić, które z pól ma jaką wartość. To chyba tyle co można powiedzieć o tablicy jednowymiarowej.

Wyobraź sobie, że mamy tablice typu int, która przechowuje 500 losowych elementów typu int, wyobraź sobie ile miał byś pracy wypełniając taką tablicę w sposób podany powyżej, my napiszemy program który wypełnia naszą tablicę losowymi elementami, poniżej jest kod programu, może postaraj się sam napisać ten program nie zaglądając do rozwiązania, oczywiście warto zażyć małych podpowiedzi:

1.Aby indeksować po kolei użyj zmiennej, która będzie indeksem i stale będzie inkrementowana poczynając od 0, bo jak wiemy indeksujemy od 0 w C#.

2.Aby wylosować jakąś liczbę piszemy:
Random x = new Random(3000) ; //Deklarujemy o obiekt klasy random, będziemy losować liczbę;

x.Next(3000) ; // A teraz losujemy następną liczbę, tak jakby wykonujemy nowy rzut kostką.

3. Następnie wyświetl wszystkie elementy naszej tablicy, oczywiście uczyń to za pomocą jakiejś pętli.

A oto program:
Początek kodu:

using System ;


class Tablice
{
public static void Main()
{
int[] tablica = new int[500] ;
Random x = new Random(3000);

for(int i = 0 ; i < 500 ;i++)
{
tablica[i] = x.Next(3000);
}


for(int a = 0 ; a < 500 ; a++)
{
Console.WriteLine(tablica[a]);
}

}

}

Koniec kodu:

Ok. Powiedzmy, że masz już podstawowe wiadomości o tablicach, teraz będziemy poznawać kolejne aspekty tablic oraz inne rodzaje tablic.

Przypuśćmy, że nie znamy rozmiaru tablicy, jak doczytać ilość elementów jakie zawiera nasza tablica, otóż piszemy wtedy nazwa_tablicy.Lenght ; Ta własność zwraca nam ilość elementów w tablicy, w powyższym zadaniu zwróci nam 500, czyli zamiast pisania w pętlach for 500 możemy zapisać tablica.Lenght, jest to wartość tylko do odczytu! To chyba logiczne.

Dobrze, przejdźmy dalej, programując natchniesz się na tony błędów, bo jest takie przysłowie o programowaniu, brzmi ono: „Połowę życia programista pisze programy, a drugą połowę życia przeznacza na usuwanie błędów”, jest to cała prawda o programowaniu. Jaki jest najczęściej spotykany błąd przy używaniu tablic, otóż jest to przekroczenie indeksu, błąd ma nazwę IndexOutOfRange, w C# nie nazywamy tego błędem tylko wyjątkiem :) Exception. Kiedy taki błąd się dzieje? Otóż wtedy gdy masz np. tablicę o rozmiarze 20 elementów :

dobule tab = new double[20] ;

A ty nagle chcesz wywołać 22 element tablicy: tab[22], oczywiście w tym momencie przekraczasz indeks tablicy i powodujesz błąd, pisząc tab[20] też przekraczasz indeks bo jak wiesz w C# indeksujemy od 0 i ostatni element zatem ma indeks 19. Na razie to tyle co do jednowymiarowej tablicy. Teraz zapoznasz się z tablicami dwuwymiarowymi.

Tablica dwuwymiarowa, ujmując w skrócie to tablica która zawiera dwa indeksy, najłatwiej sobie to wyobrażać jako tabelę z kolumnami i wierszami – już widzisz, że to potężny mechanizm. Ale przejdźmy do tego jak wygląda ogólna deklaracja tablicy dwuwymiarowej:

typ[,] nazwa_tablicy = new typ[rozmiar1,rozmiar2] ;

Co to jest typ i nazwa_tablicy to wiesz, w tym zapisie [,] informujemy, że to będzie tablica dwuwymiarowa. A dlatego dwu wymiarowa bo po lewej stronie przecinka będzie jeden indeks, a po prawej drugi czyli w sumie dwa, czyli dwuwymiarowa, rozmiar1 i rozmiar2 to rozmiary tablicy. Poniżej jest program w którym deklarujemy prostą tablicę dwuwymiarową, oraz wypełniamy ją przykładowymi liczbami:

Początek kodu:


using System ;


class Tablice
{
public static void Main()
{
int[,] tablica = new int[4,3] ;
tablica[0,0] = 10 ;
tablica[0,1] = -23 ;
tablica[0,2] = 50 ;
tablica[1,0] = 0 ;
tablica[1,1] = 7 ;
tablica[1,2] = 9 ;
tablica[2,0] = 4 ;
tablica[2,1] = 89 ;
tablica[2,2] = 21 ;
tablica[3,0] = 0 ;
tablica[3,1] = 6 ;
tablica[3,2] = 3 ;


Console.WriteLine(tablica[2,1]);


}
}

Koniec kodu:

Dla jeszcze lepszego zrozumienia, przed przystąpieniem do tłumaczenia zapisu, przyjże się poniższemu schematowi naszej tablicy:

Tablica Dwuwymiarowa C#

Już po samym spojrzeniu na schemat powinieneś wiedzieć jak działa tablica dwuwymiarowa, nie ma co tutaj tłumaczyć poza wyjątkiem, że są dwa indeksy, spróbujemy teraz znaleźć jakieś proste zastosowanie dla naszej tablicy dwuwymiarowej. Twoje zadanie to napisać program który przechowuje w tablicy dwuwymiarowej rozkład jazdy pociągów, w pierwszej kolumnie pisze miasto z którego wyrusza pociąg, w drugiej godzina przyjazdu, w trzeciej miasto docelowe, a w czwartej godzina przybycia na miejsce. Masz dodać metodę która będzie wyszukiwać po podaniu miasta przyjazdu lub przybycia wszystkie dodatkowe dane. Jak to zrobić to powinieneś wiedzieć, mała podpowiedź to, że  musi to być tablica tylu string. To trochę trudniejsze zadanie, niż dotychczas jakie miałeś, warto abyś je sam rozwiązał, bo po tym co przerobiłeś, takie zadanie to dla ciebie pestka, tylko trzeba pomyśleć na spokojnie, weź sobie kartkę, rozrysuj to sobie, lub jak wolisz. Po niżej jest rozwiązanie zadania:

Początek kodu:
using System ;


class Stacja
{
public string[,] lista = new string[3,4] ;


public void Szukaj_do_kad(string miasto)
{

for(int i = 0 ; i < 3 ; i++)
{
if(lista[i,2]== miasto)
{
Console.WriteLine(„Pociąg z {0} wyrusza do {1} o godzinie {2}”,lista[i,0],lista[i,2],lista[i,1]);
}
}
}
}


class Kolej
{
public static void Main()
{
string szukanie ;


Stacja Warszawa = new Stacja() ;
Warszawa.lista[0,0] = „Katowice” ;
Warszawa.lista[0,1] = „12:45″ ;
Warszawa.lista[0,2] = „Kraków” ;
Warszawa.lista[0,3] = „13:55″ ;


Warszawa.lista[1,0] = „Słupsk” ;
Warszawa.lista[1,1] = „09:00″ ;
Warszawa.lista[1,2] = „Kraków” ;
Warszawa.lista[1,3] = „14:15″ ;


Warszawa.lista[2,0] = „Lódź” ;
Warszawa.lista[2,1] = „22:40″ ;
Warszawa.lista[2,2] = „Olsztyn” ;
Warszawa.lista[2,3] = „03:15″ ;


Console.Write(„Podaj miasto do którego zmierza pociąg : „);
szukanie = Console.ReadLine() ;
Warszawa.Szukaj_do_kad(szukanie);
}

}

Koniec kodu:

Wszystko chyba z programu jest zrozumiałe, nie ma żadnych nowych rzeczy które mogły by cię w jakiś sposób zaskoczyć.

Teraz szybko postaram ci się wytłumaczyć w dość prosty sposób jak się deklaruje tablice trójwymiarowe i wielowymiarowe.

A więc przedstawię ci teraz deklarację tablicy trójwymiarowej:

typ[,,] nazwa_tablicy = new typ[rozmiar1,rozmiar2,rozmiar3] ;

Jak wygląda taka tablica, łatwo sobie wyobrazić, np. dla mnie jest to coś na wzór kostki Rubika, każdy taki sześcian to jedno pole, rozmiar1 to liczba wierszy tak jakby, rozmiar2 to liczba kolumn, a rozmiar3 to głębia oczywiście abstrakcyjnie tłumacząc. Jak to działa, prześledź sam, jeżeli tego nie zrobisz, nie masz co czytać dalej.

Warto wspomnieć o czymś takim jak dynamiczne deklarowanie tablic, oto przykład gdzie dynamicznie wypełniamy elementami tablicę jednowymiarową oraz dwuwymiarową:

Początek kodu:

using System ;


class Pokaz
{
public static void Main()
{
int[] tablica1 = {12,45,77,3322,56,88,0,-33,6};


int[,] tablica2 = {
{12,67},
{75,-788},
{567,78},
{0,-35}};

}
}

Koniec kodu:

Tablica1 ma rozmiar 9, jak widzisz jest to szybszy sposób wypełniania tablic, nie podajemy od razu rozmiaru tablicy.

Tablica2 to tablica dwuwymiarowa, jak widzisz jest to tablica o rozmiarze 4×2;

Kiedyś zapewne zadasz pytanie jak odczytać ilość wierszy lub kolumn z tablicy dwuwymiarowej, a co zrobić jak masz tablicę szesnastowymiarową, kiedy użyjesz polecenia Lenght to zwróci ci ono liczbę wszystkich elementów jakie pomieści tablica, w takiej tablicy int[,] tab = new int[4,5]; Lenght będzie posiadało wartość 4*5 czyli 20 bo tak naprawdę tablica pomieści 20 elementów. Aby odczytać długość tablicy w indeksie którym chcemy używamy polecenia getLenght() jak ono działa pokazuje poniższy program:

Początek kodu:

using System ;


class Pokaz
{
public static void Main()
{
int[] tablica1 = {12,45,77,3322,56,88,0,-33,6};


int[,] tablica2 = {
{12,67},
{75,-788},
{567,78},
{0,-35}};

Console.WriteLine(tablica2.GetLength(0));
}
}

Koniec kodu:

To ‘0’ to jest to co nazywaliśmy wcześniej lewym indeksem tylko tutaj podajemy kolejność rozmiaru którego chcemy odczytać, jak byśmy wpisali 1 to byśmy otrzymali 2 ; bo tak naprawdę deklaracja tablicy wyglądałaby int[,] tablica2 = new int[4,2];

Teraz pokrótce ostatni rodzaj tablic, czyli tablice nierównomierne.

Oto jak wygląda program który używa tablicy nierównomiernej:

Początek kodu:
using System ;


class Pokaz
{


public static void Main()
{
byte[][] tablica = new byte[3][] ;


tablica[0] = new byte[3];
tablica[1] = new byte[5];
tablica[2] = new byte[2];

tablica[0][2] = 10 ;
Console.WriteLine(tablica[0][2]);
}

}

Koniec kodu:

W tym zapisie byte[][] tablica = new byte[3][] ; deklarujemy liczbę wierszy, ona nie może być nieregularna dopiero liczba kolumn dla danego wiersza w tablicy nieregularnej może być dowolna.

Uf… Może ta lekcja była długa i trudna, ale uznałem, że nie powinno się tablic rozdzielać, na podstawy czy ich rodzaje, tablice uznałem za jedną lekcje, ty oczywiście nie musisz tego „łykać” na raz możesz sobie tą lekcję podzielić np. na 4 części. Oczywiście wedle upodobań. Jako zadanie wymyśl kilka zastosowań dla naszych tablic, możesz napisać jakieś bazy danych lub inne ciekawe programy, wszystko w twoich rękach.