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.

198 ROZDZIA 6 • PISANIE PROGRAMU<br />

6.5.2.3. Wyraenia — do trzech razy sztuka<br />

Co teraz? Spójrz jeszcze raz na gramatyk (t poprawn w podrozdziale 6.5.2) — kade wyra-<br />

enie zaczyna si skadnikiem, po którym moe znajdowa si znak + lub -. Musimy wic<br />

poszuka skadnika, sprawdzi, czy znajduje si za nim jeden z tych znaków, i robi tak a do<br />

wyczerpania plusów i minusów. Na przykad:<br />

double expression()<br />

{<br />

double left = term();<br />

// Wczytuje skadnik i oblicza jego warto.<br />

Token t = get_token();<br />

// nastpny token<br />

while ( t.kind=='+' || t.kind=='–') { // Szuka znaków + i –.<br />

if (t.kind == '+')<br />

left += term();<br />

// Oblicza warto skadnika i wykonuje dodawanie.<br />

else<br />

left –= term();<br />

// Oblicza warto skadnika i wykonuje odejmowanie.<br />

t = get_token();<br />

}<br />

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

}<br />

Ten kod jest nieco bardziej skomplikowany, poniewa musielimy wprowadzi ptl, aby<br />

móc wyszuka wszystkie plusy i minusy. Ponadto powtarzamy si troch — dwa razy sprawdzamy<br />

znaki + i - oraz dwa razy wywoujemy funkcj get_token(). Poniewa to tylko zaciemnia<br />

kod, pozbdziemy si nadmiarowego testu znaków + i -:<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;<br />

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

}<br />

}<br />

}<br />

Warto zauway, e pomijajc ptl, ta wersja kodu jest podobna do pierwszej próby (podrozdzia<br />

6.5.2.1). Usunlimy wywoanie funkcji expression() wewntrz funkcji expression()<br />

i zastpilimy je ptl. Innymi sowy przekonwertowalimy wyraenie z zasad gramatyki na<br />

ptl szukajc skadnika ze znakiem + lub -.

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

Saved successfully!

Ooh no, something went wrong!