Edytuj stronę Odnośniki Fold/unfold all ODT export Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić. ~~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~~ <html> <style type="text/css"> p { text-align: left;} .reveal pre code { height: 100%; max-height: 100%; box-sizing: border-box; } </style> </html> ====== 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: <code C#> typ[] nazwa_tablicy; </code> Przykład: <code C#> double[] tablica; </code> ===== Inicjowanie tablic ===== Tablica jest **typem referencyjnym**, używamy słowa **new** <code C#> double[] tablica = new double[10]; </code> * stały rozmiar określony w momencie tworzenia * można zainicjować w momencie tworzenia <code C#> 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" }; </code> ===== Dostęp do elementów ===== * Operator dostępu ''[indeks]'' * Indeksy rozpoczynają się od 0 <code C#> 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]); </code> ===== 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 ===== <code C#> 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]) </code> Wyjście <file> a=42 b=43 ta[0]=43 tb[0]=43 </file> ===== Pętla foreach() ===== Pętla ''forach()'' pozwala wygodnie iterować po elementach kolekcji (tablice, listy, łańcuchy) Składnia: <code C#> foreach (var element in tablica) { // kolejne elementy podstawiane do zmiennej element } </code> Przykład: <code C#> int i = 0; foreach (var element in tablica) { Console.WriteLine("Element [{0}] wynosi: {1}", i, element); i++; } </code> ===== ===== <code C#> string tekst = "Ala ma kota"; foreach(var znak in tekst) Console.WriteLine(znak); </code> ===== Ć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 <code C#> int[,] macierz = new int[3, 4]; </code> Dostęp do elementów tablicy <code C#> int element = macierz[0, 5]; </code> {{zajecia:cs:array_2d.png}} ===== ===== Przykład z inicjacją <code C#> 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 } } }; </code> ===== 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) <code C#> int[][] jaggedArray = new int[3][]; jaggedArray[0] = new int[5]; jaggedArray[1] = new int[4]; jaggedArray[2] = new int[2]; </code> Dostęp do elementów; <code C#> int x = jaggedArray[1][2]; </code> ===== ===== Przykład z inicjacją <code C#> int[][] jaggedArray3 = { new int[] { 1, 3, 5, 7, 9 }, new int[] { 0, 2, 4, 6 }, new int[] { 11, 22 } }; </code> ===== 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: <file> T A J N A W I A D O M O Ś Ć </file> 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: <file> Podaj liczbę kolumn (klucz szyfrujący): 4 Wprowadź komunikat: Ala ma kota Zaszyfrowany tekst: Amolata a k Liczba wierszy (klucz deszyfrujący): 3 </file>