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.6. WYPRÓBOWYWANIE PIERWSZEJ WERSJI 203<br />

1 2 3 4+5 6+7 8+9 10 11 12<br />

= 1<br />

= 4<br />

= 6<br />

= 8<br />

= 10<br />

Co takiego? Nie 2 ani 3? Czemu 4, a nie 9 (bo 4+5)? Czemu 6, a nie 13 (bo 6+7)? Przyjrzyj si<br />

uwanie — program zwraca co trzeci token! Moe „poera” cz wprowadzonych danych<br />

bez obliczania ich wartoci? Tak wanie robi. Spójrz na funkcj expression():<br />

double expression()<br />

{<br />

double left = term(); // Wczytuje skadnik i oblicza jego warto.<br />

Token t = get_token(); // nastpny token<br />

while(true) {<br />

switch(t.kind) {<br />

case '+':<br />

left += term(); // Oblicza warto skadnika i wykonuje dodawanie.<br />

t = get_token();<br />

break;<br />

case '–':<br />

left –= term(); // Oblicza warto skadnika i wykonuje odejmowanie.<br />

t = get_token();<br />

break;<br />

default:<br />

return left; // Jeli nie ma wicej znaków + lub –, zwraca odpowied.<br />

}<br />

}<br />

}<br />

Gdy funkcja get_token() zwróci inny Token ni + lub -, po prostu zwracamy warto. Nie uywamy<br />

tego tokenu i nie zapisujemy go do uytku przez inn funkcj. To nie byo zbyt mdre.<br />

Odrzucanie danych wejciowych bez sprawdzenia nawet, co to dokadnie jest, to niezbyt dobry<br />

pomys. atwo mona si przekona, e ten sam defekt ma funkcja term(). To wyjania,<br />

dlaczego nasz kalkulator zjada dwa tokeny na trzy.<br />

Poprawimy funkcj expression(), aby nie zjadaa tokenów. Gdzie moemy zapisa nastpny<br />

token (t), jeli program go nie potrzebuje? Moglibymy opracowa wiele rónych skomplikowanych<br />

rozwiza, ale zastosujemy najbardziej oczywiste (wydaje si oczywiste, gdy si<br />

je ju zobaczy) — ten token zostanie wykorzystany przez jak inn funkcj, a wic umiecimy<br />

go z powrotem w strumieniu wejciowym, aby móg zosta stamtd ponownie wczytany! W istocie<br />

mona by byo wstawia znaki do strumienia istream, ale nie o to nam chodzi. My chcemy<br />

mie tokeny, a nie bawi si ze znakami. Potrzebujemy strumienia wejciowego, w którym<br />

bdzie mona zapisywa tokeny.<br />

Zaómy wic, e mamy strumie tokenów — Token_stream — o nazwie ts. Przyjmijmy<br />

te, e ma on funkcj skadow o nazwie get(), która zwraca nastpny token i funkcj skadow<br />

putback(t), ta za wstawia token t z powrotem do strumienia. Implementacj strumienia<br />

Token_stream przedstawimy w podrozdziale 6.8, gdy bdziemy ju wiedzieli, jak go uy.

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

Saved successfully!

Ooh no, something went wrong!