Struktury danych

Wyjaśnienie struktury danych (rekordy)

Co to są struktury danych (rekordy)?

Struktura danych (rekord) to złożony typ danych, który pozwala na grupowanie różnych wartości w jedną jednostkę logiczną. Każda struktura składa się z pól (atrybutów), gdzie każde pole może mieć inny typ danych.

Struktury są szczególnie przydatne, gdy dane mają wspólny kontekst i powinny być przechowywane razem. Dzięki nim można łatwiej organizować i przetwarzać informacje, unikając konieczności zarządzania wieloma oddzielnymi zmiennymi.

Jak działają struktury danych?

  • Struktura definiuje nowy typ danych zawierający określone pola.

  • Każde pole w strukturze może mieć swój własny typ (np. liczba, tekst, tablica).

  • Po utworzeniu struktury można tworzyć jej instancje (obiekty), które przechowują konkretne wartości w zdefiniowanych polach.

  • Struktury mogą być przekazywane do funkcji, przechowywane w tablicach lub wykorzystywane do bardziej zaawansowanego modelowania danych.

Przykład użycia struktury

Załóżmy, że chcemy przechowywać informacje o książkach w bibliotece. Zamiast używać trzech oddzielnych zmiennych na tytuł, autora i rok wydania, możemy stworzyć strukturę Ksiazka, która będzie przechowywać te dane razem:

Struktura Ksiazka:
  - tytul (tekst)
  - autor (tekst)
  - rokWydania (liczba)

Przykładowe użycie:

  • Tworzymy instancję struktury i przypisujemy wartości:

Ksiazka ks1
ks1.tytul = "Władca Pierścieni"
ks1.autor = "J.R.R. Tolkien"
ks1.rokWydania = 1954
  • Możemy przechowywać wiele takich struktur w tablicy:

Ksiazka biblioteka[3]
biblioteka[0] = ks1
biblioteka[1] = Ksiazka("Hobbit", "J.R.R. Tolkien", 1937)
biblioteka[2] = Ksiazka("1984", "George Orwell", 1949)

Zastosowania struktur danych

  • Organizacja danych – przechowywanie powiązanych informacji w uporządkowany sposób.

  • Przesyłanie danych – struktury mogą być łatwo przekazywane między funkcjami.

  • Praca z plikami i bazami danych – struktury pomagają w organizacji rekordów.

  • Reprezentacja obiektów w programowaniu obiektowym – często są podstawą do budowy bardziej zaawansowanych typów danych.

Podsumowanie

Struktury danych pozwalają na logiczne grupowanie różnych wartości w jedną całość, ułatwiając organizację i przetwarzanie informacji. Są szeroko stosowane w programowaniu, szczególnie tam, gdzie potrzebna jest czytelna i spójna reprezentacja danych.

Zastosowanie struktur danych w C++

Definicja struktury

Aby zdefiniować strukturę, używamy słowa kluczowego struct, po którym następuje nazwa struktury oraz blok definiujący jej składowe:

struct Uzytkownik {
    string imie;
    string nazwisko;
    int wiek;
    string email;
};

W powyższym przykładzie struktura Uzytkownik zawiera cztery pola: imie, nazwisko, wiek oraz email.

Tworzenie i inicjalizacja obiektu struktury

Po zdefiniowaniu struktury możemy tworzyć jej obiekty i przypisywać wartości do poszczególnych pól:

Uzytkownik osoba1;
osoba1.imie = "Jan";
osoba1.nazwisko = "Kowalski";
osoba1.wiek = 30;
osoba1.email = "jan.kowalski@example.com";

Możemy również inicjalizować strukturę podczas deklaracji:

Uzytkownik osoba2 = {"Anna", "Nowak", 25, "anna.nowak@example.com"};

Dostęp do pól struktury

Dostęp do poszczególnych pól struktury uzyskujemy za pomocą operatora kropki (.):

cout << "Imię: " << osoba1.imie << endl;
cout << "Nazwisko: " << osoba1.nazwisko << endl;
cout << "Wiek: " << osoba1.wiek << endl;
cout << "Email: " << osoba1.email << endl;

Operacje na strukturach

Na strukturach w C++ możemy wykonywać różne operacje, takie jak:

  • Kopiowanie: Przypisywanie jednego obiektu struktury do innego.

Uzytkownik osoba3 = osoba1;
  • Porównywanie: Porównywanie poszczególnych pól struktury.

