!

บทที่ 9
ขอมูล structure และ union
♦!ความหมายของ structure
structure หมายถึง กลุมขอมูลซึ่งประกอบดวยขอมูลชนิดเดียวกันหรือหลายชนิดก็ได ขอมูล
แตละรายการใน structure เรียกวา สมาชิกของสตรักเจอร (members of structure) structure แตกตาง
จากอารเรย คือ สมาชิกของ structure แตละรายการเปน ขอมูลตางชนิดกันได แตสมาชิกของอารเรย
แตละรายการจะตองเปนชนิดเดียวกันเทานัน้
ตัวอยางขอมูลที่สามารถนํามาเก็บเปนชนิด structure
ไดแกขอมูลที่มีรายละเอียดภายในแตละรายการเปนขอมูลตางชนิด(Data Type) กัน เชน
- ขอมูลประวัตินักศึกษา ประกอบดวย รหัสนักศึกษา, ชื่อนักศึกษา, อายุ, วันเดือนปเกิด
- ขอมูลรายละเอียดวิชา ประกอบดวย รหัสวิชา, ชือ่ วิชา, จํานวนหนวยกิต, ผูส อน
- ขอมูลประวัติสินคา ประกอบดวย รหัสสินคา, คําอธิบายรายการ, หนวยนับ, ราคาตอหนวย

♦!วิธีสรางขอมูลประเภท structure และการนําไปใช
กอนทีจ่ ะนําขอมูลประเภท structure มาใชในโปรแกรม จะมี 2 ขั้นตอน คือ
1. สรางชือ่ ประเภทขอมูลใหเปนประเภท structure กอนโดยผูใชกาหนดชื

อ่ structure จาก
keyword คําวา struct
2. จากนั้นจากนํา ชื่อประเภทขอมูล structure ไปประกาศตัวแปรที่ตองการสรางขึ้นใชภายใน
โปรแกรม
การสรางประเภทขอมูลใหเปน structure มีรปู แบบโครงสราง ดังนี้
struct ชือ่ สตรักเจอร
{
ชนิดขอมูล ชื่อรายการ;
ชนิดขอมูล ชื่อรายการ;
ชนิดขอมูล ชื่อรายการ;
ชนิดขอมูล ชื่อรายการ;
};

ศิริชัย นามบุรี

ขอมูล structure และ union

!

110

เชน ถาตองการสรางขอมูลแบบ structure เพือ่ เก็บขอมูล รหัสนักศึกษา, ชื่อนักศึกษา, คะแนนสอบ
ระหวางภาค, คะแนนสอบปลายภาค และเกรด กําหนดรายละเอียดใน structure ดังนี้
struct STD
ชือ่ structure กําหนดโดยผูใ ช
{ char code[9];
char name[31];
int midterm;
ชือ่ ฟลด(Field) ในโครงสราง
int final;
char grade;
};
STD คือชือ่ ของประเภท structure ที่มีสมาชิกหรือฟลด(Field) 5 รายการ คือ code, name,
midterm, final และ grade โดยที่สมาชิกแตละรายการมีชนิดขอมูลที่แตกตางกันได

การประกาศตัวแปร
เมื่อตองการนําชื่อ STD ไปใชประกาศตัวแปร สามารถประกาศตัวแปรไดตามรูปแบบ
การประกาศตัวแปรประเภทอื่น ๆ ทําได 2 วิธี คือ
วิธีแรก ประกาศตัวแปรไปพรอมกับการสราง structure
struct STD
{ char code[9];
char name[31];
int midterm;
int final;
char grade;
} student;

วิธีแรก ประกาศตัวแปร หลังจากสราง structure แลว
struct STD
{ char
char
int
int
char
};

code[9];
name[31];
midterm;
final;
grade;

ชื่อตัวแปร Student เปนประเภท STD

STD student;
ศิริชัย นามบุรี

ขอมูล structure และ union

!

111

♦!การอางถึง structure และสมาชิกของ structure
การอางถึงสมาชิกใน structure ไมสามารถจะอางถึงชื่อรายละเอียดใน structure โดยตรงได แต
จะตองกําหนดตัวแปร(variable) ที่มีชนิดเปน structure ขึ้นมากอน เชน จากตัวอยางที่สราง structure
ชื่อ STD ขึ้น เราสามารถประกาศตัวแปร student และ stud ใหเปนประเภท STD ไดดงั นี้
STD student,stud; //ชื่อตัวแปรคือ student และ stud
หรืออาจประกาศในขณะสราง structure ก็ได มีรปู แบบดังนี้
struct STD
{ char code[9];
char name[31];
int midterm;
int final;
char grade;
}student,stud;
เมือ่ เรากําหนดตัวแปร student และ stud ใหเปนชนิด STD ซึ่งเปน structure ไดแลว เรา
สามารถอางถึงสมาชิกของ STD ไดโดยการเขียนชื่อตัวแปรเครื่องหมายจุดและตามดวยชื่อรายการ
สมาชิกหรือฟลด(Field)ของ STD ดังนี้
student.code
หมายถึง รหัสนักศึกษา
student.name
หมายถึง ชื่อนักศึกษา
student.midterm
หมายถึง คะแนนสอบระหวางภาค
student.final
หมายถึง คะแนนสอบปลายภาค
student.grade
หมายถึง เกรด
หรือ

ศิริชัย นามบุรี

stud.code
stud.code
stud.name
stud.midterm
stud.final
stud.grade

หมายถึง รหัสนักศึกษา
หมายถึง รหัสนักศึกษา
หมายถึง ชื่อนักศึกษา
หมายถึง คะแนนสอบระหวางภาค
หมายถึง คะแนนสอบปลายภาค
หมายถึง เกรด

ขอมูล structure และ union

!

112

♦!การกําหนดคาคงทีใ่ หกบั สมาชิกของ structure
struct STD
{ char code[9];
char name[31];
int midterm;
int final;
char grade;
}student,stud;
จากโครงสรางของ STD และการกําหนดตัวแปร student , stud สามารถกําหนดคาใหกับตัว
แปรไดดงั นี้
1. กําหนดคาคงที่ใหกับ structure เขียนไดดังนี้
strcpy(student.code,"40214514");
//เนือ่ งจากเปน string ตองใช strcpy()
strcpy(student.name, "Somsak");
//เนือ่ งจากเปน string ตองใช strcpy()
student.midterm = 45;
student.final = 30;
student.grade=75;
2. การกําหนดคาของตัวแปรใหกบั structure เขียนไดดงั นี้
char co[9]=”10015210”;
strcpy(student.code,co);
int x = 25;
student.midterm = x;

♦!การรับขอมูลจากคียบ อรดเก็บในสมาชิกของ sturcture
การรับคาคงที่จากคียบอรดไปเก็บไวใน structure ทําไดโดยใช cin>> ดังนี้
cin>>student.code;
cin>>student.name;
cin>>student.midterm;
cin>>student.final;
cin>>student.grade;
ศิริชัย นามบุรี

ขอมูล structure และ union

!

113

♦!การแสดงขอมูลจากสมาชิกของ structure
การแสดงผลขอมูลจาก structure ทําไดโดยใช cout<< ดังนี้
cout<<student.code;
cout<<student.name;
cout<<student.midterm;
cout<<student.final;
cout<<student.grade;
•! ตัวอยางโปรแกรม stru_exp1.cpp แสดงการกําหนดโครงสราง structure การประกาศตัว
แปร การรับคาทางคียบ อรด และแสดงคาใน structure เพื่อเก็บรายละเอียดขอมูลคะแนน
สอบนักศึกษา จํานวน 1 คน
/*Program : stru_ex1.cpp
Process : creat structure and manage structure*/
#include <iostream.h>
#include <conio.h>
//declaration structure STD
struct STD
{ char code[9];
char name[31];
int midterm;
int final;
char grade;
};
//declaration prototype function
void input();
void display();
//declaration student is global variable has structure type
STD student;
void main() //begin main program
{
clrscr();
input(); clrscr();
display();
getch();
} //end main program
void input() //function enter data
ศิริชัย นามบุรี

ขอมูล structure และ union

!

