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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

182 ROZDZIA 6 • PISANIE PROGRAMU<br />

}<br />

}<br />

error("Nieprawidowe wyraenie.");<br />

Wyglda niele, ale gdy wpiszemy wyraenie 1+2*3, to ujrzymy wynik 9 zamiast 7, którego<br />

spodziewalibymy si na podstawie wiedzy zdobytej w szkole podstawowej. Analogicznie<br />

wynikiem wyraenia 1-2*3 bdzie -3 zamiast spodziewanego -5. Kalkulator wykonuje dziaania<br />

w zej kolejnoci — wyraenie 1+2*3 jest liczone jako (1+2)*3 zamiast 1+(2*3). Analogicznie<br />

1-2*3 jest liczone jako (1-2)*3 zamiast 1-(2*3). Lipa! Moglibymy uzna, e zasada, i „mnoenie<br />

wie mocniej ni dodawanie” jest gupi i przestarza konwencj, ale nie moemy zignorowa<br />

wielowiekowej tradycji, aby uatwi sobie programowanie.<br />

6.3.2. Tokeny<br />

Musimy zatem znale sposób na wczytywanie czci wiersza „na zapas”, aby sprawdzi, czy<br />

nie ma tam gdzie operatora * (albo /). Jeli jest, musimy zmieni kolejno wykonywania dziaa.<br />

Niestety próbujc wczyta nieco danych z wyprzedzeniem, napotkamy kilka trudnoci:<br />

1. Nie wymagamy, aby wyraenie znajdowao si w jednym wierszu. Na przykad ponisze<br />

te jest poprawne:<br />

1<br />

+<br />

2<br />

2. Jak znale znaki * i / wród cyfr i plusów w kilku wierszach danych wejciowych?<br />

3. Jak zapamita, gdzie znajdowa si znaleziony znak *?<br />

4. Jak wykona obliczenia, które nie s cile typu „od lewej do prawej”?<br />

Postanowilimy by wielkimi optymistami i zaj si tylko punktami 1 – 3. Ostatnim zajmiemy<br />

si troch póniej.<br />

Poszukamy pomocy. Przecie kto na pewno zna typowy sposób wczytywania danych typu<br />

liczby i operatory i zapisywania ich w taki sposób, aby mona je byo atwo wykorzysta w obliczeniach.<br />

Ta konwencjonalna i przydatna technika nazywa si rozbiorem na skadniki, czyli<br />

tokeny (ang. tokenize) — wczytuje si dane i dzieli je na tokeny. Na przykad wyraenie<br />

45+11.5/7<br />

zostaoby rozoone na tokeny<br />

45<br />

+<br />

11.5<br />

/<br />

7<br />

Token to sekwencja znaków, która reprezentuje pewn cao, np. liczb lub operator. Kompilator<br />

<strong>C++</strong> dzieli na tokeny kod ródowy. W istocie róne formy rozkadu na czynniki s<br />

podstaw analizy wikszoci rodzajów tekstów. W wyraeniach matematycznych w jzyku<br />

<strong>C++</strong> potrzebujemy trzech rodzajów tokenów:

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

Saved successfully!

Ooh no, something went wrong!