C語言數組詳解

1. 什麼是數組?

數組是一種用於存儲固定大小的相同類型元素的順序集合。數組中的所有元素在內存中是連續存儲的,可以通過索引(下標)來訪問每個元素。

數組的主要特點

  • 相同數據類型的元素集合
  • 連續的內存空間
  • 固定大小(聲明時確定)
  • 通過索引訪問元素(從0開始)

2. 數組的基本概念


指針運算


3. 一維數組

數組聲明和初始化
#include <stdio.h>
  int main() {
  printf("=== 一維數組基礎 ===\n");
  // 方式1:聲明後逐個初始化
  int numbers1[5];
  numbers1[0] = 10;
  numbers1[1] = 20;
  numbers1[2] = 30;
  numbers1[3] = 40;
  numbers1[4] = 50;
  // 方式2:聲明時初始化
  int numbers2[5] = {1, 2, 3, 4, 5};
  // 方式3:自動計算數組大小
  int numbers3[] = {11, 22, 33, 44, 55};  // 編譯器自動計算為5
  // 方式4:部分初始化(其餘元素自動為0)
  int numbers4[5] = {1, 2};  // [1, 2, 0, 0, 0]
  // 顯示數組內容
  printf("numbers1: ");
  for (int i = 0; i < 5; i++) {
  printf("%d ", numbers1[i]);
  }
  printf("\n");
  printf("numbers2: ");
  for (int i = 0; i < 5; i++) {
  printf("%d ", numbers2[i]);
  }
  printf("\n");
  printf("numbers3: ");
  for (int i = 0; i < 5; i++) {
  printf("%d ", numbers3[i]);
  }
  printf("\n");
  printf("numbers4: ");
  for (int i = 0; i < 5; i++) {
  printf("%d ", numbers4[i]);
  }
  printf("\n");
  return 0;
  }
數組的常見操作
#include <stdio.h>
  // 函數聲明
  void printArray(int arr[], int size);
  int findMax(int arr[], int size);
  int findMin(int arr[], int size);
  int calculateSum(int arr[], int size);
  float calculateAverage(int arr[], int size);
  void reverseArray(int arr[], int size);
  int main() {
  int numbers[] = {23, 45, 12, 67, 34, 89, 56};
  int size = sizeof(numbers) / sizeof(numbers[0]);
  printf("=== 數組常見操作 ===\n");
  printf("原始數組: ");
  printArray(numbers, size);
  printf("數組大小: %d\n", size);
  printf("最大值: %d\n", findMax(numbers, size));
  printf("最小值: %d\n", findMin(numbers, size));
  printf("總和: %d\n", calculateSum(numbers, size));
  printf("平均值: %.2f\n", calculateAverage(numbers, size));
  reverseArray(numbers, size);
  printf("反轉後數組: ");
  printArray(numbers, size);
  return 0;
  }
  // 打印數組
  void printArray(int arr[], int size) {
  for (int i = 0; i < size; i++) {
  printf("%d ", arr[i]);
  }
  printf("\n");
  }
  // 查找最大值
  int findMax(int arr[], int size) {
  int max = arr[0];
  for (int i = 1; i < size; i++) {
  if (arr[i] > max) {
  max = arr[i];
  }
  }
  return max;
  }
  // 查找最小值
  int findMin(int arr[], int size) {
  int min = arr[0];
  for (int i = 1; i < size; i++) {
  if (arr[i] < min) {
  min = arr[i];
  }
  }
  return min;
  }
  // 計算總和
  int calculateSum(int arr[], int size) {
  int sum = 0;
  for (int i = 0; i < size; i++) {
  sum += arr[i];
  }
  return sum;
  }
  // 計算平均值
  float calculateAverage(int arr[], int size) {
  int sum = calculateSum(arr, size);
  return (float)sum / size;
  }
  // 反轉數組
  void reverseArray(int arr[], int size) {
  for (int i = 0; i < size / 2; i++) {
  int temp = arr[i];
  arr[i] = arr[size - 1 - i];
  arr[size - 1 - i] = temp;
  }
  }
