Tutorial

C Language 101 - Structure โครงสร้าง ฮ่ะ ? (EP.9)

By Arnon Puitrakul - 14 มิถุนายน 2015

C Language 101 - Structure โครงสร้าง ฮ่ะ ? (EP.9)

ก่อนจะเริ่มเนื้อหาของเรื่องนี้ ก็ต้องขอบคุณก่อนเลยครับ ที่อ่านมาเรื่อย ๆ จนถึงตอนนี้ ตอนนี้เราก็เดินทางกันมาจนจะจบแล้ว ขอบคุณมากจริง ๆ ครับ
เรามาเริ่มเรื่องของเราในวันนี้กันเลย วันนี้เราจะพูดถึง Structure หรือถ้าเอาภาษาไทยก็คือ โครงสร้าง ก่อนอื่นก็ต้องของเกริ่นก่อน

Structure คืออะไร ?

Structure คือโครงสร้างข้อมูลแบบนึง ที่เอาข้อมูลที่มีชนิดต่างกัน มาเก็บไว้ในโครงสร้างเดียวกัน แตกต่างจาก Array ที่เราเคยพูดกันไป เพราะว่าใน 1 Array จะเก็บข้อมูลได้แบบเดียวเท่านั้น เช่นเราบอกว่าให้ Array นี้เป็น int Member ทั้งหมดของ Array ก็จะต้องเป็น int หมด แต่กลับกัน Structure เราสามารถบอกว่า ให้ตัวนี้เป็น char ให้อันนี้เป็น int ได้ แล้วแต่เราเลย

แล้ว Structure เอามาทำอะไร ?

เมื่อกี้เรารู้กันไปแล้วว่า Structure นั้นคืออะไร แต่อาจจะยังนึกภาพไม่ออก ให้ลองนึกถึงทะเบียน นศ หรือ นร เราก็ได้ เล่น ๆ มันจะต้องมี ชื่อ นามสกุล เกรด อะไรแบบนี้ เจ้า Structure มันสามารถที่จะเก็บ 3 อย่างนี้ลงไปใน Structure เดียวได้เลย

struct Student
{
   char name [20];
   char surname [20];
   float grade;
};

จากตัวอย่างด้านบน เราสร้าง Structure ชื่อ Student ขึ้นมา เราบอกว่า ใน Student ก็จะมีตัวแปร name, surname และ grade อยู่ใน Structure Student อันเดียวกันได้เลย

ประกาศ Structure ยังไงล่ะ ?

เราลองมาดูรูปแบบของมันกันเลย

struct Name
{
   DataType No.1 VarName No.1
   ...
   DataType No.n VarName No.n
};

ตามด้านบนเลยครับ ก่อนอื่น เราก็ต้องใช้ Keyword คำว่า "struct" ก่อนเพื่อบอก Compiler ว่า นี่เราจะประกาศ Structure แล้วนะ แล้วตามด้วยชื่อของ Structure ถัดมาเปิดปีกกาเพื่อกำหนดขอบเขต
จากนั้นก็ประกาศรายละเอียดของ Structure ตามที่เราต้องการ ว่าจะมีอะไรอยู่ใน Structure นี้บ้าง Syntax เหมือนเราประกาศตัวแปรปกติเลย ถัดไปเกือบสุดท้าย ปิดปีกกา และอย่าลืม Semicolon ด้วยล่ะ

แต่เมื่อกี้เป็นเพียงแค่จุดเริ่มต้น

เมื่อกี้เราแค่บอกว่า Structure ตัวนี้มัน ชื่ออะไร ในนั้นมันจะมีอะไรบ้าง แต่เรายังใช้มันไม่ได้ เพราะเรายังไม่ได้สร้างมันออกมาจริง ๆ เมื่อกี้เหมือนเราแค่บอกพิมพ์เขียวมันเท่านั้น ตอนนี้เราจะเอาพิมพ์เขียวที่เราเขียนมาสร้างมันกัน ขอใช้ Structure Student ที่เคยเขียนไว้ข้างบนล่ะกัน

