Avatar billede the_prodigy Nybegynder
14. november 2001 - 09:14 Der er 18 kommentarer og
1 løsning

En algoritme der fjerne gentagne mellemrum i en streng.

Ja... Det smænd\' sådan en jeg skal bruge.. jeg har selv lavet en der kan, men den kan kun tage dobbelte mellemrum... Øv øv... Nå, men jeg venter.. :)
Avatar billede borrisholt Novice
14. november 2001 - 09:37 #1
Prøv den her

Function Hest(Const s : String; RepeatChar : char = #32) : String;
var
  i,j : Integer;
begin
  result := s;
  j := 0;

  while j<Length(Result) do
  begin
    inc(j);
    if Result[j] <> RepeatChar then
      continue;

    if Result[j+1] <> RepeatChar then
      continue;

    i := j +1;

    while Result[i] = RepeatChar do
      inc(i);

    Delete(Result,j+1, i-j-1);
  end;
end;

Og kald den sådan her ...

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit2.Text := hest(Edit1.Text);
end;

Den her algoritme kan ikke kun fjerne Gentagende mellemrum men helt generelt gentagende Karekterer efter eget valg.

Jens B
Avatar billede hreiff Nybegynder
14. november 2001 - 10:01 #2
Værsgo:

Function DelSpace(s:string):string;
Var i: word;
Begin
  i := 1;
  While i <= length(s)-1 do
  Begin
    While (s[i]=\' \') and (length(s)>=i+1) and (s[i+1]=\' \') do
      delete(s,i+1,1);
    inc(i);
  end;
  Result := s;
end;

Kaldes:
  test := \'ab c  d  e    f\';
  edit1.text := delspace(test);

//hreiff
Avatar billede badass Nybegynder
15. november 2001 - 09:14 #3
Prøv dette:

// Fjerner alle forekomster af DelCh
Function DeleteChar(Const Str:String;DelCh:Char):String;
Var Idx:Integer;
begin
  Result:=\'\';
  for Idx:=1 to Length(Str) do
    if Str[Idx]<>DelCh then
      Result:=Result+Str[Idx];
end;

Kaldes:
  Test:=\' 12  3 4  5\';
  Test:=DeleteChar(Test);
  // Test er nu lig \'12345\'
Avatar billede morten_s Nybegynder
16. november 2001 - 10:16 #4
Den korte version:

function RemoveSpace(S:string) : string;
  begin
    while Pos(\' \', S) > 0 do
      delete(s,Pos(\' \', S),1);
    RemoveSpace:=S;
  end;
Avatar billede morten_s Nybegynder
16. november 2001 - 10:21 #5
Den korte version incl. test eksempel

Opret ny application med 1 Editfelt: Edit1
                        1 Button  : Button1 

indsæt nedenstående kode i onclick event for button
og du er kørende


function RemoveSpace(S:string) : string;
  begin
    while Pos(\' \', S) > 0 do
      delete(s,Pos(\' \', S),1);
    RemoveSpace:=S;
  end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := RemoveSpace(Edit1.Text)
end;
Avatar billede borrisholt Novice
16. november 2001 - 10:22 #6
mroten_S>> Var der ikke gentagende mellemrum han ville have fjernet og ikke alle mellem rum ?

JEns B
Avatar billede morten_s Nybegynder
16. november 2001 - 10:25 #7
Som jeg læser det har han lavet en som kun kan fjerne dbl mellemrum
og det er tilsyneladende Øv, øv. Derfor gætter jeg på at der også
skal fjernes enkelte mellemrum.

Avatar billede borrisholt Novice
16. november 2001 - 10:28 #8
tja .. Nu må vi se når vi en gang får manden på banen ...

Jens B
Avatar billede morten_s Nybegynder
16. november 2001 - 10:28 #9
Men uanset hvad, så er det så heldigt at den korte version kan
opgraderes til ver 1.1 (kan tage dbl mellemrum) ved at indsætte ekstra space
som vist neden under, det kræver kun et par tryk på mellemrumstast

function RemoveSpace(S:string) : string;
  begin
    while Pos(\'  \', S) > 0 do  // <-- 2*MELLEMRUM MELLEM \'  \'
      delete(s,Pos(\'  \', S),1); // <-- 2*MELLEMRUM MELLEM \'  \'
    RemoveSpace:=S;
  end;
Avatar billede morten_s Nybegynder
16. november 2001 - 10:31 #10
Eller den korte version som fjerner hvad som helst
incl. det kendte ord hest ;-))


function RemoveSpace(S, DelStr:String) : string;
  begin
    while Pos(DelStr, S) > 0 do
      delete(s,Pos(DelStr, S),length(DelStr));
    RemoveSpace:=S;
  end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := RemoveSpace(Edit1.Text, \'hest\')
end;
Avatar billede borrisholt Novice
16. november 2001 - 10:32 #11
jo jo ... JEg læste bare opgaven som han havde n mellemrum mellem hvert ord og der askulle kun være et.

Jens B
Avatar billede hreiff Nybegynder
16. november 2001 - 10:54 #12
Sådan har jeg også læst opgaven.
morten s\'s måde er simpel, men jeg kan ikke forstå at du kalder den rekursivt: While sætningen ændrer alle forekomster af \'  \' (dobbelt) til \' \' (enkelt), og den gentager sig selv indtil der kun er enkelt \' \' tilbage.
Jeg synes faktisk at den er ret smart!
//hreiff
Avatar billede morten_s Nybegynder
16. november 2001 - 11:00 #13
hreiff>> jeg kalder den ikke rekursivt

RemoveSpace:=S; sætter resultatet af function til S
Avatar billede hreiff Nybegynder
16. november 2001 - 11:11 #14
Nå nej, det er også rigtigt - jeg blev bare narret af Removespace = istedet for Result =
(Jeg synes stadig det er smart)
Avatar billede borrisholt Novice
16. november 2001 - 13:21 #15
Den store forskel på min algoritme og mortens er at jeg ikke fjerner et bestemt antal mellemrum hver gang. JEg finder ud af hvormange der er også fjerner dem.


Jens B
Avatar billede hreiff Nybegynder
16. november 2001 - 13:36 #16
Principielt burde borrisholts funktion være hurtigere, da strengen kun løbes igennem 1 gang, men man skal jo ikke kimse af standardfunktionerne da de som regel er kodet ret godt.
Avatar billede morten_s Nybegynder
16. november 2001 - 13:44 #17
og min sidste udvidelse fjerner alle forekomne
delstrenge i en streng, incl et mellemru, 2 mellemrum
diverse tekster som f.eks \'hest\' m.m.
Avatar billede borrisholt Novice
16. november 2001 - 13:52 #18
OKI. Min virker lidt anderledes

fx
Test:=\'12  3 4  5\';
Test:=Hest(Test);
  // Test er nu lig \'12 3 4 5\' 

Eller
Test:=\'12##3#4###5\';
Test:=Hest(Test);
// Test er nu lig \'12#3#4#5\' 

Jens B
Avatar billede the_prodigy Nybegynder
19. januar 2002 - 20:06 #19
Jeg havde simpelthen glemt ALT om dette emne.. Sorry! Borrisholdt får pointne, fordi det var hans svar der var først, og det virkede... Sorry igen til alle!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester