На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
  
> Помогите найти ошибку в программе!, Удалять каждое второе вхождение подстроки в строке без стандартных функций Паскаля - Pascal ABC
    Лабораторная. Нельзя использовать "... стандартные функции для работы со строками (за исключением фукнции определения длины строки).".
    Нашел функцию по алгоритму Бойера-Мура, но программа работает так, что удаляет все вхождения, а мне нужно каждое второе. Почему не срабатывает?
    ExpandedWrap disabled
      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.
      Включи логику - что делается внутри цикла repeat? Почему поиск каждый раз идет с первой позиции строки?
        Да, вы правы. Вместо 1 нужно n. Работает. Спасибо большое!!!!
        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script Execution time: 0,0669 ]   [ 14 queries used ]   [ Generated: 16.10.19, 10:27 GMT ]