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

C語言排序程式實作:十個整數依使用者選擇升序或降序輸出

     編輯:C 語言問答

需求分析

  • 輸入 10 個整數
  • 選擇 'A'(升序)或 'D'(降序)
  • 對應排序後輸出

完整程式碼(修正版)

#include <stdio.h>
#include <stdlib.h>

void sort_ascending(int arr[], int n);
void sort_descending(int arr[], int n);

int main() {
    int numbers[10];
    int i;
    char choice;

    // 1. 輸入 10 個整數
    printf("請輸入 10 個整數(以空格或換行分隔):\n");
    for (i = 0; i < 10; i++) {
        if (scanf("%d", &numbers[i]) != 1) {
            printf("輸入錯誤,請輸入整數。\n");
            return 1;
        }
    }

    // 2. 選擇排序方式
    printf("請選擇排序方式:'A' 升序(小到大) 或 'D' 降序(大到小):\n");
    scanf(" %c", &choice);  // 注意 %c 前的空格,跳過殘留換行符

    // 3. 呼叫對應排序函式
    if (choice == 'A' || choice == 'a') {
        sort_ascending(numbers, 10);
    } else if (choice == 'D' || choice == 'd') {
        sort_descending(numbers, 10);
    } else {
        printf("無效選擇,請輸入 A 或 D。\n");
        return 1;
    }

    return 0;
}

// 升序排序(氣泡排序法)
void sort_ascending(int arr[], int n) {
    int i, j, temp;
    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
    printf("升序排序結果:\n");
    for (i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

// 降序排序(氣泡排序法)
void sort_descending(int arr[], int n) {
    int i, j, temp;
    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - 1 - i; j++) {
            if (arr[j] < arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
    printf("降序排序結果:\n");
    for (i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

關鍵修正點說明

原始碼問題修正後寫法說明
a[]=t; 缺少索引a[j]=t;陣列賦值必須指定索引
硬編碼測試資料改為 scanf 讀取使用者輸入符合題目「從鍵盤輸入」要求
scanf("%c", &c) 讀到殘留換行符scanf(" %c", &choice) 加空格跳過空白字元避免誤讀上一行的 \n
未處理大小寫接受 'A'/'a'、'D'/'d'提升使用者體驗
函式原型宣告在 main 內部移至檔案頂部(全域)符合現代 C 標準風格

進階延伸:使用 qsort

C 標準庫提供 qsort(快速排序),效率優於氣泡排序 O(n log n) vs O(n²):

#include <stdlib.h>

int cmp_asc(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}
int cmp_desc(const void *a, const void *b) {
    return (*(int*)b - *(int*)a);
}

// 在 main 中呼叫:
// qsort(numbers, 10, sizeof(int), choice == 'A' ? cmp_asc : cmp_desc);

學習重點總結

  • 模組化設計:將排序邏輯封裝為函式,提高可讀性與複用性
  • 輸入驗證:檢查 scanf 回傳值,防止非數字輸入導致程式異常
  • 緩衝區處理:scanf(" %c", ...) 前置空格是新手必學技巧
  • 演算法選擇:小資料量氣泡排序教學足夠,實務建議 qsort
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved