2008年9月23日 星期二

找出某範圍內的第二高(低)點

其實 這篇文章是很久以前就寫了 不過沒寫完

之前在雅測看到有人發問 "如何寫岀10根K棒中第二低點數"

恩 雖然說 我不知道 第二高低點要幹什麼

不過要找到他 還蠻簡單的

假設 過去10筆資料的最高價是 8 5 9 3 1 4 5 4 6 2

我們先用 Highest 這函數去找 最高點

所以最高點 是 Highest( high , 10 ) 結果是 9

用一個變數 存起來 Value1 = Highest( high , 10 )

所以 Value1 = 9

現在要找 第二高點 也就是8 這就要 一個一個往回比較了

先宣告一個變數 Value2 這個變數(預設0) 放第二高點

只要 某筆資料 小於 Value1 且 大於 Value2 那他就是第二高點

以上面的假設舉例 value1 = 9,value2 = 0

2 小於 9 -> 2 大於 0(value2預設) -> value2 = 2

6 小於 9 -> 6 大於 2 -> value2 = 6

4 小於 9 -> 4 小於 6 -> value2 = 6 (不變)

5 小於 9 -> 5 小於 6 -> value2 = 6 (不變)

4 小於 9 -> 4 小於 6 -> value2 = 6 (不變)

1 小於 9 -> 1 小於 6 -> value2 = 6 (不變)

3 小於 9 -> 3 小於 6 -> value2 = 6 (不變)

9 不小於 9 -> 跳出

5 小於 9 -> 5 小於 6 -> value2 = 6 (不變)

8 小於 9 -> 8 大於 6 -> value2 = 8

以上 若是有100筆 就要比100次

比較順序是往前比的 也就是先比 High[1] 然後是 High[2] ....

有感覺出來規則嗎?? 程式是這樣寫的

建立一個函數


input : length(NumericSeries);

vars : High1st(0),High2nd(0); { 宣告存放最高和第二高值的變數 }

vars : count(0); { 計數器 }



High1st = highest(high[1],length); { High1st就放高點 }

High2nd = 0; { High2nd歸0 }



for count=1 to length begin { 計數器從1開始到length的時候執行.. }

if high[count] < High1st then begin { 如果High[count] < 最高點時 }

if high[count] > High2nd then begin { 如果High[count] > 次高點時 }

High2nd = high[count]; { High[count] = 次高點 }

end;

end;

end;




就這樣 ~

最後函數回傳的值 就是Length範圍內的 次高點了

沒有在TS測試過 不保證沒問題

有問題在問吧
HEMiDEMi Technorati Del.icio.us MyShare?犖?貊惜 Yahoo