วันพฤหัสบดีที่ 10 กรกฎาคม พ.ศ. 2557

8.8 ข้อมูลแบบยูเนียน (unions)

8.8 ข้อมูลแบบยูเนียน  (unions)                       
            8.8.1  ความหมายและลักษณะของข้อมูลแบบยูเนียน
            ยูเนียน  คือ  ข้อมูลแบบหนึ่งที่สามารถกำหนดให้ตัวแปรต่างชนิดกัน ใช้เนื้อที่ในหน่วยความจำของเครื่องร่วมกันได้  ทำให้การใช้เนื้อที่ภายในหน่วยความจำลดลง
            เช่น  สมมติว่าเรามีตัวแปรอยู่  3 ตัว  คือตัวแปร  a, b  และ  c  ตามลำดับ  โดยที่ตัวแปร  a  เป็นชนิด  integer,  ตัวแปร b  เป็นชนิด  floating  point  และตัวแปร  c เป็นชนิด  single  character  และเราต้องการให้ตัวแปร  a, b  และ  c  ใช้เนื้อที่ภายในหน่วยความจำร่วมกัน
                                                           
            ลักษณะเช่นนี้ต้องใช้ข้อมูลแบบยูเนียนเพราะตัวแปรต่างชนิดกัน ใช้เนื้อที่ภายในหน่วยความจำร่วมกันได้โดยใช้คำสั่งดังนี้

union   {
      int  a;
      float  b;
      char c;
}  ShareArea;
            8.8.2  การประกาศข้อมูลแบบยูเนียน 
            (declaration  of  an  unions  data  type)
            สามารถทำได้โดยใช้คำสั่ง   union  มาช่วยในการประกาศข้อมูลแบบยูเนียน  โดยมีรูปแบบการประกาศดังนี้
รูปแบบที่  1
union      union_name
{
      type1 name1;
      type2 name2;
      ………
      typeN nameN;
}  union_var;
 รูปแบบที่  2
union  union_name
{
      type1  name1;
      type2  name2;
      ………
      typeN  nameN;
};
union  union_name  union_var;
                         โดยที่

union  เป็นคำสั่งที่ใช้ประกาศข้อมูลแบบยูเนียน
union_name  เป็นชื่อข้อมูลแบบยูเนียน  ใช้สำหรับการประกาศข้อมูลแบบยูเนียนกลุ่มอื่นให้มีโครงสร้างเหมือนกลุ่มยูเนียนที่เคยประกาศไว้แล้ว
union_var  เป็นชื่อตัวแปรยูเนียนใช้สำหรับการอ้างอิงภายในยูเนียน
type1  name1, type2  name2,…, typeN  nameN  เป็นชนิดและชื่อตัวแปรตัวที่ 1, 2, 3, …, N  ตามลำดับ  บางครั้งอาจจะเรียก  name1, name2,…, nameN   ว่า   element 1, element2, …, element N  ตามลำดับ
ตัวอย่างที่  8.6  แสดงการประกาศข้อมูลแบบยูเนียน
 union  same
{
int  j;
char  ch;
float   a;
}  one;
หรือใช้คำสั่ง

union   same
{
int  j;
char  ch;
float   a;
} ;
union   same  one;
            เมื่อใช้คำสั่งประกาศข้อมูลแบบยูเนียนข้างต้น  ภายในหน่วยความจำจะมีลักษณะการจองเนื้อที่ไว้ดังนี้



           รูปที่  8.5  แสดงการจองเนื้อที่ภายในหน่วยความจำของข้อมูลแบบยูเนียนชื่อ  same
            จากรูปข้างต้นจะเห็นได้ว่ามีการจองเนื้อที่ในหน่วยความจำมากที่สุดเพียง  4  bytes  ซึ่งเพียงพอสำหรับตัวแปรชนิด  float  เนื่องจาก  float  ใช้เนื้อที่มากที่สุด  4  bytes  ส่วน  int  ใช้  2  bytes  และ  char  ใช้  1  bytes  เมื่อใช้คำสั่ง  union  จะมีการจองเนื้อที่เพื่อให้ใช้หน่วยความจำร่วมกันได้โดยใช้หลักการจอง เนื้อที่เท่ากับตัวแปรที่ใช้มากที่สุด  ถึงแม้ว่าจะมีข้อมูลต่างชนิดกันก็ตาม

            8.8.3 การอ้างอิงตัวแปรภายในข้อมูลแบบยูเนียน 
            (accessing  union  members)
            การอ้างอิงสมาชิกหรือตัวแปรภายในข้อมูลแบบยูเนียน  สามารถทำได้โดยเรียกชื่อตัวแปรยูเนียน (union_var)  ตามด้วยเครื่องหมาย  .  (period)  จากนั้นก็ตามด้วยชื่อตัวแปรภายในยูเนียน  (element_name  หรือ  member_name)  ซึ่งมีลักษณะการอ้างอิงทำนองเดียวกันกับข้อมูลแบบโครงสร้าง
