Помощь - Поиск - Пользователи - Календарь
Полная версия: Комментарии Конечного Автомата
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
Глюк
Здравствуйте!Я сделал прогу,которая выводит комментарий Конечного Автомата,но она выводит только 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;
Глюк
пожалуйста,помогите,оч надо unsure.gif
Lapp
Глюк, ты хотя бы поясни свои обозначения для состояний.. А то непонятно, что именно ты под ними подразумеваешь. Вообще, прога несколько.. запутанная smile.gif. Я подправил основной цикл (главным образом, выбросил ненужное). Разберись с этим куском - может, и тебе самому яснее станет smile.gif. Кстати, обрати внимание на то, как следует форматировать программный текст (отступы).
  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);

Если не помогло - приходи снова, но с пояснениями состояний.
Глюк
спасибо,что исправили не столь грамотного...=)
Вот рисунок алгоритма. Нажмите для просмотра прикрепленного файла
H – начальное состояние конечного автомата, S – конечное…
И комментариями могут быть фразы, заключенные в { } или (* *).
Алгоритм на рисунке соответствует нахождению одного комментария. А надо сделать для нескольких…пробовал – не получается, причем автомат может двигаться только вперед, назад – нет.
Глюк
Lapp
Ну и как быть-то? unsure.gif
Не получается...=((((
Lapp
Цитата(Глюк @ 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, поэтому вывод "без комментариев" не нужен)}

Более детально логику я не проверял, но вроде работает более-менее разумно.. smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.