Laboratorium programowania zad 3

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.

Leave a Reply