第五節 結構體、列舉、聯合
阿新 • • 發佈:2021-10-21
1. 結構體
#include <iostream> #include <string> using namespace std; //變數之間是相互獨立的,陣列是一組相同型別的變數 //在實際應用中,會出現不同變數之間具有緊密邏輯關係的情況 //結構體是將不同型別的資料進行組合,形成新的資料型別的資料結構 //結構體的宣告與定義: //建立結構體Book //結構體Book由兩個變數構成 struct Book { string Title; // 每一個變數稱為一個屬性 int id; }; // 駝峰命名法 首字母大寫 Book CreateBook(int id, stringtitle) { //使用結構體 //宣告結構體變數時,除了要寫明結構體型別,還要再宣告時加上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