首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言期中考試題詳解:結構體陣列儲存姓名、選擇排序、逐步除錯指南

     編輯:程式設計疑難解答

程式功能概覽

  1. 定義結構體 `Block`:含整數 `n`(姓名筆數)與二維字元陣列 `name[50][20]`。
  2. 主程式:輸入 2 組資料,每組先輸入筆數 `n`,再輸入 `n` 個姓名。
  3. 呼叫 `sort` 對每組姓名做選擇排序(升序)。
  4. 輸出排序後的姓名清單。

關鍵程式碼註解

#define N 2
typedef struct BLOCK {
    int n;
    char name[50][20]; // 最多 50 筆,每筆最長 19 字元 + \0
} Block;

void sort(char array[][20], int n) {
    char temp[20];
    for (int i = 1; i <= n-1; i++) {      // 選擇排序外層
        int k = i;
        for (int j = i+1; j <= n; j++) {  // 內層尋找最小值索引
            if (strcmp(array[k], array[j]) > 0) k = j;
        }
        if (i != k) {                     // 交換
            strcpy(temp, array[i]);
            strcpy(array[i], array[k]);
            strcpy(array[k], temp);
        }
    }
}

常見坑點與修正

  • 陣列索引從 1 開始 (`i=1; i<=n`),C 慣例從 0 起,易導致越界或略過第 0 筆。建議改為 0-based。
  • `gets()` 已棄用且不安全,改用 `fgets(array[i], 20, stdin)` 並手動去除換行符。
  • `scanf("%d", &num[j].n)` 後殘留換行符,導致第一次 `gets` 讀到空行。需在 `scanf` 後加 `getchar()` 或改用 `fgets`+`sscanf`。

除錯技能:單步執行與斷點

「代碼功能歸根結底不是別人幫自己看或講解出來的;而是被自己靜下心來花足夠長的時間和精力親自動手單步或設斷點一步一步分析出來的。」

  • VS: F10 (逐過)、F11 (進入)、Shift+F11 (跳出)、F9 (切換斷點)、F5 (啟動/繼續)。
  • 觀察視窗監視 `i, j, k, array[i], array[j], temp` 變化。
  • 輸出中間結果到檔案或 Console,驗證排序每輪狀態。

結語

考試題雖小,包含結構體、字串處理、排序、I/O 等核心基本功。養成「單步除錯」習慣,比背誦標準答案更能建立扎實的程式直覺。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved