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