結構
Structures
講師:陳曉璇
Index
Struct
自定義資料型別
Intro
想像一下要如何儲存你們的段考成績……
- 首先,需要知道身分
- 學號 (int)
- 姓名 (String)
- 再來是成績
- 國文 (int)
- 英文 (int)
- 數學 (int)
資料型別不同,沒辦法用陣列
Intro
想像一下要如何儲存你們的段考成績……
- 首先,需要知道身分
- 學號 (int)
- 姓名 (String)
- 再來是成績
- 國文 (int)
- 英文 (int)
- 數學 (int)
用 Struct 自定義資料型別!
struct Grade{
int id;
string name;
int ch;
int en;
int math;
};
Declare
struct Grade{
int id;
string name;
int ch;
int en;
int math;
};
struct 結構名稱{
型別 名稱=初始值;
...
}; //分號要記得!!
Declare
#include <iostream>
using namespace std;
struct Grade{
int id;
string name;
int ch;
int en;
int math;
}student1,student2;
int main()
{
Grade student3={
.id=11130000,
.name="Shaunna",
.ch=40,
.en=50,
.math=15,
};
return 0;
}
struct 結構名稱{
型別 名稱=初始值;
...
}變數名稱1,變數名稱2;
//用逗號隔開,結尾要分號
結構名稱 變數名稱={初始值};
↳ 在宣告結構時一併宣告變數
↳ 當成型別來宣告
Access
#include <iostream>
using namespace std;
struct Grade{
int id;
string name;
int ch;
int en;
int math;
}student1,student2;
int main()
{
Grade student3={
.id=11130000,
.name="Shaunna",
};
cin >> student1.id >> student1.name;
cin >> student2.id >> student2.name;
cout << student1.id <<' '<< student1.name <<endl
<< student2.id <<' '<< student2.name <<endl
<< student3.id <<' '<< student3.name <<endl;
return 0;
}
結構變數名稱.成員;
Array
#include <iostream>
using namespace std;
struct Grade{
int id;
string name;
int ch;
int en;
int math;
};
int main()
{
Grade student[3]={
{.id=11130000, .name="Shiki",},
{.id=11120000, .name="Nagi",},
{.id=11110000, .name="Akira",},
};
for(int i=0;i<3;++i){
cout << student[i].id <<' '<< student[i].name <<endl;
}
return 0;
}
11130000 Shiki
11120000 Nagi
11110000 Akira
#include <iostream>
using namespace std;
typedef struct Grade{
int id;
string name;
int ch;
int en;
int math;
}grade;
//將struct Grade定義為grade(類似取別名)
int main()
{
grade student1;
Grade student2;
return0;
}
In Struct
Struct 應用
Struct in Struct
#include <iostream>
using namespace std;
struct identity{
int id;
string name;
};
struct Grade{
identity stu;
int ch;
int en;
int math;
};
int main()
{
Grade student[3]={
{.stu={.id=11130000,.name="Shiki"}},
{.stu={.id=11120000,.name="Nagi"}},
{.stu={.id=11110000,.name="Akira"}},
};
for(int i=0;i<3;++i){
cout << student[i].stu.id <<' '<< student[i].stu.name <<endl;
}
return 0;
}
11130000 Shiki
11120000 Nagi
11110000 Akira
Struct in Struct
#include <iostream>
using namespace std;
struct Grade{
identity stu;
int ch;
int en;
int math;
Grade gr;
};
int main()
{
Grade student[3]={
{.stu={.id=11130000,.name="Shiki"}},
{.stu={.id=11120000,.name="Nagi"}},
{.stu={.id=11110000,.name="Akira"}},
};
for(int i=0;i<3;++i){
cout << student[i].stu.id <<' '<< student[i].stu.name <<endl;
}
return 0;
}
CE
Function in Struct
#include <iostream>
using namespace std;
struct Grade{
int id;
string name;
int ch;
int en;
int math;
void print(){
cout << id <<' '<< name <<endl
<< ch <<' '<< en <<' '<< math;
}
};
int main()
{
Grade student={
.id=11130000,
.name="Shiki",
.ch=40,
.en=50,
.math=15,
};
student.print();
return 0;
}
11130000 Shiki
40 50 15
Multi-Key Sort
多鍵值排序——配合Struct
Review: sort
#include <algorithm>
using namespace std;
sort( 頭, 尾, 排序規則(預設升冪) );
int num[10]={4,3,5,1,2};
sort(num,num+5);
for(int i=0;i<5;i++){
cout << num[i] << " ";
}
1 2 3 4 5
Bool Function
以 國>英>數 成績排序為例
struct grade{
int id;
string name;
int ch;
int en;
int math;
void print(){
cout << id <<' '<< name <<endl
<< ch <<' '<< en <<' '<< math;
}
};
bool compare_grade (grade a,grade b){
if(a.ch==b.ch && a.en==b.en && a.math==b.math) return a.id<b.id;
else if(a.ch==b.ch && a.en==b.en) return a.math>b.math;
else if(a.ch==b.ch) return a.en>b.en;
else return a.ch>b.ch;
}
如果 國英數 成績皆相同,學號小者在前
Bool Function
以 國>英>數 成績排序為例
struct grade{
int id;
string name;
int ch;
int en;
int math;
void print(){
cout << id <<' '<< name <<endl
<< ch <<' '<< en <<' '<< math;
}
};
bool compare_grade (grade a,grade b){
if(a.ch==b.ch && a.en==b.en && a.math==b.math) return a.id<b.id;
else if(a.ch==b.ch && a.en==b.en) return a.math>b.math;
else if(a.ch==b.ch) return a.en>b.en;
else return a.ch>b.ch;
}
如果 國英 成績皆相同,數學大者在前
Bool Function
以 國>英>數 成績排序為例
struct grade{
int id;
string name;
int ch;
int en;
int math;
void print(){
cout << id <<' '<< name <<endl
<< ch <<' '<< en <<' '<< math;
}
};
bool compare_grade (grade a,grade b){
if(a.ch==b.ch && a.en==b.en && a.math==b.math) return a.id<b.id;
else if(a.ch==b.ch && a.en==b.en) return a.math>b.math;
else if(a.ch==b.ch) return a.en>b.en;
else return a.ch>b.ch;
}
如果 國 成績皆相同,英文大者在前
Bool Function
以 國>英>數 成績排序為例
struct grade{
int id;
string name;
int ch;
int en;
int math;
void print(){
cout << id <<' '<< name <<endl
<< ch <<' '<< en <<' '<< math;
}
};
bool compare_grade (grade a,grade b){
if(a.ch==b.ch && a.en==b.en && a.math==b.math) return a.id<b.id;
else if(a.ch==b.ch && a.en==b.en) return a.math>b.math;
else if(a.ch==b.ch) return a.en>b.en;
else return a.ch>b.ch;
}
如果 國 成績皆不相同,國 大者在前
Multi-Key Sort
#include <iostream>
#include <algorithm>
using namespace std;
struct grade{
int id;
string name;
int ch;
int en;
int math;
void print(){
cout << id <<' '<< name <<endl
<< ch <<' '<< en <<' '<< math;
}
};
bool compare_grade (grade a,grade b){
if(a.ch==b.ch && a.en==b.en && a.math==b.math) return a.id<b.id;
else if(a.ch==b.ch && a.en==b.en) return a.math>b.math;
else if(a.ch==b.ch) return a.en>b.en;
else return a.ch>b.ch;
}
int main()
{
grade student[4];
for(int i=0;i<4;++i){
cin >> student[i].id >> student[i].name
>> student[i].ch >> student[i].en >> student[i].math;
}
sort(student,student+4,compare_grade);
for(int i=0;i<4;++i){
student[i].print();
cout << "\n=====\n";
}
return 0;
}
/*
11030512 Chen 100 60 70
11040513 Wang 50 60 80
11030513 Ku 50 80 70
11030546 Huang 50 60 80
*/
11030512 Chen
100 60 70
=====
11030513 Ku
50 80 70
=====
11030546 Huang
50 60 80
=====
11040513 Wang
50 60 80
=====
Reference
Kahoot!
Structures
By shaunna163
Structures
- 126