IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Комментарии Конечного Автомата
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 34
Пол: Мужской

Репутация: -  0  +


Здравствуйте!Я сделал прогу,которая выводит комментарий Конечного Автомата,но она выводит только 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;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 5)
сообщение
Сообщение #2


Новичок
*

Группа: Пользователи
Сообщений: 34
Пол: Мужской

Репутация: -  0  +


пожалуйста,помогите,оч надо unsure.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Глюк, ты хотя бы поясни свои обозначения для состояний.. А то непонятно, что именно ты под ними подразумеваешь. Вообще, прога несколько.. запутанная 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);

Если не помогло - приходи снова, но с пояснениями состояний.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 34
Пол: Мужской

Репутация: -  0  +


спасибо,что исправили не столь грамотного...=)
Вот рисунок алгоритма. Прикрепленный файл  __.rar ( 6.55 килобайт ) Кол-во скачиваний: 437

H – начальное состояние конечного автомата, S – конечное…
И комментариями могут быть фразы, заключенные в { } или (* *).
Алгоритм на рисунке соответствует нахождению одного комментария. А надо сделать для нескольких…пробовал – не получается, причем автомат может двигаться только вперед, назад – нет.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 34
Пол: Мужской

Репутация: -  0  +


Lapp
Ну и как быть-то? unsure.gif
Не получается...=((((

Сообщение отредактировано: Глюк -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Глюк @ 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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 19:55
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name