數組排序算法
#include <stdio.h>
  // 函數聲明
  void bubbleSort(int arr[], int size);
  void selectionSort(int arr[], int size);
  void printArray(int arr[], int size);
  int main() {
  int numbers1[] = {64, 34, 25, 12, 22, 11, 90};
  int numbers2[] = {64, 34, 25, 12, 22, 11, 90};
  int size = sizeof(numbers1) / sizeof(numbers1[0]);
  printf("=== 數組排序算法 ===\n");
  printf("原始數組: ");
  printArray(numbers1, size);
  // 冒泡排序
  bubbleSort(numbers1, size);
  printf("冒泡排序後: ");
  printArray(numbers1, size);
  // 選擇排序
  selectionSort(numbers2, size);
  printf("選擇排序後: ");
  printArray(numbers2, size);
  return 0;
  }
  // 冒泡排序
  void bubbleSort(int arr[], int size) {
  for (int i = 0; i < size - 1; i++) {
  for (int j = 0; j < size - i - 1; j++) {
  if (arr[j] > arr[j + 1]) {
  // 交換元素
  int temp = arr[j];
  arr[j] = arr[j + 1];
  arr[j + 1] = temp;
  }
  }
  }
  }
  // 選擇排序
  void selectionSort(int arr[], int size) {
  for (int i = 0; i < size - 1; i++) {
  int minIndex = i;
  for (int j = i + 1; j < size; j++) {
  if (arr[j] < arr[minIndex]) {
  minIndex = j;
  }
  }
  // 交換元素
  int temp = arr[i];
  arr[i] = arr[minIndex];
  arr[minIndex] = temp;
  }
  }
  void printArray(int arr[], int size) {
  for (int i = 0; i < size; i++) {
  printf("%d ", arr[i]);
  }
  printf("\n");
  }

4. 多維數組

二維數組
#include <stdio.h>
  #define ROWS 3
  #define COLS 4
  // 函數聲明
  void print2DArray(int arr[ROWS][COLS]);
  int findMax2D(int arr[ROWS][COLS]);
  int calculateSum2D(int arr[ROWS][COLS]);
  void transposeMatrix(int arr[ROWS][COLS], int result[COLS][ROWS]);
  int main() {
  // 二維數組的聲明和初始化
  int matrix1[ROWS][COLS] = {
  {1, 2, 3, 4},
  {5, 6, 7, 8},
  {9, 10, 11, 12}
  };
  // 另一種初始化方式
  int matrix2[ROWS][COLS] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
  // 部分初始化
  int matrix3[ROWS][COLS] = {
  {1, 2},        // 第一行:1, 2, 0, 0
  {5, 6, 7},     // 第二行:5, 6, 7, 0
  {9}            // 第三行:9, 0, 0, 0
  };
  printf("=== 二維數組示例 ===\n");
  printf("matrix1:\n");
  print2DArray(matrix1);
  printf("matrix2:\n");
  print2DArray(matrix2);
  printf("matrix3:\n");
  print2DArray(matrix3);
  printf("二維數組最大值: %d\n", findMax2D(matrix1));
  printf("二維數組總和: %d\n", calculateSum2D(matrix1));
  // 矩陣轉置
  int transposed[COLS][ROWS];
  transposeMatrix(matrix1, transposed);
  printf("轉置矩陣:\n");
  for (int i = 0; i < COLS; i++) {
  for (int j = 0; j < ROWS; j++) {
  printf("%d ", transposed[i][j]);
  }
  printf("\n");
  }
  return 0;
  }
  // 打印二維數組
  void print2DArray(int arr[ROWS][COLS]) {
  for (int i = 0; i < ROWS; i++) {
  for (int j = 0; j < COLS; j++) {
  printf("%d\t", arr[i][j]);
  }
  printf("\n");
  }
  }
  // 查找二維數組最大值
  int findMax2D(int arr[ROWS][COLS]) {
  int max = arr[0][0];
  for (int i = 0; i < ROWS; i++) {
  for (int j = 0; j < COLS; j++) {
  if (arr[i][j] > max) {
  max = arr[i][j];
  }
  }
  }
  return max;
  }
  // 計算二維數組總和
  int calculateSum2D(int arr[ROWS][COLS]) {
  int sum = 0;
  for (int i = 0; i < ROWS; i++) {
  for (int j = 0; j < COLS; j++) {
  sum += arr[i][j];
  }
  }
  return sum;
  }
  // 矩陣轉置
  void transposeMatrix(int arr[ROWS][COLS], int result[COLS][ROWS]) {
  for (int i = 0; i < ROWS; i++) {
  for (int j = 0; j < COLS; j++) {
  result[j][i] = arr[i][j];
  }
  }
  }
