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 ออกจากโปรแกรม
ไม่มีความคิดเห็น:
แสดงความคิดเห็น