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.