Programowanie. Teoria i praktyka z wykorzystaniem C++
Programowanie. Teoria i praktyka z wykorzystaniem C++
Programowanie. Teoria i praktyka z wykorzystaniem C++
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.