Programowanie. Teoria i praktyka z wykorzystaniem C++
Programowanie. Teoria i praktyka z wykorzystaniem C++ Programowanie. Teoria i praktyka z wykorzystaniem C++
6.3. WRACAJC DO KALKULATORA 183 literay zmiennoprzecinkowe — zgodnie z definicj w C++, np. 3.14, 0.274e2 i 42; operatory — +, -, *, / oraz %; nawiasy — ( i ). Wydaje si, e trudnoci mog nastrcza literay zmiennoprzecinkowe. Wczytanie liczby 12 wydaje si znacznie atwiejsze ni 12.3e-3. Ale kalkulatory zazwyczaj wykonuj dziaania na liczbach zmiennoprzecinkowych. Analogicznie podejrzewamy, e aby nasz kalkulator by przydatny, musi obsugiwa nawiasy. W jaki sposób reprezentuje si takie tokeny w programie? Mona spróbowa zapamitywa, gdzie kady token si zaczyna, a gdzie koczy, ale to moe by uciliwe (zwaszcza jeli pozwolimy na wpisywanie wyrae obejmujcych wicej ni jeden wiersz). Dodatkowo, jeli bdziemy zapisywa wartoci jako sekwencje znaków, bdziemy musieli póniej znale sposób na odczytanie tych wartoci. To znaczy, jeli liczb 42 zapiszemy jako znaki 4 i 2, póniej bdziemy musieli odgadn, e te dwa znaki reprezentuj liczb 42 (tzn. 4*10+2). Oczywistym i konwencjonalnym rozwizaniem tego problemu jest przedstawienie kadego tokenu jako pary (rodzaj, warto). Pierwszy element informuje o rodzaju tokenu — liczba, operator, nawias. Drugi natomiast np. w przypadku liczb okrela dokadn warto. Jak wic wykorzysta pomys par (rodzaj, warto) w kodzie? Zdefiniujemy typ Token do reprezentowania tokenów. Po co? Przypomnij sobie, po co uywamy typów: przechowuj potrzebne nam dane i pozwalaj wykonywa na nich róne operacje. Na przykad typ int pozwala przechowywa liczby cakowite i umoliwia dodawanie, odejmowanie, mnoenie oraz dzielenie tych liczb. Natomiast typ string przechowuje acuchy znaków i pozwala je np. czy. W jzyku C++ i jego bibliotece standardowej dostpnych jest wiele typów, np. char, int, double, string, vector i ostream. Nie ma jednak typu Token. W istocie mona wymieni mnóstwo typów — tysice, a nawet dziesitki tysicy — które chcielibymy mie do dyspozycji, a których nie ma w jzyku ani jego bibliotece standardowej. Do naszych ulubionych typów, które nie s standardowo dostpne, nale Matrix (zobacz rozdzia 24.), Date (zobacz rozdzia 9.) oraz reprezentujce go liczby cakowite nieskoczonej precyzji (poszukaj w internecie informacji na temat typu Bignum). Jeli przemylisz to, dojdziesz do wniosku, e jzyk nie moe standardowo obsugiwa dziesitek tysicy typów — kto by je zdefiniowa i zaimplementowa, kto by je potem znalaz, nie mówic ju o tym, jak gruby musiaby by podrcznik do nauki takiego jzyka. Jzyk C++ wzorem innych nowoczesnych jzyków programowania rozwizuje ten problem, pozwalajc uytkownikowi definiowa wasne (niestandardowe) typy (ang. userdefined type — typ zdefiniowany przez uytkownika). 6.3.3. Implementowanie tokenów Jak powinien wyglda token? To znaczy, jakie waciwoci powinien mie nasz typ Token? Musi nadawa si do reprezentowania operatorów (np. + i -) i wartoci liczbowych (np. 42 i 3.14). Oczywistym rozwizaniem jest zaimplementowanie czego takiego, co moe zawiera informacj na temat rodzaju tokenu i w razie potrzeby jego warto:
184 ROZDZIA 6 • PISANIE PROGRAMU Pomys ten mona zaimplementowa w jzyku C++ na wiele sposobów. Przedstawiamy najprostszy, który wydaje nam si uyteczny: class Token { // Bardzo prosty typ zdefiniowany przez uytkownika. public: char kind; double value; }; Token to typ (tak samo jak int czy char), a wic mona go uywa do definiowania zmiennych i przechowywania wartoci. Skada si z dwóch czci (nazywanych skadowymi) — kind (rodzaj) oraz value (warto). Sowo kluczowe class oznacza „typ zdefiniowany przez uytkownika”. Wskazuje definicj typu z zerem lub wiksz liczb skadowych. Pierwsza skadowa o nazwie kind jest znakiem char, a wic mona jej uy do przechowywania znaków '+' i '*', które bd reprezentoway operatory. Przy uyciu tego typu mona tworzy nastpujce instrukcje: Token t; // Zmienna t jest typu Token. t.kind = '+'; // Zmienna t reprezentuje znak +. Token t2; // Zmienna t2 jest innym obiektem typu Token. t2.kind = '8'; // Cyfra 8 oznacza rodzaj (kind) tokenu bdcy liczb. t2.value = 3.14; Aby uzyska dostp do skadowej, posugujemy si odpowiedni notacj — nazwa_obiektu. nazwa_skadowej. Tekst t.kind mona przeczyta jako „rodzaj obiektu t”, a t2.value jako „warto obiektu t2”. Obiekty typu Token mona kopiowa tak samo jak typu int: Token tt = t; // Inicjacja kopii if (tt.kind != t.kind) error("To niemoliwe!"); t = t2; // przypisanie cout
- Page 1 and 2: Programowanie. Teoria i praktyka z
- Page 3 and 4: 4 SPIS TRECI Rozdzia 1. Komputery,
- Page 5 and 6: 6 SPIS TRECI Rozdzia 6. Pisanie pro
- Page 7 and 8: 8 SPIS TRECI Cz II Wejcie i wyjcie
- Page 9 and 10: 10 SPIS TRECI 14.2. Klasa Shape 448
- Page 11 and 12: 12 SPIS TRECI 18.5.3. Inicjowanie t
- Page 13 and 14: 14 SPIS TRECI 22.2. Krótka histori
- Page 15 and 16: 16 SPIS TRECI 26.3.3. Algorytmy i n
- Page 17 and 18: 18 SPIS TRECI Dodatek D Instalowani
- Page 19 and 20: 176 ROZDZIA 6 • PISANIE PROGRAMU
- Page 21 and 22: 178 ROZDZIA 6 • PISANIE PROGRAMU
- Page 23 and 24: 180 ROZDZIA 6 • PISANIE PROGRAMU
- Page 25: 182 ROZDZIA 6 • PISANIE PROGRAMU
- Page 29 and 30: 186 ROZDZIA 6 • PISANIE PROGRAMU
- Page 31 and 32: 188 ROZDZIA 6 • PISANIE PROGRAMU
- Page 33 and 34: 190 ROZDZIA 6 • PISANIE PROGRAMU
- Page 35 and 36: 192 ROZDZIA 6 • PISANIE PROGRAMU
- Page 37 and 38: 194 ROZDZIA 6 • PISANIE PROGRAMU
- Page 39 and 40: 196 ROZDZIA 6 • PISANIE PROGRAMU
- Page 41 and 42: 198 ROZDZIA 6 • PISANIE PROGRAMU
- Page 43 and 44: 200 ROZDZIA 6 • PISANIE PROGRAMU
- Page 45 and 46: 202 ROZDZIA 6 • PISANIE PROGRAMU
- Page 47 and 48: 204 ROZDZIA 6 • PISANIE PROGRAMU
- Page 49 and 50: 206 ROZDZIA 6 • PISANIE PROGRAMU
- Page 51 and 52: 208 ROZDZIA 6 • PISANIE PROGRAMU
- Page 53 and 54: 210 ROZDZIA 6 • PISANIE PROGRAMU
- Page 55 and 56: w i c z e n i a 212 ROZDZIA 6 • P
- Page 57 and 58: 214 ROZDZIA 6 • PISANIE PROGRAMU
6.3. WRACAJC DO KALKULATORA 183<br />
literay zmiennoprzecinkowe — zgodnie z definicj w <strong>C++</strong>, np. 3.14, 0.274e2 i 42;<br />
operatory — +, -, *, / oraz %;<br />
nawiasy — ( i ).<br />
Wydaje si, e trudnoci mog nastrcza literay zmiennoprzecinkowe. Wczytanie liczby 12<br />
wydaje si znacznie atwiejsze ni 12.3e-3. Ale kalkulatory zazwyczaj wykonuj dziaania na<br />
liczbach zmiennoprzecinkowych. Analogicznie podejrzewamy, e aby nasz kalkulator by przydatny,<br />
musi obsugiwa nawiasy.<br />
W jaki sposób reprezentuje si takie tokeny w programie? Mona spróbowa zapamitywa,<br />
gdzie kady token si zaczyna, a gdzie koczy, ale to moe by uciliwe (zwaszcza jeli<br />
pozwolimy na wpisywanie wyrae obejmujcych wicej ni jeden wiersz). Dodatkowo, jeli<br />
bdziemy zapisywa wartoci jako sekwencje znaków, bdziemy musieli póniej znale<br />
sposób na odczytanie tych wartoci. To znaczy, jeli liczb 42 zapiszemy jako znaki 4 i 2, póniej<br />
bdziemy musieli odgadn, e te dwa znaki reprezentuj liczb 42 (tzn. 4*10+2). Oczywistym<br />
i konwencjonalnym rozwizaniem tego problemu jest przedstawienie kadego tokenu<br />
jako pary (rodzaj, warto). Pierwszy element informuje o rodzaju tokenu — liczba, operator,<br />
nawias. Drugi natomiast np. w przypadku liczb okrela dokadn warto.<br />
Jak wic wykorzysta pomys par (rodzaj, warto) w kodzie? Zdefiniujemy typ Token<br />
do reprezentowania tokenów. Po co? Przypomnij sobie, po co uywamy typów: przechowuj<br />
potrzebne nam dane i pozwalaj wykonywa na nich róne operacje. Na przykad typ int pozwala<br />
przechowywa liczby cakowite i umoliwia dodawanie, odejmowanie, mnoenie oraz dzielenie<br />
tych liczb. Natomiast typ string przechowuje acuchy znaków i pozwala je np. czy. W jzyku<br />
<strong>C++</strong> i jego bibliotece standardowej dostpnych jest wiele typów, np. char, int, double,<br />
string, vector i ostream. Nie ma jednak typu Token. W istocie mona wymieni mnóstwo typów<br />
— tysice, a nawet dziesitki tysicy — które chcielibymy mie do dyspozycji, a których<br />
nie ma w jzyku ani jego bibliotece standardowej. Do naszych ulubionych typów, które<br />
nie s standardowo dostpne, nale Matrix (zobacz rozdzia 24.), Date (zobacz rozdzia 9.) oraz<br />
reprezentujce go liczby cakowite nieskoczonej precyzji (poszukaj w internecie informacji na<br />
temat typu Bignum). Jeli przemylisz to, dojdziesz do wniosku, e jzyk nie moe standardowo<br />
obsugiwa dziesitek tysicy typów — kto by je zdefiniowa i zaimplementowa, kto by<br />
je potem znalaz, nie mówic ju o tym, jak gruby musiaby by podrcznik do nauki takiego<br />
jzyka. Jzyk <strong>C++</strong> wzorem innych nowoczesnych jzyków programowania rozwizuje ten<br />
problem, pozwalajc uytkownikowi definiowa wasne (niestandardowe) typy (ang. userdefined<br />
type — typ zdefiniowany przez uytkownika).<br />
6.3.3. Implementowanie tokenów<br />
Jak powinien wyglda token? To znaczy, jakie waciwoci powinien mie nasz typ Token?<br />
Musi nadawa si do reprezentowania operatorów (np. + i -) i wartoci liczbowych (np. 42 i 3.14).<br />
Oczywistym rozwizaniem jest zaimplementowanie czego takiego, co moe zawiera informacj<br />
na temat rodzaju tokenu i w razie potrzeby jego warto: