11 - Struktury
- 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++
- 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
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");
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ą.
// Definicja typu, który jest strukturą:
typedef struct
{
typ_1 nazwa_pola_1;} nazwa_struktury;
typ_2 nazwa_pola_2;
...
typ_N nazwa_pola_N;
//Równoważna definicja:
struct nazwa_struktury
{
typ_1 nazwa_pola_1;}; // W tym miejscu przed średnikiem można od razu zadeklarować zmienną tego typu.
typ_2 nazwa_pola_2;
...
typ_N nazwa_pola_N;
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;
Jedyną różnicą składniową jest używanie słowa kluczowego union w miejsce struct.
union nazwa_unii
{
char tablica_znakowa[4];} u;
int wartosc;