Programowanie. Teoria i praktyka z wykorzystaniem C++
Programowanie. Teoria i praktyka z wykorzystaniem C++
Programowanie. Teoria i praktyka z wykorzystaniem C++
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
196 ROZDZIA 6 • PISANIE PROGRAMU<br />
moe nauczy si bardzo duo, patrzc na dramatycznie róne zachowania podobnych fragmentów<br />
kodu. Czytanie kodu to przydatna umiejtno, któr naley pielgnowa.<br />
6.5.2.1. Wyraenia — pierwsza próba<br />
Patrzc na zasad Expression'+' Term, najpierw próbujemy wywoa funkcj expression(),<br />
nastpnie znale znak + (i -) oraz wywoa funkcj term():<br />
double expression()<br />
{<br />
double left = expression(); // Wczytuje i oblicza warto wyraenia.<br />
Token t = get_token(); // nastpny token<br />
}<br />
switch (t.kind) {<br />
case '+':<br />
return left + term();<br />
case '–':<br />
return left – term();<br />
default:<br />
return left;<br />
}<br />
// Sprawdza, jaki to jest rodzaj tokenu.<br />
// Wczytuje i sprawdza warto skadnika,<br />
// nastpnie wykonuje dodawanie.<br />
// Wczytuje i sprawdza warto skadnika,<br />
// nastpnie wykonuje odejmowanie.<br />
// Zwraca warto wyraenia.<br />
Wyglda dobrze. To jest prawie naiwna transkrypcja gramatyki. Jest do prosta — najpierw<br />
wczytuje wyraenie, a nastpnie sprawdza, czy za nim znajduje si znak + lub - i jeli tak,<br />
wczytuje skadnik (Term).<br />
Niestety w rzeczywistoci to jest bez sensu. Skd wiadomo, gdzie koczy si wyraenie,<br />
dziki czemu mona poszuka znaków + i -? Przypominam, e nasz program czyta od lewej<br />
do prawej i nie moe wybiec do przodu, aby sprawdzi, czy nie ma dalej znaku +. W istocie ta<br />
wersja funkcji expression() nigdy nie wyjdzie poza pierwszy wiersz — zaczyna od wywoania<br />
funkcji expression(), która zaczyna od wywoania funkcji expression() itd. w nieskoczono.<br />
Nazywa si to nieskoczon rekurencj (ang. infinite recursion), która jednak bdzie miaa<br />
koniec — gdy skoczy si w komputerze pami do przechowywania nigdy niekoczcych<br />
si wywoa funkcji expression(). Pojcie rekurencji oznacza wywoywanie funkcji przez<br />
siebie sam. Nie wszystkie rekurencje s nieskoczone, poza tym technika ta jest bardzo<br />
przydatna w programowaniu (zobacz rozdzia 8.5.8).<br />
6.5.2.2. Wyraenia — druga próba<br />
Co w takim razie robimy? Kady skadnik jest wyraeniem, ale nie kade wyraenie jest skadnikiem.<br />
Moemy wic zacz od szukania skadnika i przej do szukania penego wyraenia<br />
tylko wówczas, gdy znajdziemy znak + lub -. Na przykad:<br />
double expression()<br />
{<br />
double left = term();<br />
Token t = get_token();<br />
switch (t.kind) {<br />
case '+':<br />
// Wczytuje skadnik i oblicza jego warto.<br />
// nastpny token<br />
// Sprawdza, jaki to rodzaj tokenu.