Programowanie i algorytmy

Struktury w C++ (struct)

powrót

W pewnych sytuacjach, typy zmiennych, które oferuje język C++ mogą być niewystarczające. Mamy do dyspozycji szereg typów prostych takich jak int, char, bool czy typy złożone zwane tablicami. Tablica to taka struktura danych, która przechowuje wiele elementów tego samego typu. Co jeśli potrzebujemy pracować na obiektach, których składowe są różnych typów? Na ratunek przychodzą nam struktury, czyli złożone typy danych, które definiuje programista.

Przeanalizujmy przykład. Załóżmy, że chcemy przechować dane samochodu takie jak:

  • marka,
  • model,
  • rok produkcji,
  • pojemność silnika.

Moglibyśmy stworzyć cztery zmienne oraz dobrać im typy lub stworzyć nowy typ, którego elementami będą omawiane składowe. Taki typ nazywamy strukturą.

 

Tworzenie struktury

Struktury tworzymy za pomocą słowa kluczowego struct podając jej nazwę (tak będzie nazywał się typ przez nas stworzony), a następnie w nawiasie klamrowym definiujemy jej elementy:

struct nazwa{
  typ nazwa_elementu;
  typ nazwa_drugiego_elementu;
  typ nazwa_trzeciego_elementu;
  ...
};
 

 

Struktura samochód wyglądałaby następująco:

struct samochod{
  char marka[20]; //elementy struktury
  char model[20];
  int rok_produkcji;
  double pojemnosc;
};
 

 

Jeśli strukturę zdefiniujemy przed funkcją main(), będzie ona widoczna dla wszystkich bloków programu (będzie globalna). Na końcu stawiamy średnik.

 

Tworzenie zmiennych typu strukturalnego

Po stworzenie struktury mamy nowy typ - w naszym przypadku będzie nazywał się on samochod. Możemy teraz tworzyć zmienne na jego podstawie. Nie różni się ono niczym od tworzenia zmiennych opartych na typach wbudowanych takich jak int, char itp. Prześledźmy przykład:

int main()
{
  int a; //tworząc zmienną podajemy jej typ i nazwę
 
  samochod renault; //w tym przypadku jest tak samo, poniewaz
        //samochod jest typem, a renault nazwą
 
  system("pause");
  return 0;
}
 

 

Drugim sposobem jest nadanie nazwy zmiennej strukturalnej podczas tworzenia struktury:

struct samochod{
  char marka[20];
  char model[20];
  int rok_produkcji;
  double pojemnosc;
}renault, peugeot;  //stworzenie dwóch zmiennych typu samochod
 

 

Odwoływanie się do elementów składowych

Do elementów odwołujemy się za pomocą kropki, podając najpierw nazwę zmiennej strukturalnej, a następnie po kropce nazwę składowej struktury:

int main()
{
 
        samochod renault; 
 
        cin>>renault.marka; //odwołanie się do pola marka
        cin>>renault.pojemnosc; //odwołanie się do pola pojemnosc
 
        cout<<"Marka: "<<renault.marka<<", pojemnosc: "
<<renault.pojemnosc<<endl;
 
        system("pause");
        return 0;
}
 

 

Nadanie wartości początkowych

Wartości początkowe nadajemy podobnie jak w tablicach. Taki sposób można zastosować tylko przy inicjowaniu zmiennej strukturalnej. Wartości elementów podajemy w nawiasie klamrowym pamiętając o kolejności przypisywanych elementów. Jeśli pierwszym elementem jest ciąg znaków, to taki ciąg powinien znaleźć się jako pierwszy. Dotyczy to wszystkich elementów składowych. Rozpatrzmy przykład:

int main()
{
  //nadanie wartości początkowych
  samochod renault = {"renault","megane",2013,2.0}; 
 
  //wypisanie wartości elementów struktury
  cout<<renault.marka<<endl<<renault.model
<<endl<<renault.rok_produkcji
  <<endl<<renault.pojemnosc<<endl;
 
  system("pause");
  return 0;
}
 

 

Drugim sposobem jest przypisanie wartości od razu przy tworzenie struktury:

struct samochod{
  char marka[20];
  char model[20];
  int rok_produkcji;
  double pojemnosc;
} renault = {"renault","megane",2013,2.0}; 
//nadanie wartości początkowych
 

 

Podsumowując, zmienne strukturalne stosujemy podobnie jak zwykłe zmienne rozszerzając je o dodatkowe właściwości. Możemy je przypisywać do siebie, tworzyć tablice struktur, wskaźniki itp.

 

Globalnie i lokalnie

Struktura stworzona przed funkcją main() będzie strukturą globalną, czyli każdy podprogram będzie mógł z niej korzystać. Jeśli stworzymy ją wewnątrz jakiegoś bloku, będzie lokalną i widoczna tylko w tym miejscu. Popatrzmy na przykłady:

Globalnie:

#include<iostream>
using namespace std;
//struktura globalna widoczna w każdym zakątku
struct samochod{
  char marka[20]; //elementy struktury
  char model[20];
  int rok_produkcji;
  double pojemnosc;
};
 
int main()
{
  samochod peugeot = {"Peugeot","407",2013,2.7};
 
  return 0;
}
 
 

 

Lokalnie:

#include <iostream>
using namespace std;
 
int main()
{
  //struktura lokalna widoczna tylko w main()
  struct samochod{
    char marka[20]; //elementy struktury
    char model[20];
    int rok_produkcji;
    double pojemnosc;
  };
 
  samochod peugeot = {"Peugeot","407",2013,2.7};
 
  return 0;
}