Podstawy programowania
2013-10-30
St
S ru
r ktury
r
329
Rola struktur
Osoba
PESEL
Nazwisko
Imię
Data urodzenia
Adres zamieszkania
Płeć
Wzrost
Waga
Kolor oczu
...
Obiekt i jego atrybuty
330
dr inż. P. Borowiecki (KAMS, WETI, PG)
1
2013-10-30
Struktury
Struktury w języku C++ istotnie różnią się od struktur w języku C
i są ich uogólnieniem.
W szczególnym przypadku mogą one spełniać tą samą rolę, co struktury języka C. Pozwala to na poprawną interpretację struktur podczas przenoszenia kodu z C do C++.
Odpowiednikiem takich uproszczonych struktur w niektórych językach, np. Pascal, Modula-2 są tzw. rekordy.
W wersji uproszczonej struktura pozwala na grupowanie w jednej zmiennej wielu elementów, które mogą być różnych typów.
W wersji pełnej struktura może być utożsamiana z klasą, której wszystkie składowe są publiczne (składowe klasy są domyślnie prywatne). W szczególności struktura może zawierać również funkcje składowe (w tym konstruktory i destruktory).
W dalszej części tego wykładu skupimy się na strukturach uproszczonych.
331
Definiowanie struktur
struct nazwa_typu
{
// lista składowych
};
Dla uproszczonych struktur mówimy też o liście pól Przykład
Osoba
struct Osoba {
char pesel[12];
PESEL
char nazwisko[21];
Nazwisko
char imie[11];
Imię
...
...
int wzrost;
Wzrost
int waga;
Waga
} ;
...
Tu opcjonalnie można podać nazwę zmiennej
332
dr inż. P. Borowiecki (KAMS, WETI, PG)
2
2013-10-30
Odwołania do składowych struktur
nazwa_struktury . nazwa_składowej
Przykład
struct Data {
int Dzien, Miesiac, Rok;
};
struct Osoba {
char Nazwisko[30];
char Imie[20];
Data Data_Ur;
};
Osoba Pracownik; // definicja zmiennej typu Osoba Osoba Osoby[3];
// definicja tablicy struktur typu Osoba
...
333
Odwołania do składowych struktur
Dostęp do pól pojedynczej zmiennej będącej
strukturą wyglądałby następująco:
cin >> Pracownik.Nazwisko;
Przykład c.d.
…
cout << Pracownik.Data_Ur.Rok;
int main() {
for (int i=0; i < 3; i++)
{ // wczytanie danych trzech osób cout << "\nNazwisko: ";
cin >> Osoby[i].Nazwisko;
cout << "Imie: ";
cin >> Osoby[i].Imie;
cout << "Data urodzenia: " << "\n\tDzien: "; cin >> Osoby[i].Data_Ur.Dzien;
cout << "\tMiesiac: ";
cin >> Osoby[i].Data_Ur.Miesiac;
cout << "\tRok: ";
cin >> Osoby[i].Data_Ur.Rok;
}
...
334
dr inż. P. Borowiecki (KAMS, WETI, PG)
3
2013-10-30
Odwołania do składowych struktur
Przykład c.d.
...
cout << "W tablicy sa nastepujace dane:"; for (int i=0; i < 3; i++)
cout << Osoby[i].Nazwisko << " "
<< Osoby[i].Imie << ", ur. "
<< Osoby[i].Data_Ur.Dzien << "."
<< Osoby[i].Data_Ur.Miesiac
<< "." << Osoby[i].Data_Ur.Rok << " r.\n"; return 0;
}
335
Wskaźniki do struktur
wskaźnik_na_strukturę -> nazwa_składowej ( *wskaźnik_na_strukturę ) . nazwa_składowej Przykład
struct Data {
int Dzien, Miesiac, Rok;
};
struct Osoba {
char Nazwisko[30];
char Imie[20];
Data Data_Ur;
};
Osoba *wskOs; // definicja wskaźnika na strukturę Osoba Osoby[3]; // definicja tablicy struktur typu Osoba
...
336
dr inż. P. Borowiecki (KAMS, WETI, PG)
4
2013-10-30
Wskaźniki do struktur
Przykład c.d.
int main() {
for (wskOs = Osoby; wskOs < Osoby + 3; wskOs++)
{
cout << "\nNazwisko: ";
cin >> wskOs->Nazwisko;
cout << "Imie: ";
cin >> wskOs->Imie;
cout << "Data urodzenia: " << "\n\tDzien: "; cin >> wskOs->Data_Ur.Dzien;
cout << "\tMiesiac: ";
cin >> wskOs->Data_Ur.Miesiac;
cout << "\tRok: ";
cin >> wskOs->Data_Ur.Rok;
}
... // itd.
}
337
Tablica wskaźników do struktur
Przykład
Kowal
... 03 10
1980
...
Osoba *Osoby[20];
...
Nowak
... 20 12
1934
int main() {
NULL
...
for (int i=0; i < k; i++) {
Osoby[i] = new Osoba;
cout << "\nNazwisko: ";
cin >> Osoby[i]->Nazwisko;
cout << "Imie: ";
cin >> Osoby[i]->Imie;
cout << "Data urodzenia: " << "\n\tDzien: "; cin >> Osoby[i]->Data_Ur.Dzien;
cout << "\tMiesiac: ";
cin >> Osoby[i]->Data_Ur.Miesiac; cout << "\tRok: ";
cin >> Osoby[i]->Data_Ur.Rok;
}
...
Pamiętaj o zwolnieniu pamięci !
}
for (int i=0; i < k; i++) delete Osoby[i]; 338
dr inż. P. Borowiecki (KAMS, WETI, PG)
5
2013-10-30
Typ strukturalny
Każda definicja typu strukturalnego, nawet jeżeli lista składowych jest taka sama jak w innej definicji, wprowadza nowy typ.
struct typ_Str_1 { int p; char c; ... };
struct typ_Str_2 { int p; char c; ... };
Typy typ_Str_1 i typ_Str_2 są różne, więc jeżeli typ_Str_1 x, y;
typ_Str_2 z;
to zmienne x oraz y są tego samego typu typ_Str_1, natomiast x oraz z są różnych typów.
339
Typ strukturalny
Wobec tego, ponieważ dla struktur można stosować operator przypisania, to instrukcje:
x = y;
y = x;
są poprawne, podczas gdy:
x = z;
z = y;
są błędne.
Dopuszczalne są natomiast wzajemne przypisania składowych, których typy są zgodne, np.:
x.p = z.p;
340
dr inż. P. Borowiecki (KAMS, WETI, PG)
6
2013-10-30
Inicjalizowanie struktur
W
nawiasach
klamrowych
podajemy
oddzielone
przecinkami
wartości
kolejnych
pól.
Pominięcie
końcowych pól spowoduje ich wyzerowanie.
Przykład
struct Osoba
{
char Nazwisko[30];
char Imie[20];
int Rok_Ur;
};
Osoba Pracownik1 = {"Kowalski" , "Jan" , 1973 }; Osoba Pracownik2 = {"Nowak" , "Andrzej" }; 341
Inicjalizowanie struktur
Tablice struktur inicjalizujemy łącząc metody inicjalizowania tablic i struktur.
Przykład
struct Osoba
{
char Nazwisko[30];
char Imie[20];
int Rok_Ur;
};
Osoba Lista_Osob[3] = {
{"Kowalski" , "Jan" , 1973 },
{"Nowak" , "Piotr" , 1960 },
{"Adamczak" , "Janusz" }
};
342
dr inż. P. Borowiecki (KAMS, WETI, PG)
7
2013-10-30
Zastosowanie struktur w tworzeniu
prostej bazy danych
< Prezentacja i analiza kodu programu > 343
dr inż. P. Borowiecki (KAMS, WETI, PG)
8