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.9. STRUKTURA PROGRAMU 211<br />
Skd wiadomo, e ma pojawi si liczba? Zgadujc na podstawie wasnych dowiadcze<br />
lub zagldajc do podrcznika jzyka <strong>C++</strong> (np. w dodatku A), mona stwierdzi, e litera liczbowy<br />
musi zaczyna si od cyfry lub znaku . (kropki dziesitnej). Sprawdzamy wic, czy tak<br />
jest. Nastpnie chcemy, aby liczb t wczyta strumie cin, ale wczytalimy ju pierwszy znak<br />
(cyfr lub kropk), a wic pozwalajc temu strumieniowi zaj si reszt, uzyskalibymy nieprawidowe<br />
wyniki. Moglibymy spróbowa poczy warto pierwszego znaku z „reszt” wczytan<br />
przez cin. To znaczy, jeli wpisano by 123, otrzymalibymy 1 i strumie cin wczytaby 23. Wówczas<br />
trzeba by byo doda 100 do 23. A fuj! A to tylko banalny przykad. Na szczcie (i nie<br />
przypadkowo) cin dziaa bardzo podobnie do Token_stream pod tym wzgldem, e take pozwala<br />
wstawi odczytany znak z powrotem. Zamiast wic wykonywa zagmatwane obliczenia<br />
arytmetyczne, wstawiamy pierwsz cyfr z powrotem do cin i odczytujemy z niego ca liczb.<br />
Zauwa, e cay czas unikamy skomplikowanej pracy i znajdujemy prostsze rozwizania<br />
— czsto w tym celu wykorzystujc zawarto biblioteki. To jest istota programowania —<br />
nieustanne poszukiwanie jak najprostszych rozwiza. Niektórzy — nie zawsze susznie —<br />
wyraaj to sowami: „Dobry programista to leniwy programista”. W tym, i tylko w tym,<br />
sensie rzeczywicie powinnimy by leniwi. Po co pisa duo kodu, skoro mona to samo<br />
zrobi, piszc go mniej?<br />
6.9. Struktura programu<br />
Jest takie przysowie, które gosi, e czasami trudno zauway las, poniewa zasaniaj go drzewa.<br />
W analogiczny sposób mona straci z oczu program, patrzc na te jego wszystkie funkcje, klasy<br />
itp. Spójrzmy zatem na nasz program, pomijajc chwilowo szczegóy:<br />
#include "std_lib_facilities.h"<br />
class Token { /* … */ };<br />
class Token_stream { /* … */ };<br />
Token_stream::Token_stream() :full(false), buffer(0) { /* … */ }<br />
void Token_stream::putback(Token t) { /* … */ }<br />
Token Token_stream::get() { /* … */ }<br />
Token_stream ts; // Udostpnia funkcje get() i putback().<br />
double expression(); // Deklaracja umoliwiajca funkcji primary() wywoywanie funkcji expression().<br />
double primary() { /* … */}<br />
// Obsuga nawiasów i liczb.<br />
double term() { /* … */} // Obsuga operatorów *, / i %.<br />
double expression() { /* … */} // Obsuga operatorów + i –.<br />
int main() { /* … */ } // Gówna ptla i obsuga bdów.<br />
Kolejno deklaracji ma znaczenie. Nie mona uy nazwy, zanim zostanie zadeklarowana. Dlatego<br />
ts musi zosta zadeklarowana, zanim zostanie uyta w ts.get(), a funkcja error() musi zosta<br />
zadeklarowana przed funkcjami parsera, poniewa wszystkie z niej korzystaj. Na schemacie<br />
wywoa mona zauway ciekawe zaptlenie: funkcja expression() wywouje term(),<br />
która wywouje primary(), a ta z kolei wywouje expression().