Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2017, 11:00   #11
Max$$
Пользователь
 
Регистрация: 23.09.2017
Сообщений: 17
По умолчанию Удалять каждое второе вхождение подстроки в строку без использования стандартных функция Паскаля.

Лабораторная на PascalABC. Нельзя использовать "... стандартные функции для работы со строками (за исключением функции определения длины строки).".
Нашел функцию по алгоритму Бойера-Мура, но программа работает так, что удаляет все вхождения, а мне нужно каждое второе. Почему не срабатывает?

Код:
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.
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 16.10.2017 в 11:05.
Max$$ вне форума Ответить с цитированием
Старый 17.10.2017, 11:36   #12
Max$$
Пользователь
 
Регистрация: 23.09.2017
Сообщений: 17
По умолчанию

Я понял, исправлюсь. А по теме, я разобрался, вопрос снят.
Max$$ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Генератор псевдослучайных чисел без использования встроеных функций lordik333 C# (си шарп) 1 03.12.2012 20:18
Дана строки S и S1. Каждое вхождение S1 в строку S в качестве подстроки заменить на обращенную подстроку S1 ( на Pascal ) avizer Помощь студентам 11 20.03.2012 14:47
Вхождение подстроки в строку! Edimus Общие вопросы C/C++ 4 04.04.2011 07:50
Задача по массивам и сортировка строк без стандартных функций. AnnieFoxy Помощь студентам 3 19.01.2011 09:45
Как определить вхождение подстроки в строку поля? Bendebej SQL, базы данных 3 23.03.2010 12:38