Kalkulator logiczny to program, który dla danego wyrażenia logicznego pozwoli obliczyć jego wartość. Opisany poniżej program będzie jego najprostszą implementacją, która będzie rozpoznawać główne operatory logiczne: koniunkcję, negację, alternatywę i równość. Wartości fałsz i prawda będą reprezentowane kolejno przez 0 i 1. Ponadto program będzie uwzględniał nawiasy okrągłe w celu podwyższenia priorytetu wybranego fragmentu równania.
Przed przystąpieniem do pisania właściwej części programu warto napisać funkcję, która na podstawie danych wartości logicznych oraz operatora zwróci odpowiedni wynik. W tym przypadku funkcja check() przyjmuje dwa argumenty logiczne val1 i val2 oraz operator op. Ze względu na fakt, że negacja jest operatorem jednoargumentowym to zostanie zaimplementowana oddzielnie.
(2.) Na podstawie znaku operatora zwróć wynik: (3. - 4.) alternatywy, (5. - 6.) koniunkcji, (7. - 8.) alternatywy wykluczającej czy (9. - 10.) równość. (11.) W przypadku braku rozpoznania operatora (12.) zwróć fałsz.
Kolejna funkcja result() przyjmuje dwa argumenty: data - ciąg znaków z danymi oraz pos - pozycję od której ma rozpocząć obliczanie wyrażenia. W celu wydobycia z wyrażenia wartości logicznych program korzysta z funkcji readvalue() zamieszczonej niżej.
(2.) Wyodrębnij pierwszą wartość logiczną. (3.) Zadeklaruj zmienną op do przechowywania ostatniego znaku. (4.) Dopóki nie ma końca danych to (5.) pobierz operator i (6.) wylicz nową wartość. (7.) Jeśli następny znak to ")" to (8.) zwiększ numer pozycji i (9.) zwróć wartość. Fragment (7. - 9.) pozwala na zwrócenie wartości podczas obliczania wyrażenia w nawiasach. W przypadku głównego wywołania funkcji result() program zakończy się w linijce (12.) zwracając aktualną wartość zmiennej w tj. aktualnie obliczonego wyrażenia.
W trakcie pobierania wartości przed lub po operatorze może dojść do sytuacji, że (4.) zostanie użyta negacja wtedy należy zanegować (5.) wartość dalszej części wyrażenia. (6.) Zostanie podane wyrażenie w nawiasie - wtedy (7.) wyrażenie należy obliczyć oddzielnie. Poprzednia funkcja result() rozpozna znak ")" i przerwie obliczania wyrażania w nawiasach. Jednak jeśli żaden znak specjalny nie wystąpił to (9.) wystarczy zwrócić wartość wskazywaną przez cyfrę. (10.) W takim przypadku należy numer znaku 0 lub 1 zamienić na wartość liczbową, a następnie na wartość logiczną. Innym sposobem jest porównanie pobranego znaku do 1. Aby program wiedział, którą część wyrażenia rozpoznaje (2.) zwiększony zostaje numer rozpatrywanej pozycji w data.
Wszystkie funkcje podczas pobieranie kolejnego znaku zwiększają tą samą zmienną w pamięci. Pozwala to najprostsze zarządzenie przeglądaniem wszystkich informacji, ale przez to potrzebna jest dodatkowa funkcja, która taką zmienną zaalokuje w pamięci:
Podczas korzystania z kalkulatora logicznego w innym programie wystarczy podać funkcji solve() odpowiedni ciąg znaków.
W celu przetestowania funkcji można skorzystać z poniższego kodu. Należy pamiętać, że wyrażenie powinno składać się wyłącznie z następujących znaków: 0, 1, &, |, ^, = oraz nawiasów okrągłych (, ).
Napisz program, który prawidłowo będzie pomijał znaki spacji oraz będzie rozpoznawał implikację, która będzie reprezentowana przez =>.
Poprawne przykładowe dane: