結(jié)構(gòu)體屬于用戶自定義的數(shù)據(jù)類型,允許用戶存儲不同的數(shù)據(jù)類型
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供民樂企業(yè)網(wǎng)站建設(shè),專注與做網(wǎng)站、成都網(wǎng)站設(shè)計、H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為民樂眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計公司優(yōu)惠進(jìn)行中。
語法: struct 結(jié)構(gòu)體名{ 結(jié)構(gòu)體成員列表 };
通過結(jié)構(gòu)體創(chuàng)建變量的方式有三種:
示例:
#include
#include
using namespace std;
//1、創(chuàng)建學(xué)生數(shù)據(jù)類型;
//學(xué)生:姓名,年齡,分?jǐn)?shù)
//自定義數(shù)據(jù)類型,一些類型集合組成的一個類型
//語法 struct 類型名稱 { 成員列表 };
struct Student
{
//成員列表
//姓名
string name;
//年齡
int age;
//分?jǐn)?shù)
int score;
}s3;
//2、通過學(xué)生類型創(chuàng)建具體學(xué)生
//2.1 struct Student s1;
//2.2 struct Student s2 = {...}
//2.3 在定義結(jié)構(gòu)體時候順便創(chuàng)建結(jié)構(gòu)體變量
int main()
{
//2.1 struct Student s1;
//struct 關(guān)鍵字可以省略
struct Student s1;
s1.name = "張三";
s1.age = 18;
s1.score = 100;
cout << "姓名:" << s1.name << " 年齡:" << s1.age << " 分?jǐn)?shù):" << s1.score << endl;
//2.2 struct Student s2 = {...}
struct Student s2 = { "李四",19,80 };
cout << "姓名:" << s2.name << " 年齡:" << s2.age << " 分?jǐn)?shù):" << s2.score << endl;
//2.3 在定義結(jié)構(gòu)體時候順便創(chuàng)建結(jié)構(gòu)體變量
s3.name = "王五";
s3.age = 30;
s3.score = 100;
cout << "姓名:" << s3.name << " 年齡:" << s3.age << " 分?jǐn)?shù):" << s3.score << endl;
system("pause");
return 0;
}
作用:將自定義的結(jié)構(gòu)體放入到數(shù)組中方便維護(hù);
語法:struct 結(jié)構(gòu)體名 數(shù)組名[元素個數(shù)] = { {},{},..{} }
示例:
#include
#include
using namespace std;
//結(jié)構(gòu)體數(shù)組
//1、定義結(jié)構(gòu)體
struct Student
{
//姓名
string name;
//年齡
int age;
//分?jǐn)?shù)
int score;
};
int main()
{
//2、創(chuàng)建結(jié)構(gòu)體數(shù)組
struct Student stuArray[8] =
{
{"張三",18,100},
{"李四",29,99},
{"王五",18,50}
};
//3、給結(jié)構(gòu)體數(shù)組中的元素賦值
stuArray[0].name = "趙六";
stuArray[0].age = 80;
stuArray[0].score = 60;
//4、遍歷結(jié)構(gòu)體數(shù)組
for (int i = 0; i < 3; i++)
{
cout << "姓名" << stuArray[i].name
<< " 年齡:" << stuArray[i].age
<< " 分?jǐn)?shù):" << stuArray[i].score << endl;
}
system("pause");
return 0;
}
作用:通過指針訪問結(jié)構(gòu)體中的成員
->
可以通過結(jié)構(gòu)體指針訪問結(jié)構(gòu)體屬性示例:
#include
#include
using namespace std;
//結(jié)構(gòu)體指針
//定義學(xué)生結(jié)構(gòu)體
struct Student
{
string name;//姓名
int age;//年齡
int score; //分?jǐn)?shù)
};
int main()
{
//創(chuàng)建學(xué)生結(jié)構(gòu)體變量
struct Student s = { "張三",18,100 };
//通過指針指向結(jié)構(gòu)體變量
struct Student* p = &s;
//通過指針訪問結(jié)構(gòu)體變量中數(shù)據(jù)
cout << "姓名: " << p->name << " 年齡: " << p->age << " 分?jǐn)?shù): " << p->score << endl;
system("pause");
return 0;
}
作用:結(jié)構(gòu)體中的成員可以是另一個結(jié)構(gòu)體
例如:每個老師輔導(dǎo)一個學(xué)員,一個老師的結(jié)構(gòu)體中,記錄一個學(xué)生的結(jié)構(gòu)體
示例:
#include
#include
using namespace std;
//定義學(xué)生結(jié)構(gòu)體
struct Student
{
string name;//學(xué)生的姓名
int age; //學(xué)生的年齡
int score;//學(xué)生的分?jǐn)?shù)
};
//定義老師結(jié)構(gòu)體
struct Teacher
{
int id;//職工編號
string name; //教師姓名
int age; //年齡
struct Student stu;//輔導(dǎo)的學(xué)生
};
int main()
{
//結(jié)構(gòu)體嵌套結(jié)構(gòu)體
//創(chuàng)建老師
struct Teacher t;
t.id = 2102;
t.name = "王老師";
t.age = 66;
t.stu.name = "王同學(xué)";
t.stu.age = 18;
t.stu.score = 99;
cout << "老師姓名: " << t.name << " 老師編號:" << t.id
<< " 老師年齡: " << t.age
<< " 老師輔導(dǎo)學(xué)生為" << t.stu.name <<" 學(xué)生年齡"
<< t.stu.age << " 學(xué)生分?jǐn)?shù)" << t.stu.score
<< endl;
system("pause");
return 0;
}
作用:將結(jié)構(gòu)體作為參數(shù)向函數(shù)中傳遞
傳遞方式有兩種:
示例:
#include
#include
using namespace std;
//定義學(xué)生結(jié)構(gòu)體
struct Student
{
//姓名
string name;
//年齡
int age;
//分?jǐn)?shù)
int score;
};
//打印學(xué)生信息函數(shù)
//1、值傳遞
void printStudent1(struct Student s)
{
s.age = 100;
cout << "子函數(shù)1中 姓名:" << s.name << " 年齡:" << s.age << " 分?jǐn)?shù):" << s.score << endl;
}
//2、地址傳遞
void printStudent2(struct Student* s)
{
s->age = 66;
cout << "子函數(shù)2中 姓名:" << s->name << " 年齡:" << s->age << " 分?jǐn)?shù):" << s->score << endl;
}
int main()
{
//結(jié)構(gòu)體做函數(shù)參數(shù)
//將學(xué)生傳入到一個參數(shù)中,打印學(xué)生身上的所有信息
//創(chuàng)建結(jié)構(gòu)體變量
struct Student s;
s.name = "張三";
s.age = 18;
s.score = 88;
cout << "main 函數(shù)中打印 姓名:" << s.name << " 年齡:" << s.age << " 分?jǐn)?shù):" << s.score << endl;
printStudent2(&s);
printStudent1(s);
cout << "main 函數(shù)中打印 姓名:" << s.name << " 年齡:" << s.age << " 分?jǐn)?shù):" << s.score << endl;
system("pause");
return 0;
}
作用:用const來防止誤操作
示例:
#include
#include
using namespace std;
//const使用場景
struct Student
{
//姓名
string name;
//年齡
int age;
//分?jǐn)?shù)
int score;
};
//值傳遞
void printStudent01(Student s)
{
s.age = 150;
cout << "姓名: " << s.name << " 年齡: " << s.age << " 分?jǐn)?shù): " << s.score << endl;
}
//地址傳遞
//將函數(shù)中的形參改為指針,可以減少內(nèi)存空間,而且不會賦值新的副本出來
//加入const之后,不能修改。只能讀不能寫。
void printStudent02(const struct Student* s)
{
cout << "姓名: " << s->name << " 年齡: " << s->age << " 分?jǐn)?shù): " << s->score << endl;
}
int main()
{
//創(chuàng)建結(jié)構(gòu)體變量
struct Student s = { "張三", 15,98 };
//通過函數(shù)打印結(jié)構(gòu)體變量信息
printStudent01(s);
cout << "main 中 姓名: " << s.name << " 年齡: " << s.age << " 分?jǐn)?shù): " << s.score << endl;
system("pause");
return 0;
}
案例描述:學(xué)校正在做畢設(shè)項目,每名老師帶領(lǐng)5個學(xué)生,總共有3名老師,需求如下:
示例:
#include
#include
#include
using namespace std;
//學(xué)生的結(jié)構(gòu)體
struct Student
{
//姓名
string sName;
//分?jǐn)?shù)
int score;
};
//老師的結(jié)構(gòu)體定義
struct Teacher
{
//姓名
string tName;
//學(xué)生數(shù)組
struct Student sArray[5];
};
//給老師和學(xué)生賦值的函數(shù)
//給老師
void allocateSpace(struct Teacher tArray[], int len)
{
string nameSeed = "ABCDE";
//給老師開始賦值
for (int i = 0; i < len; i++)
{
tArray[i].tName = "Teacher_";
tArray[i].tName += nameSeed[i];
//通過循環(huán)給每名老師所帶的學(xué)生賦值
for (int j = 0; j < 5; j++)
{
tArray[i].sArray[j].sName = "Student_";
tArray[i].sArray[j].sName += nameSeed[j];
int random_score = rand() % 61 + 40;
tArray[i].sArray[j].score = random_score;
}
tArray[i].sArray;
}
}
void printInfo(struct Teacher tArray[], int len)
{
for (int i = 0; i < len; i++)
{
cout << "老師姓名:" << tArray[i].tName << endl;
for (int j = 0; j < 5; j++)
{
cout << "\t學(xué)生姓名:" << tArray[i].sArray[j].sName <<
" 考試分?jǐn)?shù):"<
案例描述:
設(shè)計一個英雄的結(jié)構(gòu)體,包括成員姓名,年齡,性別;創(chuàng)建結(jié)構(gòu)體數(shù)組,數(shù)組中存放5名英雄。通過冒泡排序的算法,將數(shù)組中的英雄按照年齡進(jìn)行升序排序,最終打印排序后的結(jié)果。
五名英雄的信息如下:
{"劉備", 23, "男"}
{"關(guān)羽", 22, "男"}
{"張飛", 20, "男"}
{"趙云", 21, "男"}
{"貂蟬", 19, "男"}
示例:
#include
#include
using namespace std;
//1、設(shè)計英雄的結(jié)構(gòu)體
struct Hero
{
//姓名
string name;
//年齡
int age;
//性別
string sex;
};
//冒泡排序
void bubbleSort(struct Hero heroArray[], int len)
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - i - 1; j++)
{
if (heroArray[j].age > heroArray[j + 1].age)
{
struct Hero temp = heroArray[j];
heroArray[j] = heroArray[j + 1];
heroArray[j + 1] = temp;
}
}
}
}
//打印排序后數(shù)組中的信息
void printHero(struct Hero heroArray[], int len)
{
for (int i = 0; i < len; i++)
{
cout << "姓名:" << heroArray[i].name << " 年齡:" << heroArray[i].age
<< " 性別:" << heroArray[i].sex << endl;
}
}
int main()
{
//2、創(chuàng)建數(shù)組存放5名英雄
struct Hero heroArray[5] = {
{"劉備", 23, "男"},
{"關(guān)羽", 22, "男"},
{"張飛", 20, "男"},
{"趙云", 21, "男"},
{"貂蟬", 19, "男"}
};
int len = sizeof(heroArray) / sizeof(heroArray[0]);
cout << "排序前的打印結(jié)果是" << endl;
for (int i = 0; i < len; i++)
{
cout << "姓名:" << heroArray[i].name << " 年齡:" << heroArray[i].age
<< " 性別:" << heroArray[i].sex << endl;
}
//3、對數(shù)組進(jìn)行排序,按照年齡進(jìn)行升序排列
bubbleSort(heroArray, len);
cout << "排序后的打印結(jié)果是" << endl;
//4、講排序后的結(jié)果打印輸出
printHero(heroArray, len);
system("pause");
return 0;
}