Anagramy i jeszcze cos

0

Witam.
Słuchajcie mam problem, chciałbym zrobic program sprawdzajacy, czy dane słowo jest anagramem. W sumie niebyłoby z tym jakiegoś problemu, gdyby nie to, ze nie wiem jak sprawdzic długośc wyrazu.
Macie jakieś pomysły jak zrobic taki programik?

Drugi problemik to program, ktory sprawdza z ilu różnych znaków składa się dany wyraz. Tutaj miałem pomysł, żeby porównywac znaki w słowie, ale problemem jest znów jak sprawdzic dlugosc wyrazu, a także co zrobic jak po raz kolejny pojawi sie znak nie bedacy znakiem ktory porównujemy.
Macie jakieś pomysły?

Pozdrawiam Chronos :)

0

Oczywiscie, chodzi tu o Turbo Pascala.

sory za dwa posty pod rząd.

Pozdrawiam.

0

Długośc wyrazu sprawdzasz przez Length. A co do liter, to możesz sprawdzać, czy kolejna litera w słowie znajduje się w zbiorze, jeśli nie to ją dodajesz i zwiększasz zmienną z liczbą różnych liter.

0

juz tu raz cos takiego pisałem :) polegało to na tym żę oba wyrazy są pierwsze sortowane i dopiero wtedy porównywane. wiec poszukaj :>

{===========================}

function Sortuj(s:string):string;
var z:boolean;
    i:integer;
    t:char;
begin
  repeat
    z:=true;
    for i:=1 to Length(s)-1 do if Ord(s[i])<Ord(s[i+1]) then
    begin
      t:=s[i];
      s[i]:=s[i+1];
      s[i+1]:=t;
      z:=false;
    end;
  until z;
  result:=s;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Sortuj(Edit1.Text)=Sortuj(Edit2.Text) then Showmessage('ta') else Showmessage('niet');
end;

ku potomnym ;P

0

Poniżej masz funkcję sprawdzającą, czy łańcuch znaków pamiętany w zmiennej s1 jest anagramem łańcucha pamiętanego w zmiennej s2.
(inaczej mówiąc - czy łańcuch s1 da się utworzyć z liter łańcucha s2).
IgnoreCase decyduje o tym, czy wielkości znaków będą brane pod uwagę przy porównywaniu.

function CheckAnagram(s1, s2: string; IgnoreCase: Boolean): Boolean;
var
  i, xp: integer;
  c: Char;
begin
  Result := True;

  if Length(s1) <> Length(s2) then
  begin
    Result := False;
    Exit;
  end;

  if IgnoreCase then
  begin
    s1 := UpperCase(s1);
    s2 := UpperCase(s2);
  end;
  { lepsze byłoby AnsiUpperCase, ale
    w Pascalu chyba nie ma } 

  for i := 1 to Length(s1) do
  begin
    c := s1[i];

    xp := Pos(c, s2);
    if xp = 0 then
    begin
      Result := False;
      Break;
    end
    else
      Delete(s2, xp, 1);

  end; { for }
end;

Przykładowe wywołanie:

uses
  WinTypes, WinProcs, .... ;

begin
  if CheckAnagram('portal', 'patrol', True) then
    MessageBox(0, 'TRUE', '', MB_OK)
  else
    MessageBox(0, 'false', '', MB_OK);
end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1