Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.143.4.181] |
|
Сообщ.
#1
,
|
|
|
Лабораторная. Нельзя использовать "... стандартные функции для работы со строками (за исключением фукнции определения длины строки).".
Нашел функцию по алгоритму Бойера-Мура, но программа работает так, что удаляет все вхождения, а мне нужно каждое второе. Почему не срабатывает? Program lab2; uses crt; function BMSearch(StartPos: Integer; const S, P: String): Integer; type TBMTable = array[0..255] of Integer; var Pos, lp, i, kol: Integer; BMT: TBMTable; 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; lp := Length(P); Pos := StartPos + lp -1; while Pos <= Length(S) do if P[lp] <> S[Pos] then Pos := Pos + BMT[Byte(S[Pos])] else if lp = 1 then begin Result := Pos; Exit; end 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; Procedure Vvod(var s1,s2:string); begin Writeln('Введите исходную строку: '); readln(s1); writeln('Введите подстроку: '); readln(s2); end; Procedure Vivod(s1,s2:string); begin writeln('Результат: ',s1); end; function Del(s1, s2: String):string; var i, n: integer; begin i := 0; n := 1; repeat n := BMSearch(1, s1, s2); if n > 0 then begin inc(i); if i mod 2 = 0 then delete(s1, n, length(s2)) else inc(n); end; until n = 0; Del := s1; end; var s1, s2: string; begin Vvod(s1,s2); s1 := Del(s1, s2); Vivod(s1,s2); readln; end. |
Сообщ.
#2
,
|
|
|
Включи логику - что делается внутри цикла repeat? Почему поиск каждый раз идет с первой позиции строки?
|
Сообщ.
#3
,
|
|
|
Да, вы правы. Вместо 1 нужно n. Работает. Спасибо большое!!!!
|