二維數組的實際應用:學生成績系統
#include <stdio.h>
  #define STUDENTS 5
  #define SUBJECTS 3
  // 科目名稱
  const char* subjectNames[] = {"數學", "英語", "編程"};
  // 函數聲明
  void inputGrades(int grades[STUDENTS][SUBJECTS]);
  void printGradeTable(int grades[STUDENTS][SUBJECTS]);
  void calculateStudentAverages(int grades[STUDENTS][SUBJECTS], float averages[]);
  void calculateSubjectAverages(int grades[STUDENTS][SUBJECTS], float averages[]);
  void findTopStudent(int grades[STUDENTS][SUBJECTS]);
  int main() {
  int grades[STUDENTS][SUBJECTS];
  float studentAverages[STUDENTS];
  float subjectAverages[SUBJECTS];
  printf("=== 學生成績管理系統 ===\n");
  // 輸入成績
  inputGrades(grades);
  // 顯示成績表
  printf("\n=== 成績表 ===\n");
  printGradeTable(grades);
  // 計算學生平均分
  calculateStudentAverages(grades, studentAverages);
  printf("\n=== 學生平均分 ===\n");
  for (int i = 0; i < STUDENTS; i++) {
  printf("學生%d: %.2f\n", i + 1, studentAverages[i]);
  }
  // 計算科目平均分
  calculateSubjectAverages(grades, subjectAverages);
  printf("\n=== 科目平均分 ===\n");
  for (int i = 0; i < SUBJECTS; i++) {
  printf("%s: %.2f\n", subjectNames[i], subjectAverages[i]);
  }
  // 查找優秀學生
  findTopStudent(grades);
  return 0;
  }
  // 輸入成績
  void inputGrades(int grades[STUDENTS][SUBJECTS]) {
  printf("請輸入%d個學生的%d門科目成績:\n", STUDENTS, SUBJECTS);
  for (int i = 0; i < STUDENTS; i++) {
  printf("學生%d:\n", i + 1);
  for (int j = 0; j < SUBJECTS; j++) {
  printf("  %s成績: ", subjectNames[j]);
  scanf("%d", &grades[i][j]);
  }
  }
  }
  // 打印成績表
  void printGradeTable(int grades[STUDENTS][SUBJECTS]) {
  // 打印表頭
  printf("學生\\科目\t");
  for (int j = 0; j < SUBJECTS; j++) {
  printf("%s\t", subjectNames[j]);
  }
  printf("\n");
  // 打印分隔線
  printf("--------\t");
  for (int j = 0; j < SUBJECTS; j++) {
  printf("----\t");
  }
  printf("\n");
  // 打印成績
  for (int i = 0; i < STUDENTS; i++) {
  printf("學生%d\t\t", i + 1);
  for (int j = 0; j < SUBJECTS; j++) {
  printf("%d\t", grades[i][j]);
  }
  printf("\n");
  }
  }
  // 計算學生平均分
  void calculateStudentAverages(int grades[STUDENTS][SUBJECTS], float averages[]) {
  for (int i = 0; i < STUDENTS; i++) {
  int sum = 0;
  for (int j = 0; j < SUBJECTS; j++) {
  sum += grades[i][j];
  }
  averages[i] = (float)sum / SUBJECTS;
  }
  }
  // 計算科目平均分
  void calculateSubjectAverages(int grades[STUDENTS][SUBJECTS], float averages[]) {
  for (int j = 0; j < SUBJECTS; j++) {
  int sum = 0;
  for (int i = 0; i < STUDENTS; i++) {
  sum += grades[i][j];
  }
  averages[j] = (float)sum / STUDENTS;
  }
  }
  // 查找優秀學生
  void findTopStudent(int grades[STUDENTS][SUBJECTS]) {
  int topStudent = 0;
  int maxTotal = 0;
  for (int i = 0; i < STUDENTS; i++) {
  int total = 0;
  for (int j = 0; j < SUBJECTS; j++) {
  total += grades[i][j];
  }
  if (total > maxTotal) {
  maxTotal = total;
  topStudent = i;
  }
  }
  printf("\n=== 優秀學生 ===\n");
  printf("學生%d (總分: %d)\n", topStudent + 1, maxTotal);
  printf("各科成績: ");
  for (int j = 0; j < SUBJECTS; j++) {
  printf("%s:%d ", subjectNames[j], grades[topStudent][j]);
  }
  printf("\n");
  }
三維數組
#include <stdio.h>
  #define X 2
  #define Y 3
  #define Z 4
  int main() {
  // 三維數組聲明和初始化
  int cube[X][Y][Z] = {
  {   // 第一個二維平面
  {1, 2, 3, 4},
  {5, 6, 7, 8},
  {9, 10, 11, 12}
  },
  {   // 第二個二維平面
  {13, 14, 15, 16},
  {17, 18, 19, 20},
  {21, 22, 23, 24}
  }
  };
  printf("=== 三維數組示例 ===\n");
  // 訪問三維數組元素
  printf("cube[0][1][2] = %d\n", cube[0][1][2]);  // 7
  printf("cube[1][2][3] = %d\n", cube[1][2][3]);  // 24
  // 遍歷三維數組
  printf("\n三維數組內容:\n");
  for (int i = 0; i < X; i++) {
  printf("平面 %d:\n", i);
  for (int j = 0; j < Y; j++) {
  for (int k = 0; k < Z; k++) {
  printf("%d\t", cube[i][j][k]);
  }
  printf("\n");
  }
  printf("\n");
  }
  // 計算三維數組元素總和
  int total = 0;
  for (int i = 0; i < X; i++) {
  for (int j = 0; j < Y; j++) {
  for (int k = 0; k < Z; k++) {
  total += cube[i][j][k];
  }
  }
  }
  printf("三維數組元素總和: %d\n", total);
  return 0;
  }

5. 字符數組和字符串

字符數組基礎
#include <stdio.h>
  #include <string.h>
    int main() {
    printf("=== 字符數組和字符串 ===\n");
    // 方式1:字符數組(不是字符串,因為沒有null終止符)
    char arr1[] = {'H', 'e', 'l', 'l', 'o'};
    // 方式2:字符串(以null字符'\0'結尾)
    char arr2[] = "Hello";
    // 方式3:指定大小的字符數組
    char arr3[10] = "Hello";
    // 方式4:逐個初始化
    char arr4[6];
    arr4[0] = 'H';
    arr4[1] = 'e';
    arr4[2] = 'l';
    arr4[3] = 'l';
    arr4[4] = 'o';
    arr4[5] = '\0';  // 重要:添加null終止符
    printf("arr1 (字符數組): ");
    for (int i = 0; i < 5; i++) {
    printf("%c", arr1[i]);
    }
    printf("\n");
    printf("arr2 (字符串): %s\n", arr2);
    printf("arr3: %s\n", arr3);
    printf("arr4: %s\n", arr4);
    // 字符串長度
    printf("arr2長度: %lu\n", strlen(arr2));
    printf("arr2數組大小: %lu\n", sizeof(arr2));  // 包括'\0'
    return 0;
    }
