16.07.2014 Views

Programowanie. Teoria i praktyka z wykorzystaniem C++

Programowanie. Teoria i praktyka z wykorzystaniem C++

Programowanie. Teoria i praktyka z wykorzystaniem C++

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

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!