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...

จัดการเรื่องแต่ละมื้อ แต่ละเดย์ด้วย Obsidian

จัดการเรื่องแต่ละมื้อ แต่ละเดย์ด้วย Obsidian

Obsidian เป็นโปรแกรมสำหรับการจด Note ที่เรียกว่า สารพัดประโยชน์มาก ๆ เราสามารถเอามาทำอะไรได้เยอะมาก ๆ หนึ่งในสิ่งที่เราเอามาทำคือ นำมาใช้เป็นระบบสำหรับการจัดการ Todo List ในแต่ละวันของเรา ทำอะไรบ้าง วันนี้เราจะมาเล่าให้อ่านกันว่า เราจัดการะบบอย่างไร...

Loop แท้ไม่มีอยู่จริง มีแต่ความจริงซึ่งคนโง่ยอมรับไม่ได้

Loop แท้ไม่มีอยู่จริง มีแต่ความจริงซึ่งคนโง่ยอมรับไม่ได้

อะ อะจ๊ะเอ๋ตัวเอง เป็นยังไงบ้างละ เมื่อหลายเดือนก่อน เราไปเล่าเรื่องกันขำ ๆ ว่า ๆ จริง ๆ แล้วพวก Loop ที่เราใช้เขียนโปรแกรมกันอยู่ มันไม่มีอยู่จริง สิ่งที่เราใช้งานกันมันพยายาม Abstract บางอย่างออกไป วันนี้เราจะมาถอดการทำงานของ Loop จริง ๆ กันว่า มันทำงานอย่างไรกันแน่ ผ่านภาษา Assembly...

Monitor การทำงาน MySQL ด้วย Prometheus และ Grafana

Monitor การทำงาน MySQL ด้วย Prometheus และ Grafana

นอกจากการทำให้ Application รันได้แล้ว อีกเรื่องที่สำคัญไม่แพ้กันคือการวางระบบ Monitoring ที่ดี วันนี้เราจะมาแนะนำวิธีการ Monitor การทำงานของ MySQL ผ่านการสร้าง Dashboard บน Grafana กัน...

เสริมความ"แข็งแกร่ง" ให้ SSH ด้วย fail2ban

เสริมความ"แข็งแกร่ง" ให้ SSH ด้วย fail2ban

จากตอนที่แล้ว เราเล่าในเรื่องของการ Harden Security ของ SSH Service ของเราด้วยการปรับการตั้งค่าบางอย่างเพื่อลด Attack Surface ที่อาจจะเกิดขึ้นได้ หากใครยังไม่ได้อ่านก็ย้อนกลับไปอ่านกันก่อนเด้อ วันนี้เรามาเล่าวิธีการที่มัน Advance มากขึ้น อย่างการใช้ fail2ban...