一個結(jié)構(gòu)體變量中可以存放一組有關(guān)聯(lián)的數(shù)據(jù)(如一個學(xué)生的學(xué)號、姓名、成績等數(shù)據(jù))。如果有 10 個學(xué)生的數(shù)據(jù)需要參加運(yùn)算,顯然應(yīng)該用數(shù)組,這就是結(jié)構(gòu)體數(shù)組。結(jié)構(gòu)體數(shù)組與以前介紹過的數(shù)值型數(shù)組的不同之處在于每個數(shù)組元素都是一個結(jié)構(gòu)體類型的數(shù)據(jù),它們都分別包括各個成員項(xiàng)。
目錄
一、定義結(jié)構(gòu)體數(shù)組
1.1舉例說明
1.2定義
二、結(jié)構(gòu)體數(shù)組的應(yīng)用舉例
一、定義結(jié)構(gòu)體數(shù)組
1.1舉例說明
下面舉一個簡單的例子來說明怎樣定義和引用結(jié)構(gòu)體數(shù)組。
舉例:有 3 個候選人,每個選民只能投票選一人,要求編一個統(tǒng)計(jì)選票的程序,先后輸入被選人的名字,最后輸出各人得票結(jié)果。
解題思路:顯然,需要設(shè)一個結(jié)構(gòu)體數(shù)組,數(shù)組中包含 3 個元素,每個元素中的信息應(yīng)包括候選人的姓名(字符型)和得票數(shù)(整型)。輸入被選人的姓名,然后與數(shù)組元素中的 “ 姓名 ” 成員比較,如果相同,就給這個元素中的 “ 得票數(shù) ” 成員的值加 1。最后輸出所有元素的信息。
#include<stdio.h>
#include<string.h>
struct Person //聲明結(jié)構(gòu)體類型
{
char name[20];
int count;
};
int main()
{
struct Person leader[3] = { "zhang",0,"wang",0,"liu",0 }; //初始化結(jié)構(gòu)體變量
char leader_name[20];
for (int i = 0; i < 10; i++)
{
scanf_s("%s", leader_name, 20); //輸入所選候選人姓名
for (int j = 0; j < 3; j++)
{
if (strcmp(leader_name, leader[j].name) == 0)
leader[j].count++;
}
}
printf("結(jié)果是:\n");
for (int j = 0; j < 3; j++)
{
printf("%5s:%d\n", leader[j].name, leader[j].count);
}
return 0;
}
運(yùn)行結(jié)果:
程序分析:
定義一個全局的結(jié)構(gòu)體數(shù)組 leader,它有 3 個元素,每一個元素包含兩個成員 name(姓名)和 count(票數(shù))。在定義數(shù)組時使之初始化,將 " Li " 賦給 leader[0].name,0 賦給 leader[0].count," Zhang "賦給 leader[1].name,0 賦給 leader[1].count," Sun " 賦給 leader[2].name,0 賦給 leader[2].count。這樣,3 位候選人的票數(shù)全部先置零。
在主函數(shù)中定義字符數(shù)組 leader_name,用它存放被選人的姓名。在每次循環(huán)中輸入一個被選人姓名,然后把它與結(jié)構(gòu)體數(shù)組中 3 個候選人姓名相比,看它和哪一個候選人的名字相同。注意leader_name 是和 leader 數(shù)組第 j 個元素的 name 成員相比。若 j 為某一值時,輸入的姓名與 leader[j].name 相等,就執(zhí)行 “ leader[j].count++”,由于成員運(yùn)算符 “.” 優(yōu)先于自增運(yùn)算符 “++”,因此它相當(dāng)于(leader[j].count)++,使 leader[j] 成員 count 的值加 1。在輸入和統(tǒng)計(jì)結(jié)束之后,將 3 人的名字和得票數(shù)輸出。
1.2定義
(1)定義結(jié)構(gòu)體數(shù)組一般形式是
struct 結(jié)構(gòu)體名
{????????成員表列
} 數(shù)組名[數(shù)組長度];
先聲明一個結(jié)構(gòu)體類型(如 struct Person),然后再用此類型定義結(jié)構(gòu)體數(shù)組:
結(jié)構(gòu)體類型 數(shù)組名[數(shù)組長度];
如:
struct Person leader[3];????????//leader是結(jié)構(gòu)體數(shù)組名
(2)對結(jié)構(gòu)體數(shù)組初始化的形式是在定義數(shù)組的后面加上:
= {初值表列};
如:
struct Person leader[3] = {"zhang", 0, "wang", 0, "liu", 0};
二、結(jié)構(gòu)體數(shù)組的應(yīng)用舉例
舉例:有 n 個學(xué)生的信息(包括學(xué)號、姓名、成績),要求按照成績的高低順序輸出各學(xué)生的信息。
解題思路:用結(jié)構(gòu)體數(shù)組存放 n 個學(xué)生信息,采用選擇法對各元素進(jìn)行排序(進(jìn)行比較的是各元素中的成績)。
#include<stdio.h>
struct Student //聲明結(jié)構(gòu)體類型
{
int num;
char name[20];
float score;
};
int main()
{
const int n = 5; //定義常變量
struct Student stu[n] = { 1001,"wang",88,1002,"li",85,1003,"liu",98,1004,"zhao",95,1005,"wu",87 };
for (int i = 0; i < n - 1; i++) //選擇排序
{
int k = i;
for (int j = i + 1; j < n; j++)
{
if (stu[j].score > stu[k].score)
k = j;
}
if (k != i) //stu[k]和stu[i]互換
{
Student temp;
temp = stu[i];
stu[i] = stu[k];
stu[k] = temp;
}
}
printf("排序?yàn)椋篭n");
for (int i = 0; i < n; i++)
{
printf("%6d %8s %6.2f\n", stu[i].num, stu[i].name, stu[i].score);
}
}
運(yùn)行結(jié)果:?
程序分析:
(1)程序中第 11 行定義了常變量 n,在程序運(yùn)行期間它的值不能改變。如果學(xué)生數(shù)改為 30 人,只須把第 11 行改為即可。
也可以不用常變量,而用符號常量,可以取消第 11 行,同時在第 2 行前加一行:
# define N 5
(2)在定義結(jié)構(gòu)體數(shù)組時進(jìn)行初始化,為清晰起見,將每個學(xué)生的信息用一對花括號包起來,這樣做,閱讀和檢查比較方便,尤其當(dāng)數(shù)據(jù)量多時,這樣是有好處的。文章來源:http://www.zghlxwxcb.cn/news/detail-804691.html
(3)在執(zhí)行第 1 次外循環(huán)時i的值為0,經(jīng)過比較找出 5 個成績中最高成績所在的元素的序號為 k,然后將 stu[k] 與 stu[i] 對換(對換時借助臨時變量temp)。執(zhí)行第 2 次外循環(huán)時i的值為 1,參加比較的只有 4 個成績了,然后將這 4 個成績中最高的所在的元素與 stu[1] 對換。其余類推。注意臨時變量 temp 也應(yīng)定義為 struct Student 類型,只有同類型的結(jié)構(gòu)體變量才能互相賦值。程序 21 行是將 stu[k] 元素中所有成員和 stu[i] 元素中所有成員整體互換(而不必人為地指定一個一個成員地互換)。從這點(diǎn)也可以看到使用結(jié)構(gòu)體類型的好處。文章來源地址http://www.zghlxwxcb.cn/news/detail-804691.html
到了這里,關(guān)于C語言自定義數(shù)據(jù)類型(二)使用結(jié)構(gòu)體數(shù)組的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!