首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言經典程式設計實例集錦(四):星期判斷、彩色輸出、排序演算法與矩陣運算

     編輯:關於C語言

前言

本文為《C語言程式開發經典實例》系列第四輯,收錄第 31 至 40 號範例。主題涵蓋字元輸入判斷星期、DOS 控制台顏色與座標控制、函式呼叫練習、素數篩選、選擇排序、矩陣對角線求和、有序陣列插入與陣列逆序。這些範例著重於基礎語法靈活運用與經典演算法實作,是進階學習的紮實墊腳石。

範例 31:首字母判斷星期幾

核心邏輯

  • 使用 getch() 無回顯讀取單一字元。
  • 外層 switch 判斷首字母,S/T 需再讀第二字母區分 Saturday/Sunday、Tuesday/Thursday。
  • 輸入 'Y' 結束迴圈。

改良建議

原碼中 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;

範例 32:任意鍵切換背景顏色

關鍵函式

  • textbackground(color) 設定背景色(0~7)。
  • cprintf() 直接輸出至控制台,支援顏色屬性。
  • getch() 暫停等待按鍵。

適用於 Turbo C / Borland C 等 DOS 時代編譯器,現代 IDE 需改用 ANSI 轉義序列或跨平台庫(如 ncurses)。

範例 33:gotoxy() 與 clrscr() 定位輸出

gotoxy(col, row) 將游標移至指定座標(列、行),配合 textbackground() 可繪製簡易文字介面版面。

範例 34:函式呼叫練習——三重 Hello World

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; }

展示模組化分解:主函式 → 三次呼叫 → 單次列印,層層遞進。

範例 35:前景色與閃爍效果

textcolor(1~15) 設定前景色,textcolor(128+15) 啟用高亮閃爍(視硬體支援而定)。

範例 36:埃拉托斯特尼篩法求 100 以內素數

演算法步驟

  1. 建立陣列 a[2..100] 初始化為索引值。
  2. 外層迴圈 i=2..√N,內層 j=i+1..N,若 a[j] % a[i] == 0 標記 a[j]=0。
  3. 最後遍歷輸出非零元素,每 10 個換行。

複雜度

時間 O(N log log N),空間 O(N),為入門級最優素數篩法。

範例 37:選擇排序法對 10 個數排序

核心邏輯

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]);
}

每輪只交換一次,比氣泡排序減少交換次數,適合資料移動成本高的場景。

範例 38:3×3 矩陣主對角線元素求和

雙重迴圈輸入矩陣,單迴圈累加 a[i][i],輸出格式 %6.2f 保留兩位小數。

範例 39:有序陣列插入新元素

演算法

  1. 若新數大於最後元素,直接置於末尾。
  2. 否則從頭掃描,找到第一個大於新數的位置 i。
  3. 將 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)。

範例 40:陣列逆序輸出

首尾雙指標對稱交換:for (i=0; i,時間 O(N),空間 O(1),為原地逆序標準寫法。

綜合比較與實作建議

範例核心知識點現代化替代方案
31字元輸入、switch 巢狀std::cin + string 比對
32~33DOS 控制台圖形ncurses / ANSI escape codes
36篩法素數bitset 優化空間、並行篩法
37選擇排序std::sort (Introsort)
39有序插入std::vector + lower_bound + insert
40原地逆序std::reverse

延伸練習

  1. 將範例 36 改為線性篩(O(N)),輸出 100 萬以內素數個數。
  2. 實作通用模板函式 template void selection_sort(T*, size_t)。
  3. 使用 memmove 優化範例 39 的元素後移。
  4. 嘗試用遞迴寫出陣列逆序,比較堆疊開銷。

下一集將深入字串處理、遞迴經典(河內塔、八皇后)、動態記憶體管理與連結串列進階操作,敬請期待。

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