Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Funkcia Copy - Pascal

Dostali sme za ulohu napisat vlastnu funkciu, ktora ma fungovat ako funkcia copy v Pascale. Neviem si s tym rady, akosi nedostavam napad ako to vsetko dat dohromady. Stacia mi iba nejake zachytne body ako to spravit, hadam mi to dopne. :) Dakujem.

Předmět Autor Datum
Chceš to rychle nebo pomalu? Rychle: jestli tím "copy" myslíš kopírování souboru, tak to je už hotov…
JoDiK 24.05.2012 19:41
JoDiK
Skôr si myslím, že mal namysli funkciu Copy, ktorá extrahuje určitý text z reťazca, od zadanej pozíc…
pme 24.05.2012 19:44
pme
ospravedlnujem sa.. ide o funkciu, ktora pracuje so stringami...takto vyzera copy(retazec,od ktoreho…
ehm 24.05.2012 19:48
ehm
záchytné body: string=pole tzn. že lze pracovat i s jednotlivými znaky zvlášť, takže třeba ten tvůj…
JoDiK 24.05.2012 19:54
JoDiK
Stačí sa pozrieť na knižnicu System... Takto vyzerá funkcia _Copy originál v Unit-e System: var Len…
pme 24.05.2012 20:11
pme
Jeden cyklus FOR function MojeCopy(ret: string; odkud, kolik: integer): string; var i: Integer; beg…
Jan Fiala 24.05.2012 21:24
Jan Fiala
Krátké řetězce jsou i v delfách, např. var S:string[12] je v podstatě array[0..12] of char, kde nult…
JM 24.05.2012 22:00
JM
Mas pravdu s temi stringy, uz si vzpominam.
Jan Fiala 24.05.2012 22:06
Jan Fiala
Vymyslet se dá spoustu věcí, co třeba pointerová matematika? Neboli žádný cyklus, jen přiřazení odku…
JoDiK 25.05.2012 22:38
JoDiK
Ještě by šla použít direktiva ASM a napsat to v assembleru ;-)
Jan Fiala 25.05.2012 22:48
Jan Fiala
Tojo, to je ale už vyšší dívčí :-)
JoDiK 25.05.2012 22:50
JoDiK
ne vyssi, ale nizsi. A najefektivnejsi. Je to totiz na jeden riadok :D rep movsb samozrejme predtym… poslední
MM.. 25.05.2012 23:33
MM..

Chceš to rychle nebo pomalu?
Rychle: jestli tím "copy" myslíš kopírování souboru, tak to je už hotové v nápovědě a určitě aspoň milionkrát na nejrůznějších stránkách na internetu
Pomalu: Programování není těžký se naučit, jen se doporučuje začít od jednoduchých zadání a podle toho, jak to postupně budeš zvládat jít do složitějších...
PS: podal jsi velmi málo a navíc zmatených informací, to se v programování nenosí...

ospravedlnujem sa.. ide o funkciu, ktora pracuje so stringami...takto vyzera copy(retazec,od ktoreho znaku,kolko znakov), teda napr. copy(ret,1,2), vysledok je string, priradim ho takto napr: ret2:=copy(ret,1,2)

priklad.
readln(ret);
-- zadam vetu napr. auto

ret1:=copy(ret,1,2)

vznikne au

Stačí sa pozrieť na knižnicu System...
Takto vyzerá funkcia _Copy originál v Unit-e System:

var
  Len, I: Integer;
begin
  Len := Byte(S[0]);
  if Len = 0 then
    Byte(Result[0]) := 0
  else
  begin
    if Index <= 0 then Index := 1
    else if Index > Len then Count := 0;
    Len := Len - Index + 1;
    if Count < 0 then Count := 0
    else if Count > Len then Count := Len;
    Byte(Result[0]) := Count;
    for I := 1 to Count do
      Result[I] := S[Index + I - 1];
  end;
end;

Neviem si predstaviť ako vymyslieť svoju vlastnú funkciu inak...

Jeden cyklus FOR

function MojeCopy(ret: string; odkud, kolik: integer): string;
var
  i: Integer;
begin
  MojeCopy := '';
  if Len(ret) < odkud + kolik then
    kolik := Len(ret) - odkud;
  for i := odkud to odkud + kolik - 1 do
    MojeCopy := MojeCopy + ret[i-1];
end;

Uz si to presne nepamatuju, ale pokud jde o TurboPascal, tak tam je tusim indexovani retezce od nuly. To si pripadne oprav. Vysledek se neprirazoval do promenne Result, ale do nazvu funkce. Ale tim si nejsem jisty.

Krátké řetězce jsou i v delfách, např. var S:string[12] je v podstatě array[0..12] of char, kde nultý znak je délka. V TP se přiřazuje pouze do názvu funkce.

function MojeCopyTP(ret: string; odkud, kolik: integer): string;
var
  i: Integer;
  S: string;
begin
  S := '';
  if Length(ret) < odkud + kolik then
    kolik := Length(ret) - odkud;
  for i := odkud to odkud + kolik - 1 do
    S := S + ret[i];
  MojeCopyTP := S
end;

Vymyslet se dá spoustu věcí, co třeba pointerová matematika? Neboli žádný cyklus, jen přiřazení odkud se bude brát přímo ze zdroje?

function copy(s : string; odkud, delka : integer) : string;
var ls : byte absolute s;
    pvystup: ^string;
begin
  if odkud>ls then s:='';
  if delka>ls-odkud+1 then delka:=ls-odkud+1;
  pvystup:=ptr(seg(s),ofs(s)+odkud-1);
  pvystup^[0]:=chr(delka);
  copy:=pvystup^;
end;

ne vyssi, ale nizsi. A najefektivnejsi. Je to totiz na jeden riadok :D
rep movsb
samozrejme predtym treba nastavit ecx, esi, edi a selektory (ds, es)

P.S> slusne kniznice vyssich jazykov maju toto urobene pomocou rep movsd a len zvysne 0-3 bajty pomocou movsb, je to tak najefektivnejsie

Zpět do poradny Odpovědět na původní otázku Nahoru