寫一函數,能夠找出傳入陣列中的中間值 |
尚未結案
|
hows88
一般會員 發表:1 回覆:1 積分:0 註冊:2007-01-11 發送簡訊給我 |
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
建議您最好自己先嘗試寫, 貼出程式碼, 說您卡在什麼地方, 錯誤訊息 , 再研究討論
procedure TForm1.FormCreate(Sender: TObject); var a : array[1..5] of Integer; i, j, tmp : Integer; begin a[1]:=6; a[2]:=16; a[3]:=56; a[4]:=66; a[5]:=36; // 先將數值由小到大排序 (氣泡排序法) for i:=1 to 5 do for j:=i 1 to 5 do if a[i]>a[j] then begin tmp := a[i]; a[i]:= a[j]; a[j]:=tmp; end; // 印出排在中間的 Memo1.Clear; Memo1.Lines.Add(IntToStr(a[3])); end;
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
hows88
一般會員 發表:1 回覆:1 積分:0 註冊:2007-01-11 發送簡訊給我 |
上面的例子 是要先輸入陣列的值,如果要跑random,再根據跑出來的值,找其中位數,是不是要改其他寫法。
我自己有ㄧ個寫法,但是無法執行,希望哪位大大可以幫我除錯,或是有其他的寫法可以參考,謝謝!! begin var i, j, n, tmp, median : Integer; begin for i := 0 to (n-1) do begin for j := 0 to (n-1-i) do begin if a[j 1] < a[j] then begin tmp := a[j]; a[j] := a[j 1]; a[j 1] = tmp; end; end; end; end; if (n%2) then median := a[n/2]; else median := (a[n/2] a[(n/2) 1])/2; result := median; end; |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
再給點提示
印出目前所有陣列值 0 , 1 , 43 , 10 , 13 ----------------------------- a[0],a[1],a[2],a[3],a[4] i=0, j=2 : 0 , 1 , 10 , 43 , 13 i=0, j=3 : 0 , 1 , 10 , 13 , 43 i=0, j=4 : 0 , 1 , 10 , 13 , 0 <== 第 j (4) 和 j 1 (5) 個交換, 但是第 j 1 個實際上不存在, 系統似乎將 a[5]=0, 結果 0 和 43 交換 i=1, j=3 : 0 , 1 , 10 , 0 , 13 i=2, j=2 : 0 , 1 , 0 , 10 , 13 i=3, j=1 : 0 , 0 , 1 , 10 , 13 ----------------------------- median : 1
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
procedure TfrmMain.Button1Click(Sender: TObject);
var List: TStringList; I: Integer; begin List := TStringList.Create; try for I := 0 to 1000 do List.Add(Format('.10d=%d',[Random(MaxInt),I])); List.Sorted := True; ShowMessage(List[List.Count div 2]); finally FreeAndNil(List); end; end; |
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
直接處理數值陣列
procedure TfrmMain.Button2Click(Sender: TObject); var I, T: Integer; A, B: array of Integer; procedure QuickSort(L, R: Integer); //修改自 TStringList.QuickSort() var I, J, P: Integer; begin repeat I := L; J := R; P := (L R) shr 1; repeat while A[B[I]] < A[B[P]] do Inc(I); while A[B[J]] > A[B[P]] do Dec(J); if I <= J then begin T := B[I]; B[I] := B[J]; B[J] := T; if P = I then P := J else if P = J then P := I; Inc(I); Dec(J); end; until I > J; if L < J then QuickSort(L, J); L := I; until I >= R; end; begin SetLength(A, 1000); SetLength(B, 1000);//Index Sorting Array try for I := 0 to Length(A)-1 do begin A[I] := Random(MaxInt); B[I] := I; end; QuickSort(0, Length(A)-1); I := Length(A) div 2; ShowMessage(Format('Index=%d, Value=%d',[B[I], A[B[I]]])); finally SetLength(A, 1000); SetLength(B, 1000);//Index Sorting Array end; end; 因為沒有叫用Randomize(),所以執行程式兩次,各按一次Button1, Button2 所得到的結果應當要相同. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |