LEKCJA 14. Jak tworzy� i stosowa� struktury. ________________________________________________________________ W trakcie tej lekcji poznasz poj�cia: * Klasy zmiennej. * Struktury. * Pola bitowego. * Unii. Dowiesz si� tak�e wi�cej o operacjach logicznych. ________________________________________________________________ CO TO JEST KLASA ZMIENNEJ? W j�zyku C i C++ programista ma wi�kszy wp�yw na rozmieszczenie zmiennych w pami�ci operacyjnej komputera i w rejestrach mikroprocesora. Mo�e to mie� decyduj�cy wp�yw na dost�pno�� danych z r�nych miejsc programu i szybko�� dzia�ania programu. Nale�y podkre�li�, �e TYP ZMIENNEJ (char, int, float itp.) decyduje o sposobie interpretacji przechowywanych w pami�ci zer i jedynek, natomiast KLASA ZMIENNEJ decyduje o sposobie przechowywania zmiennej w pami�ci. W C++ wyst�puj� cztery klasy zmiennych. ZMIENNE STATYCZNE - static. Otrzymuj� sta�� lokalizacj� w pami�ci w momencie uruchamiania programu. Zachowuj� swoj� warto�� przez ca�y czas realizacji programu, chyba, �e �wiadomie za��damy zmiany tego stanu - np. instrukcj� przypisania. Przyk�ad deklaracji: static float liczba; W wi�kszo�ci kompilator�w C++ zmienne statyczne, kt�re nie zosta�y jawnie zainicjowane w programie, otrzymuj� po zadeklarowaniu warto�� ZERO. ZMIENNE AUTOMATYCZNE - auto. Otrzymuj� przydzia� miejsca w pami�ci dynamicznie - na stosie procesora, w momencie rozpocz�cia wykonania tego bloku programu, w kt�rym zmienne te zosta�y zadeklarowane. Przydzielenie pami�ci nie zwalnia nas z obowi�zku zainicjowania zmiennej (wcze�niej warto�� zmiennej jest przypadkowa). Zmienne automatyczne "znikaj�" po zako�czeniu wykonywania bloku. Pami�� im przydzielona zostaje zwolniona. Przyk�ad: auto long suma; ZMIENNE REJESTROWE - register. Zmienne rejestrowe s� tak�e zmiennymi lokalnymi, widocznymi tylko wewn�trz tego bloku programu, w kt�rym zosta�y zadeklarowane. C++ mo�e wykorzysta� dwa rejestry mikroprocesora - DI i SI do przechowywania zmiennych. Je�li zadeklarujemy w programie wi�cej zmiennych jako zmienne rejestrowe - zostan� one umieszczone na stosie. Znaczne przyspieszenie dzia�ania programu powoduje wykorzystanie rejestru do przechowywania np. licznika p�tli. Przyk�ad: register int i; ..... for (i=1; i<1000; i++) {.....} ZMIENNE ZEWN�TRZNE - extern. Je�li zmienna zosta�a - raz i TYLKO RAZ - zadeklarowana w pojedynczym segmencie du�ego programu, zostanie w tym�e segmencie umieszczona w pami�ci i potraktowana podobnie do zmiennych typu static. Po zastosowaniu w innych segmentach deklaracji extern zmienna ta mo�e by� dost�pna w innym segmencie programu. Przyk�ad: extern int NUMER; STRUKTURY. Poznane wcze�niej tablice mog� zawiera� wiele danych, ale wszystkie te dane musz� by� tego samego typu. Dla zgrupowania powi�zanych ze sob� logicznie danych r�nego typu C/C++ stosuje STRUKTURY, deklarowane przy pomocy s�owa struct. Kolejne pola struktury s� umieszczane w pami�ci zgodnie z kolejno�ci� ich deklarowania. Struktur�, podobnie jak zmienn�, MUSIMY ZADEKLAROWA�. Struktura jest objektem bardziej z�o�onym ni� pojedyncza zmienna, wi�c i deklaracja struktury jest bardziej skomplikowana. Deklaracja struktury sk�ada si� z nast�puj�cych element�w: 1. S�owo kluczowe struct (obowi�zkowe). 2. Nazwa (opcjonalna). Je�li podamy nazw�, to nazwa ta b�dzie oznacza� dany typ struktury. 3. Nawias klamrowy { 4. Deklaracje kolejnych sk�adnik�w struktury. 5. Nawias klamrowy } 6. Lista nazw struktur okre�lonego powy�ej typu (mo�e zosta� zadeklarowana oddzielnie). Przyk�ad. Deklaracja og�lnego typu struktury i okre�lenie wewn�trznej postaci struktury. struct Ludzie { char Imiona[30]; char Nazwisko[20]; int wiek; char pokrewienstwo[10] }; Je�li okre�limy ju� typ struktury - czyli rodzaj, wielko�� i przeznaczenie poszczeg�lnych p�l struktury, mo�emy dalej tworzy� - deklarowa� i inicjowa� konkretne struktury danego typu. Przyk�ad. Deklaracja zmiennych - struktur tego samego typu. struct Ludzie Moi, Twoi, Jego, Jej, Szwagra; Deklaracj� struktur mo�na po��czy�. Przyk�ad. Po��czona deklaracja struktur. struct Ludzie { char pokrewienstwo[10]; char Imiona[30]; int wiek; } Moi, Twoi, Szwagra; Struktury statyczne * maj� sta�e miejsce w pami�ci w trakcie ca�ego programu; * s� "widoczne" i dost�pne w ca�ym programie. Zadeklarujemy teraz typ struktury i zainicjujemy dwie struktury. Przyk�ad. Zainicjowanie dwu struktur statycznych. struct Ludzie { char pokrewienstwo[10]; char Imiona[30]; int wiek; }; struct Ludzie Moi, Szwagra; static struct Ludzie Moi = { "Stryjek", "Walenty", 87 }; static struct Ludzie Szwagra = { "ciotka", "Ala", 21 }; Zapis static struct Ludzie Szwagra; oznacza: statyczna struktura typu "Ludzie" pod nazw� "Szwagra". Do struktury w ca�o�ci mo�emy odwo�ywa� si� za pomoc� jej nazwy a do poszczeg�lnych element�w struktury poprzez nazw� struktury i nazw� pola struktury - ROZDZIELONE KROPK� ".". Zademonstrujmy to na przyk�adzie. Zwr�� uwag� na r�ne sposoby przekazywania danych pomi�dzy strukturami: C4.Wiek=Czlowiek2.Wiek; - przekazanie zawarto�ci pojedynczego pola numerycznego; C4=Czlowiek3; - przekazanie zawarto�ci ca�ej struktury Czlowiek3 do C4. Przyk�ad. Program manipuluj�cy prost� struktur�. [P037.CPP] int main() { struct Ludzie { char Imie[20]; int Wiek; char Status[30]; char Tel_Nr[10]; }; static struct Ludzie Czlowiek1={"Ala", 7, "Ta, co ma Asa","?"}, Czlowiek2={"Patrycja", 13, "Corka", "8978987"}, Czlowiek3={"Krzysztof", 27, "Kolega z przedszkola", "23478"}; struct Ludzie C4, C5; C4=Czlowiek3; C4.Wiek=Czlowiek2.Wiek; C5=Czlowiek1; clrscr(); printf("%s %d %s\n", C4.Imie, C4.Wiek, C4.Status); printf("%s %s",C5.Imie, C5.Status); return 0; } Tablice mog� by� elementami struktur, ale i odwrotnie - ze struktur, jak z cegie�ek mo�na tworzy� konstrukcje o wy�szym stopniu z�o�ono�ci - struktury struktur i tablice struktur. Je�li tablica sk�ada si� z liczb typu int, to deklarujemy j�: int TABLICA[10]; je�li tablica sk�ada si� ze struktur, to deklarujemy j�: struct TABLICA[50]; W przyk�adzie poni�ej przedstawiono * deklaracj� jednowymiarowej tablicy LISTA[50], * elementami tablicy s� struktury typu SCzlowiek, * jednym z element�w ka�dej struktury SCzlowiek jest struktura "ni�szego rz�du" typu Adres; [P038.CPP] int main() { struct Adres { char Ulica[30]; int Nr_Domu; int Nr_Mieszk; }; struct SCzlowiek { char Imie[20]; int Wiek; struct Adres Mieszkanie; }; struct SCzlowiek LISTA[50]; LISTA[1].Wiek=34; LISTA[1].Mieszkanie.Nr_Domu=29; printf("%d", LISTA[1].Mieszkanie.Nr_Domu); return 0; } Zapis printf("%d", LISTA[1].Mieszkanie.Nr_Domu oznacza: * wybierz element nr 1 z tablicy LISTA; (jak wynika z deklaracji tablicy, ka�dy jej element b�dzie mia� wewn�trzn� struktur� zorganizowan� tak, jak opisano w deklaracji struktury SCzlowiek); * wybierz ze struktury typu SCzlowiek pole Mieszkanie; (jak wynika z deklaracji, pole Mieszkanie b�dzie mia�o wewn�trzn� organizacj� zgodn� ze struktur� Adres); * ze struktury typu Adres wybierz pole Nr_Domu; * Wydrukuj zawarto�� pola pami�ci interpretuj�c j� jako liczb� typu int - w formacie %d. S�owo struktura tak doskonale pasuje, �e chcia�oby si� powiedzie�: je�li struktura struktur jest wielopoziomowa, to podobnie, jak przy wielowymiarowych tablicach, ka�dy poziom przy nadawaniu warto�ci musi zosta� uj�ty w dodatkow� par� nawias�w klamrowych. [???] A CO Z �A�CUCHAMI ZNAKOWYMI ? ________________________________________________________________ J�zyk C++ oferuje do kopiowania �a�cuch�w znakowych specjaln� funkcj� strcpy(). Nazwa funkcji to skr�t STRing CoPY (kopiuj �a�cuch). Spos�b wykorzystania tej funkcji: strcpy(Dok�d, Sk�d); lub strcpy(Dok�d, "�a�cuch znak�w we w�asnej osobie"); Szczeg�y - patrz Lekcja o �a�cuchach znakowych. ________________________________________________________________ STRUKTURY I WSKA�NIKI. Wska�niki mog� wskazywa� struktur� w ca�o�ci lub element struktury. J�zyk C/C++ oferuje specjalny operator -> kt�ry pozwala na odwo�ywanie si� do element�w struktury. W przyk�adzie poni�ej przedstawiono r�ne sposoby odwo�ania si� do element�w trzech identycznych struktur STA, STB, STC. [P039.CPP] int main() { struct { char Tekst[20]; int Liczba1; float Liczba2; } STA, STB, STC, *Pointer; STA.Liczba1 = 1; STA.Liczba2 = 2.2; strcpy(STA.Tekst, "To jest tekst"); STB=STA; Pointer = &STC; Pointer->Liczba1 = 1; Pointer->Liczba2 = 2.2; strcpy(Pointer->Tekst, STA.Tekst); printf("\nLiczba1-STA Liczba2-STB Tekst-STC\n\n"); printf("%d\t", STA.Liczba1); printf("%f\t", STB.Liczba2); printf("%s", Pointer->Tekst); return 0; } Rozszyfrujmy zapis: strcpy(Pointer->Tekst, STA.Tekst); Skopiuj �a�cuch znak�w z pola Tekst struktury STA do pola Tekst struktury wskazywanej przez pointer. Prawda, �e to ca�kiem proste? [???] CZY MUSIMY TO ROZDZIELA� ? ________________________________________________________________ Jak zauwa�y�e�, liczby mogliby�my zapisywa� tak�e jako �a�cuchy znak�w, ale wtedy nie mogliby�my wykonywa� na tych liczbach dzia�a�. Konwers...
PabloPCK