Zadanie 3 z laboratorium programowania na Informatyce UW.
Zadanie 3 (termin wysylania rozwiazan: 1 II 2008, godz. 23:59) (wyrazenia logiczne w ONP) Dana jest gramatyka bezkontekstowa wyrazen logicznych w Odwrotnej Notacji Polskiej (obok kazdej produkcji podano jej znaczenie): E -> 0 falsz E -> 1 prawda E -> E E & koniunkcja E -> E E | alternatywa E -> E E = rownowaznosc E -> E E > implikacja (pierwsze E implikuje drugie) E -> E ! negacja Napisz program, ktory wczyta z wejscia wyrazenie opisane powyzsza gramatyka i wypisze na wyjscie 1 lub 0 w zaleznosci od tego, czy wartoscia wyrazenia jest prawda czy falsz. Dla danych niepoprawnych program powinien wypisac slowo BLAD. Postac danych: Na wejsciu znajdzie sie jeden wiersz tekstu zbudowanego ze znakow 0, 1, &, |, =, >, ! i zakonczonego kropka. Pomiedzy kolejnymi znakami wyrazenia nie bedzie spacji. Postac wyniku: Program wypisuje na wyjscie jeden wiersz z liczba 0 lub 1 albo ze slowem BLAD. Np. dla danych: 01>1!0|>110&&!=. reprezentujacych wyrazenie logiczne: ((false => true) => ((not true) or false)) not (true and (true and false)) program powinien wypisac: 0
A oto rozwiązanie:
program zad3;
//Program napisany na zajęcia z Laboratorium Języka Pascal i C. Zadania nr 3.
var i,ile:integer;
wynik,blad:boolean;
zdanie:string;
function wczytaj:boolean;
//Funkcja wczytuje operator lub wartosc i decyduje co robic dalej.
var znak:char;
wynik,wynik1,wynik2:boolean;
begin
wynik:=false;
if (blad=false) then
begin
//Jesli nie bylo bledu
znak:=zdanie[i];
i+=-1;
//male zabezpieczenie jesli wykroczylismy poza zakres
if i') then
begin //Liczymy implikacje
wynik1:=wczytaj();
wynik2:=wczytaj();
wynik:=NOT (wynik2 AND NOT wynik1);
end
else if (znak='!') then
begin //Liczymy zaprzeczenie
wynik1:=wczytaj();
wynik:=NOT wynik1;
end
else //Podano znak spoza zakresu
blad:=true;
end;
wczytaj:=wynik;
end;
begin
blad:=false;
//Wczytujemy zdanie:
readln(zdanie);
ile:=length(zdanie);
i:=ile;
//Jesli zdanie ma jak powinno kropke na koncu:
if (zdanie[ile]='.') then
begin
i+=-1;
wynik:=wczytaj;
end
else //No jesli nie ma to blad
blad:=true;
//Teraz wypiszemy wynik
//Jesli wystapil blad:
if blad then
writeln('BLAD')
else
if wynik then
writeln('1')
else
writeln('0');
end.