Programowanie. Teoria i praktyka z wykorzystaniem C++

Programowanie. Teoria i praktyka z wykorzystaniem C++ Programowanie. Teoria i praktyka z wykorzystaniem C++

pdf.helion.pl
from pdf.helion.pl More from this publisher
16.07.2014 Views

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

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:

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!