Глава 44. Задание Г.

Книга адресована школьникам средних и старших классов, желающим испытать себя в «олимпийских схватках». Может быть полезна студентам-первокурсникам и преподавателям информатики.

Модераторы: Oleg_D, Модераторы

Глава 44. Задание Г.

Сообщение Fors » 03.07.2016 18:05:30

Прошу выложить ответ к данному заданию. У меня получилось написать только процедуры MyCopy и частично MyDelete. Хотелось бы понять ход исполнение процедур и функций: Pos, Copy, Insept, Delete. Спасибо.

Само задание.
Г) Напишите собственные процедуры и функции обработки строк,
повторяющие те, что встроены в Паскаль. Дайте им названия, похожие на
стандартные, например: MyCopy, MyDelete и так далее.
Последний раз редактировалось Fors 04.07.2016 11:46:02, всего редактировалось 1 раз.
Fors
незнакомец
 
Сообщения: 4
Зарегистрирован: 02.07.2016 17:09:09

Re: Глава 44. Задание Г.

Сообщение Oleg_D » 04.07.2016 00:09:25

Процедуры несложные, надеюсь, что кто-нибудь из форумчан выложит свои варианты решений. Я повременю.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Глава 44. Задание Г.

Сообщение azsx » 04.07.2016 02:43:45

что это за задания?
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Глава 44. Задание Г.

Сообщение Oleg_D » 06.07.2016 20:51:31

Вот для начала функция Pos. Навскидку.

Код: Выделить всё
{
  Функция-аналог Pos
}

function MyPos(SubS: string; S: string): Integer;
var i, j, r, L1, L2 : integer;
begin
  r:= 0; { Предполагаемый результат заносим в r }
  L1:= Length(SubS); { длина искомой строки }
  L2:= Length(S);    { длина строки, в которой ищем }
  { i перебирает символы строки, где ищем }
  for i:= 1 to 1+L2-L1 do begin
    r:= i; { Предполагаемый результат заносим в r }
    { j перебирает символы искомой строки }
    for j:=1 to L1 do begin
      if Subs[j] <> S[i+j-1] then begin
        { если символы  не совпали, то сброс попытки }
        r:= 0; 
        Break;
      end
    end;
    { Если найдено совпадение, то прекратить перебор строки }
    if r<>0 then Break;
  end;
  MyPos:=r;
end;

{
  Main
}
begin
  Writeln(Pos('123','01234'));
  Writeln(MyPos('123','01234'));
  Writeln(MyPos('321','01234'));
  Writeln(MyPos('01234','01234'));
  Writeln(MyPos('012345','01234'));
  Readln;
end.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Глава 44. Задание Г.

Сообщение Fors » 07.07.2016 21:54:11

Спасибо. У меня проблем с написание кода пока что не возникало. Вся проблема сводится к одному. Неспособности правильно представить ту или иную задачу в виде блок-схемы.
Fors
незнакомец
 
Сообщения: 4
Зарегистрирован: 02.07.2016 17:09:09

Re: Глава 44. Задание Г.

Сообщение Oleg_D » 07.07.2016 23:20:04

Fors писал(а):Вся проблема сводится к одному. Неспособности правильно представить ту или иную задачу в виде блок-схемы.

Вероятно, не всегда удобно представлять решение одной блок-схемой. Отдельные фрагменты решения на укрупнённой блок-схеме можно изобразить неким прямоугольником, а затем раскрыть его уже детально другой блок-схемой. Принцип матрёшки. В общем, с опытом придёт.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Глава 44. Задание Г.

Сообщение arriah » 11.07.2016 04:41:41

А у меня такой вариант :)

Код: Выделить всё
Function TForm1.MyPos (substr,str:String):integer;
var
  tmp:string;
  i,j,k:integer;
begin
   j:=length(substr);
   tmp:='';
   k:=0;
   while (substr<>tmp) and (k<=(length(str)-j+1)) do begin
     tmp:='';
     inc(k);
     for i:=k to j+k-1 do begin
       tmp:=tmp+str[i];
     end;
   end;
   if k>(length(str)-j+1) then result:=0 else result:=k;
end;


Почему-то не люблю прерывать циклы принудительно, как по мне - цикл должен завершиться сам по себе :)
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: Глава 44. Задание Г.

Сообщение bormant » 15.07.2016 00:31:57

Код: Выделить всё
function MyPos(const ss, s: String): Integer;
var i, j, k, n: Integer;
begin
  MyPos:=0; n:=Length(ss);
  for i:=1 to Length(s)-n+1 do begin
    j:=i; k:=1;
    while (k<=n) and (s[j]=ss[k]) do begin
      Inc(j); Inc(k);
    end;
    if k>n then begin
      MyPos:=i; Exit;
    end;
  end;
end;

Код: Выделить всё
function MyPos(const ss, s: String): Integer;
var i, j, k, n: Integer;
begin
  MyPos:=0; n:=Length(ss);
  for i:=1 to Length(s)-n+1 do begin
    j:=i+n-1; k:=n;
    while (k>0) and (s[j]=ss[k]) do begin
      Dec(j); Dec(k);
    end;
    if k=0 then begin
      MyPos:=i; Exit;
    end;
  end;
end;

Код: Выделить всё
function MyPos(const ss, s: String): Integer;
var i: Integer; p, q, e: PChar;
begin
  MyPos:=0; e:=@ss[Length(ss)];
  for i:=1 to Length(s)-Length(ss)+1 do begin
    p:=@s[i]; q:=@ss[1];
    while (q<=e) and (p^=q^) do begin
      Inc(p); Inc(q);
    end;
    if q>e then begin
      MyPos:=i; Exit;
    end;
  end;
end;

Код: Выделить всё
function MyPos(const ss, s: String): Integer;
var i: Integer; p, q, e, f: PChar;
begin
  MyPos:=0; e:=@ss[Length(ss)]; f:=@s[1];
  for i:=1 to Length(s)-Length(ss)+1 do begin
    p:=f; Inc(f); q:=@ss[1];
    while (q<=e) and (p^=q^) do begin
      Inc(p); Inc(q);
    end;
    if q>e then begin
      MyPos:=i; Exit;
    end;
  end;
end;
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01


Вернуться в Книга "Песни о Паскале"

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru