Marasp93 napisał(a)
Witam tworzę pętlę, mającą na celu sprawdzenie, ile znaków występuje ponad raz.
Moja propozycja:
function MultiCharsCountAsInteger(AInput: array of AnsiChar): Integer;
const
COUNTED_CHAR_VALUE = AnsiChar(#0);
var
intCharToken, intCounterToken, intCharCount: Integer;
begin
Result := 0;
for intCharToken := Low(AInput) to High(AInput) do
if AInput[intCharToken] <> COUNTED_CHAR_VALUE then
begin
intCharCount := 1;
for intCounterToken := intCharToken + 1 to High(AInput) do
if AInput[intCharToken] = AInput[intCounterToken] then
begin
Inc(intCharCount);
AInput[intCounterToken] := COUNTED_CHAR_VALUE;
end;
if intCharCount > 1 then
Inc(Result);
end;
end;
Przyjmuje tzw. "open array", więc można podać cokolwiek - tablicę, łańcuch, literał itd.; Nie wymaga tworzenia macierzy po to, aby przechowywać znaki i/lub ilości ich wystąpień; No i działa bardzo podobnie do sortowania bąbelkowego;
Jeżeli interesuje Cię zwrócenie łańcucha, który zawierać będzie znaki, które wystąpiły co najmniej dwa razy w łańcuchu wejściowym, to funkcja będzie wyglądać tak:
function MultiCharsCountAsString(AInput: array of AnsiChar): AnsiString;
const
COUNTED_CHAR_VALUE = AnsiChar(#0);
var
intCharToken, intCounterToken, intCharCount: Integer;
begin
Result := '';
for intCharToken := Low(AInput) to High(AInput) do
if AInput[intCharToken] <> COUNTED_CHAR_VALUE then
begin
intCharCount := 1;
for intCounterToken := intCharToken + 1 to High(AInput) do
if AInput[intCharToken] = AInput[intCounterToken] then
begin
Inc(intCharCount);
AInput[intCounterToken] := COUNTED_CHAR_VALUE;
end;
if intCharCount > 1 then
Result += AInput[intCharToken];
end;
end;
Test działania obu funkcji tutaj: http://ideone.com/NT8jB9
W przypadku użycia tej drugiej funkcji, oprócz ilości znaków występujących wielokrotnie w dowolnych miejscach (nie tylko obok siebie i w jednym miejscu), masz także do dyspozycji wartości tych znaków, zwracane w rezultacie funkcji;
PS: Żeby zobaczyć jak funkcja działa i jak zmienia się zawartość macierzy wejściowej w iteracjach, w których warunek zostaje spełniony, wystarczy po spełnieniu warunku wyświetlić zawartość macierzy i łańcucha rezultatu;
Przykład: http://ideone.com/lSCXUV