1. 程式人生 > 其它 >第五節 結構體、列舉、聯合

第五節 結構體、列舉、聯合

1. 結構體

#include <iostream>
#include <string>

using namespace std;

//變數之間是相互獨立的,陣列是一組相同型別的變數
//在實際應用中,會出現不同變數之間具有緊密邏輯關係的情況

//結構體是將不同型別的資料進行組合,形成新的資料型別的資料結構
//結構體的宣告與定義:

//建立結構體Book
//結構體Book由兩個變數構成
struct Book
{
    string Title; // 每一個變數稱為一個屬性
    int id;
};

// 駝峰命名法 首字母大寫


Book CreateBook(int id, string
title) { //使用結構體 //宣告結構體變數時,除了要寫明結構體型別,還要再宣告時加上struct關鍵字 //建立構造體時,與變數不同,需要呼叫建構函式進行結構體的記憶體建立 struct Book newBook = Book(); //訪問結構體中的變數要使用"."符號 newBook.id = id; newBook.Title = title; //結構體的初始化還可以使用下列格式 struct Book newBook2 = { title, id }; return newBook; } //typedef關鍵字可以為一個型別重新起一個新的名稱
//使用新的名字後,就是一個新的資料型別 typedef string CarID; typedef int CarWeight; typedef int CarType; //使用typedef為Car結構體起一個新的名稱 struct Car { CarID id; CarWeight Weight; CarType Type; }typedef Truck; //Truck和Car是同一個結構體 Truck CreatCar(CarID id, CarWeight weight, CarType type) { //使用typedef後,在建立結構體變數時就可以省略struct關鍵字
Car newCar = Car(); //結構體指標中的變數使用"->"進行訪問 newCar.id = id; newCar.Weight = weight; newCar.Type = type; return newCar; }

2. 列舉

#include <iostream>
#include <string>

using namespace std;

struct Student_Info
{
    string Name;
    string Id;
    // 對於性別這個屬性,如果設計為字串容易輸出,如果設計為布林值容易判斷
    string Gender; // bool Gender
};

struct Car_Info
{
    string Grand;
    string Type; // 問題:系統可以接受那些Type?
};

// 為了限定可輸入的資訊,或者為了同時具有可讀性與計算性,設計了列舉型別
enum CarType
{
    Truck, Taxi, Ambulance, SportsCar, Jeep //....
};

enum FilmType
{
    Comedy, SciFi = 10, Crime, War = 5, Horror, Action = 11
};

int main()
{
    cout << "Truck: " << CarType::Truck << endl;
    cout << "Taxi: " << CarType::Taxi << endl;
    cout << "Ambulance: " << CarType::Ambulance << endl << endl << endl;

    cout << "Comedy: " << FilmType::Comedy << endl;
    cout << "SciFi: " << FilmType::SciFi << endl;
    cout << "Crime: " << FilmType::Crime << endl;
    cout << "War: " << FilmType::War << endl;
    cout << "Horror: " << FilmType::Horror << endl;
    cout << "Action: " << FilmType::Action << endl; // 可能出現邏輯錯誤
}

3. 聯合

#include <iostream>
#include <string>

using namespace std;

struct Student_Info
{
    string Name;
    string Id;
    string Gender;
    int Age;
};

// 聯合與結構體不同之處在於,所有屬性成員,共用同一塊記憶體空間
union Car_Info
{
    double Size;
    int Weight;
    float Height;
};

enum CarType
{
    Truck, Taxi, Ambulance, SportsCar, Jeep //....
};


int main()
{
    cout << "Sizeof String: " << sizeof(string) << endl;
    cout << "SizeOf Student_Info: " << sizeof(Student_Info) << endl;
    cout << "SizeOf Car_Info: " << sizeof(Car_Info) << endl;
    cout << "SizeOf CarType: " << sizeof(CarType) << endl;

    Car_Info car;
    car.Weight = 22;
    cout << "Size: " << car.Size << " Height: " << car.Height << " Weight: " << car.Weight << endl;
    car.Weight = -22;
    cout << "Size: " << car.Size << " Height: " << car.Height << " Weight: " << car.Weight << endl;
}

4. 練習

//建立結構體Student,包含姓名、學號、性別、年齡、聯絡方式
//為Student建立建構函式完成初始化
//以自己的資訊為例,建立Student變數,並在螢幕中列印個人資訊
struct Student
{
    string Name;
    string ID;
    bool Gender;
    string Contect;
};

Student CreateStudent(string name, string id, bool gender, string contect) {
    return Student(name, id, gender, contect);
}

void PrintInfo(Student stu)
{
    cout << "學號:\t" << stu.ID << endl;
    cout << "姓名:\t" << stu.Name << endl;
    cout << "性別:\t" << stu.Gender << endl;
    cout << "聯絡方式:\t" << stu.Contect << endl;
}
//建立複數的結構體,並完成複數的加法,乘法運算

struct complex //定義一個複數結構體
{
    int real; //實數
    int imaginary; //虛數
};

complex ComplexAdd (complex a, complex b) 
{
    return complex{a.real + b.real, a.imaginary + b.imaginary};
}

complex ComplexMulti (complex a, complex b)
{
    return complex{
        a.real * b.real - a.imaginary * b.imaginary,
        a.real * b.imaginary + b.real + b.imaginary
    };
}

5. 作業

1. 建立結構體Calendar,其具有年份、月份、日期、時、分、秒六個屬性
2. 建立函式,預設建立1900-1-1-00:00:00日期
3. 建立增加指定天數和減去指定天數的函式,注意跨月、跨年(閏年)操作
4. 建立列印日期函式,列印當前的時間,格式為YYYY-MM-DD HH:mm:SS