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

如何簡化雙重判斷

答題得分者是:P.D.
K1086
初階會員


發表:61
回覆:142
積分:40
註冊:2007-04-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2016-09-09 22:09:34 IP:36.234.xxx.xxx 訂閱

[code delphi]
Rush:string;
RuNO:Integer;
Rush:=COPY((QUERY2.FIELDBYNAME('沖肖').ASSTRING),0,4);
if Rush = '鼠' Then begin RuNO:= 9; end;
if Rush = '牛' Then begin RuNO:= 8; end;
if Rush = '虎' Then begin RuNO:= 7 end;
if Rush = '兔' Then begin RuNO:= 6; end;
if Rush = '龍' Then begin RuNO:= 5; end;
if Rush = '蛇' Then begin RuNO:= 4; end;
if Rush = '馬' Then begin RuNO:= 3; end;
if Rush = '羊' Then begin RuNO:= 2; end;
if Rush = '猴' Then begin RuNO:= 1; end;
if Rush = '酉' Then begin RuNO:= 12; end;
if Rush = '狗' Then begin RuNO:= 11; end;
if Rush = '豬' Then begin RuNO:= 10; end;
------------------------------------------------------------------>>>>以下是想簡化片段程式
const
cCompoundWordsKnam:String='鼠牛虎兔龍蛇馬羊猴雞狗豬';
if Pos(PChar(Rush),PChar(cCompoundWordsKnam))>0 then
ShowMessage('沖肖吻合');
end;
[/code]
請教各位前輩,小弟想把這種判斷方式簡化,是有運用上列,中間有吻合的沖肖要給值,就不瞭解如何加在程式內達成,請各位大大們指導!謝謝!!
P.D.
版主


發表:571
回覆:3884
積分:3672
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2016-09-10 01:24:37 IP:118.160.xxx.xxx 未訂閱
1. 使用 pos 是可以的
2. 你的 if 中定義 runno, 但在你想簡化的過程中, 完全沒有 runno 的出現, 不知這個 runno你是要做什麼用?
3. 你的生肖與 runno 沒有一個順序的排列, 這其中不知道是如何規劃的?
4. 你的 copy(..., 0, 4), 但你的if rush卻又是2chars, 不懂, 後兩個 char 是什麼?
5. 最重要的是, 你想要簡化的結果是什麼? 是判斷, 還是要指定 runno 值?
===================引 用 K1086 文 章===================

[code delphi]
Rush:string;
RuNO:Integer;
Rush:=COPY((QUERY2.FIELDBYNAME('沖肖').ASSTRING),0,4);
if Rush = '鼠' Then begin RuNO:= 9; end;
if Rush = '牛' Then begin RuNO:= 8; end;
if Rush = '虎' Then begin RuNO:= 7 end;
if Rush = '兔' Then begin RuNO:= 6; end;
if Rush = '龍' Then begin RuNO:= 5; end;
if Rush = '蛇' Then begin RuNO:= 4; end;
if Rush = '馬' Then begin RuNO:= 3; end;
if Rush = '羊' Then begin RuNO:= 2; end;
if Rush = '猴' Then begin RuNO:= 1; end;
if Rush = '酉' Then begin RuNO:= 12; end;
if Rush = '狗' Then begin RuNO:= 11; end;
if Rush = '豬' Then begin RuNO:= 10; end;
------------------------------------------------------------------>>>>以下是想簡化片段程式
const
cCompoundWordsKnam:String='鼠牛虎兔龍蛇馬羊猴雞狗豬';
if Pos(PChar(Rush),PChar(cCompoundWordsKnam))>0 then
ShowMessage('沖肖吻合');
end;
[/code]
請教各位前輩,小弟想把這種判斷方式簡化,是有運用上列,中間有吻合的沖肖要給值,就不瞭解如何加在程式內達成,請各位大大們指導!謝謝!!
GrandRURU
站務副站長


發表:234
回覆:1654
積分:1752
註冊:2005-06-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2016-09-10 20:19:41 IP:211.23.xxx.xxx 未訂閱
可活用 Generics Collections TDictionary
K1086
初階會員


發表:61
回覆:142
積分:40
註冊:2007-04-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2016-09-10 20:20:11 IP:1.165.xxx.xxx 訂閱

===================引 用 P.D. 文 章===================
1. 使用 pos 是可以的
2. 你的 if 中定義 runno, 但在你想簡化的過程中, 完全沒有 runno 的出現, 不知這個 runno你是要做什麼用?
3. 你的生肖與 runno 沒有一個順序的排列, 這其中不知道是如何規劃的?
4. 你的 copy(..., 0, 4), 但你的if rush卻又是2chars, 不懂, 後兩個 char 是什麼?
5. 最重要的是, 你想要簡化的結果是什麼? 是判斷, 還是要指定 runno 值?
===================引 用 K1086 文 章===================

