11 - Struktury

Ikona obiektów Cele lekcji
  • Nabycie umiejętności tworzenia struktur i unii w języku C/C++
  • Poznanie sposobów definiowania własnych typów w języku C/C++

Ikona obiektów Co powinieneś już wiedzieć?
  • Jakie typy danych występują w języku C/C++ i czym się od siebie różnią.
  • Na czym polega przechowywanie zmiennych w pamięci

Ikona obiektów Typy definiowane
W języku C/C++, podobnie jak w innych językach programowania, można określić własne typy danych. Robi się to przy pomocy polecenia typedef. Składnia jest następująca:
typedef rodzaj_typu nazwa_typu;
Po zadeklarowaniu takiego typu używa się go tak samo jak typów wbudowanych w kompilator.
Można w ten sposób np. zadeklarować typ zmiennych, którego w C /C++ brakuje komuś, kto był do tego przyzwyczajony w Pascalu - stringa:

typedef char[255] string;
string nazwa;
strcpy(nazwa, "nazwa");


Ikona obiektów Inne definicje

W języku C/C++ można definiować dowolnie pewne stałe, ale też wyrażenia, które następnie można wykorzystywać w programie. Robi się to przy pomocy dyrektory prekompilatora define.

Przykład deklaracji i użycia stałych:

#define PI 3.14
#define ogr 1000

int main()
{

int tablica[ogr]; // Powstanie tablica ograniczona przez 1000
int r = 4;
double pole_kola; // Zadeklarowanie zmiennej zmiennoprzecinkowej (ułamkowej)
pole_kola = r*r*PI; // Pod PI zostanie podstawione 3,14 i obliczone zostanie pole koła o promieniu r
return 0;
}

 

Przykład deklaracji wyrażenia i jego użycia wraz z użyciem funkcji:

 

#define FOR(i,n) for(int i=0; i<n; i++)

// Powyżej zdefiniowana została inna struktura pętli for, którą będzie można wykorzystać w kodzie
// Szkielet pisanych przez nas programów mógłby wyglądać następująco:

void solve()
{

//---------------------------------------------------------------------------------------------
// Tu powinien znajdować się właściwy kod programu rozwiązujący zadanie dla pojedynczego testu
//---------------------------------------------------------------------------------------------

}

int main()
{

int d; // deklaracja zmiennej oznaczającej liczbę zestawów danych
scanf("%d",&d); // sczytwanie liczby zestawów danych
FOR(i,d) solve(); // pętla sterująca programem - wykonywana tyle razy, ile jest zestawów.
// Powyższa pętla zostanie podmienione przez preprocesor na for(int i=0; i<d; i++) solve();
return 0;

}

 

Definicje są wstawiane w odpowiednie miejsca w kodzie na etapie prekompilacji, przed kompilacją.

Ikona obiektów Struktury
Struktura pozwala przechowywać połączone ze sobą dane różnego typu i łączy je w pojedyncze obiekty. Np. gdy chcemy zapisać dane osobowe jakiegoś człowieka (imię, nazwisko i wiek), nie da się tego zrobić przy pomocy jednej zmiennej lub tablicy, gdyż dane takie zawierają trzy parametry różnego typu. Wówczas możemy zdefiniować strukturę, w której zapamiętamy naraz wszystkie te trzy rzeczy. Strukturę deklaruje się przy użyciu słowa kluczowego struct oraz nazwy struktury. Po niej w nawiasach klamrowych umieszcza się deklaracje zmiennych, które wchodzą w skład tej struktury. Po nawiasie klamrowym może wystąpić nazwa zmiennej określonego właśnie przed chwilą typu. Jeśli nie pojawia się nazwa zmiennej, to w tym miejscu wyjątkowo po nawiasie klamrowym zamykającym trzeba umieścić średnik. Taka definicja struktury jest zarazem definicją nowego typu.

// Definicja typu, który jest strukturą:
typedef struct
{

typ_1 nazwa_pola_1;
typ_2 nazwa_pola_2;
...
typ_N nazwa_pola_N;
} nazwa_struktury;

//Równoważna definicja:
struct nazwa_struktury
{
typ_1 nazwa_pola_1;
typ_2 nazwa_pola_2;
...
typ_N nazwa_pola_N;
}; // W tym miejscu przed średnikiem można od razu zadeklarować zmienną tego typu.

 

Na przykład:

struct Osoba
{

char imie[20], nazwisko[50];
int wiek;
};
Osoba pewna_osoba;

 

Do wartości pól tej struktury odwołujemy się poprzez nazwę zmiennej, kropkę, a po niej nazwy pola.

strcpy(pewna_osoba.imie, "Jan");
strcpy(pewna_osoba.nazwisko, "Kaczmarek");
pewna_osoba.wiek = 25;


Ikona obiektu Zastanów się
Aby mieć pełną informację o kole na płaszczyźnie, trzeba znać współrzędne jego środka oraz promień. Jak mogłaby wyglądać struktura przechowująca takie dane?
Ikona obiektów Unie
Unia jest bardzo podobna do struktury, jednakże wszystkie jej pola zajmują ten sam obszar pamięci.
Jedyną różnicą składniową jest używanie słowa kluczowego union w miejsce struct.

union nazwa_unii
{

char tablica_znakowa[4];
int wartosc;
} u;