~~NOCACHE~~
~~REVEAL theme=simple&disableLayout=0&transition=none&controls=1&show_progress_bar=1&build_all_lists=0&show_image_borders=0&horizontal_slide_level=2&enlarge_vertical_slide_headers=0&show_slide_details=1&open_in_new_window=1&size=1024x768~~
====== Tablice, macierze, kolekcje ======
===== Tablice =====
{{ zajecia:pp1_2020_1:tab2.png?800 |}}
* tablice jednowymiarowe, dwuwymiarowe, wielowymiarowe, postrzępione
* przechowują elementy takiego samego typu
* pozycja elementu określona przez indeks poczynając od 0
* rozmiar tablicy jest stały, określony w momencie tworzenia tablicy
* tablice to typ referencyjny
===== Deklaracja tablic =====
Składnia:
typ[] nazwa_tablicy;
Przykład:
double[] tablica;
===== Inicjowanie tablic =====
Tablica jest **typem referencyjnym**, używamy słowa **new**
double[] tablica = new double[10];
* stały rozmiar określony w momencie tworzenia
* można zainicjować w momencie tworzenia
double[] tab2 = { 40.32, 3.13, 345.12};
var[] tab3 = new double[]{ 40.32, 3.13, 345.12};
string[] dni = new string[] { "Pon", "Wt", "Śr", "Czw", "Pią", "Sob", "Niedz" };
===== Dostęp do elementów =====
* Operator dostępu ''[indeks]''
* Indeksy rozpoczynają się od 0
double[] tablica = { 40.32, 3.13, 345.12};
tablica[0] = 3.15;
Console.WriteLine(tablica[2]);
for(int i=0; i < tablica.Length; i++)
Console.WriteLine(tablica[i]);
===== Typy wartościowe i referencyjne =====
Typy wartościowe:
* ''int'', ''char'', ''double'', ...
* wartość jest przechowywana w obszarze pamięci zmiennej (na stosie)
{{ https://www.tutorialsteacher.com/Content/images/csharp/value-type-memory-allocation.png?400 }}
===== =====
Typy referencyjne:
* tablice, łańcuchy (''string''), wszystkie klasy
* tworzone za pomocą operatora ''**new**''
* zmienna przechowuje referencję (wskaźnik) do obszaru pamięci (na stercie)
* domyślna wartość ''**null**'' - pusta referencja
{{ https://www.tutorialsteacher.com/Content/images/csharp/raference-type-memory-allocation.png?600 }}
Żródło: [[https://www.tutorialsteacher.com/csharp/csharp-value-type-and-reference-type|TutorialsTeacher]]
===== Przykład =====
int a = 42;
int b;
b=a; // kopiowanie wartości
b++;
Console.WriteLine("a={0} b={1}", a, b);
int[] ta = { 42, 1, 2 };
int[] tb;
tb = ta; // kopiowanie referencji
tb[0]++;
Console.WriteLine("ta[0]={0} tb[0]={1}", ta[0], tb[0])
Wyjście
a=42 b=43
ta[0]=43 tb[0]=43
===== Pętla foreach() =====
Pętla ''forach()'' pozwala wygodnie iterować po elementach kolekcji (tablice, listy, łańcuchy)
Składnia:
foreach (var element in tablica)
{
// kolejne elementy podstawiane do zmiennej element
}
Przykład:
int i = 0;
foreach (var element in tablica)
{
Console.WriteLine("Element [{0}] wynosi: {1}", i, element);
i++;
}
===== =====
string tekst = "Ala ma kota";
foreach(var znak in tekst)
Console.WriteLine(znak);
===== Ćwiczenie =====
Napisz program, który wczytuje liczby aż do podania pustej linii.
Po zakończeniu wczytywania program wyświetla wprowadzone liczby w odwrotnej kolejności.
Zakładamy, że liczb nie będzie więcej niż 1000.
Sprawdź, co się stanie, gdy przekroczymy zakres indeksów tablicy.
===== Tablice wielowymiarowe =====
Tworzenie tablicy 2 wymiarowej
int[,] macierz = new int[3, 4];
Dostęp do elementów tablicy
int element = macierz[0, 5];
{{zajecia:cs:array_2d.png}}
===== =====
Przykład z inicjacją
int[,] macierz = new int[,] {{ 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 }};
int[,,] macierz = new int[,,] { { { 1, 2, 3 }, { 4, 5, 6 } },
{ { 7, 8, 9 }, { 10, 11, 12 } } };
===== Tablice postrzępione =====
Tablice postrzępione (jagged) - to tablice, których elementami są tablice. \\
Rozmiar tablic może być różny (nie tworzą macierzy prostokątnej)
int[][] jaggedArray = new int[3][];
jaggedArray[0] = new int[5];
jaggedArray[1] = new int[4];
jaggedArray[2] = new int[2];
Dostęp do elementów;
int x = jaggedArray[1][2];
===== =====
Przykład z inicjacją
int[][] jaggedArray3 =
{
new int[] { 1, 3, 5, 7, 9 },
new int[] { 0, 2, 4, 6 },
new int[] { 11, 22 }
};
===== Własności tablic =====
Wybrane własności i metody tablic
^ Własność ^ Opis ^
| ''Length'' | całkowita liczba elementów we wszystkich wymiarach tablicy |
| ''Rank'' | ilość wymiarów |
^ Metoda ^ Opis ^
| ''GetLength(i)'' | ilość elementów w i-tym wymiarze |
===== Klasa Array =====
Klasa [[https://learn.microsoft.com/en-us/dotnet/api/system.array?view=netcore-3.1|Array]] udostępnia funkcje operujące na tablicach
^ Metoda ^ opis ^
| ''Array.Clear(tab)'' | zeruje elementy |
| ''Array.Reverse(tab)'' | odwraca kolejność elementów w tablicy jednowymiarowej |
| ''Array.Sort(tab)'' | sortuje elementy w tablicy jednowymiarowej |
===== Ćwiczenie =====
Napisz program, który wczyta macierz liczb rzeczywistych o wymiarach $N \times M$.
Wartości $N$ oraz $M$ podaje użytkownik na początku programu następnie program pobiera kolejne elementy macierzy.
Po wczytaniu wszystkich wartości wyświetl zawartość macierzy w postaci tabeli.
===== Zadanie: Szyfr macierzowy =====
Napisz program, który zaszyfruje linię tekstu za pomocą szyfru macierzowego.
Metoda szyfrowania polega na umieszczeniu znaków szyfrowanej wiadomości sekwencyjnie w kolejnych wierszach macierzy.
Przykładowo tekst "TAJNA WIADOMOŚĆ" umieszczony w macierzy posiadającej 4 kolumny wypełnia macierz o wymiarach 4x4:
T A J N
A W I
A D O M
O Ś Ć
Szyfr uzyskujemy ze znaków odczytanych w kolumnach. W powyższym przykładzie zaszyfrowana wiadomość to: "TAAOA DŚJWOĆNIM".
Sposób kodowania zależy od ilości kolumn macierzy - jest to klucz szyfrujący.
Do odszyfrowania wiadomości wykorzystuje się ten sam algorytm, w którym kluczem będzie liczba wierszy macierzy wypełnionej tekstem.
Program wczytuje następujące dane:
* liczbę kolumn macierzy
* linię tekstu (komunikat do zaszyfrowania)
Wynikiem działania jest wyświetlenie zaszyfrowanego tekstu oraz liczby uzyskanych wierszy macierzy szyfrującej.
===== =====
Przykład działania:
Podaj liczbę kolumn (klucz szyfrujący): 4
Wprowadź komunikat:
Ala ma kota
Zaszyfrowany tekst:
Amolata a k
Liczba wierszy (klucz deszyfrujący): 3