掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ランダムの要素の中から値が大きいものを探し出す (ID:37872)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
ほれ、 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; TBuffer = array of array of Integer; ERangeError = class(Exception) public ErrorCode: Integer; end; var Form1: TForm1; implementation {$R *.dfm} resourcestring SOutOfRangeBuffer = 'Indexが配列の範囲を超えています'; SDataNothing = 'その順位のデータは存在しません'; function Get(Buffer: TBuffer;Index1,Index2: WORD): Integer; var I,J,K,K2: Integer; E: ERangeError; Save1,Save2: Integer; begin //範囲チェック if (Index1 < (High(Buffer)-Low(Buffer))+2 ) and (Index1 > 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,0] < Buffer[J,0] then //小さい順 begin K := Buffer[I,0]; K2 := Buffer[I,1]; Buffer[I,0] := Buffer[J,0]; Buffer[I,1] := Buffer[J,1]; Buffer[J,0] := K; Buffer[J,1] := K2; end; end; end; //取り出す I := Low(Buffer); J := 1; while (Index1 <> 0) and (I <= High(Buffer) ) do begin if Buffer[I,0] <> Save1 then begin Save1 := Buffer[I,0]; Dec(Index1); Inc(J); end; Inc(I); end; //ソート(データ量が多ければ QuickSort にでも変更) for I:= Low(Buffer) to High(Buffer) do begin for J:= Low(Buffer) to High(Buffer) do begin if Buffer[I,0] > Buffer[J,0] then //大きい順 begin K := Buffer[I,0]; K2 := Buffer[I,1]; Buffer[I,0] := Buffer[J,0]; Buffer[I,1] := Buffer[J,1]; Buffer[J,0] := K; Buffer[J,1] := K2; end; end; end; //取り出す I := Low(Buffer); J := 1; while (Index2 <> 0) and (I <= High(Buffer) ) do begin if Buffer[I,1] <> Save2 then begin Save2 := Buffer[I,1]; Dec(Index2); Inc(J); end; Inc(I); end; Result := Save1 * Save2; //該当するデータが存在しない if (Index1 <> 0) or (Index2 <> 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 TForm1.Button1Click(Sender: TObject); var Buffer: TBuffer; I: Integer; begin SetLength(Buffer,4); for I:=0 to 4 do begin SetLength(Buffer[I],3); end; Buffer[0,0] := 3; Buffer[0,1] := 2; Buffer[1,0] := 4; Buffer[1,1] := 14; Buffer[2,0] := 5; Buffer[2,1] := 17; Buffer[3,0] := 6; Buffer[3,1] := 5; Caption := IntToStr(Get(Buffer,4,4)); end; end.
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.