PROGRAMOWANIE I ALGORYTMY

Struktury w C++ (struct)


powrót

Pojęcie struktury

W pewnych sytuacjach, rodzaje typów 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;
}