รูปแบบการอ้างอิงตัวแปรภายในยูเนียน

union_var.member_name
เช่น  จากตัวอย่างการประกาศยูเนียนที่ผ่านมา   ถ้าต้องการอ้างอิงภายในยูเนียนสามารถ   ทำได้ดังนี้
same.a  หมายถึง  ตัวแปร  a  ที่อยู่ในยูเนียน  same
same.ch  หมายถึง  ตัวแปร  ch  ที่อยู่ในยูเนียน  same
same.j  หมายถึง  ตัวแปร  j  ที่อยู่ในยูเนียน  same

เพื่อความเข้าใจในการใช้ยูเนียนมากยิ่งขึ้น  ให้ศึกษาจากโปรแกรมตัวอย่าง  ดังต่อไปนี้
                                     โปรแกรมตัวอย่างที่  8.8 แสดงการใช้ยูเนียน





/*             union1.c                                */
#include<stdio.h>                                                                      /*  บรรทัดที่  1  */
#include<conio.h>                                                                      /*  บรรทัดที่  2  */
void main(void)                                                                           /*  บรรทัดที่  3  */
{                                                                                                 /*  บรรทัดที่  4  */
      union intflo                                                                                /*  บรรทัดที่  5  */
{                                                                                                /*  บรรทัดที่  6  */
      int num;                                                                                 /*  บรรทัดที่  7  */
      float f;                                                                                     /*  บรรทัดที่  8  */
} unsame;                                                                                /*  บรรทัดที่  9  */
      clrscr();                                                                                     /*  บรรทัดที่  10  */
      printf("Size of union intflo = %d\n", sizeof(union intflo));              /*  บรรทัดที่  11  */
      unsame.num = 25;                                                                 /*  บรรทัดที่  12  */
      printf("Number = %d\n", unsame.num);                                  /*  บรรทัดที่  13  */
      unsame.f = 1.2345;                                                                  /*  บรรทัดที่  14  */
      printf("F = %.4f\n", unsame.f);                                                  /*  บรรทัดที่  15  */
      printf("\n\nPress any key back to program...");                       /*  บรรทัดที่  16  */
      getch();                                                                                   /*  บรรทัดที่  17  */
}                                                                                                  /*  บรรทัดที่  18  */

ผลลัพธ์ที่ได้จากโปรแกรม
แผนผังลำดับงาน: จอภาพ: Size   of  union intflo  = 4  Number  =  25  F  =  1.2345    Press any key back to program...
คำอธิบายโปรแกรม
            จากโปรแกรมตัวอย่างข้างต้น  เพื่อความเข้าใจเกี่ยวกับข้อมูลแบบ  union  มากขึ้น  (ดูรูปที่  8.6  ประกอบความเข้าใจ)
unsame  เป็นตัวแปรยูเนียน
        
รูปที่ 8.6  แสดงการจองเนื้อที่ในหน่วยความจำของข้อมูลแบบยูเนียนชื่อ  intflo
โปรแกรมตัวอย่างที่  8.9 แสดงการใช้ยูเนียน





