Informatyka I rok
Laboratorium Metod Programowania
2001/2002

Zadanie z dnia: 15.04.02
Termin odbioru: 29.04.02

Zadanie 3

Napisz program Kalk implementujący interaktywny kalkulator z pamięcią. Po wywołaniu
program Kalk ma wyświetlać znak zachęty (np. '>'), czekać na komendy użytkownika i 
je wykonywać. Ponadto na początku swego działania oraz przed zwolnieniem
i po zwolnieniu pamięci Kalk ma wypisać wartości funkcji MemAvail i MaxAvail.
Wywołanie z większą od zera liczbą parametrów powinno spowodować wypisanie komunikatu
o błędzie, wypisanie informacji o sposobie wywołania i zakończenie działania programu.

* Komendy

Komendy są jednowierszowe i mogą mieć jedną z następujących postaci:
1) <id> = <wyr>
2) <id>
3) <pusty wiersz>

Ad 1)
 Kalk ma wyliczyć wartość wyrażenia wyr i zapamiętać ją na zmiennej id. W wyrażeniu
 mogą występować zmienne. Składnia wyrażeń jest podana dalej.

Ad 2)
 Kalk ma wypisać bieżącą wartość zmiennej id.
 
Ad 3)
 Kalk powinien zapytać użytkownika, czy ten na pewno chce zakończyć pracę i, w przypadku
 uzyskania odpowiedzi twierdzącej, zakończyć działanie.

W przypadku napotkania błędu w komendzie (zła składnia, użycie niezainicjalizowanej 
zmiennej, dzielenie przez zero, niewłaściwa odpowiedź na pytanie o zakończenie pracy) 
należy wypisać komunikat o błędzie, potraktować komendę jako niebyłą i przejść 
do wykonywania następnej.

* Uwagi

1) Do analizy treści wyrażeń _trzeba_ zastosować metodę zejść rekurencyjnych.
2) Do pamiętania wartości zmiennych _trzeba_ użyć drzew BST.
3) Drzewa BST _trzeba_ zaimplementować w oddzielnym module.

* Do omówienia
1) Metoda zejść rekurencyjnych (procedura pobierzSymbol, problem wczytywania
   o jeden symbol za dużo).
2) Moduły w Turbo Pascalu.
3) Interfejs modułu BST.
3) Procedura Val.
4) Operacje porównywania (<, <=, ...) na napisach.
5) Ewentualnie funkcje ReadKey i UpCase.

Załączniki
----------

* Gramatyka wyrażeń

<wyr>    ::= <skł> { <opdod> <skł> }
<opdod>  ::= + | -
<skł>    ::= <czyn> { <opmnoż> <czyn> }
<opmnoż> ::= * | /
<czyn>   ::= ( <wyr> ) | <liczba> | <id>

<liczba> to liczba naturalna,
<id>     to niepusty ciąg liter.

Rozróżniamy wielkie i małe litery. Operacje na liczbach przpeprowadzamy w standardowej
arytmetyce Turbo Pascala (typ Integer). Operacja / oznacza dzielenie całkowite (div).

* Przykładowa sesja z Kalk (bez informacji o zajętości pamięci)

c:\>kalk
> ala = 1
> ala
ala=1
>ola = ala  * 2+1
>  ela = ula +1
Błąd: zmienna ula nie jest zdefiniowana
>ela
Błąd: zmienna ela nie jest zdefiniowana
>ela= (ola + 1)*4 - ala / 2
>
Czy chcesz już zakończyć pracę (T/N)? N
>ela
ela=16
>ola
ola=3
>
Czy chcesz już zakończyć pracę (T/N)? T
Koniec pracy z programem Kalk.
C:\>