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

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 …

ไม่มีความคิดเห็น:

แสดงความคิดเห็น