C 語言初學教材 - 第四章 印出帳號列表

我們要印出所有已註冊的帳號列表很簡單,就用一個 for 迴圈陣列 userID 及 userCODE 裡頭所有的元素依序列印出來即可,但是帳號數的上限是 SIZE ,我們通常會給 SIZE 不太小的值,可是實際上註冊的使用者可能不會那麼多,所以全部列印出來會有太多不必要資訊的困擾,因此我們需要個提前結束的機制。



如何提前結束呢?一個簡單的想法是比對 userID 中每一個字元陣列的第一個字元,如果是 '\0' 就表示那是個沒有資料的空字串,因此就不需要列印出來,空字串以後的資料依據我們目前程式版本,也就是利用 counter 記錄 userID 的索引,也都會是空字串,所以遇到空字串就可以直接以 break 陳述跳出迴圈。


這個概念是準備加入以下的程式碼
for (j = 0; j < SIZE; j++) {
    if (userID[j][0] == '\0') {
        break;
    }
                                
    printf("%s - %s\n", userID[j], userCODE[j]);
}


因為之前比對帳號、密碼的 for 迴圈已經用了變數 i 當迴圈變數,所以這裡改用 j 當迴圈變數,同樣的,別忘了用到新變數要先宣告
// 宣告狀態變數、迴圈變數及陣列索引值變數
int state, i, j;
int counter;


管理模式的 while (1) 迴圈內容要調整如下
while (1) {
    printf("\n# ");
    scanf("%s", instruction);
                        
    // exit 為離開管理模式的指令
    if (!strcmp(instruction, "exit")) {
        break;
    }
                        
    // list 為列印使用者列表的指令
    if (!strcmp(instruction, "list")) {
        printf("\n以下為所有註冊使用者的帳號及密碼\n");
        printf("\n帳號 - 密碼\n");
        for (j = 0; j < SIZE; j++) {
            if (userID[j][0] == '\0') {
                break;
            }
                                
            printf("%s - %s\n", userID[j], userCODE[j]);
        }
        continue;
    }
                        
    // search 為查詢帳號指令
    if (!strcmp(instruction, "search")) {
        printf("\n您即將開啟查詢使用者帳號的功能....\n");
        continue;
    }
                        
    // delete 為刪除帳號指令
    if (!strcmp(instruction, "delete")) {
        printf("\n您即將開啟刪除使用者帳號的功能....\n");
        continue;
    }
                        
    // sort 為排序指令
    if (!strcmp(instruction, "sort")) {
        printf("\n您即將開啟排序使用者帳號列表的功能....\n");
        continue;
    }
}


當我們設計軟體時,通常會先設想軟體會有哪些功能,如果規劃的功能還沒有實作出來,我們可以先用不影響程式執行的程式碼代替,例如以上使用函數 printf() 印出提示訊息。


一旦我們實作出規劃的功能,就可以把實作程式碼加進預計放置的地方,之前置入的程式碼便可刪除了。


完整的範例程式碼及編譯執行,請繼續參考


問題與討論
  1. 如果只有五個使用者註冊,把 userID 中全部資料列印出來,會得到什麼樣的結果?
  2. 若是一定要把 userID 的全部資料列印出來,有什麼方式可以便於檢視資料?




沒有留言: