C - 结构体数组

你好,有抱負的程序员們!今天,我們將踏上一段令人興奮的旅程,進入C程式設計的世界,特別是探索結構體數組。別擔心你對程式設計還是新手;我會以多年來在課堂上使用的同樣耐心和熱情引導你走過每一步。讓我們一起來看看吧!

C - Arrays of Structures

結構體和數組是什麼?

在我們跳進結構體數組之前,讓我們快速複習一下結構體和數組各自是什麼。

結構體

在C語言中,結構體就像一個容器,可以存放不同類型的數據。想像一下一個背包,你可以在其中存放各種物品 - 那就是你的結構體!例如:

struct Student {
char name[50];
int age;
float gpa;
};

在這裡,我們的Student結構體可以存放一個名字、年齡和GPA。很棒吧?

數組

另一方面,數組是同一類型項目的集合。想像一下一排相同的鎖櫃,每個鎖櫃都存放同種類的物品。例如:

int numbers[5] = {1, 2, 3, 4, 5};

這個名為numbers的數組可以存放5個整數。

現在,如果我們將這兩個概念結合起來會怎麼樣?那就是魔法的發生!

結構體數組

結構體數組正如其名 - 一個數組,其中每個元素都是一個結構體。這就像有一個滿是學生的教室,每個學生都有自己的特點。

讓我們探討一下如何使用這些強大的構造!

聲明結構體數組

要聲明一個結構體數組,我們首先定義我們的結構體,然後創建一個該結構體類型的數組。這是它的樣子:

struct Student {
char name[50];
int age;
float gpa;
};

struct Student class[30];

在這個例子中,我們創建了一個名為class的數組,可以存放30個學生的信息。這就像有30個學生卡片,每個都包含名字、年齡和GPA。

初始化結構體數組

現在,我們已經聲明了我們的數組,讓我們用一些數據填充它。我們可以通過兩種方式來做到這點:

  1. 在聲明時初始化:
struct Student class[3] = {
{"Alice", 20, 3.8},
{"Bob", 22, 3.5},
{"Charlie", 21, 3.9}
};
  1. 在聲明後初始化:
strcpy(class[0].name, "Alice");
class[0].age = 20;
class[0].gpa = 3.8;

strcpy(class[1].name, "Bob");
class[1].age = 22;
class[1].gpa = 3.5;

// ... 然後依此类推

記住,當在C語言中處理字符串時,我們使用strcpy來將值分配給字符數組。

讀取結構體數組

從結構體數組中讀取是直接了當的。我們可以使用數組索引和結構成員的點運算符來訪問個別元素:

printf("學生名字: %s\n", class[0].name);
printf("學生年齡: %d\n", class[0].age);
printf("學生GPA: %.2f\n", class[0].gpa);

我們也可以使用循環來讀取整個數組:

for (int i = 0; i < 3; i++) {
printf("學生 %d:\n", i+1);
printf("名字: %s\n", class[i].name);
printf("年齡: %d\n", class[i].age);
printf("GPA: %.2f\n\n", class[i].gpa);
}

這段代碼將打印我們class數組中所有三個學生的信息。

對結構體數組進行排序

對結構體數組進行排序要複雜一些,但別擔心 - 我們會一步步分解。讓我們假設我們要按照學生的GPA從高到低對學生進行排序:

#include <string.h>

void swap(struct Student *a, struct Student *b) {
struct Student temp = *a;
*a = *b;
*b = temp;
}

void sortByGPA(struct Student arr[], int n) {
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (arr[j].gpa < arr[j+1].gpa) {
swap(&arr[j], &arr[j+1]);
}
}
}
}

// 使用方法:
sortByGPA(class, 3);

這段代碼使用冒泡排序算法來排列我們的學生基於他們的GPA。調用sortByGPA後,class數組將會以最高GPA為首進行排序。

聲明指向結構體數組的指針

指針是C語言中的強大工具,我們也可以將它們與我們的結構體數組一起使用。這是怎樣聲明指向結構體數組的指針:

struct Student *classPtr = class;

現在,classPtr指向我們class數組的第一個元素。我們可以使用這個指針來訪問元素:

printf("第一個學生的名字: %s\n", classPtr->name);
printf("第二個學生的年齡: %d\n", (classPtr+1)->age);

注意在使用指向結構的指針時使用箭頭運算符(->)。

結論

恭喜你!你剛剛在C程式設計的旅程中迈出了重要的一步。結構體數組在現實世界的編程場景中非常有用。想像一下管理學校數據庫、組織圖書館目錄或跟踪商店庫存 - 所有這些任務在有了結構體數組後都會變得更加容易。

記住,熟能生巧。嘗試創建你自己的結構體數組,用數據填充它們,對它們進行排序,並嘗試不同的方法來操作數據。在你還沒有察覺之前,你將會像專家一樣構建你的代碼!

快樂編程,願你的數組總是正確索引!

Credits: Image by storyset