Здравствуйте!Я сделал прогу,которая выводит комментарий Конечного Автомата,но она выводит только 1 комментарий,а если вводить 2 и более - нет.Как это реализовать?И автомат может двигаться только вперед,а назад возвращаться не может...
procedure TForm1.Button1Click(Sender: TObject);
type Qka=(H,K,C,D,S,E); {Cостояния КА} var qa : Qka; Sa,Sc: string; i: byte; begin edit2.Text:=''; Sc:=''; Sa:=edit1.Text; qa:=H; i:=1; repeat case qa of H : begin case Sa[i] of '{' : qa:=K; '(' : qa:=D; end; i:=i+1; end; K : begin case Sa[i] of '}' : qa:=S else begin qa:=K;Sc:=Sc+Sa[i]; end; end; i:=i+1; end; D : begin case Sa[i] of '*' : qa:=C else begin qa:=H; Sc:=''; end; end; i:=i+1; end; C : begin case Sa[i] of '*' : qa:=E else begin qa:=C; Sc:=Sc+Sa[i]; end; end; i:=i+1; end; E : begin case Sa[i] of '*' : begin qa:=E; Sc:=Sc+Sa[i]; end; ')' : qa:=S; else begin qa:=C; Sc:=Sc+Sa[i]; end; end; i:=i+1; end; end; until (i>length(Sa)) or (qa=S); if qa<>S then edit2.Text:='Без комментариев' else edit2.Text:=Sc; end;
Глюк
10.11.2007 21:30
пожалуйста,помогите,оч надо
Lapp
11.11.2007 18:02
Глюк, ты хотя бы поясни свои обозначения для состояний.. А то непонятно, что именно ты под ними подразумеваешь. Вообще, прога несколько.. запутанная . Я подправил основной цикл (главным образом, выбросил ненужное). Разберись с этим куском - может, и тебе самому яснее станет . Кстати, обрати внимание на то, как следует форматировать программный текст (отступы).
repeat case qa of H : case Sa[i] of '{' : qa:=K; '(' : qa:=D; end; K : case Sa[i] of '}' : qa:=S else Sc:=Sc+Sa[i] end; D : case Sa[i] of '*' : qa:=C else begin qa:=H; Sc:=''; end; end; C : case Sa[i] of '*' : qa:=E else Sc:=Sc+Sa[i] end; E : case Sa[i] of '*' : Sc:=Sc+Sa[i]; ')' : qa:=S; else begin qa:=C; Sc:=Sc+Sa[i] end end; end; i:=i+1; until (i>length(Sa)) or (qa=S);
Если не помогло - приходи снова, но с пояснениями состояний.
Глюк
11.11.2007 23:03
спасибо,что исправили не столь грамотного...=) Вот рисунок алгоритма. Нажмите для просмотра прикрепленного файла H – начальное состояние конечного автомата, S – конечное… И комментариями могут быть фразы, заключенные в { } или (* *). Алгоритм на рисунке соответствует нахождению одного комментария. А надо сделать для нескольких…пробовал – не получается, причем автомат может двигаться только вперед, назад – нет.
Глюк
13.11.2007 20:40
Lapp Ну и как быть-то? Не получается...=((((
Lapp
14.11.2007 7:31
Цитата(Глюк @ 13.11.2007 16:40)
Ну и как быть-то?
Заключить твой цикл repeat в еще один (внешний) цикл. В начале внешнего цикла присваивать qa значение H, а также очищать строку комментариев. В конце внешнего цикла, если qa=S, то выводить комментарий. Выход из внешнего цикла по достижении конца строки. Еще рекомендую ввести счетчик найденных комментариев (n). Короче, примерно вот так:
n:=0; i:=1; repeat qa:=H; Sc:=''; repeat case qa of H : case Sa[i] of '{' : qa:=K; '(' : qa:=D; end; K : case Sa[i] of '}' : qa:=S else Sc:=Sc+Sa[i] end; D : case Sa[i] of '*' : qa:=C else begin qa:=H; Sc:=''; end; end; C : case Sa[i] of '*' : qa:=E else Sc:=Sc+Sa[i] end; E : case Sa[i] of '*' : begin qa:=E; Sc:=Sc+Sa[i]; end; ')' : qa:=S; else begin qa:=C; Sc:=Sc+Sa[i] end end; end; i:=i+1; until (qa=S) or (i>length(Sa)); if qa=S then begin Inc(n); {тут выводишь очередной комментарий, Sc, каждый на своей строке} end until i>length(Sa); {тут выводишь общее число найденных комментариев n (может быть равно 0, поэтому вывод "без комментариев" не нужен)}
Более детально логику я не проверял, но вроде работает более-менее разумно..
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.