Podstawy C# Tablicektm.umg.edu.pl/~pik/prokom/pliki/pp-w03.pdf · 2019. 2. 10. · Tablice C#...

22
Podstawy programowania Podstawy C# Tablice

Transcript of Podstawy C# Tablicektm.umg.edu.pl/~pik/prokom/pliki/pp-w03.pdf · 2019. 2. 10. · Tablice C#...

  • Podstawy programowania

    Podstawy C#

    Tablice

  • Tablice C#

    Tablica to indeksowany zbiór elementów • Tablica jest typem referencyjnym

    (deklaracja tworzy tylko referencję, sama tablica musi byćutworzona oddzielnie, najprościej operatorem new)

    • Wszystkie elementy tablicy są tego samego typu

    • Dostęp do elementów tablicy daje operator indeksowania [](Ważne: indeks zaczyna się zawsze od wartości 0, a nie 1)

    • Tablice mogą być jedno- lub wielowymiarowe

    • Można tworzyć tablice tablic(jest to coś innego, niż tablica wielowymiarowa)

  • Tablice C#

    • Deklaracja tablicyMożna zadeklarować tablicę elementów dowolnego typu (wartościowego lub referencyjnego), dopisując "[]" po typie:

    Int32[] t1; // tablica liczb Int32

    Button[] t2; // tablica referencji przycisków

    Użycie "[]" po nazwie typu deklaruje tablicę jednowymiarową, użycie "[ , ]" dwuwymiarową, "[ , , ]" trzywymiarową itd.

    Int32[ , ] t3; // tablica dwuwymiarowa

  • Tablice C#

    • Deklaracja tablicyMożna połączyć deklarację tablicy z jej utworzeniem i nadaniem wartości – wówczas rozmiar tablicy wynika z inicjalizatora.

    Inicjalizator tablicy to lista elementów, zapisana w nawiasach klamrowych i oddzielonych przecinkami:{ p0, p1, p2, … pk-1 }

    Jeżeli tablica jest wielowymiarowa, to konstrukcja ta musi zostać zagnieżdżona, np. w tablicy trójwymiarowej każde p jest tablicą elementów q, a każde q jest tablicąelementów r:{ p0, p1, p2, … pk-1 }

    {{q0,…ql-1}, {q0,…ql-1}, … {q0,…ql-1}}

    {{{r0,…rm-1},…{r0,…rm-1}},… {{r0,…rm-1},…{r0,…rm-1}}}

  • Tablice C#

    • Deklaracja tablicyPrzykłady:// tablica jednowymiarowa 4 el.Int32[] t1 = { 1, 2, 3, 4 };

    // tablica dwuwymiarowa 2x3 el.

    Int32[,] t2 = { { 1, 2, 3 }, { 4, 5, 6 } };

    // tablica trójwymiarowa 2x3x4 el.

    Int32[, ,] t3 = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 0, 1, 2} }

    { {3, 4, 5, 6}, {7, 8, 9, 0}, {1, 2, 3, 4} } };

  • Tablice C#

    • Utworzenie tablicyW celu utworzenia tablicy należy użyć operatora new, podając rozmiar tablicy:Int32[] t1; // deklaracja tablicyt1 = new Int32[5]; // utworzenie tablicy

    Deklarację i utworzenie tablicy można połączyć:Double[] t2 = new Double[3];

    Int32[,] t3 = new Int32[3,5];

    Można też połączyć utworzenie tablicy z nadaniem wartości;Liczba elementów musi być równa rozmiarowiInt32[] t4 = new Int32[3] {1, 2, 3}; // ok

    Int32[] t5 = new Int32[3] {1, 2}; // błąd!

  • Tablice C#

    • Utworzenie tablicyRozmiar tablicy może być stałą całkowitą, ale też zmienną lub dowolnym wyrażeniem o rezultacie całkowitym:Int32[] t1, t2, t3;Int32 r = 7;

    t1 = new Int32[7]; t2 = new Int32[r];t3 = new Int32[2 * r + 1];

    To ważne – rozmiar nie musi być znany w czasie kompilacji, można utworzyć tablicę o rozmiarze zależnym od wykonania programu, np. podanym przez użytkownika

  • Tablice C#

    • Wartości domyślne elementówPodczas tworzenia tablicy, jej wszystkie elementy sąinicjalizowane tzw. wartością domyślną:

    – 0 lub 0.0 dla typów prostych liczbowych,

    – false dla typu Boolean

    – '\0' dla znaków,

    – "" (łańcuch pusty) dla łańcuchów

    – null dla typów referencyjnych

    To inaczej, niż w C/C++, gdzie tablice nie są inicjalizowane,a po utworzeniu zawierają wartości przypadkowe (tj. śmieci pozostałe po poprzednio używanych zmiennych)

    To również inaczej, niż zwykłe zmienne w C#, które także nie są inicjowane

  • Tablice C#

    Wartości null• Dotyczy wyłącznie typów referencyjnych i oznacza referencję

    pustą, tj. że obiekt wskazywany przez referencję nie istnieje.

    • Wartość null ma istotne znaczenie praktyczne, np. pozwala sprawdzić, czy obiekt istnieje:obiect o = TryCreateObiect();if (o != null) // = jeżeli obiekt istnieje

    • Przypisanie null do zmiennej referencyjnej jest dla CLR sygnałem, że obiekt wskazywany przez nią nie jest potrzebny, więc jego zasoby mogą zostać zwolnione przez GC:object o = new object();

    // …o = null; // zwolnienie zasobów obiektu przez GC

  • Tablice C#

    • IndeksowanieDostęp do elementów tablicy daje operator indeksowania [].Numery indeksów zaczynają się od 0, zatem tablica o rozmiarze N ma indeksy od 0 do N-1Int32[] t = new Int32[3];Int32 suma; t[0] = 7; // pierwszy elementt[1] = 13; // drugit[2] = 77; // trzeci i ostatni

    suma = t[0] + t[1] + t[2];

    Próba odczytu lub przypisania elementu o indeksie spoza zakresu 0…N-1 spowoduje wyjątek programowy t[3] = 0; // błąd!

  • Tablice C#

    • IndeksowanieIndeks może być stałą całkowitą, ale też zmienną lub dowolnym wyrażeniem o rezultacie całkowitym:Int32[] t = new Int32[100];Int32 i = 7;

    t[i] = 7;t[i+1] = 13;t[7*i + 13] = 77;t[2*t[i] + 3] = 169;

    To ważne – umożliwia przetwarzanie tablic przy pomocy pętli, oczywiście najczęściej jest to pętla for

  • Tablice C#

    • IndeksowanieDo przetwarzania tablic prawie zawsze najlepszym wyborem jest pętla for – ponieważ liczba elementów jest znana:Random r = new Random(); Int32 i; Int32[] t = new Int32[100];

    for (i = 0; i < 100; i++)t[i] = r.Next();

    Dla liczb całkowitych równoważnie można napisaćInt32[] t = new Int32[100]; for (i = 0; i

  • Tablice C#

    • IndeksowanieDo przetwarzania tablic prawie zawsze najlepszym wyborem jest pętla for – ponieważ liczba elementów jest znana:Random r = new Random(); Int32 i; Int32[] t = new Int32[100];

    for (i = 0; i < 100; i++)t[i] = r.Next();

    Każda iteracja pętli daje kolejną wartość indeksu tablicy,i = 0, 1, 2, …, N-1 – używając zapisu t[i] można wykorzystaćzmieniany przez pętlę indeks do zapisania lub odczytania wartości, po jednej wartości w każdej iteracji

  • Tablice C#

    • IndeksowanieSposób konstrukcji pętli z warunkiem "licznik < rozmiar" jest jeszcze bardziej czytelny, gdy rozmiar jest zmienną:Random r = new Random(); Int32 i, N = 100; Int32[] t = new Int32[N];for (i = 0; i < N; i++)t[i] = r.Next();

    Tym bardziej, że np. w algorytmach sortowania przegląda siętablicę od pierwszego do przedostatniego elementu, co w takim zapisie jest wyraźnie widoczne:for (i = 0; i < N - 1; i++)

    Równoważny zapis i

  • Tablice C#

    • Tablice tablicTablica może zawierać elementy dowolnego typu, zatem również inne tablice. Tablice tablic NIE są tablicami dwuwymiarowymi (nie można stosować ich zamiennie):Int32[,] t2w; // tablica dwuwymiarowa

    Int32[][] tt; // tablica tablic

    Tablice tablic wymagają dwuetapowego tworzenia: tt = new Int32[][2];tt[0] = new Int32[5];tt[1] = new Int32[10];

    Tablice wchodzące w skład tablicy tablic mogą mieć różne rozmiary, dlatego takie tablice są nazywane jigged tables(tablice szczerbate)

  • Tablice C#

    Klasa Array• Klasa Array jest tzw. klasą uniwersalną – reprezentuje tablicę

    elementów dowolnego typu

    • Jest to klasa abstrakcyjna – nie można utworzyć obiektu Array

    • Każda tablica, niezależnie od typu elementów składowych, należy do klasy Array (do zmiennej typu Array można przypisaćdowolną tablicę), odwrotne przypisanie wymaga rzutowaniaInt32[] t = new Int32[3];Array a;

    a = new Array(); // błąd!a = t; // okt = a; // błąd!t = (Int32[])a; // ok

  • Tablice C#

    Klasa Array• Klasa Array udostępnia wiele przydatnych właściwości i metod;

    • Większość z nich to metody statyczne (wywoływane przez klasę Array, a nie obiekt tej klasy; pierwszym argumentem metody jest tablica)Int32[] t1 = { 1, 2, 3, 4 };Int32[] t2;Int32 i;

    i = Array.IndexOf(t1, 3); // 2Array.Reverse(t1); // {4,3,2,1}t2 = Array.FindAll(t1, n => n%2==0); // {4,2}Array.Sort(t2); // {2,4}

  • Tablice C#

    Klasa Array• Klasa Array – metody statyczne

    – CreateInstance – tworzy tablicę obiektów wskazanego typu

    – Copy – kopiuje fragment tablicy do innej tablicy

    – Find, FindAll – znajduje elementy spełniające określony warunek

    – FindIndex – znajduje element spełniający warunek i zwraca jego indeks

    – IndexOf – znajduje element o określonej wartości i zwraca jego indeks

    – Resize – zmienia rozmiar tablicy

    – Reverse – odwraca kolejność elementów

    – Sort – sortuje tablicę (jest kilkanaście wersji tej metody, można m.in. podać niestandardowy komparator)

  • Tablice C#

    Klasa Array• Klasa Array – właściwości i metody instancji

    (tj. dostępne przez zmienne klasy Array)metody:

    – Clone – tworzy tzw. płytką kopię tablicy

    – CopyTo – kopiuje fragment tablicy do innej tablicy

    – GetLength – podaje liczbę elementów określonego wymiaru

    właściwości– Rank – liczba wymiarów (liczona od zera!)

    – Length – łączna (dla wszystkich wymiarów) liczba elementów

    for (i=0; i

  • Tablice C#

    Klasa Enumerable• Klasa statyczna, dostarcza kilkadziesiąt (!) statycznych metod

    przetwarzania dowolnych obiektów implementujących interfejs IEnumerable, tj. różne kolekcje (klasa Array też)

    • Wszystkie metody są zdefiniowane jako tzw. rozszerzenia (extension), mogą być wywoływane na 2 sposoby:– przez klasę Enumerable– przez obiekt dowolnej klasy implementującej IEnumerable

    (znacznie wygodniej, można wykonać kilka operacji)

    Int32[] t1 = { 1, 2, 3, 4 };Double avg;avg = Enumarable.Average(t1); avg = t1.Average();

  • Tablice C#

    Klasa Enumerable• Wiele metod daje jako rezultat kolekcję, jednak aby zapisać go

    jako tablicę, należy użyć metody ToArrayInt32[] t1 = { 1, 2, 3, 4 };Int32[] t2;t2 = t1.Reverse().ToArray(); // {4,3,2,1}

    • Wywołania wielu kolejnych metod Enumerable można połączyćw łańcuch – kolejna metoda łańcucha przetwarza rezultat dostarczony przez metodę poprzedniąInt32[] t3 = { 2, 1, 2, 3, 2, 4 };Int32[] t4;t4 = t3.Distinct().Where(n => n

  • Tablice C#

    Klasa Enumerable, wybrane metody:– All – sprawdza czy wszystkie elementy spełniają wskazane kryterium

    – Any – sprawdza czy choć jeden elementy spełnia wskazane kryterium

    – Average – oblicza wartość średnią (elementy muszą być liczbami)

    – Concat – łączy dwie kolekcje

    – Contains – sprawdza czy kolekcja zawiera wskazany element

    – Distinct – zwraca kolekcję elementów unikalnych (bez powtórzeń)

    – Except – zwraca kolekcję za wyjątkiem wskazanych (różnica zbiorów)

    – Max – zwraca wartość maksymalną (elementy muszą być liczbami)

    – Min – zwraca wartość minimalną

    – OrderBy – sortuje według wybranego klucza i opcjonalnie komparatora

    – Select – zwraca kolekcję elementów przetworzonych p. zał. funkcję

    – Sum – oblicza sumę (elementy muszą być liczbami)

    – Where – zwraca podzbiór elementów spełniających zał. kryterium

    – ToList – przekształca kolekcję w listę

    – ToArray – przekształca kolekcję w tablicę