→ Для вступления в общество новичков и профессионалов программирования, пожалуйста нажмите здесь ...

Форум программистов: C++, Basic, Delphi, Pascal, JavaScript
Логин: Пароль:
Запомнить?  
@Mail.ru



Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Переделать программу из Delphi в C++ 
Автор Сообщение
Начинающий

Регистрация: 21.12.2010
Сообщения: 1
Языки:

Репутация: 0 [ ? ]
 Переделать программу из Delphi в C++
Вобщем есть программа поиска подстроки в строке с помощью конечных автоматов реализованная на Delphi. Нужно ее перекомпилировать в C++. Заранее благодарен.
Вот код:

uses math;

const
maxplen = 400;

type
transfunc = array[0..maxplen, 1..255] of integer;

var
i: integer;
p, t: string;
hasch: array[1..255] of boolean;
f: transfunc;

{ Построение автомата по образцу }
procedure computefunc(const p: string; var f: transfunc);
var
i, j, k, m, t1, t2: integer;
begin
m := length(p);
for i := 0 to m do begin
for j := 1 to 255 do if hasch[j] then begin
k := min(m + 1, i + 2);
while k > 0 do begin
dec(k);
if (k > 0) and (ord(p[k]) = j) then begin
t1 := k - 1; t2 := i;
while (t1 > 0) and (p[t1] = p[t2]) do begin
dec(t1); dec(t2);
end;
if t1 = 0 then break;
end;
end;
f[i, j] := k;
end;
end;
end;

{ Поиск подстроки }
procedure match(const t: string; var f: transfunc; const m: integer);
var
n, q, i: integer;
begin
writeln('Осуществим проход по тексту. В начале автомат находится в состоянии q = 0.');
writeln('Взяв следующий символ ''a'' текста Т, автомат переходит в состояние f[q, ''a''].');
writeln;

n := length(t);
q := 0;
for i := 1 to n do begin
write('T[', i, '] = ', '''', t[i], ''', f[', q, ', ''', t[i], '''] = ', f[q, ord(t[i])]);
q := f[q, ord(t[i])];
if q = m then begin
write(', мы попали в состояние ', m,
', следовательно образец входит в текст с позиции ', i - m + 1, '.');
end;
writeln;
end;
end;

procedure fill(const n: integer; const ch: char);
var
i: integer;
begin
for i := 1 to n do write(ch);
end;

procedure printfunc(var f: transfunc; const m: integer);
var
i, j, t, digits: integer;
begin
writeln;
writeln('Длина образца |P| = ', m, ', поэтому количество состояний в автомате - ', m + 1, ' (|P|+1).');
writeln('Автомат находит вхождение образца, если он попадает в допускающее состояние ', m, '.');
writeln('Построим функцию переходов f. Для каждого префикса P[0..m], где m = 0..', m, ',');
writeln('переберем все символы ''a'', встречающиеся в образце, и найдем максимальный');
writeln('суффикс строки P[0..m]a, который является префиксом P. Длину найденного префикса');
writeln('сохраним в ячейке f[m, ''a''] функции переходов.');
writeln;
writeln('Полученная в результате функция переходов имеет вид:');
writeln;
t := m; digits := 0;
while t > 0 do begin
inc(digits); t := t div 10;
end;

write(' ');
for i := 0 to m do begin
write('| ');
write(i:digits);
end;
writeln;

for i := 1 to 255 do if hasch[i] then begin
write('--');
for j := 0 to m do begin
write('+');
fill(digits + 1, '-');
end;
writeln;
write(' ', chr(i));
for j := 0 to m do begin
write('| ');
write(f[j, i]:digits);
end;
writeln;
end;
writeln;
end;

begin
reset(input, 'input.txt');
rewrite(output, 'output.txt');

readln(t); readln(p);
writeln('Ищем образец "', p, '" (P) в тексте "', t, '" (T).');
for i := 1 to length(p) do hasch[ord(p[i])] := true;

computefunc(p, f);
printfunc(f, length(p));
match(t, f, length(p));
end.


21.12.2010 23:34
Профиль Отправить email
Эксперт

Регистрация: 09.12.2010
Сообщения: 80
Откуда: Лисичанск
Языки:

Репутация: 0 [ ? ]
 Re: Переделать программу из Delphi в C++
переделать врядли выйдет!!! нужно писать новую на таком подобии


24.12.2010 16:27
Профиль Отправить email
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 


Кто сейчас на конференции

Зарегистрированные пользователи: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
cron
© 2013 «Форум программистов Украины»