@Huffy - tak sobie patrzę na Twoją funkcję FindFirst
i skoro nazwa sugeruje, że wyszukiwane będzie pierwsze wystąpienie, to powinieneś mieć także funkcję FindNext
, która wyszuka kolejne wystąpienia; A skoro już mowa o takich funkcjach, to mogą one działać na podobnej zasadzie, jak RTLowskie funkcje FindFirst i FindNext, służace do wyszukiwania plików lub katalogów według zadanej ścieżki;
Skoro już się tak pozastanawiałem, to machnąłem na szybko przykładowy program, który realizuje takie funkcje:
type
TNumbersArr = array [0 .. 19] of Integer;
type
TNumberSearchRec = record
Number: Integer;
LastPos: Integer;
end;
procedure FillNumbersArray(var ANumbers: TNumbersArr; const ARange: Integer);
var
I: Integer;
begin
for I := Low(ANumbers) to High(ANumbers) do
ANumbers[I] := Random(ARange);
end;
procedure ShowNumbersArray(var ANumbers: TNumbersArr);
var
I: Integer;
begin
Write(#10'Numebrs: ');
for I := Low(ANumbers) to High(ANumbers) - 1 do
Write(ANumbers[I], ', ');
WriteLn(ANumbers[High(ANumbers)], #10);
end;
function FindFirstNumber(ANumber: Integer; var ANumbers: TNumbersArr; var ARec: TNumberSearchRec): Integer;
var
I: Integer;
begin
ARec.Number := ANumber;
for I := Low(ANumbers) to High(ANumbers) do
if ANumbers[I] = ANumber then
begin
Result := I;
ARec.LastPos := I;
Exit;
end;
Result := -1;
end;
function FindNextNumber(var ANumbers: TNumbersArr; var ARec: TNumberSearchRec): Integer;
var
I: Integer;
begin
for I := ARec.LastPos + 1 to High(ANumbers) do
if ANumbers[I] = ARec.Number then
begin
Result := I;
ARec.LastPos := I;
Exit;
end;
Result := -1;
end;
var
naRandom: TNumbersArr;
nsrRandom: TNumberSearchRec;
intToFind, intRange: Integer;
begin
Randomize();
Write('Type the number to find: ');
ReadLn(intToFind);
Write('Type the numbers range: ');
ReadLn(intRange);
FillNumbersArray(naRandom, intRange);
ShowNumbersArray(naRandom);
if FindFirstNumber(intToFind, naRandom, nsrRandom) = -1 then
Write('The number "', nsrRandom.Number, '" not found.')
else
begin
Write('The number "', nsrRandom.Number, '" found at positions: ', nsrRandom.LastPos);
while FindNextNumber(naRandom, nsrRandom) <> -1 do
Write(', ', nsrRandom.LastPos);
end;
ReadLn;
end.
Przykładowe wyjscie programu:
Type the number to find: 3
Type the numbers range: 5
Numebrs: 2, 1, 1, 3, 4, 3, 3, 0, 4, 3, 2, 2, 4, 4, 0, 2, 2, 4, 1, 4
The number "3" found at positions: 3, 5, 6, 9
Może Ci się przyda, a jak nie, to może ktoś inny skorzysta.