字符串操作函數
#include <stdio.h>
  #include <string.h>
    int main() {
    char str1[50] = "Hello";
    char str2[50] = "World";
    char str3[100];
    char str4[50];
    printf("=== 字符串操作函數 ===\n");
    // 字符串長度
    printf("str1長度: %lu\n", strlen(str1));
    // 字符串複製
    strcpy(str3, str1);
    printf("複製後str3: %s\n", str3);
    // 字符串連接
    strcat(str3, " ");
    strcat(str3, str2);
    printf("連接後str3: %s\n", str3);
    // 字符串比較
    printf("str1和str2比較: %d\n", strcmp(str1, str2));
    printf("str1和\"Hello\"比較: %d\n", strcmp(str1, "Hello"));
    // 字符串查找
    char *found = strchr(str3, 'W');
    if (found != NULL) {
    printf("在str3中找到'W': %s\n", found);
    }
    // 子字符串查找
    found = strstr(str3, "World");
    if (found != NULL) {
    printf("在str3中找到\"World\": %s\n", found);
    }
    // 字符串分割
    char text[] = "apple,banana,cherry,date";
    char *token = strtok(text, ",");
    printf("分割字符串:\n");
    while (token != NULL) {
    printf("- %s\n", token);
    token = strtok(NULL, ",");
    }
    return 0;
    }
自定義字符串函數
#include <stdio.h>
  // 自定義字符串函數
  int myStrlen(const char *str);
  void myStrcpy(char *dest, const char *src);
  void myStrcat(char *dest, const char *src);
  int myStrcmp(const char *str1, const char *str2);
  int main() {
  char str1[50] = "Hello";
  char str2[50] = "World";
  char result[100];
  printf("=== 自定義字符串函數 ===\n");
  printf("myStrlen(\"%s\") = %d\n", str1, myStrlen(str1));
  myStrcpy(result, str1);
  printf("myStrcpy: %s\n", result);
  myStrcat(result, " ");
  myStrcat(result, str2);
  printf("myStrcat: %s\n", result);
  printf("myStrcmp(\"%s\", \"%s\") = %d\n", str1, str2, myStrcmp(str1, str2));
  printf("myStrcmp(\"%s\", \"%s\") = %d\n", str1, "Hello", myStrcmp(str1, "Hello"));
  return 0;
  }
  // 自定義字符串長度函數
  int myStrlen(const char *str) {
  int length = 0;
  while (str[length] != '\0') {
  length++;
  }
  return length;
  }
  // 自定義字符串複製函數
  void myStrcpy(char *dest, const char *src) {
  int i = 0;
  while (src[i] != '\0') {
  dest[i] = src[i];
  i++;
  }
  dest[i] = '\0';  // 添加null終止符
  }
  // 自定義字符串連接函數
  void myStrcat(char *dest, const char *src) {
  // 找到dest的結尾
  int dest_len = myStrlen(dest);
  int i = 0;
  // 將src複製到dest的結尾
  while (src[i] != '\0') {
  dest[dest_len + i] = src[i];
  i++;
  }
  dest[dest_len + i] = '\0';  // 添加null終止符
  }
  // 自定義字符串比較函數
  int myStrcmp(const char *str1, const char *str2) {
  int i = 0;
  while (str1[i] != '\0' && str2[i] != '\0') {
  if (str1[i] != str2[i]) {
  return str1[i] - str2[i];
  }
  i++;
  }
  return str1[i] - str2[i];
  }

6. 數組與指針的關係

