全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1527
推到 Plurk!
推到 Facebook!

寫一函數,能夠找出傳入陣列中的中間值

尚未結案
hows88
一般會員


發表:1
回覆:1
積分:0
註冊:2007-01-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-01-11 21:03:30 IP:163.18.xxx.xxx 訂閱
不好意思,我剛剛接觸這程式,我會寫陣列,但是要找出此陣列的中間值,我該如何做呢?
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-01-12 08:29:28 IP:61.219.xxx.xxx 未訂閱
建議您最好自己先嘗試寫, 貼出程式碼, 說您卡在什麼地方, 錯誤訊息 , 再研究討論
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-01-12 08:39:33 IP:218.164.xxx.xxx 訂閱
 上面的例子  是要先輸入陣列的值,如果要跑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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-01-12 09:28:51 IP:61.219.xxx.xxx 未訂閱
請問一下, 您有嘗試 Compile 過嗎 ? 有看過錯誤訊息寫什麼嗎 ?
陣列 a 連宣告都沒有
也沒看到您在用 random 設定 陣列值
不知道哪裡錯誤, 可以將數值印出來看
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-01-12 10:06:24 IP:61.219.xxx.xxx 未訂閱
再給點提示
印出目前所有陣列值
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-01-12 15:21:53 IP:210.66.xxx.xxx 訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-01-12 15:56:55 IP:210.66.xxx.xxx 訂閱
直接處理數值陣列
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
所得到的結果應當要相同.
系統時間:2024-05-13 14:14:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!