StrukturastrukturaStruktura jest złożonym typem danych, który definiuje programista. Przechowywane przez nią informacje nie muszą mieć tego samego typu. Oznacza to, że jedna struktura może przechowywać łańcuch znaków, liczbę zmiennoprzecinkową oraz wartość logiczną.
W języku C++ strukturę definiujemy następująco:
Linia 1. struct uczen otwórz nawias klamrowy.
Linia 2. string imie średnik.
Linia 3. string nazwisko średnik.
Linia 4. double sredniaOcen średnik.
Linia 5. zamknij nawias klamrowy średnik.
Zaczynamy od słowa kluczowego struct, które informuje kompilator, że będziemy tworzyć właśnie strukturę. Następnie podajemy nazwę struktury – w tym przypadku jest nią uczen. Struktura uczen będzie przechowywać trzy wartości: dwie pierwsze są zmiennymi typu string, a ostatnia to liczba typu double. Struktury składają się z pólpole strukturypól, z których każde ma swoją nazwę (inaczej niż w przypadku tablic, gdzie poszczególnym elementom odpowiadają indeksy), typ oraz wartość.
Zwróćmy uwagę na znaki kończące opis struktury: zamykający nawias klamrowy oraz średnik. Łatwo o nich zapomnieć podczas definiowania pierwszych struktur.
Po stworzeniu struktury mamy nowy typ danych o nazwie uczen – możemy teraz tworzyć zmienne na jego podstawie.
Aby skorzystać ze struktury, definiujemy zmienną o typie struktura. Robimy to tak samo jak w przypadku definiowania zmiennych znakowych, numerycznych czy logicznych:
Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny.
Linia 2. kratka include otwórz nawias ostrokątny string zamknij nawias ostrokątny.
Linia 4. using namespace std średnik.
Linia 6. struct uczen otwórz nawias klamrowy.
Linia 7. string imie średnik.
Linia 8. string nazwisko średnik.
Linia 9. double sredniaOcen średnik.
Linia 10. zamknij nawias klamrowy średnik.
Linia 12. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 13. uczen uczen1 średnik.
Linia 15. return 0 średnik.
Linia 16. zamknij nawias klamrowy.
W rezultacie powstała zmienna uczen1. Składa się ona z trzech pól (imie, nazwisko, sredniaOcen) i jest gotowa na przyjęcie danych.
Aby uzyskać dostęp do poszczególnych pól struktury, podamy nazwę zmiennej, a następnie wpiszemy znak kropki oraz nazwę interesującego nas pola. Oto przykład operacji zapisywania danych w strukturze:
Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny.
Linia 2. kratka include otwórz nawias ostrokątny string zamknij nawias ostrokątny.
Linia 4. using namespace std średnik.
Linia 6. struct uczen otwórz nawias klamrowy.
Linia 7. string imie średnik.
Linia 8. string nazwisko średnik.
Linia 9. double sredniaOcen średnik.
Linia 10. zamknij nawias klamrowy średnik.
Linia 12. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 13. uczen uczen1 średnik.
Linia 15. uczen1 kropka imie znak równości cudzysłów Krzysztof cudzysłów średnik.
Linia 16. uczen1 kropka nazwisko znak równości cudzysłów Kowalewski cudzysłów średnik.
Linia 17. uczen1 kropka sredniaOcen znak równości 5 kropka 0 średnik.
Linia 19. return 0 średnik.
Linia 20. zamknij nawias klamrowy.
Ponieważ definicja struktury wprowadza nowy typ danych, możemy zadeklarować wiele zmiennych tego typu. Wpiszmy dane kolejnego ucznia do nowej zmiennej o nazwie uczen2:
Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny.
Linia 2. kratka include otwórz nawias ostrokątny string zamknij nawias ostrokątny.
Linia 4. using namespace std średnik.
Linia 6. struct uczen otwórz nawias klamrowy.
Linia 7. string imie średnik.
Linia 8. string nazwisko średnik.
Linia 9. double sredniaOcen średnik.
Linia 10. zamknij nawias klamrowy średnik.
Linia 12. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 13. uczen uczen1 średnik.
Linia 15. uczen1 kropka imie znak równości cudzysłów Krzysztof cudzysłów średnik.
Linia 16. uczen1 kropka nazwisko znak równości cudzysłów Kowalewski cudzysłów średnik.
Linia 17. uczen1 kropka sredniaOcen znak równości 5 kropka 0 średnik.
Linia 19. uczen uczen2 średnik.
Linia 21. uczen2 kropka imie znak równości cudzysłów Maciej cudzysłów średnik.
Linia 22. uczen2 kropka nazwisko znak równości cudzysłów Kowalski cudzysłów średnik.
Linia 23. uczen2 kropka sredniaOcen znak równości 4 kropka 5 średnik.
Linia 25. return 0 średnik.
Linia 26. zamknij nawias klamrowy.
Dotychczas porównywaliśmy struktury z tablicami. W rzeczywistości obie struktury danych możemy wykorzystywać w programach jednocześnie. Informacje dotyczące każdego ucznia zapisane są w strukturze typu uczen. Do szkoły chodzi wielu uczniów, możemy więc utworzyć tablicę, która będzie przechowywać struktury typu uczen:
Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny.
Linia 2. kratka include otwórz nawias ostrokątny string zamknij nawias ostrokątny.
Linia 4. using namespace std średnik.
Linia 6. struct uczen otwórz nawias klamrowy.
Linia 7. string imie średnik.
Linia 8. string nazwisko średnik.
Linia 9. double sredniaOcen średnik.
Linia 10. zamknij nawias klamrowy średnik.
Linia 12. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 13. uczen szkola otwórz nawias kwadratowy 10 zamknij nawias kwadratowy średnik.
Linia 15. return 0 średnik.
Linia 16. zamknij nawias klamrowy.
W ten sposób powstała tablica opisująca dziesięciu uczniów za pomocą osobnych struktur. Dane związane z każdym uczniem oznaczone są w tablicy unikatowymi indeksami.
Z informacjami przechowywanymi w poszczególnych strukturach możemy się zapoznać, stosując opisaną wcześniej notację z użyciem kropki. Oto przykład wypisywania danych ze struktury:
Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny.
Linia 2. kratka include otwórz nawias ostrokątny string zamknij nawias ostrokątny.
Linia 4. using namespace std średnik.
Linia 6. struct uczen otwórz nawias klamrowy.
Linia 7. string imie średnik.
Linia 8. string nazwisko średnik.
Linia 9. double sredniaOcen średnik.
Linia 10. zamknij nawias klamrowy średnik.
Linia 12. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 13. uczen szkola otwórz nawias kwadratowy 10 zamknij nawias kwadratowy średnik.
Linia 15. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny 10 średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 16. cout otwórz nawias ostrokątny otwórz nawias ostrokątny szkola otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka imie otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
Linia 17. zamknij nawias klamrowy.
Linia 18. return 0 średnik.
Linia 19. zamknij nawias klamrowy.
#include <iostream>
#include <string>
using namespace std;
struct uczen {
string imie;
string nazwisko;
double sredniaOcen;
};
int main() {
uczen szkola[10];
for (int i = 0; i < 10; i++) {
cout << szkola[i].imie << endl;
}
return 0;
}
Przedstawiony program wyświetli imiona wszystkich uczniów opisanych w tablicy szkola.
Struktury – zastosowanie
Struktury stosujemy w sytuacji, gdy chcemy opisać obiekt, na którego charakterystykę składają się liczne cechy (często tak różne, że nie można ich opisać za pomocą zmiennych tego samego typu).
Dobrym przykładem jest lista kontaktów w smartfonie bądź w komunikatorze. Każdy wpis może zawierać m.in. imię lub nazwisko, identyfikator, adres e‑mail, adres zamieszkania, numer telefonu, a także zaznaczenie, czy jest to numer prywatny. Każdy przechowywany kontakt zawiera te same typy informacji, ale oczywiście ich wartości są różne. Do zapisania takich zestawów informacji doskonale nadają się właśnie struktury. A ponieważ liczba kontaktów bywa duża, warto sięgnąć po tablicę, aby je uporządkować.
Do utworzenia książki adresowej moglibyśmy również użyć tablicy dwuwymiarowej, ale musielibyśmy zapisywać dane tego samego typu. Zapewne zdecydowalibyśmy się na tablicę zawierającą ciągi znaków. Struktury dają o wiele większą swobodę podczas przechowywania informacji.
Poniżej znajduje się przykład definicji tablicy dwuwymiarowej. Założyliśmy, że tablica będzie mieścić maksymalnie 50 kontaktów, z których każdy będzie zawierał 10 pozycji z informacjami.
Linia 1. const int liczbaAdresow znak równości 50 średnik.
Linia 2. const int liczbaWpisow znak równości 10 średnik.
Linia 3. string ksiazkaAdresowa otwórz nawias kwadratowy liczbaAdresow zamknij nawias kwadratowy otwórz nawias kwadratowy liczbaWpisow zamknij nawias kwadratowy średnik.
const int liczbaAdresow = 50;
const int liczbaWpisow = 10;
string ksiazkaAdresowa[liczbaAdresow][liczbaWpisow];
Słownik
pole struktury
pole struktury
jedna mająca nazwę składowa w strukturze; element struktury
struktura
struktura
złożony typ danych, który pozwala na przechowanie wielu typów danych w jednym miejscu, rozróżniając je za pomocą klucza; elementem struktury może być inna struktura