S SmartDocs
Serie: C++ cpp 177 righe · Aggiornato 2026-04-03

arrays.cpp

C++/Part1_基礎入門/Ch05_陣列與字串/arrays.cpp

// ============================================================
// Ch05 — 陣列(Arrays)
// 編譯:g++ -std=c++17 -Wall -o arrays arrays.cpp
// ============================================================

#include <iostream>
#include <array>

// ── 函式原型 ──
void printArray(const int arr[], int size);
double average(const int arr[], int size);
void printMatrix(const int matrix[][4], int rows);

// ── 主程式 ────────────────────────────────────────
int main() {
    std::cout << "===== Ch05:陣列 =====\n\n";

    // ── 1. 宣告與初始化 ──
    std::cout << "【1】宣告與初始化\n";

    int a[5] = {10, 20, 30, 40, 50};  // 完全初始化
    int b[5] = {1, 2};                // 部分初始化,其餘為 0
    int c[]  = {100, 200, 300};       // 編譯器推算大小為 3

    std::cout << "a[] = ";
    printArray(a, 5);

    std::cout << "b[] = ";
    printArray(b, 5);

    std::cout << "c[] = ";
    printArray(c, 3);
    std::cout << "\n";

    // ── 2. 存取與修改元素 ──
    std::cout << "【2】存取與修改元素\n";
    std::cout << "a[0] = " << a[0] << "(第一個元素)\n";
    std::cout << "a[4] = " << a[4] << "(最後一個元素)\n";

    a[2] = 999;
    std::cout << "修改 a[2] = 999 後:";
    printArray(a, 5);
    std::cout << "\n";

    // ── 3. 走訪方式 ──
    std::cout << "【3】走訪方式\n";

    int scores[] = {85, 92, 78, 95, 88, 76, 90};
    int scoresSize = sizeof(scores) / sizeof(scores[0]);

    // 3a. 傳統 for 迴圈
    std::cout << "傳統 for 迴圈:";
    for (int i = 0; i < scoresSize; i++) {
        std::cout << scores[i] << " ";
    }
    std::cout << "\n";

    // 3b. 範圍 for 迴圈
    std::cout << "範圍 for 迴圈:";
    for (int score : scores) {
        std::cout << score << " ";
    }
    std::cout << "\n";

    // 3c. 範圍 for 迴圈(搭配 auto)
    std::cout << "auto 推導型別:";
    for (auto val : scores) {
        std::cout << val << " ";
    }
    std::cout << "\n";

    std::cout << "平均分數:" << average(scores, scoresSize) << "\n\n";

    // ── 4. sizeof 取得陣列大小 ──
    std::cout << "【4】sizeof 與陣列大小\n";
    std::cout << "sizeof(scores) = " << sizeof(scores) << " 位元組\n";
    std::cout << "sizeof(int)    = " << sizeof(int) << " 位元組\n";
    std::cout << "元素數量 = " << sizeof(scores) / sizeof(scores[0]) << "\n\n";

    // ── 5. 多維陣列(2D 矩陣) ──
    std::cout << "【5】多維陣列(2D 矩陣)\n";
    int matrix[3][4] = {
        { 1,  2,  3,  4},
        { 5,  6,  7,  8},
        { 9, 10, 11, 12}
    };

    std::cout << "3×4 矩陣:\n";
    printMatrix(matrix, 3);

    // 存取特定元素
    std::cout << "matrix[1][2] = " << matrix[1][2] << "(第 2 列第 3 行)\n\n";

    // 矩陣走訪
    std::cout << "巢狀迴圈走訪:\n";
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            std::cout << matrix[i][j] << "\t";
        }
        std::cout << "\n";
    }
    std::cout << "\n";

    // ── 6. std::array(C++11) ──
    std::cout << "【6】std::array\n";
    std::array<int, 5> stdArr = {11, 22, 33, 44, 55};

    std::cout << "std::array 內容:";
    for (int val : stdArr) {
        std::cout << val << " ";
    }
    std::cout << "\n";

    std::cout << "size()  = " << stdArr.size() << "\n";
    std::cout << "front() = " << stdArr.front() << "\n";
    std::cout << "back()  = " << stdArr.back() << "\n";
    std::cout << "at(2)   = " << stdArr.at(2) << "\n";

    // std::array 可以直接比較
    std::array<int, 5> stdArr2 = {11, 22, 33, 44, 55};
    std::cout << "stdArr == stdArr2 ? "
              << (stdArr == stdArr2 ? "是" : "否") << "\n\n";

    // fill 填充
    std::array<int, 5> filled;
    filled.fill(0);
    std::cout << "fill(0) 後:";
    for (int val : filled) {
        std::cout << val << " ";
    }
    std::cout << "\n\n";

    // ── 7. C 陣列 vs std::array 比較 ──
    std::cout << "【7】C 陣列 vs std::array\n";
    std::cout << "┌──────────────┬──────────────────┬──────────────────┐\n";
    std::cout << "│    特性       │    C 陣列         │   std::array     │\n";
    std::cout << "├──────────────┼──────────────────┼──────────────────┤\n";
    std::cout << "│ 大小資訊     │ 傳入函式時遺失     │ 保留 size()      │\n";
    std::cout << "│ 邊界檢查     │ 無               │ at() 有檢查       │\n";
    std::cout << "│ 可比較       │ 否               │ 是               │\n";
    std::cout << "│ 可賦值       │ 否               │ 是               │\n";
    std::cout << "│ STL 相容     │ 有限             │ 完全             │\n";
    std::cout << "└──────────────┴──────────────────┴──────────────────┘\n";

    return 0;
}

// ── 函式定義 ──────────────────────────────────────

// 陣列傳入函式時退化為指標,必須額外傳入大小
void printArray(const int arr[], int size) {
    std::cout << "{ ";
    for (int i = 0; i < size; i++) {
        std::cout << arr[i];
        if (i < size - 1) std::cout << ", ";
    }
    std::cout << " }\n";
}

double average(const int arr[], int size) {
    if (size <= 0) return 0.0;
    int sum = 0;
    for (int i = 0; i < size; i++) {
        sum += arr[i];
    }
    return static_cast<double>(sum) / size;
}

void printMatrix(const int matrix[][4], int rows) {
    for (int i = 0; i < rows; i++) {
        std::cout << "  [ ";
        for (int j = 0; j < 4; j++) {
            std::cout << matrix[i][j] << "\t";
        }
        std::cout << "]\n";
    }
}

Articoli correlati