lekcja14.txt

(16 KB) Pobierz
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...
Zgłoś jeśli naruszono regulamin