/*             union2.c                */
#include<stdio.h>                                                                          /*  บรรทัดที่  1  */
#include<conio.h>                                                                          /*  บรรทัดที่  2  */
void main(void)                                                                                /*  บรรทัดที่  3  */
{                                                                                                  /*  บรรทัดที่  4  */
struct  twointeger                                                                             /*  บรรทัดที่  5  */
{                                                                                                    /*  บรรทัดที่  6  */
      int num1;                                                                                         /*  บรรทัดที่  7  */
      int num2;                                                                                       /*  บรรทัดที่  8  */
} us;                                                                                                /*  บรรทัดที่  9  */
      union      intflo                                                                          /*  บรรทัดที่  10  */
{                                                                                                    /*  บรรทัดที่  11  */
      int   num3;                                                                                    /*  บรรทัดที่  12  */
      float f;                                                                                           /*  บรรทัดที่  13  */
} unsame;                                                                                       /*  บรรทัดที่  14  */
      clrscr( );                                                                                    /*  บรรทัดที่  15  */
      printf("Size of Structure twointeger = %d\n", sizeof(struct  twointeger)); /* บ. 16 */
      us.num1 = 25;                                                                          /*  บรรทัดที่  17  */
      printf("Number1 = %d\n", us.num1);                                          /*  บรรทัดที่  18  */
      us.num2 = 70;                                                                            /*  บรรทัดที่  19  */
      printf("Number2 = %d\n", us.num2);                                           /*  บรรทัดที่  20  */
      printf("\nSize of Union intflo = %d\n", sizeof(union  intflo));        /*  บรรทัดที่  21  */
      unsame.num3 = 55;                                                                  /*  บรรทัดที่  22  */
      printf("Number3 = %d\n", unsame.num3);                                 /*  บรรทัดที่  23  */
      unsame.f = 9.8765;                                                                    /*  บรรทัดที่  24  */
      printf("F = %.4f\n", unsame.f);                                                    /*  บรรทัดที่  25  */
      printf("\n\nPress any key back to program...");                            /*  บรรทัดที่  26  */
      getch();                                                                                          /*  บรรทัดที่  27  */
}                                                                                                         /*  บรรทัดที่  28  */

ผลลัพธ์ที่ได้จากโปรแกรม

แผนผังลำดับงาน: จอภาพ: Size   of  Structure  twointeger  = 4  Number1  =  25  Number2  =  70  Size   of  union intflo  = 4  Number3  =  55  F  =  9.8765    Press any key back to program...
            8.8.4 ข้อควรระวังในการใช้ยูเนียน
                        การใช้เนื้อที่ร่วมกันของตัวแปรต่างชนิดกัน    เมื่อใช้ตัวแปรใดแล้ว  ควรพิมพ์ค่าตัวแปรนั้นออมาก่อนที่จะใช้ตัวแปรตัวอื่น  เพราะข้อมูลเดิมจะหายไปเนื่องจากใช้เนื้อที่ร่วมกัน

วันพุธที่ 9 กรกฎาคม พ.ศ. 2557

8.7 พอยน์เตอร์กับข้อมูลแบบโครงสร้าง (pointer and structures)

8.7 พอยน์เตอร์กับข้อมูลแบบโครงสร้าง  (pointer  and  structures)
            หัวข้อนี้จะมีประโยชน์มากเมื่อต้องการทำโครงสร้างข้อมูลแบบ  linked  list  และ  tree  แบบต่าง ๆ  การใช้พอยน์เตอร์อ้างอิงตัวแปรภายในข้อมูลแบบโครงสร้าง  สามารถทำได้ดังนี้
รูปแบบการใช้พอยน์เตอร์อ้างอิงตัวแปรภายในข้อมูลแบบโครงสร้าง

            (*ptr_name).member_var
หรือ
            ptr_name->member_var
                                     เพื่อความเข้าใจเกี่ยวกับการใช้พอยน์เตอร์อ้างอิงตัวแปรภายในข้อมูลแบบโครง สร้าง   มากยิ่งขึ้น  ให้ศึกษาจากโปรแกรมตัวอย่างดังต่อไปนี้ โปรแกรมตัวอย่างที่  8.7 แสดงการใช้พอยน์เตอร์อ้างอิงตัวแปรภายในข้อมูลแบบโครงสร้าง


 

 
/*             ptrstru.c */
#include<stdio.h>                                                                     /*  บรรทัดที่  1  */   
#include<conio.h>                                                                     /*  บรรทัดที่  2  */
void main(void)                                                                               /*  บรรทัดที่  3  */
{                                                                                                          /*  บรรทัดที่  4  */
      struct  x                                                                                       /*  บรรทัดที่  5  */
{                                                                                                      /*  บรรทัดที่  6  */
      int num;                                                                                 /*  บรรทัดที่  7  */
      char ch;                                                                                 /*  บรรทัดที่  8  */
};                                                                                                       /*  บรรทัดที่  9  */
      struct  x  one;                                                                         /*  บรรทัดที่  10  */
      struct  x  *ptr;       /* define pointer to structure */          /*  บรรทัดที่  11  */
      clrscr();                                                                                       /*  บรรทัดที่  12  */
      ptr = &one;                            /* assign address of struc to ptr */   /*  บรรทัดที่  13  */
      ptr->num = 230;                  /* or ptr.num = 230 */                /*  บรรทัดที่  14  */
      ptr->ch = 'K';        /* or ptr.ch = 'K' */                                    /*  บรรทัดที่  15  */
      printf("\nNumber = %d\n",ptr->num);                                 /*  บรรทัดที่  16  */
      printf("Char = %c", ptr->ch);                                                  /*  บรรทัดที่  17  */
      printf("\n\nPress any key back to program...");                   /*  บรรทัดที่  18  */
      getch();                                                                             /*  บรรทัดที่  19  */
}                                                                                               /*  บรรทัดที่  20  */
 
 

ผลลัพธ์ที่ได้จากโปรแกรม
แผนผังลำดับงาน: จอภาพ: Number  =  230  Char  =  k    Press any key back to program ...

8.6 ข้อมูลชุดแบบโครงสร้าง (arrays of structures)

8.6 ข้อมูลชุดแบบโครงสร้าง  (arrays  of  structures)
            บางครั้งเราอาจจะต้องการตัวแปรโครงสร้างจำนวนมากกว่า  1  ตัว  เราต้องการเก็บข้อมูลนักศึกษาจำนวน  10  คน  หรือข้อมูลหนังสือ  20  เล่มก็สามารถใช้ความรู้เกี่ยวกับ  arrays  มาช่วยในการจัดการข้อมูลแบบโครงสร้างได้ดังนี้
8.6.1  การประกาศข้อมูลชุดแบบโครงสร้าง
            ใช้คำสั่ง  struct  มาช่วยในการประกาศข้อมูลชุดแบบโครงสร้างโดยมีรูปแบบดังนี้
รูปแบบที่  1

struct  struct_name
{
type1  name1;
type2  name2;
……..
typeN  nameN;
}  struct_var[n];
                         รูปแบบที่  2
struct  struct_name
{
type1  name1;
type2  name2;
……..
typeN  nameN;
};
struct struct_name struct_var[n];
                         โดยที่ 

struct  เป็นคำสั่งที่ใช้ประกาศข้อมูลแบบโครงสร้าง
struct_name  เป็นชื่อข้อมูลแบบโครงสร้าง  ใช้สำหรับประกาศข้อมูลแบบโครงสร้างกลุ่มอื่นให้มีโครงสร้างเหมือนกลุ่มโครงสร้างที่เคยประกาศไว้แล้ว
struct_var  เป็นชื่อตัวแปรโครงสร้างใช้สำหรับอ้างอิงข้อมูลภายใน   โครงสร้าง
type1  name1, type2  name2, …., typeN  nameN  เป็นชนิดและชื่อตัวแปรตัวที่  1, 2, 3, …, N  ตามลำดับ  บางครั้งอาจจะเรียก  name1, name2, … nameN  ว่า  element 1 , element 2, … element N  ตามลำดับ
n  คือ ขนาดของตัวแปรชุดแบบโครงสร้าง  มีค่าเริ่มต้นที่  0,1, 2, …, n-1
            ตัวอย่างที่  8.3  แสดงการประกาศตัวแปรชุดแบบโครงสร้าง
 
                                                            เมื่อใช้คำสั่งประกาศข้างต้นภายในหน่วยความจำจะมีการจองเนื้อที่สำหรับ ข้อมูลชุดแบบโครงสร้าง  employee[0],…, employee[9]  ดังนี้  (ดูรูปที่  8.4  ประกอบความเข้าใจ)

                                                name                                                    salary                                                    age
