Помогите решить задачу на рекурсию. В строке записанно выражение следующего вида:
<формула>::=<индетификатор>/(<формула><знак><формула>)
<знак>::= +/-/*
<индетификатор>::=<буква>/<буква><цифра>
<цифра>::=0/1/2/3/4/5/6/7/8/9
Проверить правильность сочетания.
Не получается процедура проверки на истинность, может кто подскажет как это сделать. Вот мои наработки процедура ввода (скорее всего и там косяк есть).
Честно говоря, у тебя написано не очень правильно....
Попробуй вот этот вариант:
function Test(const S: string): boolean;
var Cur: integer; // индекс следующего символа
Len: integer; // длина строки входной
Look: char; // текущий символ
// вернёт истину, если достигнут конец строки
function LineEnd: boolean;
begin
Result:=Cur > Len;
end;
// вернёт истину, если символ удалось считать
function GetChar: boolean;
begin
if Cur <= Len then begin
Look:=S[Cur];
inc(Cur);
Result:=true
end else begin
Look:=#0;
Result:=false
end
end;
// проверяет, является ли символ + - или *
function IsOperator(C: Char): boolean;
begin
Result:=C in ['+','*','-']
end;
// является ли символ буквой (латиница)
function IsAlpha(C: char): boolean;
begin
Result:=UpCase( С ) in ['A'..'Z']
end;
// является ли цифрой (арабской
function IsDigit(C: char): boolean;
begin
Result:=C in ['0'..'9']
end;
// <идентификатор>
function IsIdentifer: boolean;
begin
if IsAlpha(Look) then begin // <индетификатор>::=<буква>
while GetChar do //<индетификатор>::=<буква><цифра>
if not (IsAlpha(Look) or IsDigit(Look)) then Break;
Result:=true
end else Result:=false
end;
// <формула>
function IsFormula: boolean;
begin
if IsIdentifer then begin // <формула>::=<идентификатор>
Result:=true
end else if Look = '(' then begin // <формула>:=(<формула><знак><формула>)
GetChar; // пропускаем '('
if IsFormula then
if IsOperator(Look) then begin
GetChar; //пропускаем знак
if IsFormula then
if Look = ')' then begin
GetChar; // пропускаем ')'
Result:=true;
Exit;
end;
end;
Result:=false;
end else Result:=false;
end;
// инициализирует переменные и закачивает первый символ
procedure Init;
begin
Cur:=1;
Len:=Length(S);
GetChar;
end;
begin
Init;
// условие правильности: формула обнаружена и достигнут конец строки
Result:=IsFormula and LineEnd;
end;
Я вот тут написал свой вариант, он понимает вроде всё кроме выражения такого типа:4 или (4+6) , пишет что good, а должно быть bad, не могу правильно определить идентификатор. Подскажите плз, что и на что надо исправить в программе.
в коде разобраться - нереально :-))
погоняй лучше мой вариант