[code delphi]
Rush:string;
RuNO:Integer;
Rush:=COPY((QUERY2.FIELDBYNAME('沖肖').ASSTRING),0,4);
if Rush = '鼠' Then begin RuNO:= 9; end;
if Rush = '牛' Then begin RuNO:= 8; end;
if Rush = '虎' Then begin RuNO:= 7 end;
if Rush = '兔' Then begin RuNO:= 6; end;
if Rush = '龍' Then begin RuNO:= 5; end;
if Rush = '蛇' Then begin RuNO:= 4; end;
if Rush = '馬' Then begin RuNO:= 3; end;
if Rush = '羊' Then begin RuNO:= 2; end;
if Rush = '猴' Then begin RuNO:= 1; end;
if Rush = '酉' Then begin RuNO:= 12; end;
if Rush = '狗' Then begin RuNO:= 11; end;
if Rush = '豬' Then begin RuNO:= 10; end;
------------------------------------------------------------------>>>>以下是想簡化片段程式
const
cCompoundWordsKnam:String='鼠牛虎兔龍蛇馬羊猴雞狗豬';
if Pos(PChar(Rush),PChar(cCompoundWordsKnam))>0 then
ShowMessage('沖肖吻合');
end;
[/code]
請教各位前輩,小弟想把這種判斷方式簡化,是有運用上列,中間有吻合的沖肖要給值,就不瞭解如何加在程式內達成,請各位大大們指導!謝謝!!

>>>>謝謝 PD版主的提示, copy(..., 0, 4) 確實是 copy(..., 0, 2) 才對打錯了, 關於 runno 確實是要對應 cCompoundWordsKnam:String='鼠牛虎兔龍蛇馬羊猴雞狗豬' 的值,例如,抓到的沖肖是 鼠 runno 的值是給9 抓到的沖肖是 牛 runno 的值是給8 以此類推 ,每次抓會因輸入日期而改變沖肖,抓到什麼沖肖就給runno什麼值,值的排列順序是這樣→ '987654321121110' 希望各位大大前輩指導,謝謝!!
P.D.
版主


發表:571
回覆:3884
積分:3672
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2016-09-12 01:21:50 IP:118.160.xxx.xxx 未訂閱
簡化程式不代表程式優化, 只是把程式碼少寫一些, 也不代表只有一種寫法, 我提供一種

定義一個常式 在 interface 下
const runary : array[0..11] of integer = (9,8,7,6,5,4,3,2,1,12,11,10)
const cCompoundWordsKnam:String='鼠牛虎兔龍蛇馬羊猴雞狗豬';

implementation
...

RuNO:Integer;
rushno: integer;
Rush:=COPY((QUERY2.FIELDBYNAME('沖肖').ASSTRING),0,2);
rushno:= Pos(Rush,cCompoundWordsKnam); // 傳回 rush 在 cCompoundWordsKnam的位置
// rushno = 0 代表找不到
// 注意, 如果是xe系列, 已改成 = -1 找不到, 找到的話起始值是0
// dephi 系列, 找不到是0, 找到是由 1 開始
// 所以有找到的話, 回傳值一定是 1,3,5,7,9,11...(2bytes)
// 1 代表陣列0, 3代表陣列1
if rushno > 0 then
begin
runno := (rushno - 1) - ((rushno -1) div 2);
runno := runary[runno];
ShowMessage('沖肖吻合');
end;

ps. 以上程式沒有在實體上運作過, 所以不保證可運行成功
編輯記錄
P.D. 重新編輯於 2016-09-12 01:31:06, 註解 無‧
GrandRURU
站務副站長


發表:234
回覆:1654
積分:1752
註冊:2005-06-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2016-09-13 08:18:10 IP:211.79.xxx.xxx 未訂閱
if (TDictionary.TryGetValue('猴', RuNO) = True) then
begin
ShowMessage('找到' RuNO.ToString);
end;

不知是否為您想要的寫法?
編輯記錄
GrandRURU 重新編輯於 2016-09-13 08:50:42, 註解 無‧
K1086
初階會員


發表:61
回覆:142
積分:40
註冊:2007-04-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2016-09-13 10:26:45 IP:1.165.xxx.xxx 訂閱

===================引 用 P.D. 文 章===================
簡化程式不代表程式優化, 只是把程式碼少寫一些, 也不代表只有一種寫法, 我提供一種

定義一個常式 在 interface 下
const runary : array[0..11] of integer = (9,8,7,6,5,4,3,2,1,12,11,10)
const cCompoundWordsKnam:String='鼠牛虎兔龍蛇馬羊猴雞狗豬';

implementation
...

RuNO:Integer;
rushno: integer;
Rush:=COPY((QUERY2.FIELDBYNAME('沖肖').ASSTRING),0,2);
rushno:= Pos(Rush,cCompoundWordsKnam); // 傳回 rush 在 cCompoundWordsKnam的位置
// rushno = 0 代表找不到
// 注意, 如果是xe系列, 已改成 = -1 找不到, 找到的話起始值是0
// dephi 系列, 找不到是0, 找到是由 1 開始
// 所以有找到的話, 回傳值一定是 1,3,5,7,9,11...(2bytes)
// 1 代表陣列0, 3代表陣列1
if rushno > 0 then
begin
runno := (rushno - 1) - ((rushno -1) div 2);
runno := runary[runno];
ShowMessage('沖肖吻合');
end;

ps. 以上程式沒有在實體上運作過, 所以不保證可運行成功

===========>>>感謝PD版主的熱心指導,小弟有實際套入程式運作,是OK的 只是剛剛在 RUN 時,runo := runary[runo];
runo := runary[runo]; 就完全正確了,感謝
PD版主,同時也感謝本版所有熱心指導的前輩們,小弟就把得分者給PD版主了。
系統時間:2017-11-22 20:38:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!