Форум: "Основная";
Текущий архив: 2003.01.30;
Скачать: [xml.tar.bz2];
ВнизРасскажите пожалуйста, что сдесь надо делать... Найти похожие ветки
← →
vidiv (2003-01-21 04:55) [0]Есть 2 задачи, расскажите пожалуйста, что сдесь надо делать, а то я даже сути не пойму...
1. Используя стек, решить следующую задачу:
В текстовом файле LOG записано без ошибок логическое выражение (ЛВ) в следующе форме:
<ЛВ>::=true|false|(-<ЛВ>)|(<ЛВ> и <ЛВ>)|(<ЛВ> или <ЛВ>)
Вычислить (как Boolean) значение этого выражения. Знаки "-","и","или" - означают соответственно орицание, коньюнкцию и дизъюнкцию.
2. Дан некоторый текст произвольной длины. Необходимо проверить его симметричность, используя список.
-------------
что такое симметричность текста вообще?
и расскажите что делать в первой задаче, пожалуйста, срочно, очень срочно надо....
Чуть не забыл, это все надо на паскале, или хотябы объяснить что делать? я так думаю мир не без добрых людей....
← →
vidiv (2003-01-21 07:39) [1]Помогите, плиз.... срочно очень надо....
"<ЛВ>::=true|false|(-<ЛВ>)|(<ЛВ> и <ЛВ>)|(<ЛВ> или <ЛВ>)"
"|" - это не СИшное "или", а просто разделитель между возможными вариантами ЛВ
← →
Digitman (2003-01-21 08:47) [2]type
TBoolOper = (boTrue, boFalse, boNot, boAnd, boOr);
function BoolExpr(LV1, LV2: Boolean; BoolOper: TBoolOper): Boolean; cdecl;
begin
case BoolOper of
boTrue: Result := True;
boFalse: Result := False;
boNot: Result := not LV1;
boAnd: Result := LV1 and LV2;
boOr: Result := LV1 or LV2;
end;
end;
← →
han_malign (2003-01-21 11:17) [3]2 Digitman © (21.01.03 08:47)
- описание <LV> рекурсивное, я так понимаю это задача на [обратную] польскую запись.
На сколько я помню в FPU обратная польская запись - на верху стека оператор. Заполнение стека и раскрутка через рекурсию.
← →
AlexKniga (2003-01-21 11:59) [4]2 vidiv © (21.01.03 04:55)
Это классическая задача - разбор строки parsing.
Соответственно у любого классика (Вирт, Кнут, ets.) есть глава по сабжу.
Есть и куча компонент реализующих сабж.
← →
Д (2003-01-21 12:23) [5]Симметричность, наверно, понимается как условие:
Первый символ текста = последнему, 2-й - предпоследнему и т.д., то есть если длина текста n, то i-й симовол = (n-i+1)символу (i=1,2,... [n/2]). Так что помещаещь все символы в список, эл-т списка - один символ и указатели на предыд. и послед. эл-т, запоминаешь ук-ль на первый эл-т и на посл.эл-т и в цикле двигаешься по списку с двух концов, сравнивая эл-ты.
← →
vidiv (2003-01-22 11:34) [6]2 Д >> Спасибо
2 AlexKniga >> Компонент... в Турбо Паскале?
2 han_malign >> наверно ты прав...
← →
vidiv (2003-01-22 11:38) [7]Я решил первую задачу: Предлагаю ее на суд:
uses crt;
type PChars=^TChars;
TChars=Record
C:Char;
Next:PChars;
end;
function Empty(P:Pchars):Boolean;
begin
Empty:=P=nil;
end;
function Pop(var P:PChars):Char;
var W:Pchars;
begin
Pop := P^.C;
W := P^.Next;
dispose(p);
P := W;
end;
procedure Clear(var p:Pchars);
begin
while not Empty(p) do pop(p);
end;
procedure Push(var P:PChars;C:Char);
var W:PChars;
begin
New(W);
W^.C := C;
W^.Next := P;
P := W;
end;
function Top(p:PChars):char;
begin
Top := p^.C;
end;
const kon="*"; diz="+"; no="-"; eqv="=";
function DoOper(a,b:boolean;op:Char):boolean;
begin
case op of
kon: DoOper:=a and b;
diz: DoOper:=a or b;
no : DoOper:=not a;
Eqv: DoOper:= a = b;
else
DoOper:=a;
end;
end;
function GetVal(P:PChars):Boolean;
var c,c1:Char;
op:Char;
Res,R1:boolean;
A:Pchars;
begin
op:=#0;
new(A);
A^.Next:=nil;
repeat
if keypressed then if readkey=#27 then exit;{Дабы не зависла}
c:= pop(p);
if top(P)=no then
begin
if c="1" then c:="0" else
if c="0" then c:="1";
pop(p);
end;
case c of
kon,diz,eqv: op:=c;
"1": Res:= DoOper(true,Res,op);
"0": Res:= DoOper(false,Res,op);
")": begin
Clear(A);
Repeat
c1:=pop(P);
push(A,c1);
until c1="(";
pop(A);
R1:=GetVal(A);
if R1 then push(P,"1") else push(P,"0");
end;
end;
until Empty(P);
if not empty(a) then dispose(A);
GetVal:=Res;
end;
var F:Text;
LogTxt:String;
Stc:PChars;
i:Word;
Res:Boolean;
begin
{$I-}
Assign(F,"Log.Txt");
Reset(F);
Readln(F,LogTxt);
close(F);
{$I+}
if ioresult<>0 then
begin
Writeln("I/O Error on read file Log.txt");
halt;
end;
{ LogTxt:="-1*-0";}
New(Stc);
Stc^.Next:=nil;
for i:=1 to length(LogTxt) do Push(Stc,LogTxt[i]);
Res:=GetVal(Stc);
writeln("["+LogTxt+"] = ",ord(Res));
end.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.01.30;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c