employee[0]                          25  bytes                4  bytes                  2  bytes
employee[1]                          25  bytes                4  bytes                  2  bytes
……………..                                   …………                            ………..                  ………..
employee[9]                          25  bytes                4  bytes                  2  bytes
                                                                                                                                                                                                                                                                        
รูปที่  8.4  แสดงการจองเนื้อที่ภายในหน่วยความจำให้กับตัวแปรชุดแบบโครงสร้าง

            8.6.2 การอ้างอิงตัวแปรที่อยู่ภายในข้อมูลชุดแบบโครงสร้าง
รูปแบบการอ้างอิงโดยไม่มีการกำหนดค่าให้ตัวแปร

struct_var[n].member_var
                         โดยที่ 

n  คือขนาดของตัวแปรชุดแบบโครงสร้าง  มีค่าตั้งแต่  0,1, 2, …,n-1
ตัวอย่างที่ 8.4 ถ้าอ้างอิงว่า employee[3].salary หมายถึง เงินเดือนของพนักงานคนที่ 4
ตัวอย่างที่  8.5  ถ้าอ้างอิงว่า  employee[7].name  หมายถึง  ชื่อของพนักงานคนที่  8
สำหรับการกำหนดค่าให้กับตัวแปรภายในข้อมูลชุดแบบโครงสร้าง  มีรูปแบบดังนี้
รูปแบบอ้างอิงโดยมีการกำหนดค่าให้ตัวแปร
struct_var[n].member_var = value;
                                                 โดยที่บางครั้งจะใช้ฟังก์ชัน  strcpy  (s2,s1)  มาช่วยในการกำหนดค่าข้อมูลที่เป็นข้อความ

เช่น  employee[0].age  =  20;
strcpy(employee[0].name, “Kannikar”);


            เพื่อความเข้าใจเกี่ยวกับการใช้งานตัวแปรชุดแบบโครงสร้างมากยิ่งขึ้น  ให้ศึกษาจากโปรแกรมตัวอย่างดังต่อไปนี้
โปรแกรมตัวอย่างที่  8.6 แสดงการใช้ตัวแปรชุดแบบโครงสร้าง


 

 
/*             arrstru.c */
#include<stdio.h>      /* printf(), getche(), gets() in this file */    /*  บรรทัดที่  1  */
#include<stdlib.h>     /*  atoi(), atof(), tolower()  in this file */ /*  บรรทัดที่  2  */
#include<ctype.h>                                                                      /*  บรรทัดที่  4  */
void newname(void);   /* functions prototype of newname() */   /*  บรรทัดที่  5  */
void listall(void);           /* functions prototype of listall() */           /*  บรรทัดที่  6  */
struct      person                                                                          /*  บรรทัดที่  7  */
{                                                                                                   /*  บรรทัดที่  8  */
      char name[30];                                                                    /*  บรรทัดที่  9  */
      int age;                                                                                  /*  บรรทัดที่  10  */
      float salary;                                                                            /*  บรรทัดที่  11  */
};                                                                                                    /*  บรรทัดที่  12  */
      struct      person   employee[50];    /* array of 50 structures */ /*  บรรทัดที่  13  */
      int n=0;                                                                           /*  บรรทัดที่  14  */