114
{ clrscr();
gotoxy(30,2);cout<< " Please enter data : ";
gotoxy(5,4);cout<< "Code : ";
gotoxy(5,5);cout<< "Name : ";
gotoxy(5,6);cout<< "Midterm : ";
gotoxy(5,7);cout<< "Final : ";
gotoxy(5,8);cout<< "Grade : ";
//input from keyboard
gotoxy(15,4);cin>>student.code;
gotoxy(15,5);cin>>student.name;
gotoxy(15,6);cin>>student.midterm;
gotoxy(15,7);cin>>student.final;
gotoxy(15,8);cin>>student.grade;
}
void display() //function display data
{
gotoxy(30,2);cout<< " Your Information : \a";
gotoxy(5,4);cout<< "Code : "<<student.code;
gotoxy(5,5);cout<< "Name : "<<student.name;
gotoxy(5,6);cout<< "Midterm : "<<student.midterm;
gotoxy(5,7);cout<< "Final : "<<student.final;
gotoxy(5,8);cout<< "Grade : "<<student.grade;
}

ศิริชัย นามบุรี

ขอมูล structure และ union

!

115

♦!อารเรยของ structure
การกําหนดอารเรยของ structure มีวิธีการเชนเดียวกับการกําหนดอารเรย 1 มิตปิ กติ เพราะถือ
วา structure เปนขอมูล 1 รายการในอารเรย ดังนัน้ การอางอิงถึงขอมูลทีเ่ ปนอารเรยชนิดโครงสราง
จึงตองอางถึงตําแหนงรายการของสมาชิกในอารเรยรวมกับการอางถึงสมาชิกใน structure
struct STD
//สราง structure ชื่อ STD
{ char code[9];
char name[31];
int midterm;
int final;
char grade;
};
STD student[5];
//ประกาศตัวแปรชื่อ student เปนอารเรยมสี มาชิกเปน structure ชื่อ STD จํานวน 5 รายการ
ฟลด(Field) หรือสมาชิกของโครงสราง

index ของ array

code[9]
name[31]
0 10000001 somsak
...
1 ...
2
3
4

midterm
final
55
20
...
...

grade
B
...

ดังนัน้ การอางถึงสมาชิกของอาเรยตองใช [index] ตามหลังชื่อตัวแปรและอางถึงสมาชิกของ
structure ตองใช ตามดวยจุด (.) และชื่อรายการสมาชิกใน structure ดังนี้
student[0].midterm=30;
student[1].final=50;
strcpy(student[0].code,"10012512");
cin>>student[4].code;
cout<<student[4].code;

ศิริชัย นามบุรี

ขอมูล structure และ union

!

116
•! ตัวอยางโปรแกรม stru_exp1.cpp แสดงการใชโครงสรางขอมูลอารเรยรว มกับโครงสราง
ขอมูลแบบ structure เพื่อเก็บรายละเอียดขอมูล รหัส, ชื่อ, คะแนนสอบระหวางภาค,
ปลายภาค และเกรดของนักศึกษา จํานวน 5 คน

/*Program : stru_exp1.cpp
Process : creat structure and manage structure*/
#include <iostream.h>
#include <conio.h>
//declaration structure STD
struct STD
{ char code[9];
char name[31];
int midterm;
int final;
char grade;
};
//declaration prototype function
void input();
void display();
//declaration array structure is global variable
STD student[5];
void main() //begin main program
{
clrscr();
input(); clrscr();
display();
} //end main program
void input() //function enter data
{ int i;
for(i=0;i<=4;++i)
{ clrscr();
gotoxy(15,2);cout<< " Please enter data of student No.# \a"<<i+1;
gotoxy(5,4);cout<< "Code : ";
gotoxy(5,5);cout<< "Name : ";
gotoxy(5,6);cout<< "Midterm : ";
gotoxy(5,7);cout<< "Final : ";
gotoxy(5,8);cout<< "Grade : ";
gotoxy(15,4);cin>>student[i].code;
ศิริชัย นามบุรี

ขอมูล structure และ union

!

117

}

}

