~~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~~ ====== Struktury i typ wyliczeniowy ======= ===== Typ wyliczeniowy ===== Typ wyliczeniowy to odmiana typu całkowitego, którego wartości mają przypisane nazwy (wyliczanka). Deklaracja typu: enum nazwa_typu { element1, element2, ... }; Przykład: enum Kolory { Czerwony , Niebieski , Zielony , Czarny } ===== Deklaracja typu ===== * słowo ''enum'' **definiuje nowy typ** wyliczeniowy * deklaracja typu umieszczana jest w zakresie przestrzeni nazw lub klasy * elementy to kolejne wartości całkowite od 0 namespace Program { enum Kolory { Czerwony , Niebieski , Zielony , Czarny } public class Hello { enum Dni {pn, wt, śr, czw, pt}; public static void Main() { // .... } } } ===== Deklaracja zmiennej typu enum ===== Tworzenie zmiennej typu wyliczeniowego class Program { enum Kolory { Czerwony, Niebieski, Zielony, Czarny } static void Main(string[] args) { // deklaracja zmiennej Kolory kolor1; // przypisanie wartości kolor1 = Kolory.Czerwony; Console.WriteLine("Zmienna zawiera wartość {0}" , kolor1); Console.WriteLine("Wartość całkowita to {0}", (int)kolor1); } } ===== Operacja na zmiennych enum ===== Na zmiennych typu wyliczeniowego można wykonywać operacje dozwolone dla typu całkowitego. enum Kolory { Czerwony, Niebieski, Zielony, Czarny } static void Main(string[] args) { Kolory kolor1 = Kolory.Zielony; kolor1++; Console.WriteLine("Następny kolor to {0}", kolor1); for (var k = Kolory.Czerwony; k < Kolory.Czarny; k++) { Console.WriteLine($"Kolor: {k} o wartości {(int)k}"); } } Wyjście Następny kolor to Czarny Kolor: Czerwony o wartości 0 Kolor: Niebieski o wartości 1 Kolor: Zielony o wartości 2 Kolor: Czarny o wartości 3 ===== Przypisanie wartości ===== Wartościom wyliczeniowym możemy przypisać własne wartości liczbowe enum Kolory { Zielony = 5, Czerwony, Czarny = 10 } static void Main(string[] args) { for (var k = Kolory.Zielony; k <= Kolory.Czarny; k++) { Console.WriteLine($"Kolor: {k} o wartości {(int)k}"); } } Wyjście Kolor: Zielony o wartości 5 Kolor: Czerwony o wartości 6 Kolor: 7 o wartości 7 Kolor: 8 o wartości 8 Kolor: 9 o wartości 9 Kolor: Czarny o wartości 10 ===== Struktury ===== Struktura to typ wartościowy przechowujący elementy różnego typu {{ zajecia:cs:struct.png?200 |}} ===== ===== * Struktura to typ wartościowy przechowujący elementy różnego typu * **pola** - elementy struktury identyfikowane nazwami * dostęp do pola operatorem kropka (''struktura.pole'') * ułatwia organizację danych - struktura jest obiektem * struktura może być argumentem metody oraz typem zwracanym metody ===== Deklaracja typu strukturalnego ===== Składnia struct nazwa_typu { modyfikator_dostępu typ1 nazwa_pola1; modyfikator_dostępu typ2 nazwa_pola2; ... }; Przykład: struct Osoba { public string Imię; public int Wiek; } Struktura tworzy nowy typ, deklaracja w ramach przestrzeni nazw lub klasy ===== Definicja zmiennej typu strukturalnego ===== Osoba student; Osoba pracownik = new Osoba(); Dostęp do pól za pomocą kropki student.imię = "Janek"; int x = pracownik.Wiek; ===== Przykład ===== struct Osoba { public string Imię; public int Wiek; } static void Main(string[] args) { Osoba student; student.Imię = "Janek"; student.Wiek = 33; Console.WriteLine(student.Imię); Console.WriteLine(student.Wiek); } ===== Struktury a klasy ====== * struktury mają wiele podobnych mechanizmów jak klasy: konstruktory, metody, właściwości, .. * struktury to typ wartościowy a klasy referencyjny * struktury nie wspierają dziedziczenia (ale to już inny temat) Osoba student = new Osoba(); student.Imię = "Jan"; Osoba x = student; // kopiowanie wartości a nie referencji x.Imię = "Marek"; Console.WriteLine(student.Imię); Console.WriteLine(x.Imię); Wynik: Jan Marek ===== Ćwiczenie ===== Zadeklaruj strukturę ''Punkt'' zawierająca dwa pola ''x'' i ''y'' typu rzeczywistego (współżędne na płaszczyźnie). Zdefiniuj metodę statyczną (funkcję) wyznaczającą długość lini łamanej określonej przez tablicę punktów (wierzchołków). {{ https://www.math.edu.pl/images/geometria/lamana.gif?400 }} Napisz program, który wczyta sekwencję współrzędnych wierzchołków linii łamanej a następnie wyznaczy długość łamanej. Odległość pomiędzy dwoma punktami wynosi $$ D(A, B) = \sqrt{(A_x-B_x)^2 + (A_y - B_y)^2)} $$ ===== Zadanie 7: Baza danych osobowych ====== Zaimplementuj prostą bazę danych osobowych składającą się z tablicy struktur zawierających dane osobowe: imię, nazwisko, wiek, płeć. Dla uproszczenia zakładamy, że maksymalna ilość rekordów w bazie danych nie przekroczy 100. Pole ''płeć'' reprezentuj przez zmienną wyliczeniową (''enum'') o wartościach: ''Kobieta'', ''Mężczyzna''. ===== ===== Program po uruchomieniu wypisuje ilość dostępnych rekordów w bazie danych oraz menu z możliwymi akcjami do wykonania: - **Wyświetl** - wyświetlenie aktualnej zawartości bazy danych (zawartość wszystkich rekordów) oraz liczby rekordów. - **Dodaj** - dodanie nowego rekordu do bazy danych. Użytkownik proszony jest o wypełnienie wszystkich pól nowego rekordu. Nowy rekord dodawany jest automatycznie na końcu bazy danych. Ilość rekordów zwiększa się o 1. - **Zamknij** - zapisanie aktualnego stanu bazy danych do pliku oraz zamkniecie programu. ===== ===== Przy pierwszym uruchomieniu program startuje z pustą bazą danych. Użytkownik może dodawać nowe rekordy i wyświetlać aktualny stan bazy danych. Przed zamknięciem programu (po wybraniu opcji 3 z menu) aktualny stan bazy danych (wszystkie rekordy) jest zapisywany w pliku znajdującym się w bieżącym katalogu programu. Dane mogą być zapisane w dowolnej postaci, ale umożliwiającej odtworzenie stanu bazy danych w programie. Przy każdym uruchomieniu programu, przed wypisaniem menu, program sprawdza, czy w bieżącym katalogu znajduje się plik zawierający zapis bazy danych. Jeżeli plik istnieje to baza danych zostaje wypełniona zawartością tego pliku. Jeżeli plik nie istnieje to program rozpoczyna pracę z pusta listą rekordów.