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.
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.
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)
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.
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.
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.
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 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;
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.
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:
Definicja struktury: Struktura Uzytkownik jest zdefiniowana z trzema polami: imie, nazwisko oraz wiek. Służy do przechowywania informacji o użytkowniku.
Deklaracja i inicjalizacja: W funkcji main tworzony jest obiekt osoba typu Uzytkownik i inicjalizowany wartościami "Jan", "Kowalski", 28.
Przekazanie struktury do funkcji: Funkcja WyswietlUzytkownika przyjmuje strukturę jako argument przekazany przez referencję (const Uzytkownik&), co zapobiega jej kopiowaniu i zwiększa wydajność.
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.
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;
}
Zagnieżdżona struktura: Struktura Adres przechowuje informacje o adresie użytkownika, a struktura Uzytkownik posiada pole adres typu Adres.
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).
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.
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.
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.
Zdefiniuj strukturę Osoba
, która będzie przechowywać:
imie,
nazwisko
,
wiek
.
Zadeklaruj zmienną typu Osoba
i przypisz do niej przykładowe dane.
Wyświetl dane zapisane w strukturze.
Zmień wartość wieku osoby w strukturze.
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
Napisz program, który umożliwia przechowywanie i wyświetlanie danych kilku osób przy użyciu tablicy struktur.
Zdefiniuj strukturę Osoba
, która będzie przechowywać:
imie
,
nazwisko
,
wiek
.
Zadeklaruj tablicę Osoba
o rozmiarze 3, aby przechować dane trzech osób.
Wprowadź przykładowe dane dla każdej osoby.
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
Napisz program, który definiuje strukturę do przechowywania danych o samochodzie oraz funkcję, która wyświetli informacje o podanym samochodzie.
Zdefiniuj strukturę Samochod
, która będzie zawierać:
marka
,
model
,
rok_produkcji
.
Napisz funkcję WyswietlDane
, która przyjmie strukturę Samochod
jako argument i wyświetli informacje o samochodzie.
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