數組名即指針
#include <stdio.h>
  int main() {
  int numbers[] = {10, 20, 30, 40, 50};
  int size = sizeof(numbers) / sizeof(numbers[0]);
  printf("=== 數組與指針的關係 ===\n");
  printf("數組名numbers: %p\n", numbers);
  printf("&numbers[0]: %p\n", &numbers[0]);
  printf("數組名等於第一個元素的地址: %s\n",
  numbers == &numbers[0] ? "是" : "否");
  // 通過指針訪問數組元素
  printf("\n通過指針訪問數組:\n");
  int *ptr = numbers;  // ptr指向數組的第一個元素
  for (int i = 0; i < size; i++) {
  printf("numbers[%d] = %d, *(ptr + %d) = %d\n",
  i, numbers[i], i, *(ptr + i));
  }
  // 指針運算
  printf("\n指針運算:\n");
  printf("*ptr = %d\n", *ptr);        // 第一個元素
  printf("*(ptr + 1) = %d\n", *(ptr + 1));  // 第二個元素
  printf("*(ptr + 2) = %d\n", *(ptr + 2));  // 第三個元素
  // 修改數組元素通過指針
  *(ptr + 1) = 99;
  printf("\n修改後numbers[1] = %d\n", numbers[1]);
  return 0;
  }
數組作為函數參數
#include <stdio.h>
  // 函數聲明
  void processArray(int *arr, int size);
  void modifyArray(int arr[], int size);
  int main() {
  int numbers[] = {1, 2, 3, 4, 5};
  int size = sizeof(numbers) / sizeof(numbers[0]);
  printf("=== 數組作為函數參數 ===\n");
  printf("原始數組: ");
  for (int i = 0; i < size; i++) {
  printf("%d ", numbers[i]);
  }
  printf("\n");
  // 數組作為指針傳遞
  processArray(numbers, size);
  printf("processArray調用後: ");
  for (int i = 0; i < size; i++) {
  printf("%d ", numbers[i]);
  }
  printf("\n");
  // 數組作為數組傳遞
  modifyArray(numbers, size);
  printf("modifyArray調用後: ");
  for (int i = 0; i < size; i++) {
  printf("%d ", numbers[i]);
  }
  printf("\n");
  return 0;
  }
  // 使用指針語法
  void processArray(int *arr, int size) {
  for (int i = 0; i < size; i++) {
  arr[i] *= 2;  // 修改數組元素
  }
  }
  // 使用數組語法(實際上還是指針)
  void modifyArray(int arr[], int size) {
  for (int i = 0; i < size; i++) {
  arr[i] += 10;  // 修改數組元素
  }
  }

7. 動態數組(使用指針和malloc)

#include <stdio.h>
  #include <stdlib.h>
    // 函數聲明
    int* createDynamicArray(int size);
    void inputDynamicArray(int *arr, int size);
    void printDynamicArray(int *arr, int size);
    void freeDynamicArray(int *arr);
    int main() {
    int size;
    int *dynamicArray;
    printf("=== 動態數組示例 ===\n");
    printf("請輸入數組大小: ");
    scanf("%d", &size);
    if (size <= 0) {
    printf("錯誤:數組大小必須為正數!\n");
    return 1;
    }
    // 創建動態數組
    dynamicArray = createDynamicArray(size);
    if (dynamicArray == NULL) {
    printf("錯誤:內存分配失敗!\n");
    return 1;
    }
    // 輸入數組元素
    printf("請輸入%d個整數:\n", size);
    inputDynamicArray(dynamicArray, size);
    // 顯示數組元素
    printf("動態數組內容: ");
    printDynamicArray(dynamicArray, size);
    // 計算總和和平均值
    int sum = 0;
    for (int i = 0; i < size; i++) {
    sum += dynamicArray[i];
    }
    printf("總和: %d\n", sum);
    printf("平均值: %.2f\n", (float)sum / size);
    // 釋放內存
    freeDynamicArray(dynamicArray);
    return 0;
    }
    // 創建動態數組
    int* createDynamicArray(int size) {
    int *arr = (int*)malloc(size * sizeof(int));
    return arr;
    }
    // 輸入動態數組
    void inputDynamicArray(int *arr, int size) {
    for (int i = 0; i < size; i++) {
    printf("元素 %d: ", i + 1);
    scanf("%d", &arr[i]);
    }
    }
    // 打印動態數組
    void printDynamicArray(int *arr, int size) {
    for (int i = 0; i < size; i++) {
    printf("%d ", arr[i]);
    }
    printf("\n");
    }
    // 釋放動態數組內存
    void freeDynamicArray(int *arr) {
    free(arr);
    printf("動態數組內存已釋放\n");
    }

