C 語言初學教材 - 第四章 while (1) 目錄

while (1) 迴圈是很好用的迴圈,很多軟體設計都需要用到類似 while (1) 的永真迴圈。因為我們通常希望只有在使用者決定關閉軟體時,才會結束程式的執行,因此利用 while (1) 迴圈,另佐以一個結束機制,就可以輕易用 break 跳出 while (1) 迴圈了。



我們在這個部份會碰到更多使用 while (1) 迴圈的例子,主要是我們會繼續發展擲骰子遊戲跟登入程式,這兩個程式都會需要用到 while (1) 的迴圈。在這之前,我們先來介紹 C 語言的常數吧!


常數,不是已經介紹過了嗎?整數型態常數有 1 、 2 、 3 ... ,浮點數型態的常數有 0.01 、 3003.6802 .... ,字元型態的常數有 'a' 、 'T' 、 '$' .... ,還有字串常數如 "Hello" ,其實列舉數也算是常數的一種喔!


那常數還有什麼可講的呢?以上所舉出的都是常數沒錯,可是 C 語言另外在前置處理器中提供用識別字定義常數的機制,這跟我們直接在程式碼中插入使用常數值是有一點點不同的。


怎麼說呢?假如我們常常需要用到如下的 for 迴圈進行計算
for (i = 0; i < 1000; i++) {
    temp = rand() % 6;
    if (temp == 0) {
        temp = 6;
    }
    points1[i] = temp;
          
    temp = rand() % 6;
    if (temp == 0) {
        temp = 6;
    }
    points2[i] = temp;
}


這樣 1000 的數字就會在程式中到處出現,如果我們需要調整這 1000 的常數值,就必須很仔細的把程式中有用到 1000 的地方都找出來更改,坦白說,這樣並不是很方便。


當然,也可以用變數,變數通常會用小寫英文字母命名,這當然是種方法,然而我們現在要處理的是一項不會經常變動的值,就是常數啊!那用變數並非相當合適,因此,在前置處理器的地方定義常數,如
#define SIZE 1000


以上便是定義 SIZE 為整數常數 1000 ,這樣一來,有用到 1000 的地方就都可以用 SIZE 代入,如果有需要做調整,就只需要更改 SIZE 的地方就可以了。


通常 #define 會放在 #include 的下方,注意前置處理器結尾不需要分號 ; 。


然後我們回到擲骰子遊戲,使用 SIZE 的常數,先來模擬勝負個 SIZE 次吧!


單純模擬玩個 SIZE 次累積的勝負次數還是不夠的,我們也要看看使用者到底贏多少籌碼,或是輸多少籌碼,另外用常數 ORIGIN 記錄最初的籌碼值,然後進行第二次模擬


但是真正設計賭博遊戲,我們也得曉得程式跑出贏或輸的機率,因此我們對擬隨機數的設計方式要做最後一次模擬,常數 SIZE_A 是用來處理骰子表格, SIZE_B 則是模擬的總次數。


做完模擬後,就來製作完成版的擲骰子遊戲吧!遊戲基本上就是在 while (1) 迴圈中運作的。


稍停一下, C 語言有衍生資料型態,我們已經介紹過指標、陣列,其中陣列是同質的資料結構,另外有不同資料型態的集合體,也就是異質的資料結構,就簡單稱為結構。


結構中可以有結構,就像陣列中可以有陣列一樣,這是種複合的定義方式,例如平面幾何中,兩點決定一直線,點座標為描述直線的條艦隻依,因此我們要處理相關的工作,就可以先定義點的結構,再定義包含點的結構 - 線 。


了解結構後,我們就能利用標準函數庫中有關處理時間的結構 tm ,進一步處理時間


然後我們繼續延伸 while (1) 迴圈的例子,先新增一個管理員帳號給登入程式,另外設計一個管理模式,管理員登入後就直接進入管理模式中,使之可以管理使用者帳號


管理模式就是在 while (1) 迴圈下進行的,我們接下來逐步建置管理模式的各項功能,最基本的就是印出帳號列表


若要查找某個帳號否存在,我們採取的策略是用線性搜尋演算法。


刪除使用者帳號也是管理員所需要的重要功能之一。


最後我們也建置一個排序帳號列表的功能,採用概念簡單的氣泡排序法


問題與討論
  1. 利用前置處理器定義常數有什麼優點?
  2. 為什麼設計遊戲,要做這麼多次模擬呢?
  3. 結構跟陣列有什麼不同?
  4. C 語言有哪些衍生資料型態?
  5. 為什麼要有管理員帳號?又要如何建立管理模式?
  6. 除了線性搜尋演算法,還有哪些搜尋演算法?
  7. 除了氣泡排序演算法,還有哪些排序演算法?




沒有留言: