Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
14-97008
Николай Быков
2003-01-10 11:04
2003.01.30
Может ли кто-нибудь объяснить?


1-96720
Эли
2003-01-21 21:12
2003.01.30
Перетаскивание текста


1-96670
AlexAlex2
2003-01-17 11:29
2003.01.30
Переход VCL->CLX


4-97102
GoldenFILL
2002-12-14 13:28
2003.01.30
Конвертация double и int64 в string


14-96984
polizei
2003-01-13 10:32
2003.01.30
Как можно сделать это через биос?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский