→ Slide 1

Struktury i typ wyliczeniowy

→ Slide 2

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 } 
→ Slide 3
  • 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()
        {
            // ....
        }
    }
}
→ Slide 4

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);
    }
}
→ Slide 5

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
→ Slide 6

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
→ Slide 7

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
→ Slide 8

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

→ Slide 9
Osoba student;
Osoba pracownik = new Osoba();

Dostęp do pól za pomocą kropki

student.imię = "Janek";
int x = pracownik.Wiek;
→ Slide 10
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);
}
→ Slide 11
  • 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
→ Slide 12

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)} $$

→ Slide 13

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:

  1. Wyświetl - wyświetlenie aktualnej zawartości bazy danych (zawartość wszystkich rekordów) oraz liczby rekordów.
  2. 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.
  3. 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.