#5 Naucz się C# razem ze mną - Tablice

in #polish7 years ago (edited)

Kurs5.png

Hej!

Poznamy dzisiaj tablice w C#.
Zaczynajmy :).

Czym jest tablica?

Tablica jest zestawem elementów tego samego typu. Liczba tych elementów jest ustalona, elementy są przechowywane w ciągłym obszarze w pamięci - czyli jeden obok drugiego. Rysunek:
Steemit1.png
Mamy tutaj 7-elementową tablicę typu int o nazwie tab. Jak możemy zauważyć, elementy tablicy zaczynamy liczyć od 0, więc indeks ostatniego elementu to 6.

Deklaracja tablicy

Podobnie jak ze zmiennymi, ale dodajemy “[]” po typie.

typ[] nazwa_Tablicy;

i aby określić rozmiar naszej tablicy:

nazwa_Tablicy = new typ[ilość];

można to zrobić w 1 linijce:

typ[] nazwa_Tablicy = new typ[ilość];

a w akcji wygląda to np. tak:

string[] poryRoku = new string[4];

Mamy więc utworzoną tablicę i nawet podaliśmy jej rozmiar. Wciąż jednak nasza tablica jest pusta. Wypełnić ją możemy na kilka sposobów:

poryRoku[0] = “wiosna”;
poryRoku[1]= “lato”;
poryRoku[2]= “jesien”;
poryRoku[3]= “zima”;

lub

for(int i=0; i<poryRoku.Length; i++)
{
    poryRoku[i] = Console.ReadLine();
}

W tym wypadku tablicę uzupełniamy po starcie programu wypisując kolejne wartości i zatwierdzając je klawiszem Enter.

Tablicę można też uzupełnić przy okazji deklaracji, i wygląda to tak;

string[] imiona = new string[]{“Heniek”, “Marek”, “Maria”};

Nie musimy wtedy podawać rozmiaru tablicy, będzie on równy liczbie elementów które umieściliśmy w klamerkach.

skrócona wersja wygląda tak:

string[] imiona = {“Heniek”, “Marek”, “Maria”};

Okej. A jak odczytać taką tablicę?
Najłatwiej przy użyciu instrukcji foreach, którą już znamy.
Kodzik:

foreach(string s in imiona);
{
    Console.Write(s+” “); //Heniek Marek Maria
}

Można też użyć pętli for i w pewnych przypadkach będzie ona dużo lepsza od foreach
(np. kiedy chcemy odczytać tablicę od końca).

for(int i=0; i<imiona.Length; i++)
{
    Console.Write(imiona[i] + “ “); //Heniek Marek Maria
}

Kopiowanie tablicy

Zanim zaczniemy warto powiedzieć kilka zdań o typach wartościowych oraz referencyjnych.
Co to takiego? Najprościej mówiąc - zmienna typu wartościowego przechowuje wartość, zmienna typu referencyjnego - referencję. Referencja to adres w pamięci, gdzie jest przechowywana wartość. Większość typów w C# to typy wartościowe, tablica jednak jest sama w sobie typem referencyjnym.
No dobra, i co z tego?
Typów referencyjnych nie możemy skopiować operatorem przypisania, czyli tak:

Tab=kopiaTab; 

Jeśli tak zrobimy, to po zmianie wartości w kopiaTab, wartość w Tab również ulegnie zmianie.
Jak więc skopiować tablicę?
Jest sposób dla leniwych (i tego chyba używa się częściej)
Po prostu korzystamy z metody do tego przeznaczonej. Wygląda to tak:

tablicaKtórąKopiujemy.CopyTo(cel, indeks)

krótkie wyjaśnienie - indeks to numer od którego mają zaczynać się wartości skopiowane w tablicy “cel”.

Sposób drugi - pętla for:

 for(int i=0;i<Tab.Length;i++)
             {
                 kopiaTab[i] = Tab[i];
             }

Należy tylko pamiętać, aby rozmiar tablicy do której kopiujemy był co najmniej równy rozmiarowi tablicy z której kopiujemy.

Tablice wielowymiarowe

