![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
invoke |
![]() ![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 5 Пол: Мужской Реальное имя: Санек Репутация: ![]() ![]() ![]() |
я только не давно начал изучать visual с++ и уменя не получилось перевести алгоритм....
![]() ![]() а вот сам алгоритм Реализуем указанный алгоритм на языке ObjectPascal. Прежде всего следует определить тип данных «таблица смещений». Для кодовой таблицы, состоящей из 256 символов, определение этого типа будет выглядеть так: type TBMTable = array [0..255] of Integer; Далее приводится процедура, вычисляющая таблицу смещений для образца P. procedure MakeBMTable( var BMT : TBMTable; const P : String); var i : Integer; begin for i := 0 to 255 do BMT[i] := Length(P); for i := Length(P) downto 1 do if BMT[Byte(P[i])] = Length(P) then BMT[Byte(P[i])] := Length(P) – i;end; Теперь напишем функцию, осуществляющую поиск. function BMSearch( StartPos : Integer; const S, P : String; const BMT : TBMTable) : Integer; var Pos, lp, i : Integer; begin lp := Length(P); Pos := StartPos + lp –1; while Pos < Length(S) do if P[lp] <> S[Pos] then Pos := Pos + BMT[S[Pos]] else for i := lp - 1 downto 1 do if P[i] <> S[Pos – lp + i] then begin Inc(Pos); Break; end else if i = 1 then begin Result := Pos – lp + 1; Exit; end; Result := 0; end; заранее спасибо..... ![]() |
![]() ![]() |
invoke |
![]()
Сообщение
#2
|
Группа: Пользователи Сообщений: 5 Пол: Мужской Реальное имя: Санек Репутация: ![]() ![]() ![]() |
/* Preprocessing */void CPraktukaDlg::PRE_KMP( char *x, int m, int kmp_next[] )
{ int i, j; i=0; j=kmp_next[0]=-1; while ( i < m ) { while ( j > -1 && x[ i ] != x[ j ] ) j=kmp_next[ j ]; i++; j++; if ( x[ i ] == x[ j ] ) kmp_next[i]=kmp_next[j]; else kmp_next[ i ] = j; }} void CPraktukaDlg::KMP( char *x, char *y, int n, int m ) { int i, ii,j, kmp_next[100]; char f[100]; /* Preprocessing */ PRE_KMP(x, m, kmp_next ); /* Searching */ i=j=0; while ( i < n ) { while ( j > -1 && x[ j ] != y[ i ] ) j = kmp_next[ j ]; i++; MessageBox("out"); j++; if ( j >= m ) { // OUTPUT( i - j); ii=i-j; MessageBox(itoa(ii,f,10) ); j = kmp_next[ j ]; } } } void CPraktukaDlg::OnButton1() { UpdateData(true); char *s1,*s2; s1=(char*)malloc(strlen(m_edit1)); s2=(char*)malloc(strlen(m_edit2)); for(int i=0;i<strlen(m_edit2);i++) { if(i<strlen(m_edit1)) s1[i]=m_edit1[i]; s2[i]=m_edit2[i]; } if((strlen(m_edit2)>=strlen(m_edit1)) &&(strlen(m_edit1)!=0)&&(strlen(m_edit1)!=0)) KMP(s2,s1,strlen(m_edit2),strlen(m_edit1)); вот то что получилось но что то не работает может кто увидет ошибку напишите плз и еще я так и не понял в чем смысл OUTPUT( i - j); она же всегда выводит 0 что..... |
![]() ![]() |
![]() |
Текстовая версия | 13.08.2025 20:24 |