gotoxy(15,5);cin>>student[i].name;
gotoxy(15,6);cin>>student[i].midterm;
gotoxy(15,7);cin>>student[i].final;
gotoxy(15,8);cin>>student[i].grade;

void display() //function display data
{int i;
for(i=0;i<=4;++i)
{ clrscr();
gotoxy(30,2);cout<< " Your Information : studen#\a"<<i+1;
gotoxy(5,4);cout<< "Code : "<<student[i].code;
gotoxy(5,5);cout<< "Name : "<<student[i].name;
gotoxy(5,6);cout<< "Midterm : "<<student[i].midterm;
gotoxy(5,7);cout<< "Final : "<<student[i].final;
gotoxy(5,8);cout<< "Grade : "<<student[i].grade;
cout<<endl<<endl<< "press any key to continue..."; getch();
}
}

♦!ขอมูลชนิด union
ยูเนียน(union) เปนกลุมขอมูลที่มีโครงสรางเชนเดียวกับ structure แตมีความแตกตางกันใน
ดานวิธีการกําหนด และวิธีการจัดเก็บขอมูลในหนวยความจํา
การจัดเก็บขอมูลในหนวยความจํา สมาชิกแตละรายการของ structure จะจองพืน้ ทีจ่ ดั เก็บ
ขอมูลในหนวยความจําอิสระจากกัน แต union สมาชิกทุกตัวจะจองพื้นที่ในหนวยความจําตําแหนง
เดียวกัน และใชหนวยความจําตําแหนงนัน้ รวมกัน สมาชิกแตละตัวจะเขาไปใชหนวยความจําของ
พรอมกันไมได จะตองสลับกันใชหนวยความจําตําแหนงนัน้ จึงตองระมัดระวังความถูกตองของขอ
มูลเมื่อจะอางถึงสมาชิกแตละตัวใน union มีประโยชนในเรือ่ งของการประหยัดหนวยความจํา ถาจํา
เปนตองใชตวั แปรหลายตัว แตเขาไปใชหนวยความจําไมพรอมกัน

ศิริชัย นามบุรี

ขอมูล structure และ union

!

118
การกําหนดขอมูลแบบ union มีรปู แบบดังนี้
union ชื่อยูเนียน
{ ชนิดขอมูล ชื่อรายการสมาชิก;
ชนิดขอมูล ชื่อรายการสมาชิก;
ชนิดขอมูล ชื่อรายการสมาชิก;
ชนิดขอมูล ชื่อรายการสมาชิก;
};
เชน
union STD2
{ char
char
int
int
char
};

code[9];
name[31];
midterm;
final;
grade;

•! ตัวอยางโปรแกรม union.cpp แสดงการใชขอมูลประเภท structure เปรียบเทียบกับการใช
union เนื่องจากสมาชิกของ structure ใชวิธีการเก็บขอมูลในหนวยความจําแยกกันเปน
อิสระจึงสามารเก็บขอมูลพรอมกันได และนํามาใชไดถูกตอง สวน union สมาชิก
ทุกรายการใชหนวยความจําตําแหนงเดียวกัน สมาชิกจะเขามาใชพรอมกันไมได ดังนั้นจึง
แสดงขอมูลที่เก็บไวไดไมถูกตอง เมื่อกําหนดใหเก็บขอมูลพรอมกัน ถูกตองเฉพาะรายการ
สุดทายที่เขาไปใชหนวยความจํา
/*Program : union.cpp
Process : creat structure and union ,compare using memory*/
#include <iostream.h>
#include <conio.h>
#include <string.h>

ศิริชัย นามบุรี

ขอมูล structure และ union

!

119

