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

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

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

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

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

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

Добрый вечер!

Задание лабораторной написать программу, удаляющую второе вхождение подстроки в исходную строку, обе задаются с экрана, не используя стандартные функции для работы со строками (за исключением функции определения длины строки).

Читал про специальные алгоритмы поиска подстроки в строке (Бойера-Мура), но пример программы не нашел.

Может кто-нибудь решал подобную задачу? Поделитесь знанием, пожалуйста.
Max$$ вне форума Ответить с цитированием
Старый 12.10.2017, 23:09   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию



46.png
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 13.10.2017, 09:01   #3
Max$$
Пользователь
 
Регистрация: 23.09.2017
Сообщений: 17
По умолчанию

Нельзя использовать стандартные функции Паскаля, кроме Length! Используя Posex, я написал, все работает.
Max$$ вне форума Ответить с цитированием
Старый 13.10.2017, 09:06   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Предложили же не PosEx использовать, а код из нее. А там только Length

add
ну и PosEx ни капли не стандартная функция паскаля ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 13.10.2017 в 09:13.
Аватар вне форума Ответить с цитированием
Старый 13.10.2017, 09:30   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Сообщение от Max$$ Посмотреть сообщение
Нельзя использовать стандартные функции Паскаля, кроме Length! Используя Posex, я написал, все работает.
d2i1ob5p.jpg
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 14.10.2017, 19:42   #6
Max$$
Пользователь
 
Регистрация: 23.09.2017
Сообщений: 17
По умолчанию

Спасибо. Хотя там есть функция Pos (в 572 строке), а она уж точно стандартная.
Max$$ вне форума Ответить с цитированием
Старый 14.10.2017, 21:33   #7
Max$$
Пользователь
 
Регистрация: 23.09.2017
Сообщений: 17
По умолчанию

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

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.

Последний раз редактировалось Max$$; 14.10.2017 в 21:37.
Max$$ вне форума Ответить с цитированием
Старый 14.10.2017, 22:10   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию


54.png
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 15.10.2017, 10:50   #9
Max$$
Пользователь
 
Регистрация: 23.09.2017
Сообщений: 17
По умолчанию

Спасибо! Только таких типов данных PascalABC не понимает (.

PWideChar и UnicodeString ..... какими типами можно заменить? Какими ни пытался. ругается , что не может преобразовать string в char.
Max$$ вне форума Ответить с цитированием
Старый 15.10.2017, 19:30   #10
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

a Delete это не стандартная функция?

Вот Вам пример:
Код:
begin
  var s := ReadString('Введите строку: ');
  var ss := ReadString('Введите подстроку: ');
  
  s := ss + '#' + s;
  
  var ns := s.Length;
  var z := new integer[ns]; //z-функция
  var nss := ss.Length;
  
  for var i := 0 to ns - 1 do
    while (i + z[i] < ns) and (s[z[i] + 1] = s[i + z[i] + 1]) do z[i] += 1;
  
  z.Println; //вывод z-функции
  
  for var i := nss + 2 to ns do
    Writeln(s[i], z[i - 1] = nss ? ' - с этой позиция подстрока входит в строку' : '');
end.
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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