string去掉后四位_数字黑洞(下):四位数的黑洞
在上一期中我們展示了三位黑洞數的求解過程,其中的關鍵技術是數字的排序及位置交換。本期文章繼續討論有關數字黑洞的問題,展示四位黑洞數的求解過程。
一、用戶界面
在App Inventor開發環境中打開上一期創建的項目——數字黑洞1,在項目菜單中選擇“另存項目”,將項目名稱修改為“數字黑洞2”,如圖 1所示,保留項目中的全部組件。
圖1 將“數字黑洞1”項目另存為“數字黑洞2”
二、技術要點分析
在求解三位黑洞數時,我們用局部變量(數1、數2、數3)保存三位數的三個數字,兩兩比較數的大小,根據比較結果決定是否將兩個數交換位置,這樣的處理過程需要3次比較,要編寫3組共9條指令,如圖 2所示,每組指令的格式相同。如果我們沿著同樣的思路,對四個數字進行排序,那么就需要進行6次比較,編寫6組共18條指令,同樣每組指令的格式相同。
圖2 三個條件語句中的代碼格式相同
作為一個開發者,我們不能允許程序中出現如此多的重復代碼,這些重復代碼不僅讓程序變得臃腫,而且當這部分代碼需要修改時,極易給程序帶來錯誤,例如由于疏忽忘記了修改其中的部分代碼。
解決這一問題的關鍵技術有兩點——列表與循環。將四位數的四個數字轉換為列表,利用循環語句,對列表項進行兩兩比較,通過交換列表項的位置,來實現數字的排序。這也是解決大量數字排序問題的通用方法,例如,對班級考試成績進行排序。
三、編寫程序
將開發工具切換到編程視圖,保留項目中的部分代碼,將最大值、最小值過程刪除,如圖 3所示。
圖3 保留項目中的部分代碼
1、定義過程——數字轉列表、列表轉數字
為了利用列表和循環語句簡化排序代碼,首先需要將數字轉化為列表,待排序完成后,再將列表轉為數字,這樣才能進行減法運算。代碼如圖 4及圖 5所示。
圖4 定義過程——數字轉列表
圖5 定義過程——列表轉數字
2、定義過程——極值
在數學語言中,最大值、最小值統稱為“極值”,這里定義一個有返回值的過程——極值,來取代最大值、最小值兩個過程,代碼如圖 6所示。
圖6 定義過程——極值
極值過程里使用了雙層循環,外層循環變量“外層序號”的取值為1~3,內層循環變量“內層序號”的起始值為(外層序號+1),終止值為4,所有指令都包含在內層循環中。首先取出數字列表中的第1項,與后面3項進行兩兩比較,并交換位置,當第1次內層循環(共執行3次)結束時,列表中的第1項為四個數字中的最大數或最小數。接下來取出列表中的第2項,與后面兩項進行比較并交換位置,當第2次內層循環(共執行2次)結束時,列表中的第2項為后三位數中的最大值或最小值,以此類推,當兩層循環全部結束時,數字列表的排序完成。
注意:在交換兩個列表項的位置時,同樣需要一個臨時變量,先將前數保存在臨時變量中,然后用后數替換前數所對應的列表項,最后再用臨時變量替換后數所對應的列表項。
極值過程里還使用了有返回值的條件語句,如果參數“極大”=真,則交換位置的條件為“前數后數”,并返回極小值列表。
3、改造過程——求差運算
首先將求差運算的“三位數”參數修改為“數字列表”,通過調用極值過程,求得四位數的最大值和最小值,再求兩者的差值并拼接輸出字串,比較差值與黑洞數(全局變量),如果差值不等于黑洞數,則繼續調用求差運算過程(遞歸調用),直到差值與黑洞數相等,然后將輸出字串顯示在標簽中。代碼如圖 7所示。
圖7 改造之后的求差運算過程
4、改造求解按鈕的事件處理程序
在求差運算過程中,第一個參數的數據類型由數字改成了列表,因此,在求解按鈕的點擊事件中,在調用求差運算過程時,要為過程提供列表類型的參數,此處利用數字轉列表過程,將數字變為數字列表,代碼如圖 8所示。
圖8 改造之后的點擊事件處理程序
對上述代碼進行測試,測試結果如圖 9所示。
圖9 測試:四位黑洞數的求解過程
四、討論
讀者可能有疑問:圖 7的求差運算過程里,在求最大值時,用“復制列表+數字列表”塊作為極值過程的參數,而在求最小值時,則直接用“數字列表”作為參數,為什么會有這樣的差別呢?我們先來做一個實驗,將求差運算過程修改一下,代碼及測試結果如圖 10所示,最大值與最小值都成了最小值,這是什么原因呢?
圖10 去掉“復制列表”塊時的測試結果
原因在于列表類型數據的存儲方式。簡單類型的變量,如黑洞數,其中保存的是具體的數,如6193,而列表類型的變量,如參數“數字列表”(參數等同于變量),其中保存的不是具體的數據,而是數據存放的地址。舉例來說,假設列表A、列表B為變量名,經過下列操作:
1.?????? 設列表A = (6 1 9 3)
2.?????? 設列表B = 列表A
3.?????? 設列表B = (9 6 3 1)
此時查看列表A的值,會發現列表A也變成了(9 6 3 1)。
也就是說,第2步操作并沒有真正生成一個變量,只是為“列表A”貼了一個“列表B”的標簽,它們指向的是同一個數據存儲區域,因此,對列表B的改寫,同時也發生在列表A之上。
回到求差運算過程里,求差運算的參數“數字列表”、過程里的局部變量最大值、最小值,這三者指向的是同一個存儲區域,而“復制列表”塊所起的作用,是另外開辟一個存儲區域,將“數字列表”的值復制到新區域中,因此求得的最大值保存在新區域中,而最小值其實是保存在參數“數字列表”所在的區域中。這就是使用“復制列表”塊的緣由。
注:本文已正式發表于《愛上機器人》雜志總第4期(2019.01)。
總結
以上是生活随笔為你收集整理的string去掉后四位_数字黑洞(下):四位数的黑洞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: excel vba 调用webbrows
- 下一篇: python多线程坑_python多线程