Tablice wielowymiarowe trochę trudniej sobie wyobrazić niż te jednowymiarowe, szczególnie przy większej liczbie wymiarów. Tablicę dwuwymiarową możesz wyobrażać sobie jako prostokątny układ współrzędnych, tablicę trójwymiarową jako sześcienny układ współrzędnych, a powyżej zaczynają się schody, więc spróbuję wytłumaczyć ci jak ja to sobie wyobrażam.
Mamy duże pudełko - jeśli wrzucimy do niego od razu jakieś wartości, to zrobi nam się tablica jednowymiarowa. Jeśli jednak włożymy do dużego pudełka mniejsze pudełka - wtedy tworzy nam się nowy wymiar. Do małych pudełek możemy tak samo włożyć wartość albo kolejne małe pudełka (co stworzy kolejny wymiar). I można tak w nieskończoność. Liczba pudełek na danym poziomie to liczba elementów w danym wymiarze. Na pocieszenie dodam, że raczej rzadko się korzysta z tablic wielowymiarowych.

Deklaracja tablicy dwuwymiarowej:

typ[,] nazwa = new typ[liczba, liczba];

np.:

int[,] ticTacToe = new int[3,3];

Jeśli chcemy od razu przypisać jakieś wartości, można zrobić to tak:

int[,] tab = new int[2,2]
{
    {1,2},
    {3,4},
};

Aby wczytać wartości z klawiatury do tablicy dwuwymiarowej należy użyć dwukrotnie pętli for:

 for (int i = 0; i < tab.GetLength(0); i++)
            {
                for (int j = 0; j < tab.GetLength(1); j++)
                {
                    tab[i, j] = Convert.ToInt32(Console.ReadLine());
                }
            }

GetLength zwraca nam rozmiar tablicy w danym wymiarze, przy czym trzeba pamiętać, że wymiary są numerowane od 0.

Wypisanie takiej tablicy na ekran realizujemy w dosyć podobny sposób:

   for (int i=0;i<tab.GetLength(0);i++)
            {
                Console.WriteLine();
                for (int j = 0; j < tab.GetLength(1); j++)
                {
                    Console.Write(tab[i, j] + " ");
                }
            }

Tablice wyszczerbione

Tablica wyszczerbiona to taka tablica w tablicy - znamy rozmiar pierwszego wymiaru, ale rozmiary kolejnych wymiarów mogą być różne od siebie.
Składnia wygląda tak:

typ[][] nazwa = new typ[ilość][];

czyli np.:

int[][] tab = new int[2][];

rozmiar drugiego wymiaru deklarujemy pod deklaracją tablicy w ten sposób:

tab[0] = new int[3];
tab[1] = new int[5];

lub, gdy chcemy od razu przypisać jakąś wartość:

tab[0] = new int[]{3, 5, 31};
tab[1] = new int[]{13, 4, 1, 2, 9};

Wypisywanie takiej tablicy na ekran jest podobne do wypisywania dwuwymiarowej regularnej tablicy, należy jedynie pamiętać, że nie możemy zastosować GetLength w przypadku drugiego wymiaru:

for(int i=0; i<tab.GetLength(0); i++)
{
for(int j=0; j<tab[i].Length; j++)
{
    Console.Write(tab[i][j] + “ “);
}
Console.WriteLine();
}

Z czego korzystałem, co mogę polecić?

Dokumentacja C#
C# 6.0 Leksykon kieszonkowy

Zakończenie

Kolejna lekcja za nami :D. Już niedługo ruszymy trochę programowanie obiektowe, a później zanurkujemy w gamedev i zrobimy grę. Taki jest przynajmniej plan :D. Zachęcam do komentowania, a jak zostawisz upvote'a albo follow'a, to już w ogóle super :). Jak zwykle niżej linki do poprzednich wpisów (polecam). Cóż… Do następnego!

Poprzednie posty z tej serii:
#1 Piszemy pierwszy program
#2 Zmienne
#3 Operatory
#4 Pętle

Sort:  

Referencja to adres w pamięci, gdzie jest przechowywana wartość.
Nie programuję w C#, ale czy to o czym mówisz nie jest wskaźnikiem? :)

różnica między wskaźnikiem a referencją jest taka, że to kompilator zarządza referencjami, a programista nie posiada żadnej informacji o sposobie implementowania referencji (parafraza z wiki). Czyli blisko, ale to jednak nie to :D.