//declaration structure STD
struct STD
{ char code[9];
char name[31];
int midterm;
int final;
char grade;
};
//declare union STD2
union STD2
{ char code[9];
char name[31];
int midterm;
int final;
char grade;
};
//declaration global variable
STD student; //type is structure
STD2 stu; //type is union
void main() //begin main program
{
clrscr();
//set value of student variabel...struct type
strcpy(student.code,"100001");
strcpy(student.name,"Somsak");
student.midterm=35;
student.final=30;
student.grade='D';
//set value of stu variable... union type
strcpy(stu.code,"100001");
strcpy(stu.name,"Somsak");
stu.midterm=35;
stu.final=30;
stu.grade='D';
//display data from student (struct)
cout<< "Display data from student variable of struct"<<endl;
cout<< "student.code= "<<student.code<<endl;
cout<< "student.name= "<<student.name<<endl;
cout<< "student.midterm= "<<student.midterm<<endl;
cout<< "student.final= "<<student.final<<endl;
ศิริชัย นามบุรี

ขอมูล structure และ union

!

}

120
cout<< "student.grade= "<<student.grade<<endl;
cout<< "*** correct value of student ***\a"<<endl<<endl;
//display data from stu (union)
cout<< "Display data from stu variable of union"<<endl;
cout<< "stu.code= "<<stu.code<<endl;
cout<< "stu.name= "<<stu.name<<endl;
cout<< "stu.midterm= "<<stu.midterm<<endl;
cout<< "stu.final= "<<stu.final<<endl;
cout<< "stu.grade= "<<stu.grade<<endl;
cout<< "*** error value of stu ***\a"<<endl;
getch();

♦!แบบฝกหัดทายบท
1. ใหเขียนโปรแกรมเพือ่ เก็บประวัตพิ นักงานของบริษทั แหงหนึง่ มีจํานวนพนักงานสูงสุดไมเกิน
100 คน รายละเอียดขอมูลที่จัดเก็บไดแก รหัสพนักงาน, ชื่อสกุล, ที่อยู, อายุ, เงินเดือน,ตําแหนง,
สถานภาพสมรส กําหนดการจัดเก็บรายละเอียดขอมูลเปนชนิดโครงสราง โดยสรางเปนฟงกชนั
ตาง ๆ ใหทางาน

ดังนี้
- กรอกขอมูลไดตามจํานวนคนทีต่ อ งการ (แตไมเกิน 100 คน)
- แสดงรายงานรายละเอียดประวัติของพนักงานทุกคนได, แสดงอายุเฉลี่ย, เงินเดือนรวม,
เงินเดือนเฉลีย่ และคํานวณภาษีหัก ณ ที่จาย 5% ของเงินเดือนพนักงานแตละคน
- คนหาประวัติพนักงานเปนรายบุคล โดยการกรอกรหัสพนักงานเพือ่ คนหาได
2. ใหนักศึกษาเขียนโปรแกรมเพื่อคํานวณการตัดเกรดนักศึกษา โดยจัดเก็บขอมูลเปนชนิดโครงสราง
จํานวนไมเกิน 50 คน
กําหนดเงือ่ นไขการตัดเกรด ดังนี้
คะแนนระหวาง
1-49
เกรด
F
คะแนนระหวาง
50-59
เกรด
D
คะแนนระหวาง
60-69
เกรด
C
คะแนนระหวาง
70-79
เกรด
B
คะแนนระหวาง
80-100
เกรด
A
โปรแกรมมีความสามารถดังนี้

ศิริชัย นามบุรี

ขอมูล structure และ union

!

121

- กรอกรายละเอียด รหัส, ชื่อนักศึกษา, คะแนนระหวางภาค, คะแนนปลายภาค โดยสามารถ
กําหนดจํานวนคนทีต่ อ งการกรอกขอมูลได (แตไมเกิน 50 คน) หรือสามารถหยุดกรอกขอมูล
ไดโดยทีไ่ มจําเปนตองกรอกครบ 50 คน
- รวมคะแนนเพือ่ นําไปคํานวณตัดเกรด
- คํานวณการตัดเกรดตามเกณฑทก่ี าหนดไว

- นับจํานวนคนทีไ่ ดรบั เกรดแตละเกรด
- แสดงผลการตัดเกรดเรียงตามคะแนนจากมากไปหานอย
โดยทีก่ ารเขียนโปรแกรมจะตองสรางเปนฟงกชนั แบงตามหนาทีก่ ารทํางานในโปรแกรมให
เหมาะสม

ศิริชัย นามบุรี

ขอมูล structure และ union

Sign up to vote on this title
UsefulNot useful