void main(void)                                                                           /*  บรรทัดที่  15  */
{                                                                                                    /*  บรรทัดที่  16  */
      char  ch;                                                                                      /*  บรรทัดที่  17  */
      do {                                                                                         /*  บรรทัดที่  18  */
            clrscr( );                                                                          /*  บรรทัดที่  19  */
            printf("       ****************************\n");                         /*  บรรทัดที่  20  */
            printf("       *         Main Menu        *\n");                        /*  บรรทัดที่  21  */
            printf("       ****************************\n");                        /*  บรรทัดที่  22  */
            printf("         1. Create a new employee\n");                 /*  บรรทัดที่  23  */
            printf("         2. Display All employees\n");                       /*  บรรทัดที่  24  */
            printf("         3. Exit Program\n\n");                                 /*  บรรทัดที่  25  */
            printf("       Enter your choice ( 1 or 2 or 3 ) : ");                /*  บรรทัดที่  26  */
            ch=getche();                                                                   /*  บรรทัดที่  27  */
switch(tolower(ch))                                                       /*  บรรทัดที่  28  */
      {                                                                                                /*  บรรทัดที่  29  */
      case '1':                                                                                   /*  บรรทัดที่  30  */
            newname(); break;                                                             /*  บรรทัดที่  31  */
      case '2':                                                                                    /*  บรรทัดที่  32  */
            listall(); break;                                                                      /*  บรรทัดที่  33  */
      case '3':                                                                                    /*  บรรทัดที่  34  */
            printf("\nExit Program.");   exit(0);                                     /*  บรรทัดที่  35  */
      default:                                                                                   /*  บรรทัดที่  36  */
            printf("\n Choice Error !    Please choice agian");         /*  บรรทัดที่  37  */
      }                                                                                               /*  บรรทัดที่  38  */
}while(ch!='3');                                                                          /*  บรรทัดที่  39  */
}/* end main */                                                                          /*  บรรทัดที่  40  */
/* newname() */                                                                        /*  บรรทัดที่  41  */
void newname()                                                                            /*  บรรทัดที่  42  */
{                                                                                                    /*  บรรทัดที่  43  */
      char numstr[81];                                                                       /*  บรรทัดที่  44  */
      printf("\n Record %d.\n Enter name:", n+1);                         /*  บรรทัดที่  45  */
      gets(employee[n].name);                                                     /*  บรรทัดที่  46  */
      printf("Enter age :");                                                            /*  บรรทัดที่  47  */
      gets(numstr);                                                                           /*  บรรทัดที่  48  */
      employee[n].age = atoi(numstr);                                              /*  บรรทัดที่  49  */
      printf("Enter salary :");                                                               /*  บรรทัดที่  50  */
      gets(numstr);                                                                              /*  บรรทัดที่  51  */
      employee[n].salary = atof(numstr);                                           /*  บรรทัดที่  52  */
      n++;                                                                                        /*  บรรทัดที่  53  */
}                                                                                                /*  บรรทัดที่  54  */
/* listall() */                                                                                /*  บรรทัดที่  55  */
void listall()                                                                                /*  บรรทัดที่  56  */
{               int j;                                                                          /*  บรรทัดที่  57  */
      if (n<1)  printf("\n Empty list.\n");                                             /*  บรรทัดที่  58  */
      for(j=0; j<n; j++)  {                                                                    /*  บรรทัดที่  59  */
      printf("\n Record number %d\n", j+1);                             /*  บรรทัดที่  60  */
      printf("Name : %s\n", employee[j].name);                      /*  บรรทัดที่  61  */
      printf("Age : %d\n", employee[j].age);                             /*  บรรทัดที่  62  */
      printf("Salary : %.2f\n", employee[j].salary);                    /*  บรรทัดที่  63  */
}                                                                                        /*  บรรทัดที่  64  */
      getch();                                                                              /*  บรรทัดที่  65  */
}                                                                                       /*  บรรทัดที่  66  */
 
 


ผลลัพธ์ที่ได้จากโปรแกรม                         กรณีเลือกตัวเลือกที่  1  จะให้เติมข้อมูลลูกจ้าง
แผนผังลำดับงาน: จอภาพ:        ****************************         *	   Main  Menu	   *	         ****************************  1.	Create a new employee  2.	Display All employees  3.	Exit Program  Enter your choice ( 1 or 2 or 3 ) : 1
แผนผังลำดับงาน: จอภาพ: Record 1.  Enter  name : Kannikar  Enter age : 25  Enter salary : 8300
 
                        กรณีเลือกตัวเลือกที่  2  จะนำข้อมูลลูกจ้างที่เติม  ออกมาแสดง

 
                        กรณีเลือกตัวเลือกที่  3  ออกจากโปรแกรม