struct Student stu;

แค่นี้เลย บรรทัดเดียว เราแค่สร้าง Structure ที่จริง ๆ (ที่ไม่ใช่พิมพ์เขียวน่ะ) จาก Structure ที่ชื่อว่า Student โดยให้ Structure ก้อนนี้มีชื่อว่า stu เท่านั้นเอง ง่ายออกเนอะ !
Note : เราสามารถที่จะสร้าง Structure จากพิมพ์เขียวกี่อันก็ได้ ไม่จำกัดว่าจะเอามาสร้างได้กี่ครั้ง

การเข้าถึงข้อมูลใน Structure

เมื่อกี้ เราก็ได้สร้าง Structure กันไปแล้ว ทีนี้เรามาดูว่า เราจะทำงานกับมันยังไง หลัก ๆ แล้วทำงานกับตัวแปร เราก็ทำกับมันอยู่ได้ แค่ 2 อย่างเอง ก็คือ เรียกค่ามันออกมา กับ เปลี่ยนค่ามัน ซึ่งวิธีในการเข้าถึงค่าของมัน เราก็แค่ใช้ ชื่อ Structure ที่เราสร้าง (ที่สร้างจริง ๆ นะ ไม่ใช่พิมพ์เขียว) แล้วเติม . (Dot) ตามด้วยชื่อ สามาชิกของ Structure ที่เราต้องการ เช่นถ้า เราต้องการเข้าถึง name ใน Structure stu จากตัวอย่างข้างบน เราก็แค่บอกว่า

stu.grade = 3.22;
printf("%f",stu.grade);

เท่านี้เอง ง่ายนิดเดียวเองเนอะ ! ก็ใส่ชื่อ Structure ที่เราต้องการแล้วจุดแล้วใส่ Member ที่เราต้องการเข้าถึงเท่านั้นเอง เป็นอันจบ

Structure ซ้อน Structure

Member ของ Structure นอกจากเราใส่ตัวแปรธรรมดาลงไปได้แล้ว จริง ๆ เราจะใส่ Structure ซ้อนลงไปอีกก็ได้ เช่น

struct time
{
   int hour;
   int min;
   int sec;
};
struct checkIn
{
   char place [100];
   struct time checkTime;
};

ลองมาดูกันเลย ก่อนอื่นเราก็ประกาศ Structure ชื่อ time เพื่อเก็บรายละเอียดของเวลา พวก ชั่วโมง นาที วินาทีลงไป ถัดมา เราสร้าง Structure อีกตัวเพื่อเก็บประวัติการ Check-in ชื่อ checkIn ถ้าสังเกต Member ที่ชื่อ checkTime มันไม่ใช่ตัวแปรธรรมดานิ แต่มันเป็น อีก Structure นึงที่มาจาก time จริง ๆ เราสามารถเขียนอีกแบบก็จะได้

struct checkIn
{
   char place [100];
   struct time
   {
      int hour;
      int min;
      int sec;
   };
};

ซึ่งแบบนี้ก็ให้ผลไม่ต่างจากอันแรกเลย แต่ถ้าแนะนำ เขียนแบบแรกดีกว่า มันดูอ่านง่ายกว่าเยอะเลย

Array of Structure

เมื่อกี้เราก็ลองสร้าง Structure ซ้อน Structure กันไปแล้ว ด้วยตัวอย่าง Check-In แล้วถ้าสมมุติว่า เราต้องเขียนโปรแกรมที่ต้องเก็บประวัติการ Check-In ล่ะ ?
เพื่อการแก้ปัญหานี้ Array ก็จะเข้ามาช่วยเราได้ เราสามารถสร้าง Structure จากพิมพ์เขียวให้กลายเป็น Array of Structure ได้ Syntax จะเหมือนกับเราประกาศตัวแปรธรรมดาเลย ลองมาดูตัวอย่างกัน

struct checkIn checkHistory [100];

