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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2015, 22:54   #1
hunter_321
 
Регистрация: 02.06.2015
Сообщений: 3
По умолчанию Реализовать удаление подстроки из строки (не используя функций для работы со строками) - Pascal

Нужно реализовать процедуру удаления подстроки из данной строки не используя стандартных функций работы над строками(delete, insert и т.д) вот наброски но пока что не работает
Код:
var
  s1: string; 
  s2: string; 
  s3: string;
  i, j, k: byte;
  flag: boolean;
 
begin
  k := 0;
  s3 := '';
  flag := false;
  i := 1;
  j := 1;
  while i >= length(s1) do
    while j >= length(s2) do 
      if s1[i] <> s2[j] then
      begin
        flag := true;
        while j >= length(s2) - 1 do j := j + 1;
      end
      else
      begin
        flag := false;
        while i >= length(s1) - 1 do i := i + 1;
        j := 1;
      end;
    if flag then
    begin
      inc(k);
      s3 := s3 + s1[i];
    end;
  write(s3)
end.
hunter_321 вне форума Ответить с цитированием
Старый 29.12.2015, 02:19   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Строка - это непрерывный массив в памяти. Поэтому юзай move() и не мучайся.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 29.12.2015, 09:41   #3
hunter_321
 
Регистрация: 02.06.2015
Сообщений: 3
По умолчанию

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

Цитата:
запрещено пользоваться любыми функциями со строками
Ну так и я про то же.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 29.12.2015, 10:30   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Нужно реализовать процедуру удаления подстроки
Код:
var s,s2,r:string; i,j,k:integer;
...
s:='строка'; s2:='подстрока'; r:='';
i:=1; while i<=Length(s) do begin
 if s[i]<>s2[1] then begin r[j]:=s[i]; inc(j); end else begin
  k:=1; while (s[i+k]=s2[k]) and (k<=Length(s2)) do inc(k);
  if k=length(s2) then inc(i,k);
 end;
 inc(i);
end;
...
Выводим r
Вот так вот я представляю себе это дело...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.12.2015, 10:56   #6
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Stilet, в каком паскале работает структура
Код:
r:='';
r[j]=s[i]
?

мой вариант на многа букаф
Код:
Function MyDelete(txt,subtxt:string):String;
var s,s3:string;
    i,ls2,j : integer;
begin
  i:=1;s:='';s3:='';
  ls2:=length(subtxt);
  while i<=length(txt) do
  begin
   if txt[i] <> subtxt[1] then
    begin
     s:=s+txt[i];
     inc(i)
    end
   else
     begin
         s3 := '';
         for j:=1 to ls2 do
          begin
            if txt[i+j-1] <> subtxt[j] then  break;
            s3 := s3+txt[i+j-1];
          end;
         if subtxt <> s3 then s := s + s3;
         inc(i,length(s3))
     end;
 end;
 MyDelete:=s;
end;
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 29.12.2015, 11:18   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Тупанул. Хотел написать так:
Код:
r=r+s[i]
Видимо что-то отвлекло )))
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.12.2015, 13:08   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Да чо вы, в натуре ваще?



Код:
procedure DeleteEx(var S: string; const Index, Count: Integer);
var
  L: Integer;
begin
  L:= Length(S);
  if (L = 0) or (Count <= 0) or (Index > L)
    then Exit;
  Move(S[Index + Count], S[Index], SizeOf(Char) * (L - Index - Count + 1));
  S[L - Count + 1]:= #0;
end;
Ни одной строковой функции!
СЛАВА МНЕ!!!

Скачать демо-прогу с исходником.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

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

Ну а если быть совсем честным и выкинуть inline compiler magic "Length()"...
Код:
procedure DeleteEx(var S: string; const Index, Count: Integer);
var
  L: Integer;
  p: PChar;
begin
  p:= PChar(S);
  while p^ <> #0 do inc(p);
  L:= p - PChar(S);

  if (L = 0) or (Count <= 0) or (Index > L) or (Count > L + 1 - Index)
    then Exit;
  Move(S[Index + Count], S[Index], SizeOf(Char) * (L - Index - Count + 1));
  S[L - Count + 1]:= #0;
end;
Задача решена, ура, землекопа 1.5!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 29.12.2015, 17:13   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Дядь Миш, а ложечку дёгтя можно?


1) код из пост #9 не компилируется в Turbo Pascal, PascalABC, PascalABC.NET
2) код из пост #8 не компилируется в PascalABC, PascalABC.NET

3) обе процедуры работают неверно (проверял в TurboPascal, Delphi 2006):
Код:
program Project18;

{$APPTYPE CONSOLE}

uses
  SysUtils;


procedure DeleteEx(var S: string; const Index, Count: Integer);
var
  L: Integer;
  p: PChar;
begin
  p:= PChar(S);
  while p^ <> #0 do inc(p);
  L:= p - PChar(S);

  if (L = 0) or (Count <= 0) or (Index > L) or (Count > L + 1 - Index)
    then Exit;
  Move(S[Index + Count], S[Index], SizeOf(Char) * (L - Index - Count + 1));
  S[L - Count + 1]:= #0;
end;


(*
procedure DeleteEx(var S: string; const Index, Count: Integer);
var
  L: Integer;
begin
  L:= Length(S);
  if (L = 0) or (Count <= 0) or (Index > L)
    then Exit;
  Move(S[Index + Count], S[Index], SizeOf(Char) * (L - Index - Count + 1));
  S[L - Count + 1]:= #0;
end;
*)

var s: string;
begin
  s:='123456789';
  DeleteEx(s, 2, 5);
  WriteLn(s);
  ReadLn
end.
результат:
Код:
1789 6789
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление подстроки из строки. FULEREN Общие вопросы C/C++ 12 22.02.2015 23:40
задача с применением функций и процедур для работы со строками Евгений77777 Помощь студентам 2 06.03.2012 20:39
Замена стандартных процедур и функций для работы со строками Alexar Makken Паскаль, Turbo Pascal, PascalABC.NET 2 18.12.2010 21:59
Текст стандартных функций и процедур для работы со строками в Delphi Pixma Помощь студентам 3 17.11.2010 13:25
Проблеммы с использованием функций работы со строками Copy и Pos Soso Общие вопросы Delphi 13 09.08.2007 16:01