8. 實際應用示例

示例1:投票統計系統
#include <stdio.h>
  #define CANDIDATES 5
  #define MAX_VOTERS 100
  // 候選人名稱
  const char* candidateNames[] = {
  "張三", "李四", "王五", "趙六", "錢七"
  };
  int main() {
  int votes[CANDIDATES] = {0};  // 初始化所有候選人的票數為0
  int voterCount = 0;
  int choice;
  printf("=== 投票統計系統 ===\n");
  printf("候選人列表:\n");
  for (int i = 0; i < CANDIDATES; i++) {
  printf("%d. %s\n", i + 1, candidateNames[i]);
  }
  printf("0. 結束投票\n");
  // 收集投票
  while (voterCount < MAX_VOTERS) {
  printf("\n選民 %d, 請選擇候選人 (1-%d, 0結束): ",
  voterCount + 1, CANDIDATES);
  scanf("%d", &choice);
  if (choice == 0) {
  break;  // 結束投票
  }
  if (choice < 1 || choice > CANDIDATES) {
    printf("無效選擇!請選擇1-%d之間的數字。\n", CANDIDATES);
    continue;
    }
    // 記錄投票
    votes[choice - 1]++;
    voterCount++;
    printf("感謝您的投票!\n");
    }
    // 顯示投票結果
    printf("\n=== 投票結果 ===\n");
    printf("總投票數: %d\n", voterCount);
    int maxVotes = 0;
    int winner = -1;
    for (int i = 0; i < CANDIDATES; i++) {
    printf("%s: %d票 (%.1f%%)\n",
    candidateNames[i], votes[i],
    (float)votes[i] / voterCount * 100);
    if (votes[i] > maxVotes) {
    maxVotes = votes[i];
    winner = i;
    }
    }
    // 檢查是否有並列第一
    int tieCount = 0;
    for (int i = 0; i < CANDIDATES; i++) {
    if (votes[i] == maxVotes) {
    tieCount++;
    }
    }
    if (tieCount > 1) {
    printf("\n並列第一的候選人:\n");
    for (int i = 0; i < CANDIDATES; i++) {
    if (votes[i] == maxVotes) {
    printf("- %s\n", candidateNames[i]);
    }
    }
    } else {
    printf("\n獲勝者: %s (%d票)\n", candidateNames[winner], maxVotes);
    }
    return 0;
    }