if (osoba1.email == osoba2.email) {
      cout << "Użytkownicy mają ten sam email." << endl;
  }
  • Przekazywanie do funkcji: Struktury mogą być przekazywane do funkcji zarówno przez wartość, jak i przez referencję.

void wyswietlUzytkownika(const Uzytkownik& u) {
      cout << u.imie << " " << u.nazwisko << ", wiek: " << u.wiek << ", email: " << u.email << endl;
  }

  wyswietlUzytkownika(osoba1);

Struktury w C++ są podstawowym narzędziem do grupowania powiązanych danych, co ułatwia organizację i zarządzanie złożonymi informacjami w programie.

Przykłady zastosowań struktur danych w C++

Przykład 1 - Definiowanie i używanie struktur danych

W tym przykładzie zademonstrowano, jak zdefiniować strukturę w języku C++ i wykorzystać ją do przechowywania oraz operowania na danych użytkownika.

#include <iostream>
using namespace std;

// Definicja struktury przechowującej dane użytkownika
struct Uzytkownik {
    string imie;
    string nazwisko;
    int wiek;
};

// Funkcja wyświetlająca dane użytkownika
void WyswietlUzytkownika(const Uzytkownik& u) {
    cout << "Imię: " << u.imie << ", Nazwisko: " << u.nazwisko << ", Wiek: " << u.wiek << endl;
}

int main() {
    // Deklaracja i inicjalizacja struktury
    Uzytkownik osoba = {"Jan", "Kowalski", 28};

    // Wyświetlenie danych użytkownika
    cout << "Dane użytkownika:" << endl;
    WyswietlUzytkownika(osoba);

    return 0;
}

Działanie:

  1. Definicja struktury: Struktura Uzytkownik jest zdefiniowana z trzema polami: imie, nazwisko oraz wiek. Służy do przechowywania informacji o użytkowniku.

  2. Deklaracja i inicjalizacja: W funkcji main tworzony jest obiekt osoba typu Uzytkownik i inicjalizowany wartościami "Jan", "Kowalski", 28.

  3. Przekazanie struktury do funkcji: Funkcja WyswietlUzytkownika przyjmuje strukturę jako argument przekazany przez referencję (const Uzytkownik&), co zapobiega jej kopiowaniu i zwiększa wydajność.

  4. Wyświetlanie danych: Program wyświetla informacje o użytkowniku przed zakończeniem działania.

Wynik działania programu:

Dane użytkownika:
Imię: Jan, Nazwisko: Kowalski, Wiek: 28

Podsumowanie:

Ten przykład pokazuje, jak można wykorzystać struktury w języku C++ do organizacji i przechowywania powiązanych danych. Struktury są szczególnie przydatne w przypadku bardziej złożonych danych, takich jak informacje o użytkownikach, produktach czy punktach geometrycznych.

Przykład 2 - Struktura zagnieżdżona i operacje na strukturach

W tym przykładzie pokazano, jak można zagnieżdżać struktury w języku C++ oraz jak operować na ich danych.

#include <iostream>
using namespace std;

// Definicja struktury przechowującej adres użytkownika
struct Adres {
    string ulica;
    string miasto;
    int kodPocztowy;
};

// Definicja struktury użytkownika z zagnieżdżoną strukturą Adres
struct Uzytkownik {
    string imie;
    string nazwisko;
    int wiek;
    Adres adres; // Pole typu Adres w strukturze Uzytkownik
};

// Funkcja wyświetlająca dane użytkownika
void WyswietlUzytkownika(const Uzytkownik& u) {
    cout << "Imię: " << u.imie << ", Nazwisko: " << u.nazwisko << ", Wiek: " << u.wiek << endl;
    cout << "Adres: " << u.adres.ulica << ", " << u.adres.miasto << ", " << u.adres.kodPocztowy << endl;
}

// Funkcja zmieniająca miasto w strukturze użytkownika
void ZmienMiasto(Uzytkownik& u, const string& noweMiasto) {
    u.adres.miasto = noweMiasto;
}

int main() {
    // Deklaracja i inicjalizacja struktury
    Uzytkownik osoba = {"Anna", "Nowak", 25, {"Ul. Kwiatowa 12", "Warszawa", 10000}};

    // Wyświetlenie danych użytkownika przed zmianą
    cout << "Dane użytkownika przed zmianą miasta:" << endl;
    WyswietlUzytkownika(osoba);

    // Zmiana miasta użytkownika
    ZmienMiasto(osoba, "Kraków");

    // Wyświetlenie danych użytkownika po zmianie
    cout << "\nDane użytkownika po zmianie miasta:" << endl;
    WyswietlUzytkownika(osoba);

    return 0;
}