แผนผังลำดับงาน: จอภาพ:        ****************************         *	   Main  Menu	   *	         ****************************  1.	Create a new employee  2.	Display All employees  3.	Exit Program  Enter your choice ( 1 or 2 or 3 ) : 3  	Exit Program …

8.5 ข้อมูลแบบโครงสร้างซ้อน (nested structures)

8.5 ข้อมูลแบบโครงสร้างซ้อน  (nested  structures)
            บางครั้งเราสามารถประกาศข้อมูลแบบโครงสร้างซ้อนอยู่ภายในโครงสร้างได้ดังโปรแกรมตัวอย่างต่อไปนี้
โปรแกรมตัวอย่างที่  8.5 แสดงการประกาศข้อมูลแบบโครงสร้างซ้อนอยู่ภายในโครงสร้าง


 

 
/*             neststru.c              */
#include<stdio.h>                                                                      /*  บรรทัดที่  1  */
#include<conio.h>                                                                      /*  บรรทัดที่  2  */
struct      student                                                                       /*  บรรทัดที่  3  */
{                                                                                                   /*  บรรทัดที่  4  */
      char name[20];                                                                    /*  บรรทัดที่  5  */
      int age;                                                                                  /*  บรรทัดที่  6  */
};                                                                                               /*  บรรทัดที่  7  */
      struct      group                                                                          /*  บรรทัดที่  8  */
{                                                                                                 /*  บรรทัดที่  9  */
      struct      student  one;        /* nested structure  one */  /*  บรรทัดที่  10  */
      struct      student  two;         /* nested structure  two */   /*  บรรทัดที่  11  */
};                                                                                                   /*  บรรทัดที่  12  */
      struct      group  x = {                                               /*  บรรทัดที่  13  */
            {"Kannikar",25},                                                                    /*  บรรทัดที่  14  */
            {"Suraporn",32}                                                                    /*  บรรทัดที่  15  */
      };                                                                                              /*  บรรทัดที่  16  */
void main(void)                                                                          /*  บรรทัดที่  17  */
{                                                                                                   /*  บรรทัดที่  18  */
      clrscr();                                                                                     /*  บรรทัดที่  19  */
      printf("\n Person One :\n");                                                       /*  บรรทัดที่  20  */
      printf("Name = %s\n", x.one.name);                                        /*  บรรทัดที่  21  */
      printf("Age = %d\n", x.one.age);                                             /*  บรรทัดที่  22 */
      printf("\n Person Two :\n");                                                     /*  บรรทัดที่  23 */
      printf("Name = %s\n", x.two.name);                                          /*  บรรทัดที่  24  */
      printf("Age = %d\n", x.two.age);                                            /*  บรรทัดที่  25  */
      printf("\n\nPress any key back to program...");                         /*  บรรทัดที่  26  */
      getch();                                                                                       /*  บรรทัดที่  27*/
}                                                                                              /* บรรทัดที่  28  */
 
 

ผลลัพธ์ที่ได้จากโปรแกรม

แผนผังลำดับงาน: จอภาพ: Person One :  Name = Kannikar  Age = 25    Person Two :  Name = Suraporn  Age = 32    Press any key back to program ...
คำอธิบายโปรแกรม
            จากโปรแกรมตัวอย่างที่  8.5  สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
            การอ้างอิงสมาชิกภายในข้อมูลแบบโครงสร้างซ้อนก็ใช้วิธีการอ้างอิงเหมือนกับข้อมูลแบบโครงสร้างธรรมดา
            เช่น  บรรทัดที่  21  x.one.name  หมายถึง  การอ้างอิงถึงตัวแปร  name  ผ่านตัวแปรโครงสร้าง  one  และตัวแปรโครงสร้าง  x  ตามลำดับ 
            หรือ  บรรทัดที่  24  x.two.name  หมายถึง  การอ้างอิงถึงตัวแปร  name  ผ่านตัวแปรโครงสร้าง  two  และตัวแปรโครงสร้าง  x  ตามลำดับ