#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 標準風格 |
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