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

C語言進階練習:回文數判斷與指針實現選擇排序

     編輯:關於C

題目一:判斷回文數

定義:正讀反讀相同的整數,如 121、12321。

算法:將數字分解為數組(低位在前),雙指針首尾比對。

#include <stdio.h>

int main(void) {
    int n, digits[20], len = 0, i;
    printf("輸入正整數: ");
    scanf("%d", &n);

    int temp = n;
    while (temp > 0) {           // 分解數位
        digits[len++] = temp % 10;
        temp /= 10;
    }

    int is_palindrome = 1;
    for (i = 0; i < len / 2; i++) { // 只需比對一半
        if (digits[i] != digits[len - 1 - i]) {
            is_palindrome = 0;
            break;
        }
    }

    printf("%d %s回文數\n", n, is_palindrome ? "是" : "不是");
    return 0;
}

優化點:原代碼逐位打印 ok/no,改為標誌位統一輸出,邏輯更清晰。

題目二:指針實現選擇排序(降序)

指針核心三句:

  1. int *p = &a; —— 取址
  2. p = arr; —— 數組名退化為首元素地址
  3. *(p + i) == arr[i] —— 指針算術等價下標
#include <stdio.h>

int main(void) {
    int data[8], *p1, *p2, temp, i;

    printf("輸入 8 個整數: ");
    for (p1 = data; p1 < data + 8; p1++) scanf("%d", p1); // 指針遍歷輸入

    // 選擇排序:外層鎖定當前位置,內層掃描剩餘區間找最大值
    for (p1 = data; p1 < data + 7; p1++) {
        for (p2 = p1 + 1; p2 < data + 8; p2++) {
            if (*p1 < *p2) {          // 降序:前小於後則交換
                temp = *p1;
                *p1 = *p2;
                *p2 = temp;
            }
        }
    }

    printf("排序結果: ");
    for (i = 0, p1 = data; i < 8; i++, p1++) printf("%6d", *p1);
    putchar('\n');
    return 0;
}

指針與數組的等價關係圖解

int arr[5] = {10,20,30,40,50};
int *p = arr;          // p 指向 arr[0]

arr[2]   == *(arr + 2) == *(p + 2) == p[2]   // 皆為 30
&arr[2]  == arr + 2    == p + 2              // 皆為 arr[2] 地址

常見誤區

  • 指針未初始化:int *p; *p = 10; → 段錯誤。必須先指向合法記憶體。
  • 數組名非左值:arr = p; 非法,數組名是常量指針。
  • 指針算術單位:p + 1 移動 sizeof(*p) 字節,非 1 字節。

總結

回文數分解展示「整數→數組」的數據轉換思維;指針排序驗證「指針遍歷、解引用交換」的核心操作。熟練掌握 *p、p+i、p[i] 三者互換,是寫好 C 語言的分水嶺。

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