none
[VB2005]請問怎麼判斷程式會最簡化 RRS feed

  • 問題

  • 請問現在我有八各條件分別是 0,1,2,3,4,5,6,7後面分別代表一各開關

    我有一個新的值是16

    我怎麼判斷是16=7+6+3

    會開第7,6,3這三各開關?

    近來的值也有可能是1或是其他的值

    謝謝!!!


    • 已編輯 Ling1982 2012年6月7日 上午 09:04
    2012年6月7日 上午 09:01

解答

  • 邏輯上的原理是

    (1) 送入測試值 (在你的範例就是 16)

    (2) 判斷測試值是否大於基準集合(也就是 0~7) 的最大值

    (2-1) 如果是

    (2-1-1) 將基準集合最大值加入結果集合

    (2-1-2) 將測試值減去基準集合最大值

    (2-1-3) 將基準集合最大值移出基準集合

    (2-1-4) 將新的值送回到(1) (Tips: 如果是 16, 此時新的測試值就變成 (16-7)=9, 基準集合則是{0,1,2,3,4,5,6}, 結果集合則是 {7})

    (2-2) 如果不是

    (2-2-1) 將測試值加入結果集合

    (2-2-2) 程式結束

    說明很多, 但我寫出來的Code只有八行, 比寫這說明的時間還短 , 你可以從上面的邏輯去想想看, 寫程式是這樣的一個活動, 當你直接從程式碼想不出來的時候, 改個方法, 用口語去描述你想達成的事情的流程, 再把流程轉成程式碼.

    我當然可直接貼個程式碼給你看, 但這樣會養成你抄 Code 而不思考的習慣, 對你不是好事. 建議你從我上面的流程著手, 想想程式碼該怎麼寫.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。




    2012年6月8日 上午 08:05
    版主

所有回覆

  • 問題是 7+5+4 也是 16 . 何以見得一定是 7+6+3 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年6月7日 上午 09:14
    版主
  • 有先後順序

    從大的開始算

    謝 謝

    2012年6月7日 上午 09:15
  • 那就是遞迴去做由大到小遞減就可以了.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年6月7日 上午 09:17
    版主
  • 可以提供範例嗎?

    感謝!!

    2012年6月7日 上午 09:22
  • 你原來打算怎麼寫? 搞不好你的寫法更快.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年6月7日 上午 09:26
    版主
  • 程式要自己寫喔~飯粒請找電鍋。

    要人家指導,自己也要付出點東西吧 ...


    學習不是查個 Google 套個書上的範例就算了,而是去熟悉了解每個程式碼背後的意義,否則就算學個幾百年,它也不會是你的。
    =================================
    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure

    2012年6月7日 上午 09:42
    版主
  • 翻譯:

    請把努力過後的原始碼貼出來繼續討論。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年6月7日 下午 12:45
  • 邏輯上的原理是

    (1) 送入測試值 (在你的範例就是 16)

    (2) 判斷測試值是否大於基準集合(也就是 0~7) 的最大值

    (2-1) 如果是

    (2-1-1) 將基準集合最大值加入結果集合

    (2-1-2) 將測試值減去基準集合最大值

    (2-1-3) 將基準集合最大值移出基準集合

    (2-1-4) 將新的值送回到(1) (Tips: 如果是 16, 此時新的測試值就變成 (16-7)=9, 基準集合則是{0,1,2,3,4,5,6}, 結果集合則是 {7})

    (2-2) 如果不是

    (2-2-1) 將測試值加入結果集合

    (2-2-2) 程式結束

    說明很多, 但我寫出來的Code只有八行, 比寫這說明的時間還短 , 你可以從上面的邏輯去想想看, 寫程式是這樣的一個活動, 當你直接從程式碼想不出來的時候, 改個方法, 用口語去描述你想達成的事情的流程, 再把流程轉成程式碼.

    我當然可直接貼個程式碼給你看, 但這樣會養成你抄 Code 而不思考的習慣, 對你不是好事. 建議你從我上面的流程著手, 想想程式碼該怎麼寫.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。




    2012年6月8日 上午 08:05
    版主
  • 如果用1個Byte的8的 bit 分別表示 8個開關

    預先建立一個map的對應表
    也就是

    Dim mapSW As New Dictionary(Of Integer, Byte)()

    0的開關要先加到mapSW
    再把1~7的開關能有狀態
    以for回圈分別計算後
    都加進這個mapSW裡這樣應該就可以簡化了判斷了




    player

    2012年6月8日 上午 10:52
  • 看來又是個只會伸手要範例的.
    2012年6月8日 下午 11:09
  • To Ling1982:

    為什麼你向我要範例的時候回應如此之快, 而我請你先寫出自己的想法後, 卻完全沒回應了呢 ? 這樣似乎不太像是 "討論" 吧 ?


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年6月11日 上午 11:00
    版主
  • 怎麼老是有這樣伸手要範例的人?

    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    2012年6月12日 上午 01:38
  • 讀了諸位的回覆 雖然不是很解(程度問題)

    但真的很欣慰來對地方了 諸位先進不倦提點後進,不輕易示人以魚,而堅持先把持釣竿 這與某教國文讀古文法,實臭味相投也.如是學到的東西,才真是勤學有得,而不是死背填鴨.慶幸慶幸!!


    天豈去此哉,任真無所先. 如有周公之才之美,使驕且吝,其餘不足觀也矣. 雖多,亦奚以為?

    2012年6月17日 下午 03:02
  • 各位大大!可否提供你們的方式,是如何的精簡,讓後輩學習! 以下是我個人的方式,但還是無法精簡到八行,因此在此求拜

    Dim InputValue As Integer = Val(TextBox1.Text)
              Dim Te As String = ""

              For I = 7 To 0 Step -1
                   If InputValue >= I Then
                        InputValue = InputValue - I
                        Te = Te & "," & I
                   End If
              Next
              MsgBox(Te)

    2012年6月21日 上午 01:39
  • 各位大大!可否提供你們的方式,是如何的精簡,讓後輩學習! 以下是我個人的方式,但還是無法精簡到八行,因此在此求拜

    Dim InputValue As Integer = Val(TextBox1.Text)
              Dim Te As String = ""

              For I = 7 To 0 Step -1
                   If InputValue >= I Then
                        InputValue = InputValue - I
                        Te = Te & "," & I
                   End If
              Next
              MsgBox(Te)

    你的程式計算邏輯只有六行, 因為 MsgBox, 和變數定義不算在計算邏輯中. 

    這個解法基本精神是對的, 但有多餘的迴圈數產生, 如果今天我的 inputValue 是 1 , 它還是得要從 7跑到0, 在基底條件數很小的狀況下, 這不會有太多影響.

    但如果基底條件是 1~10000的序列, 就要跑一萬圈, 以此類推.

    所以我的解法 (邏輯詳見上方說明), 不論基底條件數有多大, 如果答案只一個數字, 它只會跑一圈. 以下為函式程式碼供參考,

    Private Sub GetinternalValue(base As List(Of Int32), testValue As Int32, ByRef result As List(Of Int32))
    		If testValue >= base.Min AndAlso testValue <= base.Max Then
    			result.Add(testValue)
    		Else
    			result.Add(base.Max)
    			testValue = testValue - base.Max
    			base.RemoveAt(base.Count - 1)
    			GetinternalValue(base, testValue, result)
    		End If
    End Sub

    PS: 這個程式碼也有一個缺點, 如果基底條件不為連續數列就沒用了. 所以其它朋友還會有更佳的解法.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年6月21日 上午 02:53
    版主