Działanie:

  1. Zagnieżdżona struktura: Struktura Adres przechowuje informacje o adresie użytkownika, a struktura Uzytkownik posiada pole adres typu Adres.

  2. Inicjalizacja zagnieżdżonej struktury: W funkcji main tworzony jest obiekt osoba z wartościami dla imie, nazwisko, wiek, a także adres (ulica, miasto, kod pocztowy).

  3. Funkcja do zmiany danych struktury: Funkcja ZmienMiasto modyfikuje miasto użytkownika, przyjmując jego strukturę jako referencję (Uzytkownik&), co pozwala na bezpośrednią modyfikację oryginalnego obiektu.

  4. Wyświetlanie danych przed i po zmianie: Najpierw dane użytkownika są wyświetlane w pierwotnej formie, następnie po zmianie miasta.

Wynik działania programu:

Dane użytkownika przed zmianą miasta:
Imię: Anna, Nazwisko: Nowak, Wiek: 25
Adres: Ul. Kwiatowa 12, Warszawa, 10000

Dane użytkownika po zmianie miasta:
Imię: Anna, Nazwisko: Nowak, Wiek: 25
Adres: Ul. Kwiatowa 12, Kraków, 10000

Podsumowanie:

Ten przykład ilustruje, jak można wykorzystać zagnieżdżone struktury do przechowywania bardziej złożonych danych. Pokazuje również, jak zmieniać wartości pól struktury za pomocą funkcji. Takie podejście jest przydatne w przypadku bardziej skomplikowanych obiektów, takich jak użytkownicy systemów, zamówienia w sklepach internetowych czy informacje o pojazdach.

Zadania - Struktury danych w C++

Zadanie 1 - Podstawowe operacje na strukturach

Napisz program, który umożliwia pracę ze strukturami w języku C++. Program będzie przechowywał informacje o osobie w strukturze i wykonywał operacje na jej danych.

Kroki do wykonania:

  1. Zdefiniuj strukturę Osoba, która będzie przechowywać:

    • imie,

    • nazwisko,

    • wiek.

  2. Zadeklaruj zmienną typu Osoba i przypisz do niej przykładowe dane.

  3. Wyświetl dane zapisane w strukturze.

  4. Zmień wartość wieku osoby w strukturze.

  5. Ponownie wyświetl zmienione dane.

Wynik działania programu:

Dane przed modyfikacją:
Imię: Jan, Nazwisko: Kowalski, Wiek: 25

Dane po modyfikacji:
Imię: Jan, Nazwisko: Kowalski, Wiek: 30

Zadanie 2 - Tablica struktur

Napisz program, który umożliwia przechowywanie i wyświetlanie danych kilku osób przy użyciu tablicy struktur.

Kroki do wykonania:

  1. Zdefiniuj strukturę Osoba, która będzie przechowywać:

    • imie,

    • nazwisko,

    • wiek.

  2. Zadeklaruj tablicę Osoba o rozmiarze 3, aby przechować dane trzech osób.

  3. Wprowadź przykładowe dane dla każdej osoby.

  4. Wyświetl wszystkie dane przechowywane w tablicy.

Wynik działania programu:

Dane zapisane w tablicy struktur:
1. Imię: Jan, Nazwisko: Kowalski, Wiek: 25
2. Imię: Anna, Nazwisko: Nowak, Wiek: 30
3. Imię: Piotr, Nazwisko: Wiśniewski, Wiek: 40

Zadanie 3 - Funkcja operująca na strukturze

Napisz program, który definiuje strukturę do przechowywania danych o samochodzie oraz funkcję, która wyświetli informacje o podanym samochodzie.

Kroki do wykonania:

  1. Zdefiniuj strukturę Samochod, która będzie zawierać:

    • marka,

    • model,

    • rok_produkcji.

  2. Napisz funkcję WyswietlDane, która przyjmie strukturę Samochod jako argument i wyświetli informacje o samochodzie.

  3. W funkcji main():

    • Zainicjalizuj zmienną typu Samochod przykładowymi danymi.

    • Wywołaj funkcję WyswietlDane, przekazując do niej utworzoną strukturę.

Wynik działania programu:

Dane samochodu:
Marka: Toyota
Model: Corolla
Rok produkcji: 2018