Страница 1 из 1
Глава 44. Задание Г.
Добавлено: 03.07.2016 17:05:30
Fors
Прошу выложить ответ к данному заданию. У меня получилось написать только процедуры MyCopy и частично MyDelete. Хотелось бы понять ход исполнение процедур и функций: Pos, Copy, Insept, Delete. Спасибо.
Само задание.
Г) Напишите собственные процедуры и функции обработки строк,
повторяющие те, что встроены в Паскаль. Дайте им названия, похожие на
стандартные, например: MyCopy, MyDelete и так далее.
Re: Глава 44. Задание Г.
Добавлено: 03.07.2016 23:09:25
Oleg_D
Процедуры несложные, надеюсь, что кто-нибудь из форумчан выложит свои варианты решений. Я повременю.
Re: Глава 44. Задание Г.
Добавлено: 04.07.2016 01:43:45
azsx
что это за задания?
Re: Глава 44. Задание Г.
Добавлено: 06.07.2016 19:51:31
Oleg_D
Вот для начала функция 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.
Re: Глава 44. Задание Г.
Добавлено: 07.07.2016 20:54:11
Fors
Спасибо. У меня проблем с написание кода пока что не возникало. Вся проблема сводится к одному. Неспособности правильно представить ту или иную задачу в виде блок-схемы.
Re: Глава 44. Задание Г.
Добавлено: 07.07.2016 22:20:04
Oleg_D
Fors писал(а):Вся проблема сводится к одному. Неспособности правильно представить ту или иную задачу в виде блок-схемы.
Вероятно, не всегда удобно представлять решение
одной блок-схемой. Отдельные фрагменты решения на укрупнённой блок-схеме можно изобразить неким прямоугольником, а затем раскрыть его уже детально другой блок-схемой. Принцип матрёшки. В общем, с опытом придёт.
Re: Глава 44. Задание Г.
Добавлено: 11.07.2016 03:41:41
arriah
А у меня такой вариант

Код: Выделить всё
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;
Почему-то не люблю прерывать циклы принудительно, как по мне - цикл должен завершиться сам по себе

Re: Глава 44. Задание Г.
Добавлено: 14.07.2016 23:31:57
bormant
Код: Выделить всё
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;