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;
}
本文章為轉載內容,我們尊重原作者對文章享有的著作權。如有內容錯誤或侵權問題,歡迎原作者聯繫我們進行內容更正或刪除文章。