มีแค่นี้ล่ะครับ หมดแล้วกับเรื่องของ Structure สรุปเลยคือ Structure เป็นโครงสร้างข้อมูลประเภทนึงที่สามารถเก็บข้อมูลได้หลาย ๆ แบบใน Structure อันเดียว และยังสามารถเอา Structure ออกมาสร้างเป็น ตัว ๆ เดียว หรือ จะเอามา Implement เป็น Array ก็ได้ ด้วยความยืดหยุ่นของมันทำให้เราทำงานกับข้อมูลได้ง่ายขึ้นมาก ก่อนจะใช้เราก็ต้องสร้างมันขึ้นมาก่อน เหมือนกับสร้างพิมพ์เขียว ถัดมาเราถึงจะจับพิมพ์เขียวออกมาสร้างจริง (Implement) ถึงจะนำมันมาใช้ได้
สำหรับวันนี้ก็มีแค่นี้ล่ะครับ ตอนหน้าจะเป็นเรื่องอะไร ติดตามอ่านกันได้เลย ช่วงนี้กำลังปั่น Tutorial นี้ให้จบอยู่ ใกล้ล่ะ อีกไม่กี่ตอนก็น่าจะจบได้และ สำหรับวันนี้ก็ สวัสดีครับ ./.

Read Next...

ฮาวทูย้าย Synology Add-on Package ไปอีก Volume

ฮาวทูย้าย Synology Add-on Package ไปอีก Volume

เรื่องราวเกิดจากการที่เราต้องย้าย Add-on Package ใน DSM และคิดว่าหลาย ๆ คนน่าจะต้องประสบเรื่องราวคล้าย ๆ กัน วันนี้เราจะมาเล่าวิธีการว่า เราทำยังไง เจอปัญหาอะไร และ แก้ปัญหาอย่างไรให้ได้อ่านกัน...

จัดการ Docker Container ง่าย ๆ ด้วย Portainer

จัดการ Docker Container ง่าย ๆ ด้วย Portainer

การใช้ Docker CLI ในการจัดการ Container เป็นท่าที่เราใช้งานกันทั่วไป มันมีความยุ่งยาก และผิดพลาดได้ง่ายยังไม่นับว่ามี Instance หลายตัว ทำให้เราต้องค่อย ๆ SSH เข้าไปทำทีละตัว มันจะดีกว่ามั้ย หากเรามี Centralised Container Managment ที่มี Web GUI ให้เราด้วย วันนี้เราจะพาไปทำความรู้จักกับ Portainer กัน...

Host Website จากบ้านด้วย Cloudflare Tunnel ใน 10 นาที

Host Website จากบ้านด้วย Cloudflare Tunnel ใน 10 นาที

ปกติหากเราต้องการจะเปิดเว็บสักเว็บ เราจำเป็นต้องมี Web Server ตั้งอยู่ที่ไหนสักที่หนึ่ง ต้องใช้ค่าใช้จ่าย พร้อมกับต้องจัดการเรื่องความปลอดภัยอีก วันนี้เราจะมาแนะนำวิธีการที่ง่ายแสนง่าย ปลอดภัย และฟรี กับ Cloudflare Tunnel ให้อ่านกัน...

จัดการข้อมูลบน Pandas ยังไงให้เร็ว 1000x ด้วย Vectorisation

จัดการข้อมูลบน Pandas ยังไงให้เร็ว 1000x ด้วย Vectorisation

เวลาเราทำงานกับข้อมูลอย่าง Pandas DataFrame หนึ่งในงานที่เราเขียนลงไปให้มันทำคือ การ Apply Function เข้าไป ถ้าข้อมูลมีขนาดเล็ก มันไม่มีปัญหาเท่าไหร่ แต่ถ้าข้อมูลของเราใหญ่ มันอีกเรื่องเลย ถ้าเราจะเขียนให้เร็วที่สุด เราจะทำได้โดยวิธีใดบ้าง วันนี้เรามาดูกัน...