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  การอ้างอิงตัวแปรที่อยู่ภายในข้อมูลชุดแบบโครงสร้าง
รูปแบบการอ้างอิงโดยไม่มีการกำหนดค่าให้ตัวแปร 
                        
โดยที่  
  
    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  จะให้เติมข้อมูลลูกจ้าง
                        กรณีเลือกตัวเลือกที่  2  จะนำข้อมูลลูกจ้างที่เติม  ออกมาแสดง
                        กรณีเลือกตัวเลือกที่  3  ออกจากโปรแกรม
 
ไม่มีความคิดเห็น:
แสดงความคิดเห็น