結構

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!

Made with Slides.com