示例2:矩陣運算
#include <stdio.h>
  #define ROWS 2
  #define COLS 3
  // 函數聲明
  void printMatrix(int matrix[ROWS][COLS], const char* name);
  void addMatrices(int A[ROWS][COLS], int B[ROWS][COLS], int result[ROWS][COLS]);
  void multiplyByScalar(int matrix[ROWS][COLS], int scalar, int result[ROWS][COLS]);
  int findMatrixMax(int matrix[ROWS][COLS]);
  int findMatrixMin(int matrix[ROWS][COLS]);
  int main() {
  int matrixA[ROWS][COLS] = {
  {1, 2, 3},
  {4, 5, 6}
  };
  int matrixB[ROWS][COLS] = {
  {6, 5, 4},
  {3, 2, 1}
  };
  int result[ROWS][COLS];
  printf("=== 矩陣運算 ===\n");
  // 顯示原始矩陣
  printMatrix(matrixA, "矩陣A");
  printMatrix(matrixB, "矩陣B");
  // 矩陣加法
  addMatrices(matrixA, matrixB, result);
  printMatrix(result, "A + B");
  // 標量乘法
  multiplyByScalar(matrixA, 2, result);
  printMatrix(result, "2 × A");
  // 查找最大值和最小值
  printf("矩陣A的最大值: %d\n", findMatrixMax(matrixA));
  printf("矩陣A的最小值: %d\n", findMatrixMin(matrixA));
  printf("矩陣B的最大值: %d\n", findMatrixMax(matrixB));
  printf("矩陣B的最小值: %d\n", findMatrixMin(matrixB));
  return 0;
  }
  // 打印矩陣
  void printMatrix(int matrix[ROWS][COLS], const char* name) {
  printf("%s:\n", name);
  for (int i = 0; i < ROWS; i++) {
  for (int j = 0; j < COLS; j++) {
  printf("%d\t", matrix[i][j]);
  }
  printf("\n");
  }
  printf("\n");
  }
  // 矩陣加法
  void addMatrices(int A[ROWS][COLS], int B[ROWS][COLS], int result[ROWS][COLS]) {
  for (int i = 0; i < ROWS; i++) {
  for (int j = 0; j < COLS; j++) {
  result[i][j] = A[i][j] + B[i][j];
  }
  }
  }
  // 標量乘法
  void multiplyByScalar(int matrix[ROWS][COLS], int scalar, int result[ROWS][COLS]) {
  for (int i = 0; i < ROWS; i++) {
  for (int j = 0; j < COLS; j++) {
  result[i][j] = matrix[i][j] * scalar;
  }
  }
  }
  // 查找矩陣最大值
  int findMatrixMax(int matrix[ROWS][COLS]) {
  int max = matrix[0][0];
  for (int i = 0; i < ROWS; i++) {
  for (int j = 0; j < COLS; j++) {
  if (matrix[i][j] > max) {
  max = matrix[i][j];
  }
  }
  }
  return max;
  }
  // 查找矩陣最小值
  int findMatrixMin(int matrix[ROWS][COLS]) {
  int min = matrix[0][0];
  for (int i = 0; i < ROWS; i++) {
  for (int j = 0; j < COLS; j++) {
  if (matrix[i][j] < min) {
  min = matrix[i][j];
  }
  }
  }
  return min;
  }

9. 數組的常見錯誤

#include <stdio.h>
  int main() {
  printf("=== 數組常見錯誤 ===\n");
  int numbers[5] = {1, 2, 3, 4, 5};
  // ❌ 錯誤1:數組越界訪問
  /*
  printf("numbers[5] = %d\n", numbers[5]);  // 越界訪問
  printf("numbers[-1] = %d\n", numbers[-1]); // 越界訪問
  */
  // ✅ 正確:使用有效索引
  printf("有效訪問: numbers[0] = %d, numbers[4] = %d\n",
  numbers[0], numbers[4]);
  // ❌ 錯誤2:數組整體賦值
  /*
  int arr1[3] = {1, 2, 3};
  int arr2[3];
  arr2 = arr1;  // 錯誤:不能直接賦值數組
  */
  // ✅ 正確:逐個元素複製
  int arr1[3] = {1, 2, 3};
  int arr2[3];
  for (int i = 0; i < 3; i++) {
  arr2[i] = arr1[i];
  }
  printf("數組複製成功\n");
  // ❌ 錯誤3:數組大小使用變量(C89標準)
  /*
  int size = 5;
  int arr[size];  // 在C89中錯誤,C99支持變長數組
  */
  // ✅ 正確:使用常量或宏定義大小
  #define SIZE 5
  int arr[SIZE];
  printf("使用常量定義數組大小\n");
  // ❌ 錯誤4:字符串未正確終止
  /*
  char str[5] = {'H', 'e', 'l', 'l', 'o'};  // 不是字符串,缺少'\0'
  printf("%s\n", str);  // 可能導致未定義行為
  */
  // ✅ 正確:確保字符串以'\0'結尾
  char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
  printf("正確字符串: %s\n", str);
  return 0;
  }