題名の通り、配列のなかから一番大きな値、2番目に大きな値
など○番目という引数を渡してその値を取り出せるような関数ってありますか?
よろしくお願いします。
ありません。
自分で実装しなくてはなりません。
ほれ
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm4 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
end;
ERangeError = class(Exception)
public
ErrorCode: Integer;
end;
resourcestring
SOutOfRangeBuffer = 'Indexが配列の範囲を超えています';
SDataNothing = 'その順位のデータは存在しません';
var
Form4: TForm4;
implementation
{$R *.dfm}
function Get(Buffer: array of Integer;Index: WORD): Integer;
var
I,J,K: Integer;
E: ERangeError;
begin
//範囲チェック
if (Index < (High(Buffer)-Low(Buffer))+2 ) and (Index > 0) then
begin
//ソート(データ量が多ければ QuickSort にでも変更)
for I:= Low(Buffer) to High(Buffer) do
begin
for J:= Low(Buffer) to High(Buffer) do
begin
if Buffer[I] > Buffer[J] then //大きい順
begin
K := Buffer[I];
Buffer[I] := Buffer[J];
Buffer[J] := K;
end;
end;
end;
//取り出す
I := Low(Buffer);
J := 1;
while (Index <> 0) and (I <= High(Buffer) ) do
begin
if Buffer[I] <> Result then
begin
Result := Buffer[I];
Dec(Index);
Inc(J);
end;
Inc(I);
end;
//該当するデータが存在しない
if Index <> 0 then
begin
E := ERangeError.CreateRes(@SDataNothing);
E.ErrorCode := 2;
raise E;
end;
end
else
begin
//配列の範囲外が指定された
E := ERangeError.CreateRes(@SOutOfRangeBuffer);
E.ErrorCode := 1;
raise E;
end;
end;
procedure TForm4.Button1Click(Sender: TObject);
var
Buffer: array[10..17] of Integer;
I: Integer;
begin
Buffer[10] := 20; // 2
Buffer[11] := 10; // 4
Buffer[12] := 30; // 1
Buffer[13] := -15; // 6
Buffer[14] := 20; // 2
Buffer[15] := 15; // 3
Buffer[16] := 10; // 4
Buffer[17] := -10; // 5
(*
Buffer[10] := 1; // 2
Buffer[11] := 2; // 4
Buffer[12] := 3; // 1
Buffer[13] := 4; // 6
Buffer[14] := 5; // 2
Buffer[15] := 6; // 3
Buffer[16] := 7; // 4
Buffer[17] := 8; // 5
*)
for I:=0 to 10 do
begin
try
Memo1.Lines.Add (IntToStr(I)+' = '+IntToStr(Get(Buffer,I)));
except
end;
end;
end;
end.
ツイート | ![]() |