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
- 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).
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.