ตอนที่ 6: โครงสร้างข้อมูล

. . . . . . . .วันนี้เป็นเรื่องโครงสร้างช้อมูล ถ้าเราเคยใช้ระบบ record ของฐานข้อมูล DBASE, Foxpro หรือ ฐานข้อมูลอื่นๆ จะเห็นโครงสร้างข้อมูล จะมีรายละเอียดย่อยที่เราเรียกว่า ฟิลด์ และการใช้งานในลักษณะนั้น สามารถทำได้แบบนี้
#include <stdio.h>

#include <conio.h>

typedef struct TRecord //<------ วิธีกำหนดโครงสร้าง

{ //<--- ขอบเขตของโครงสร้าง

char data[80]; //<----- รายการย่อยเรียกว่า ฟิลด์ชื่อ data

char name[80]; //<----- รายการย่อยเรียกว่า ฟิลด์ชื่อ name

}; //<--- สิ้นสุดขอบเขตของโครงสร้าง

int main( )

{

struct TRecord rec1; //<------ ตัวแปรโครงสร้างของ TRecord ชื่อ rec1

strcpy( rec1.data, "Sawasdee" ); //<----- copy ข้อความให้ฟิลด์ data ของ rec1

printf( "%s\n", rec1.data ); //<----- พิมพ์ข้อมูล

return 0;

}

Sawasdee
. . . . . . . .จากตัวอย่างข้างบน วิธีการกำหนดโครงสร้างให้ทำแบบนี้

typedef struct TRecord //<------ วิธีกำหนดโครงสร้าง

{

//...... ข้างในนี้คือรายการย่อยเรียกว่า ฟิลด์

};

การกำหนดตัวแปรโครงสร้างให้ทำแบบนี้

struct TRecord rec1; //<------ ตัวแปรโครงสร้างของ TRecord ชื่อ rec1

การใช้งานฟิลด์ในโครงสร้างให้ทำแบบนี้

rec1.data //<------- ให้ใส่จุดไช่ปลาแล้วตามด้วยชื่อฟิลด์

ดูแล้วไม่ยากเลยใช่ไหม กลับไปดูใหม่ได้นะครับ ต่อไปเป็นโครงสร้างแบบซ้อน

#include <stdio.h>

#include <conio.h>

typedef struct TSubRecord

{

char data[80]; //<----- รายการย่อยเรียกว่า ฟิลด์ชื่อ data

};

typedef struct TRecord //<------ วิธีกำหนดโครงสร้าง

{ //<--- ขอบเขตของโครงสร้าง

char data[80]; //<----- รายการย่อยเรียกว่า ฟิลด์ชื่อ data

struct TSubRecord sub1; //<----- ตัวแปรโครงสร้างซ้อน

}; //<--- สิ้นสุดขอบเขตของโครงสร้าง

int main( )

{

struct TRecord rec1; //<------ ตัวแปรโครงสร้างของ TRecord ชื่อ rec1

strcpy( rec1.data, "Sawasdee" ); //<----- copy ข้อความให้ฟิลด์ data ของ rec1

strcpy( rec1.sub1.data, "Sawasdee2" ); //<----- copy ข้อความให้ฟิลด์ data ของ sub1

printf( "%s\n", rec1.data ); //<----- พิมพ์ข้อมูล

printf( "%s\n", rec1.sub1.data ); //<----- พิมพ์ข้อมูล

return 0;

}

Sawasdee

Sawasdee2

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

การใช้งานฟิลด์ในโครงสร้างแรก

rec1.data //<------- ให้ใส่จุดไช่ปลาแล้วตามด้วยชื่อฟิลด์

การใช้งานฟิลด์ในโครงสร้างที่สอง

rec1.sub1.data //<------- ให้ใส่จุดไช่ปลาแล้วตามด้วยชื่อฟิลด์

ไม่ยากอะไรใช่ไหม ลองเพิ่มฟิลด์สิครับ ไม่จำกัดรูปแบบ แต่อย่าลืมการอ้างถึงต้องมีจุดไข่ปลาเสมอ ลองดูอีกแบบนะครับ เป็นการกำหนดฟิลด์แบบต่างๆในโครงสร้าง

#include <stdio.h>

#include <conio.h>

typedef struct TSubRecord

{

char data[80]; //<----- รายการย่อยเรียกว่า ฟิลด์ชื่อ data

};

typedef struct TRecord //<------ วิธีกำหนดโครงสร้าง

{ //<--- ขอบเขตของโครงสร้าง

char data[80]; //<----- รายการย่อยเรียกว่า ฟิลด์ชื่อ data

int value1; //<------ กำหนดแบบ Integer

long value2; //<--- กำหนดแบบ long

struct TSubRecord sub1; //<----- ตัวแปรโครงสร้างซ้อน

}; //<--- สิ้นสุดขอบเขตของโครงสร้าง

int main( )

{

struct TRecord rec1;

strcpy( rec1.data, "Sawasdee" );

rec1.value1 = 100;

rec1.value2 = 200;

strcpy( rec1.sub1.data, "Sawasdee2" ); //<----- copy ข้อความให้ฟิลด์ data ของ sub1

printf( "%s\n", rec1.data );

printf( "%i\n", rec1.value1 );

printf( "%i\n", rec1.value2 );

printf( "%s\n", rec1.sub1.data );

return 0;

}

Sawasdee

100

200

Sawasdee2

วันนี้ได้อะไรหว่า ???

typedef struct TSubRecord

{

char data[80]; //<----- รายการย่อยเรียกว่า ฟิลด์ชื่อ data

};

typedef struct TRecord //<------ วิธีกำหนดโครงสร้าง

{ //<--- ขอบเขตของโครงสร้าง

char data[80]; //<----- รายการย่อยเรียกว่า ฟิลด์ชื่อ data

int value1; //<------ กำหนดแบบ Integer

long value2; //<--- กำหนดแบบ long

struct TSubRecord sub1; //<----- ตัวแปรโครงสร้างซ้อน

}; //<--- สิ้นสุดขอบเขตของโครงสร้าง

strcpy( rec1.data, "Sawasdee" );

rec1.value1 = 100;

rec1.value2 = 200;

strcpy( rec1.sub1.data, "Sawasdee2" ); //<----- copy ข้อความให้ฟิลด์ data ของ sub1

. . . . . . . .วันนี้ออกจะสั้นเพราะเป็นเนื้อหาที่ไม่ซับซ้อนมากนัก แต่ควรจะลองเขียนบ่อยๆ เพราะรูปแบบโครงสร้าง มีใช้ในโปรแกรมทุกโปรแกรม ต่อไปจะเข้าเรื่อง ตัวแปร pointer นะครับ หลังจากนั้นจะพาเขียนกราฟฟิกครับ ใกล้แล้วๆ