在軟體開發中,有效運用常數和陣列能大幅提升程式碼的品質。常數可作為陣列大小、預設值或索引,增加程式碼的可讀性,避免魔術數字的出現。合理運用陣列,則能簡化複雜的巢狀判斷,提升程式碼的維護效率。例如,在設定陣列大小、預設值和索引時,使用常數可以使程式碼更易於理解和修改。
在依賴項計數器的案例中,我們使用陣列儲存不同類別的依賴項數量,並以常數設定特殊編號,簡化了程式邏輯。此外,我們也示範瞭如何使用流程圖和偽程式碼來解釋程式流程,並透過程式碼重構,提升程式碼的可讀性和可維護性。在專案驗證的例子中,我們則展示瞭如何使用常數陣列儲存有效的專案編號,並利用線性搜尋來查詢客戶訂單中的專案編號是否有效,避免了冗長的條件判斷式,也讓程式碼更具彈性。
使用常數與陣列
在程式設計中,常數是指不會在執行期間改變的值。當與陣列合作時,您可以使用常數來提高程式的可讀性和維護性。常數可以用於以下幾種方式:
- 作為陣列的大小
- 作為陣列的值
- 作為陣列的索引
使用常數作為陣列大小
在之前的程式中,我們使用了魔術數字(magic number)6來作為陣列的大小。魔術數字是指在程式中出現的未命名的常數。為了避免魔術數字,我們可以定義一個常數來代表陣列的大小。
例如:
flowchart TD A[定義常數] --> B[初始化陣列] B --> C[使用常數作為陣列大小] C --> D[輸出結果]
看圖說話:
上述流程圖展示瞭如何使用常數來定義陣列的大小。首先,我們定義一個常數ARRAY_SIZE
,然後使用這個常數來初始化陣列。最後,我們使用這個常數來控制陣列的索引。
使用常數作為陣列值
常數也可以用作陣列的值。例如:
flowchart TD A[定義常數] --> B[初始化陣列] B --> C[使用常數作為陣列值] C --> D[輸出結果]
看圖說話:
上述流程圖展示瞭如何使用常數來作為陣列的值。首先,我們定義一個常數DEFAULT_VALUE
,然後使用這個常數來初始化陣列。最後,我們使用這個常數來設定陣列的值。
使用常數作為陣列索引
常數也可以用作陣列的索引。例如:
flowchart TD A[定義常數] --> B[初始化陣列] B --> C[使用常數作為陣列索引] C --> D[輸出結果]
看圖說話:
上述流程圖展示瞭如何使用常數來作為陣列的索引。首先,我們定義一個常數INDEX
,然後使用這個常數來存取陣列的元素。最後,我們使用這個常數來控制陣列的索引。
程式設計:依賴項計數器
簡介
在此章節中,我們將探討一個簡單的程式設計範例,該程式用於計算不同類別的依賴項。這個程式將會不斷地要求使用者輸入依賴項的編號,直到使用者輸入一個特殊的編號(在本例中為999)以結束程式。
變數宣告
首先,我們需要宣告一些變數來儲存依賴項的計數。這些變數包括:
dep
:用於儲存使用者輸入的依賴項編號。counts
:是一個陣列,包含6個元素,分別對應不同的依賴項類別,初始值均為0。QUIT
:一個特殊的編號,當使用者輸入此編號時,程式將會結束。
主要程式邏輯
程式的主要邏輯如下:
- 初始化:呼叫
getReady()
函式,初始化程式並提示使用者輸入依賴項編號或QUIT以結束。 - 迴圈輸入:進入一個迴圈,直到使用者輸入QUIT為止。在迴圈中,程式會不斷地呼叫
countDependents()
函式來處理使用者的輸入。 - 計數依賴項:在
countDependents()
函式中,根據使用者輸入的編號,對相應的counts
陣列元素進行計數。 - 結束程式:當使用者輸入QUIT時,結束迴圈,並呼叫
finishUp()
函式進行任何必要的清理工作。
程式碼重構
以下是根據上述描述重構的程式碼:
# 宣告變數
dep = 0
counts = [0, 0, 0, 0, 0, 0]
QUIT = 999
def getReady():
"""初始化程式並提示使用者輸入依賴項編號或QUIT以結束"""
print("Enter dependents or", QUIT, "to quit")
def countDependents():
"""根據使用者輸入的編號,對相應的counts陣列元素進行計數"""
global dep
global counts
counts[dep] += 1
print("Enter dependents or", QUIT, "to quit")
def finishUp():
"""進行任何必要的清理工作"""
print("Program finished.")
while True:
getReady()
dep = int(input())
if dep == QUIT:
break
countDependents()
finishUp()
陣列的威力:取代巢狀決策
在程式設計中,陣列是一種強大的工具,可以用來取代長串的決策。以下是三個有關陣列的真相和謊言:
- 陣列可以用來取代長串的決策。
- 使用未命名的數值常數作為索引比使用變數更有益。
- 顯示10個元素的陣列和顯示100個元素的陣列的過程基本上是相同的。
其中,第二個陳述是謊言。事實上,使用變數作為索引比使用常數更有益。
陣列的優點
使用陣列可以使程式碼更容易修改和理解。以下是兩種方法可以實作這一點:
- 宣告一個命名的數值常數,例如
ARRAY_SIZE = 6
,然後在存取陣列時使用這個常數進行比較,確保任何索引都小於這個常數值。 - 在一些語言中,陣列大小的值會自動提供給每個建立的陣列。例如,在Java中,宣告一個名為
counts
的陣列後,其大小會儲存在counts.length
欄位中。在C#和Visual Basic中,陣列大小是counts.Length
,其中L是大寫。然而,在C或C++中,並沒有自動建立的值。
陣列的應用
陣列可以用來儲存和操作大量的資料。以下是一個範例程式碼,展示如何使用陣列:
flowchart TD A[開始] --> B[初始化陣列] B --> C[存取陣列元素] C --> D[顯示陣列元素] D --> E[結束]
看圖說話:
上述流程圖展示瞭如何使用陣列。首先,初始化一個陣列,然後存取陣列元素,最後顯示陣列元素。
使用常數作為陣列元素值
在某些情況下,陣列中的元素值應該是常數,因為它們在程式執行期間不會被修改。例如,假設您建立一個陣列來儲存一年中的月份名稱。當宣告一個名為常數的陣列時,程式設計師通常使用全部大寫字母並以底線分隔單詞。不要將陣列識別符與其內容混淆——本課程的慣例是使用全部大寫字母作為常數識別符,但不一定是陣列值。一個名為 MONTHS
的陣列,儲存常數值,可以如下宣告:
string MONTHS[12] = "January", "February", "March",
"April", "May", "June", "July", "August", "September",
"October", "November", "December"
使用常數作為陣列索引
有時您可能想要使用未命名的數值常數作為陣列索引。例如,要顯示名為 salesArray
的陣列中的第一個值,您可能會使用以下陳述式:
output salesArray[0]
您也可能需要使用命名常數作為索引。例如,如果 salesArray
儲存了 20 個州的銷售值,而 Indiana 是第 5 個州,您可以使用未命名常數顯示 Indiana 的值:
output salesArray[5]
但是,如果您宣告一個名為 INDIANA
的常數,其值為 5,那麼您可以使用以下陳述式顯示相同的值:
output salesArray[INDIANA]
使用命名常數的優點是陳述式變得自我闡釋——任何閱讀您陳述式的人都更容易理解您的意圖,即顯示 Indiana 的銷售值。
搜尋陣列以找到精確匹配
在本章的依賴計數應用中,陣列的索引變數方便地持有小整數——允許的依賴人數是 0 到 5,而 dep
變數直接存取陣列。不幸的是,現實生活並不總是發生在小整數中。有時您沒有方便地持有陣列位置的變數;有時您必須搜尋陣列以找到您需要的值。
考慮一個郵購業務,客戶下單時包含名稱、地址、專案編號和訂購數量。假設專案編號可以從中選擇的是三位數字,但可能不是連續編號 001 到 999。例如,假設您提供六個專案:106、108、307、405、457 和 688,如圖 6-8 中的 VALID_ITEMS
陣列宣告所示。該陣列被宣告為常數,因為專案編號在程式執行期間不會改變。當客戶下單時,文書工作者可以透過檢查專案編號是否有效來驗證訂單。在類別似的方式中,電腦程式可以使用迴圈測試訂購的專案編號與每個 VALID_ITEMS
元素,尋找精確匹配。當您從一端到另一端搜尋列表時,您正在執行線性搜尋。
要確定訂購的專案編號是否有效,您可以使用六個決策來比較編號與六個允許的值。但是,圖 6-8 中顯示的更好的方法是建立一個包含有效專案編號列表的陣列,然後搜尋陣列以找到精確匹配。如果您搜尋了整個陣列而沒有找到客戶訂購的專案的匹配項,這意味著訂購的專案編號無效。
findItem()
模組在圖 6-8 中採取以下步驟來驗證專案編號是否存在:
- 一個名為
foundIt
的旗標變數被設定為 “N”。旗標是一個變數,用於指示某些事件是否發生。在此示例中,N 表示專案編號尚未在列表中找到。(參見findItem()
模組中的第一個陳述式。) - 一個索引
sub
被設定為 0。此索引將用於存取每個VALID_ITEMS
元素。
看圖說話:
圖 6-8 顯示了驗證專案可用性的程式流程圖和偽程式碼。
這篇文章討論了在程式設計中使用常數和陣列,特別是如何利用陣列簡化程式碼並提升效率。以下總結文章的重點,並提供一些額外的見解和前瞻性思考:
從程式碼最佳化和可維護性的角度來看,使用常數和陣列是至關重要的。文章清晰地闡述瞭如何用常數定義陣列大小、元素值和索引,有效避免了魔術數字,提高了程式碼的可讀性。更進一步地,利用陣列取代巢狀決策的技巧,極大地簡化了程式碼邏輯,降低了程式碼的複雜度,也更容易除錯和修改。例如,文章中提到的依賴項計數器程式,透過使用陣列,有效避免了冗長的 if-else 判斷,使程式碼更加簡潔高效。
然而,文章也點出了在實際應用中,簡單的索引並不能總是滿足需求。在處理非連續或非數值型的資料時,線性搜尋就變得不可或缺。文中以郵購業務的例子說明瞭如何利用線性搜尋在陣列中查詢特定值,例如驗證客戶訂購的商品編號。這種方法雖然簡單,但在處理大量資料時效率較低。未來可以考慮更最佳化的搜尋演算法,例如二分搜尋,以提升效能。
對於高階管理者而言,理解這些程式設計概念的價值不僅在於提升程式碼品質,更在於培養一種系統化思考問題的能力。這種能力可以應用於更廣泛的商業決策中,例如,透過分析市場資料,預測未來趨勢,制定更有效的商業策略。隨著資料量的爆炸式增長,高效的資料處理和分析能力將成為企業的核心競爭力。因此,掌握這些基礎的程式設計思維,對於管理者來說,至關重要。
總而言之,善用常數和陣列是提升程式碼品質的有效手段,同時也體現了程式設計的藝術性。隨著科技的發展,這種程式設計思維將在商業領域發揮越來越重要的作用。