Structure
Overview รู้จักกับ structure การประกาศและใช้งาน structure การประกาศและใช้งาน union
Structure
ฐานข้อมูลระเบียนประวัติการศึกษา นิสิต มหาวิทยาลัยเกษตรศาตร์ ID NAME AGE ADDRESS COURSE ID COURSE NAME COURSE DESC CREDIT STUDENT ID COURSE ID[4] GRADE[4] COURSE GRADE
STUDENT ID in memory NAME AGE ID NAME AGE ADDRESS ADDRESS STUDENT
GRADE ID in memory COURSE GRADE ID COURSE ID[4] GRADE[4] GRADE
What is structure ? Structure – โครงสร้าง คือ กลุ่มของข้อมูลที่มีชนิดเหมือนกันหรือต่างกันก็ได้ ซึ่งนำมารวมกลุ่มแล้วเรียกเป็นชื่อเดียวกัน Structure มีประโยชน์มากในการสร้างและจัดการโครงสร้างข้อมูลที่ซับซ้อน
Structure Vs Array Structures ไม่เหมือนกับ arrays structure สามารถมี array ในตัวมันเองได้ structure สามารถเขียนให้ซับซ้อนหรือธรรมดาก็ได้ขึ้นอยู่กับความต้องการของ programmer
ข้อสังเกตุ ข้อสังเกต struct เป็นคำสงวน ซึ่งมันจะทำหน้าที่เป็นชนิดข้อมูลชนิดใหม่เรียกว่า aggregate type จุดประสงค์ของ structures คือเป็นการให้ tool สำหรับการสร้างรูปแบบของตัวแปรตามที่เราต้องการ structure มีส่วนประกอบ 2 ส่วนคือ structure-name ชื่อของ structure variables (called members) ภายใน structure ซึ่งทุกตัวแปร variable ภายใน structure เองก็จะมีชื่อของมันเองด้วย
Declaration and Syntax structure จะถูกประกาศเหมือนกับการสร้างแม่แบบของตัวแปร ตัวอย่างการประกาศ ซึ่งทั้งนี้ต้องประกาศไว้ส่วนหัวของโปรแกรม struct PersonalData { char name[namesize]; char address[addresssize]; int YearOfBirth; int MonthOfBirth; int DayOfBirth; };
จากตัวอย่างเป็นการประกาศโครงสร้างของ struct PersonalData โดยที่ประกอบไปด้วย ตัวแปร string ที่เราจะเรียกว่า name ตัวแปร string ที่เราจะเรียกว่า address ตัวแปร integers 3 ตัวที่เราจะเรียกว่า YearOfBirth, MonthOfBirth และ DayOfBirth ตัวแปรใดที่ประกาศชนิดเป็น struct PersonalData ก็จะมีส่วนต่างๆดังที่กล่าวไปแล้ว
char address[addresssize]; int YearOfBirth; int MonthOfBirth; struct PersonalData { char name[namesize]; char address[addresssize]; int YearOfBirth; int MonthOfBirth; int DayOfBirth; }; PersonalData name address YearOfBirth MonthOfBirth DayOfBirth
struct PersonalData x; ขั้นต่อไป เนื่องจากว่าเป็นการสร้างโครงสร้างไว้ยังไม่มีเนื้อที่ในหน่วยความจำ เป็นเพียงการประกาศข้อมูลชนิดใหม่ ตัวอย่างการประกาศ struct PersonalData x; เป็นการประกาศตัวแปร x ที่มีชนิดเป็น struct PersonalData
X struct PersonalData x; Memory Other variable name address YearOfBirth MonthOfBirth DayOfBirth
Declaration and Syntax รูปแบบการประกาศ structure struct [ชื่อโครงสร้าง] { [<ชนิดตัวแปร> <สมาชิกตัวที่ 1>]; [<ชนิดตัวแปร> <สมาชิกตัวที่ 2>]; . } [ตัวแปรที่ 1], [ตัวแปรที่ 2]; การนำ structure ที่ประกาศแล้วไปใช้ในส่วนอื่นของโปรแกรม struct [ชื่อโครงสร้าง] [ตัวแปรที่ 1];
ตัวอย่าง หากต้องการสร้างโครงสร้างข้อมูลที่เก็บจุดใน 2 มิติ พิจารณา จุดในระบบ 2 มิติ ต้องเก็บข้อมูลอะไรบ้าง (x, y) ตำแหน่งในแกน x และ y เก็บเป็นชนิดข้อมูลแบบอะไร
ตำแหน่งในแกน x X Y ตำแหน่งในแกน y
Declaration and Syntax (Cont.) รูปแบบการประกาศ structure สามารถทำได้หลายแบบ struct spoint{ int x, y; } p1; typedef struct spoint { int x, y; } tpoint; tpoint p1; struct spoint p2; struct { int x, y; } p1; struct spoint{ int x, y; }; struct spoint p1; typedef struct { int x, y; } tpoint; tpoint p1;
struct spoint{ int x, y; } p1; รูปแบบที่ 1 เป็นการประกาศรูปแบบโครงสร้างและตั้งชื่อรูปแบบนี้ว่า spoint พร้อมกับทําการประกาศตัวแปรสําหรับโครงสร้างนี้ 1 ตัว คือ p1 การประกาศโครงสร้างในรูปแบบนี้สามารถนําโครงสร้างนี้ไปใช้สําหรับการประกาศตัวแปรใหม่ที่มีโครงสร้างเหมือนกับ p1 ได้โดยไม่ต้องประกาศโครงสร้างนี้ใหม่ หากต้องการประกาศตัวแปร p3 ซึ่งมีโครงสร้างรูปแบบเดียวกับ p1 สามารถทําได้โดยเพิ่มคําสั่งต่อไปนี้ struct spoint p3;
Example 1 ตัวอย่างที่ 1 ประกาศชื่อ structure พร้อมประกาศตัวแปร #include <stdio.h> struct spoint { int x, y; } p1; struct spoint p2; int main() { struct spoint p3; //... } ชื่อโครงสร้าง ตัวแปร
struct { int x, y; } p1; แบบที่ 2 เป็นการประกาศรูปแบบโครงสร้างหนึ่งขึ้นมา พร้อมกับการประกาศตัวแปรสำหรับโครงสร้าง 1 ตัว คือ p1
Example 2 ตัวอย่างที่ 2 ประกาศตัวแปร แต่ไม่ประกาศชื่อของ structure #include <stdio.h> struct { int x, y; } p1; int main() { //... } ตัวแปร
struct spoint{ int x, y; }; struct spoint p1; แบบที่ 3 คล้ายกับรูปแบบที่ 1 เป็นการประกาศโครงสร้างแต่ไม่ประกาศตัวแปรพร้อมกับประกาศโครงสร้าง แต่จะมีการประกาศตัวแปรทีหลัง
Example 3 ตัวอย่างที่ 3 ประกาศชื่อ structure แต่ประกาศตัวแปรภายหลัง #include <stdio.h> struct spoint { int x, y; }; struct spoint p1; int main() { struct spoint p2; //... } ชื่อโครงสร้าง ตัวแปร
typedef typedef ใช้ประกาศชนิดตัวแปรชนิดใหม่ มีรูปแบบคือ typedef struct { int x, y; } tpoint; ประกาศชนิดตัวแปรชื่อ tpoint เป็นแบบ structure typedef int INTEGER; ประกาศชนิดตัวแปรชื่อ INTEGER เป็นชนิด int ประกาศชนิดตัวแปรชื่อ char100 เป็น array ของ char ขนาด 100 typedef char[100] char100;
typedef struct spoint { int x, y; } tpoint; tpoint p1; struct spoint p2; typedef struct { รูปแบบที่ 4 และ 5 เป็นการกําหนดชนิดข้อมูลใหม่โดยใช้คําสั่ง typedef เพื่อให้สามารถ อ้างถึงรูปแบบโครงสร้างได้สั้นลงจากรูปแบบที่ 2 เมื่อต้องการประกาศตัวแปรใหม่ต้อง อ้างถึงโครงสร้างด้วยคำสั่ง struct spoint point1; หากใช้การประกาศโครงสร้างในรูปแบบที่ 4 หรือ 5 สามารถประกาศตัวแปรใหม่ด้วยคําสั่ง tpoint point1;
Example 4 ตัวอย่างที่ 4 ประกาศ structure เป็นชนิดตัวแปรชนิดใหม่ พร้อมประกาศชื่อโครงสร้าง #include <stdio.h> typedef struct spoint { int x, y; } tpoint; tpoint p1; struct spoint p2; int main() { tpoint p3; struct spoint p4; //... } ชื่อโครงสร้าง ชื่อชนิดข้อมูล ตัวแปร
Example 5 ตัวอย่างที่ 5 ประกาศ structure เป็นชนิดตัวแปรชนิดใหม่ แต่ไม่ประกาศชื่อ structure #include <stdio.h> typedef struct { int x, y; } tpoint; tpoint p1; int main() { tpoint p2; //... } ชื่อชนิดข้อมูล ตัวแปร
การอ้างถึงสมาชิกของตัวแปรแบบ structure <ชื่อโครงสร้าง>.<ชื่อสมาชิก> ตัวอย่าง #include <stdio.h> struct spoint { int x, y; } p1; int main() { p1.x = 10; } ใช้งาน p1.x เหมือนตัวแปรปกติ
การกำหนดค่าเริ่มต้นให้ตัวแปรแบบ structure ตัวอย่าง struct spoint { int x, y; } p1 = {10,10}; struct spoint p2 = {20,20}; typedef struct spoint { int x, y; } tpoint; tpoint p1 = {10,10};
การกำหนดค่าให้ตัวแปร structure p1.x = 10; p1.y = 20; กำหนดค่าตัวแปร structure โดยตรงไม่ได้ (ยกเว้นตอนกำหนดค่าเริ่มต้น) p1 = {10,20}; ตัวแปรแบบ structure ที่เป็นชนิดเดียวกันสามารถกำหนดค่าให้กันได้ p1 = p2; ถ้า p1 และ s2 เป็น structure คนละตัวให้ค่ากันไม่ได้ p1 = s2;
การเปรียบเทียบตัวแปร structure if (p1 == p2) การเปรียบเทียบตัวแปร structure ใช้การเปรียบเทียบสมาชิก if ((p1.x == p2.x) && (p1.y == p2.y))
การใช้ตัวแปร structure กับ cin และ cout cout << p1; cin >> p1; การใช้งานใช้ผ่านสมาชิกของ structure นั้น cout << p1.x << p2.y; Cin >> p1.x >> p2.y;