本文為《C語言程式開發經典實例》系列第四輯,收錄第 31 至 40 號範例。主題涵蓋字元輸入判斷星期、DOS 控制台顏色與座標控制、函式呼叫練習、素數篩選、選擇排序、矩陣對角線求和、有序陣列插入與陣列逆序。這些範例著重於基礎語法靈活運用與經典演算法實作,是進階學習的紮實墊腳石。
getch() 無回顯讀取單一字元。switch 判斷首字母,S/T 需再讀第二字母區分 Saturday/Sunday、Tuesday/Thursday。原碼中 if((letter=getch())=='a') 若非 'a' 會直接讀下一字元判斷 'u',導致漏讀。建議改為暫存第二字元再比較:
case 'S':
printf("請輸入第二個字母: ");
char c2 = getch();
if (c2 == 'a') printf("Saturday\n");
else if (c2 == 'u') printf("Sunday\n");
else printf("輸入錯誤\n");
break;
textbackground(color) 設定背景色(0~7)。cprintf() 直接輸出至控制台,支援顏色屬性。getch() 暫停等待按鍵。適用於 Turbo C / Borland C 等 DOS 時代編譯器,現代 IDE 需改用 ANSI 轉義序列或跨平台庫(如 ncurses)。
gotoxy() 與 clrscr() 定位輸出gotoxy(col, row) 將游標移至指定座標(列、行),配合 textbackground() 可繪製簡易文字介面版面。
void hello_world(void) { printf("Hello, world!\n"); }
void three_hellos(void) {
for (int i = 1; i <= 3; i++) hello_world();
}
int main(void) { three_hellos(); return 0; }
展示模組化分解:主函式 → 三次呼叫 → 單次列印,層層遞進。
textcolor(1~15) 設定前景色,textcolor(128+15) 啟用高亮閃爍(視硬體支援而定)。
a[2..100] 初始化為索引值。i=2..√N,內層 j=i+1..N,若 a[j] % a[i] == 0 標記 a[j]=0。時間 O(N log log N),空間 O(N),為入門級最優素數篩法。
for (i = 0; i < N-1; i++) {
min = i;
for (j = i+1; j < N; j++)
if (a[min] > a[j]) min = j;
swap(a[i], a[min]);
}
每輪只交換一次,比氣泡排序減少交換次數,適合資料移動成本高的場景。
雙重迴圈輸入矩陣,單迴圈累加 a[i][i],輸出格式 %6.2f 保留兩位小數。
i。a[i] 之後的元素依次後移一格,騰出空位插入新數。for (i = 0; i < 10; i++)
if (a[i] > number) {
temp1 = a[i];
a[i] = number;
for (j = i+1; j < 11; j++) {
temp2 = a[j];
a[j] = temp1;
temp1 = temp2;
}
break;
}
雙暫存變數 temp1、temp2 實現原地後移,空間複雜度 O(1)。
首尾雙指標對稱交換:for (i=0; i
| 範例 | 核心知識點 | 現代化替代方案 |
|---|---|---|
| 31 | 字元輸入、switch 巢狀 | std::cin + string 比對 |
| 32~33 | DOS 控制台圖形 | ncurses / ANSI escape codes |
| 36 | 篩法素數 | bitset 優化空間、並行篩法 |
| 37 | 選擇排序 | std::sort (Introsort) |
| 39 | 有序插入 | std::vector + lower_bound + insert |
| 40 | 原地逆序 | std::reverse |
template void selection_sort(T*, size_t) 。memmove 優化範例 39 的元素後移。下一集將深入字串處理、遞迴經典(河內塔、八皇后)、動態記憶體管理與連結串列進階操作,敬請期待。