![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() |
antonioSP |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 16 Пол: Мужской Репутация: ![]() ![]() ![]() |
Помогите решить задачу на рекурсию. В строке записанно выражение следующего вида:
<формула>::=<индетификатор>/(<формула><знак><формула>) <знак>::= +/-/* <индетификатор>::=<буква>/<буква><цифра> <цифра>::=0/1/2/3/4/5/6/7/8/9 Проверить правильность сочетания. Не получается процедура проверки на истинность, может кто подскажет как это сделать. Вот мои наработки процедура ввода (скорее всего и там косяк есть). Код procedure TForm1.Button1Click(Sender: TObject); type tl=(form,buk,sko,skz,znak,cif); var a:string[20]; i:integer; begin i:=1; function read(var s:string; var i:integer):tl; begin if s[i] in ['A'..'z'] then result:=buk; if s[i] in ['0'..'9'] then result:=cif else case s[i] of '+':result:=znak; '-':result:=znak; '(':result:=sko; ')':result:=skz; else result:=err; end; i:=i+1; end; end; |
![]() ![]() |
antonioSP |
![]()
Сообщение
#2
|
Новичок ![]() Группа: Пользователи Сообщений: 16 Пол: Мужской Репутация: ![]() ![]() ![]() |
Я вот тут написал свой вариант, он понимает вроде всё кроме выражения такого типа:4 или (4+6) , пишет что good, а должно быть bad, не могу правильно определить идентификатор. Подскажите плз, что и на что надо исправить в программе.
Код procedure TForm1.Button1Click(Sender: TObject); type spisok=(ind, cif, znak, sko, skz); var res:spisok; str:string; i:byte; function chit(var str:string; var i:byte):spisok; begin i:=i+1; if str[i] in ['A'..'z'] then result:=ind; if str[i] in ['0'..'9'] then result:=cif; case str[i] of '+':result:=znak; '-':result:=znak; '*':result:=znak; '(':result:=sko; ')':result:=skz else edit2.text:='bad'; end; end; // вероятно косяк здесь procedure indetif(var str:string; var i:byte); begin if str[i+1] in ['0'..'9'] then i:=i+1 end; procedure proverka(var str:string; var i:byte; var res:spisok); begin res:=chit(str,i); if res=ind then if i<>length(str) then indetif(str,i) else exit; if res=sko then begin proverka(str,i,res); res:=chit(str,i); if res=znak then begin proverka(str,i,res); res:=chit(str,i); if res=skz then exit else edit2.Text:='bad'; end else edit2.Text:='bad'; end else edit2.Text:='bad'; end; begin str:=edit1.text; i:=0; proverka(str,i,res); if i=length(str) then edit2.Text:='good'; end; end. Сообщение отредактировано: antonioSP - 26.03.2006 21:39 |
![]() ![]() |
![]() |
Текстовая версия | 9.09.2025 4:43 |