29
การเขียนโปรแกรมคอมพิวเตอร์ [สานักพิมพ์ ศสว.] สกุล คานวนชัย บทที10 โครงสร้างข้อมูล ในการดาเนินชีวิตของคนปัจจุบัน ต้องเกี่ยวข้องกับข้อมูลอยู ่เสมอ ๆ ลักษณะของข้อมูลทีพบเห็น มักเป็นข้อมูลเป็นกลุ่มของข้อมูล เช่น เมื่อพิจารณาข้อมูลของคนหนึ ่งคน อาจจะ พิจารณาคุณสมบัติใน เรื่องของชื่อ สกุล น าหนัก ความสูง อายุ หรือเมื่อพิจารณารถยนต์ หนึ ่งคันอาจจะพิจารณาถึง เป็นรถยนต์ที่ผลิตจากประเทศใด ยี่ห้อ รุ ่น ขนาดเครื่องยนต์ สี เป็นต้น จะเห็นว่าเวลาที่พบเห็นข้อมูลหนึ ่ง ๆ ข้อมูลเหล่านั ้นมักจะประกอบด้วย คุณสมบัติหรือข้อมูลย่อยเสมอ กรณีของข้อมูลโครงสร้างก็เป็นการพิจารณาข้อมูลใน ลักษณะเดียวกัน การประกาศประเภทข้อมูลโครงสร้างขึ ้นมาชนิดหนึ ่ง จะต้องพิจารณาว่า ข้อมูลโครงสร้างนั ้นประกอบไปด้วยคุณสมบัติ อะไรบ้าง และจะต้องมีการประกาศ คุณสมบัติของข้อมูลโครงสร้างด้วยเสมอ ข้อมูลที่ใช้ในการเขียนโปรแกรมตามที่กล่าวมาในบทก่อนหน้านี ้ได้นาเสนอ ข้อมูลเป็น แบบอาร์เรย์(ศรัณย์ อินทโกสุม, 2539) ซึ ่งหมายถึง ชุดข้อมูลที่เป็นข้อมูลชนิดเดียวกัน เก็บไว้ตัวแปรหนึ ่งตัว นอกจากตัวแปรชุดแบบอาร์เรย์แล้ว ภาษาซียังมีชนิดข้อมูลทีประกอบขึ ้นจากข ้อมูลประเภทพื ้นฐานอีกประเภทหนึ ่ง (Steven และ Lutfar, 2006) (Brian W. K., Online) ข้อมูลแบบโครงสร้าง ( Structure) และข้อมูลแบบยูเนียน (Union) เป็ น ข้อมูลที่สามารถนาข้อมูลชนิดที่แตกต่างกันมาเก็บไว้เป็นกลุ่มเดียวกัน เช่น ข้อมูลของ พนักงานในองค์กร มักประกอบด้วยข้อมูลพื ้นฐานคือ รหัสพนักงาน ชื่อ สกุล ที่อยู ่ เบอร์ โทรศัพท์ บัญชีธนาคาร เป็นต้น

การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

บทท 10

โครงสรางขอมล ในการด าเนนชวตของคนปจจบน ตองเกยวของกบขอมลอยเสมอ ๆ ลกษณะของขอมลทพบเหน มกเปนขอมลเปนกลมของขอมล เชน เมอพจารณาขอมลของคนหนงคน อาจจะพจารณาคณสมบตใน เรองของชอ สกล น าหนก ความสง อาย หรอเมอพจารณารถยนตหนงคนอาจจะพจารณาถง เปนรถยนตทผลตจากประเทศใด ยหอ รน ขนาดเครองยนต สเปนตน จะเหนวาเวลาทพบเหนขอมลหนง ๆ ขอมลเหลาน นมกจะประกอบดวยคณสมบตหรอขอมลยอยเสมอ กรณของขอมลโครงสรางกเปนการพจารณาขอมลในลกษณะเดยวกน การประกาศประเภทขอมลโครงสรางขนมาชนดหนง จะตองพจารณาวาขอมลโครงสรางนนประกอบไปดวยคณสมบต อะไรบาง และจะตองมการประกาศคณสมบตของขอมลโครงสรางดวยเสมอ ขอมลทใชในการเขยนโปรแกรมตามทกลาวมาในบทกอนหนานไดน าเสนอ ขอมลเปนแบบอารเรย(ศรณย อนทโกสม, 2539) ซงหมายถง ชดขอมลทเปนขอมลชนดเดยวกนเกบไวตวแปรหนงตว นอกจากตวแปรชดแบบอารเรยแลว ภาษาซยงมชนดขอมลทประกอบขนจากขอมลประเภทพนฐานอกประเภทหนง (Steven และ Lutfar, 2006) (Brian W. K., Online) ขอมลแบบโครงสราง (Structure) และขอมลแบบยเนยน (Union) เปนขอมลทสามารถน าขอมลชนดทแตกตางกนมาเกบไวเปนกลมเดยวกน เชน ขอมลของพนกงานในองคกร มกประกอบดวยขอมลพนฐานคอ รหสพนกงาน ชอ สกล ทอย เบอรโทรศพท บญชธนาคาร เปนตน

Page 2: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

243

การประกาศโครงสรางขอมล

struct <ชอโครงสราง> { <สมาชก 1> ; <สมาชก 2> ; … <สมาชก 3> ; } ; struct เปนค าสงใชในการประกาศใหทราบวาเปนโครงสราง โดยมชอของโครงสรางเปนตวอางองในการเรยกใชตอไป และการประกาศชอของโครงสราง ภายในโครงสรางจะตองประกอบดวย สมาชก ซงจ านวนสมาชกจะเปนตวแปรชนดใด จ านวนเทาใด ดงตวอยาง ในการประกาศโครงสรางของการเกบขอมลประชากรอาจประกอบดวยสมาชกของโครงสรางคอ ชอ สกล น าหนก ความสง อาย สามารถประกาศไดดงน

struct population { char name[8]; char surname[10]; float weight; float height; int age;

} ; จะพบวาขอมลโครงสรางเปนการวางกรอบสมาชกของขอมลทเราพบเหนใหเปนระเบยบ เปนกลมขอมลเดยวกนเพอ ใหสามารถอางองไดงายขน

Page 3: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

244

รปแบบการประกาศตวแปรโครงสราง การประกาศตวแปรโครงสรางสามารถท าไดหลากหลายรปแบบ ซงสามารถสรป ตวอยางใหเหน 4 รปแบบ ดงน คอ รปแบบท 1

struct { int x; int y;

} p1, p2;

รปแบบท 2 struct data {

int x; int y;

} p1, p2;

รปแบบท 3 struct data {

int x; int y;

}; typedef struct data Point;

Page 4: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

245

รปแบบท 4 typedef struct {

int x; int y;

} data; จากรปแบบการประกาศตวแปรโครงสรางดานบน สามารถสรปความแตกตางไดคอ รปแบบท 1 เปนการประกาศรปแบบโครงสราง พรอมกบการประกาศตวแปรส าหรบโครงสราง จ านวน 2 ตว คอ p1 และ p2 รปแบบท 2 เปนการประกาศรปแบบโครงสรางและตงชอรปแบบนวา data พรอมกบท าการประกาศตวแปรส าหรบโครงสรางน 2 ตว คอ p1 และ p2 การประกาศโครงสรางในรปแบบนสามารถน าโครงสรางนไปใชส าหรบการประกาศตวแปรใหมทมโครงสรางเหมอนกบ p1 และ p2 ไดโดยไมตองประกาศโครงสรางนใหม เชน ตองการประกาศตวแปร p3 ซงมโครงสรางรปแบบเดยวกบ p1 และ p2 สามารถท าไดโดยเพมค าสงตอไปน

struct data p3; โดยวางค าสงนไวทต าแหนงหลงค าสงประกาศโครงสราง data สวนรปแบบท 3 และ 4 เปนการก าหนดชนดขอมลใหมโดยใชค าสง typedef เพอใหสามารถอางถงรปแบบโครงสรางไดสนขน จากรป แบบท 2 เมอตองการประกาศตวแปรใหมตองอางถงโครงสรางดวยค าสง struct data point1; หากใชการประกาศโครงสรางในรปแบบท 3 หรอ 4 สามารถประกาศตวแปรใหมดวยค าสง data point1; ไดทนท

Page 5: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

246

X Y

การประกาศคาเรมตนใหกบสมาชกของตวแปรโครงสราง ในการประกาศตวแปรพนฐานเราสามารถก าหนดคาเ รมตนใหกบตวแปรน นได ตวอยางเชน ตองการประกาศตวแปร x มชนดเปน int ใหมคาเรมตนเทากบ 3 สามารถท าไดดวยค าสง int x =3; ส าหรบตวแปรโครงสราง สามารถก าหนดคาเรมตนใหกบสมาชกของตวแปรโครงสรางนนไดเชนกน ตวอยาง เชน ถาตองการสรางตวแปรโครงสรางชอ pt ซงเปนตวแปรทมรปแบบโครงสราง data สามารถท าไดดงน data pt = { 100, 200 }; คา x ของตวแปรโครงสราง pt จะมคาเทากบ 100 คา y จะมคาเทากบ 200 สามารถจ าลองการเกบขอมลตวแปรโครงสราง pt รปท 10.1 pt

รปท 10.1 แสดงแบบจ าลองของตวแปรโครงสราง

200 100

Page 6: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

247

การอางถงสมาชกของตวแปรโครงสราง การอางถงสมาชกภายใน struct สามารถท าไดโดยการใชค าสง . (จด) เปนตวอางองถงสมาชกภายในโครงสราง ดงในรปแบบตอไปน structure-name . member ตวอยาง เชน เมอตองการอางถงสมาชกภายใน struct ของ pt อยตรงกบจดใดบนแกนโคออดเนตสามารถท าไดดงน printf ( “%d, %d”, pt.x, pt.y ); ตวอยางโปรแกรมท 10.1 โปรแกรมเพอรบคาจดบนแกนโคออดเนตของรปสเหลยม และน ามาท าการค านวณหาพนทของรปสเหลยม

#include <stdio.h> #include <conio.h> typedef struct { int x; int y; } point; void main() { point pt1,pt2 ; int area; clrscr();

Page 7: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

248

ผลการท างานโปรแกรม

ตอจากดานบน /* Input Data */ printf("\nEnter rectangle data\n"); printf("\tStart point x : "); scanf("%d", &pt1.x); printf("\tStart point y : "); scanf("%d", &pt1.y); printf("\tEnd point x : "); scanf("%d", &pt2.x); printf("\tEnd point y : "); scanf("%d", &pt2.y); /* Calulate Rectangle */ area = (pt2.x-pt1.x) * (pt2.y-pt1.y); printf("\nArea is %d", area); getch(); }

Page 8: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

249

ตวอยางโปรแกรมท 10.2 โปรแกรมเพอรบขอมลของผใชซงประกอบดวย ชอ นามสกล ความสง และน าหนก จากผใชโปรแกรม แลวน าไปท าการค านวณคาดชนของน าหนก (Body Mass Index : BMI) ซงสามารถคดไดจากสตร BMI = w / h2 โดยท w แทนน าหนกตวมหนวยเปนกโลกรม และ h แทนความสงมหนวยเปนเมตร โดยผลการค านวนคา BMI อยในชวง 20-25 ใหโปรแกรมแสดงขอความวา “Normal BMI.” แตถาผลการค านวณคา BMI ยนอกชวงดงกลาวใหแสดงขอความวา “Dangerous BMI.” โดยก าหนดใหใชโครงสรางท าการเกบขอมลของผใช คา BMI และผลลพธทได และใหแสดงขอมลทงหมด

#include <stdio.h> #include<conio.h> #include <string.h> typedef struct { char name[16]; char surname[20]; float height; float weight; float bmi; char answer[14]; } student;

Page 9: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

250

ตอจากดานบน void main() { clrscr(); student std; printf("Enter student data\n"); printf("\tName : "); scanf("%s", std.name); printf("\tSurname : "); scanf("%s", std.surname); printf("\tHeight (m) : "); scanf("%f", &std.height); printf("\tWeight (Kg) : "); scanf("%f", &std.weight); std.bmi = std.weight / (std.height * std.height); if (std.bmi >= 20 && std.bmi <= 25) strcpy(std.answer, "Normal BMI"); else strcpy(std.answer, "Dangerous BMI"); printf("\n\nBMI result"); printf("\n%s %s weight %.2f kg. height %.2f", std.name, std.surname, std.weight, std.height); printf("\n\tBody mass index %.2f is %s", std.bmi, std.answer); getch(); }

Page 10: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

251

ผลการท างานโปรแกรม

จากตวโปรแกรม 10.2 ในการรบขอมลของขอมลสตรงดวยค าสง scanf นน เชน ชอ (std.name) และนามสกล (std.surname) ไมตองใชเครองหมาย & หนาตวแปรนน เนองจาก name และ surname เปนตว แปรอารเรยชนดตวอกขระ การอางถงชอจะเปนการอางถงแอดเดรสของตวแปรนน ซงแตกตางกบขอมลทเปนตวแปรชนดจ านวนเตม ตองมเครองหมาย & หนาตวแปรนน เชน (std.weight) และความสง (std.height) เปนตน

การเกบขอมลแบบโครงสราง การเกบขอมลแบบโครงสราง การจดการหนวยความจ าภายในจะท าการจดเกบขอมลตามล าดบทมการประกาศสมาชกของขอมลนน โดยทวไปขอมลแบบโครงสรางจะประกอบขนจากขอมลหลาย ๆ ชนด และขอมลแตละชนดมกจะมการจองพนทใชงานทแตกตางกน เนองดวยจากการจองพนทของหนวยความจ าภายในระบบสวนใหญ ท าการจองแอดเดรส (address) ตามขนาดทเกบของชนดของตวแปร เชน ขนาด 2 หรอ 4 ไบท ดงตวอยาง

Page 11: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

252

member num1 ch num2

Byte 0 2 3 4 Ofset

typedef struct { int num1; char ch; int num2;

} alignment; alignment example; /*ประกาศตวแปร example มโครงสรางแบบ alignment */

ขอมลประเภท int จะตองใชแอดเดรส ใชพนท 2 ไบตในการเกบขอมล สวนขอมลชนด char จะใชพนทใดกได การจองพนทในหนวยความจ าใหกบตวแปร example รปท 10.2

รปท 10.2 แสดงการจองพนทหนวยความจ าของตวแปร example

จากรปท 10.2 ตวแปร num2 จะไมสามารถใชพนททตดกบ ch ได เนองจาก num2 เปนตวแปรชนดขอมลประเภทตวเลขทจะตองใชแอดเดรสขนาดในหนวยความจ า 2 ไบท ดงนนการจองพนทของตวแปร example จงท าใหเกดทวางทไมสามารถน ามาใชประโยชนได ดงนนการประกาศสมาชกของโครงสรางจะมผลตอการใชพนทในหนวยความจ าของระบบ

Page 12: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

253

ขอมลแบบโครงสรางกบฟงกชน ตวแปรโครงสรางกบฟงกชน ขอมลทน ามาใชงานรวมกนสามารถท าไดหลายลกษณะเชนเดยวกบการใชงานตวแปรทวไป กลาวคอ สามารถใชฟงกชนคนคาเปน struct และการสงอารกวเมนทใหฟงกชนเปนตวแปร โครงสรางได ตวอยางท 10.3 ตวอยางโปรแกรมท 10.3 การรบขอมลและแสดงผลขอมลตวแปรโครงสรางโดยใชฟงกชน

#include <stdio.h> #include <conio.h> struct point { int x; int y; }; struct point readPoint( ); void printPoint(struct point); void main() { struct point pt; pt = readPoint( ); printPoint(pt); } struct point readPoint( ) {

Page 13: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

254

ผลการท างานโปรแกรม

ตอจากดานบน struct point p1; clrscr(); printf("Enter point x : "); scanf("%d", &p1.x); printf("Enter point y : "); scanf("%d", &p1.y); return (p1); } void printPoint(struct point p) { printf("\n\nPoint x : %d, y : %d", p.x, p.y); getch(); }

Page 14: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

255

การใชพอยนเตอรกบตวแปรโครงสราง การใชฟงกชนใหมการคนคาเปนตวแปรโครงสราง หรอการสงอารกวเมนทเปนตวแปรโครงสรางไปยง ฟงกชนไมเหมาะกบตวแปรโครงสรางทมขนาดใหญ เนองดวยทกครงทสงตวแปรโครงสรางจะเปนการจองพนทตวแปรใหมขนในฟงกชน และมการส าเนาคาไปยงตวแปรตวใหมในฟงกชน ซงจะท าใหชาและเปลองพนทหนวยความจ า ซงสามารถแกปญหาไดโดยใชพอยนเตอรมาชวยแกปญหา โดยสงแอดเดรสของตวแปรโครงสรางมายงฟงกชนซงรบอารกวเมนทเปนพอยนเตอร อารกวเมนทจะชไปยงแอดเดรสเรมตนของตวแปรโครงสรางจะชวยใหการท างานเรวขนและไมตองจองหนวยความจ า กลาวคอโครงสรางนนมขนาดเทาใดกจะใชพนทและเวลาในการก าหนดแอดเดรสเทากน เสมอ แตสงทตองระวงคอหากมการเปลยนแปลงคาทพอยนเตอรชอย คาในตวแปรโครงสรางทสงมายงฟงกชนจะเปลยนตามโดยอตโนมต การประกาศตวแปรพอยนเตอรชไปยง struct หลกการดงน struct point *pp; ตวแปรพอยนเตอร pp ชไปยงขอมลแบบโครงสรางชอ struct point การเขยน *pp จะเปนการอางถงโครงสรางการอางถงสมาชกสามารถท าไดโดยอาง (*pp).x หรอ (*pp).y ตวอยาง

struct point origin={30, 20}; struct point *pp; pp = &original; printf ( “origin is (%d, %d)\n”, (*pp).x, (*pp).y );

Page 15: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

256

ขอสงเกต คอ (*pp).x จะไมเหมอนกบ *pp.x เนองจากค าสงเครองหมาย . (จด) จะมล าดบความส าคญทางการค านวณคณตศาสตรทสงกวาเครองหมาย * การการแปลความหมาย *pp.x จะเหมอนกบการอาง *(pp.x) ซงอาจท าใหเกดความผดพลาดขน การอางถงสมาชกในตวแปรพอยนเตอรชไปยงโครงสรางอาจเขยนอกลกษณะหนงโดยใชเครองหมาย -> สมมต p เปนพอยนเตอร รปแบบการใชเปนดงน p->member-of-structure จะสามารถแปลงประโยคการใชพอยนเตอรอางสมาชกของโครงสรางจากตวอยางขางบนไดวา printf ( “origin is (%d, %d)\n”, pp->x, pp->y); การอางถง (*pp).x จะมผลเหมอนกบการอางถง pp->x ดงน struct rect r, *pr = r; การอางถงสมาชกตอไปนจะมผลเทากบการอางถงสมาชกตวเดยวกน r.pt1.x (*pr).pt1.x pr->pt1.x

Page 16: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

257

ตวอยางโปรแกรมท 10.4 แสดงตวอยางการอางใชตวแปรพอยนเตอรกบโครงสราง

#include <stdio.h> #include <conio.h> struct point { int x; int y; }; struct rectangle { struct point pt1; struct point pt2; }; void main() { clrscr(); struct point origin={30,20}; struct point *pp; struct rectangle r={{30,20},{100,200}}; struct rectangle *pr; pp = &origin; printf("X : %d, Y : %d", (*pp).x, (*pp).y); pr = &r; printf("\nr.pt1.x = %d", r.pt1.x); printf("\n(*pr).pt1.x = %d", (*pr).pt1.x); printf("\npr->pt1.x = %d", pr->pt1.x); getch(); }

Page 17: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

258

ผลการท างานโปรแกรม

จากโปรแกรมท 10.4 เปนโปรแกรมทท าการสงใชตวแปรพอยนเตอรในรปของฟงกชน โดยการสงแอดเดรสของตวแปรโครงสรางไปยงฟงกชนนน สามารถท าไดเหมอนกบการใชตวแปรโดยทวไป คอ struct point pt; readPoint ( &pt ); ภายในฟงกชน main( ) มการเรยกใชฟงกชน readPoint( ) โดยสงแอดเดรสของตวแปรโครงสราง pt ไปยงฟงกชน โปรโตไทปของฟงกชน readPoint จะตองประกาศ void readPoint ( struct point * ) ; การประกาศฟงกชน readPoint( ) จะท าโดยใชค าสง

void readPoint (struct point *pPt);

กระบวนการทเกดขน คอ จะมการจองพนทหนวยความจ าใหกบตวแปรพอยนเตอร pPt และมการส าเนาคาแอดเดรสของตวแปรโครงสราง pt ในฟงกชน main( ) มาเกบยง pPt หรอกลาวไดวาใหตวแปร pPt ชไปยงตวแปรโครงสราง pt นนเอง

Page 18: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

259

ยเนยน (Union) ยเนยนเปนการจดการขอมลเปนชดชนดขอมลทคลายกบชนดขอมลโครงสราง คอ เปนชนดขอมลทประกอบดวยสมาชกทมชนดขอมลหลาย ๆ ประเภท การใชงานทกตาง ๆ จะใชในลกษณะเดยวกบขอมลโครงสราง ทงการอางถงสมาชก การสงยเนยนใหกบฟงกชนและอน ๆ แตตางกนทในขณะใดขณะหนงนนยเนยนจะสามารถใชสมาชกไดเพยงตวเดยวเทานน ยเนยนจะชวยในการจดการขอมลทตางชนดกนในพนทของตวแปรยเนยนเดยวกน เชน

union number { /*members are overlaid */ int integer; float decimal; }; typedef union number Number; Number data;

การจองพนทของตวแปร data จะจองใหกบสมาชกของยเนยนทง 2 ตว แตในขณะใดขณะหนงจะสามารถใชสมาชกไดแคตวเดยวเทานน ซงผเขยนโปรแกรมจะตองเปนผ ควบคมการใชดวยตวเอง คอมไพเลอรจะไมตรวจสอบความผดพลาดให แสดงตวอยางการใชงาน ตวอยางท 10.5

Page 19: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

260

ตวอยางโปรแกรมท 10.5 ตวอยางการใชสมาชกของยเนยน

#include <stdio.h> #include <conio.h> union number { int integer; float decimal;

}; typedef union number Number; void main ( ) { clrscr();

Number data; data.integer = 20000; printf ( "int : %6d, float : %10.4f\n", data.integer, data.decimal ); data.decimal = 123.0; printf ( "int : %6d, float : %10.4f\n", data.integer, data.decimal ); getch();

}

Page 20: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

261

ผลการท างานโปรแกรม

จากโปรแกรม 10.5 ผลการท างานจะขนอยกบการท างานแตละครง แตการใชฟงกชน printf ครงแรกจะใหค าตอบจ านวนเตมทถกตองในขณะทจ านวนจรงจะไดคาทไมสามารถคาดเดาได และการใชฟงกชน printf ครงท 2 จะใหค าตอบจ านวนจรงทถกตอง ในขณะทจ านวนเตมจะไดคาทไมสามารถคาดเดาได เชน

int : 20000, float : -0.0000 int : 0, float : 123.0000

การอางถงสมาชกภายในยเนยนสามารถใช union-variable.member-name หรอ union-variable->member-name

Page 21: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

262

ดงตวอยางการใชงานตวอยางโปรแกรมท 10.6 โปรแกรมแสดงการใชงานยเนยน

#include <stdio.h> #include <conio.h> typedef enum { INT, FLOAT } Tag; union number { /* number pair template */ int integer; float decimal; }; typedef union number Number; struct pair { /* tagged number pairs */ Tag tagged; Number value; }; typedef struct pair Pair; void print_pair ( Pair ); void main ( ) { clrscr(); Pair data; data.tagged = INT; data.value.integer = 20000; print_pair ( data ); data.tagged = FLOAT; data.value.decimal = 123.0; print_pair ( data ); getch(); } void print_pair ( Pair d ) {

Page 22: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

263

ผลการท างานโปรแกรม

จากตวอยางโปรแกรมท 10.6 สามารถก าหนดชนดขอมลใหมขนไดเอง ดวยค าสง enum workday { Monday, Tuesday, Wednesday, Thursday, Friday }; เปนการก าหนดชนดขอมลชอ Workday ประเภทขอมลทเปนไปไดคอขอมลทอยในเครองหมายปกกาทงหมด เมอตองการใชงานตองประกาศตวแปรดงน enum workday today; today = Monday; if (today == Monday) printf(“Today is %d”, today); ผลลพธทไดจากการท างาน คอ Today is 0 เนองจากการเกบขอมลของ enum จะเกบในลกษณะคลายตวแปรชดของจ านวนเตม โดยทขอมลตวแรกมคาเปน 0 และไลคาเปน 1 2 3 ไปจนกระทงหมดขอมล และสามารถใช enum รวมกบค าสง typedef ดวย

Page 23: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

264

สรป โครงสรางขอมลมประโยชนอยางมาก ในการจดเกบขอมลทมความแตกตางกนของแตละชนด (Type) ใหสามารถน ามาเกบเปนขอมลชดเดยวกนหรอกลมเดยวกนได กลาวคอในหนงโครงสรางขอมลสามารถท าการเกบขอมลทเปนชนดตวเลขจ านวนเตม ตวเลขทศนยม ตวอกขระ หรอตวอกษรได ซงแตกตางจากการเกบขอมลดวย อารเรยทมขอจ ากด ดานชนดของขอมล ตองเปนชนดเดยวกนในการเกบในหนงอารเรยเทาน น ดงน นโครงสรางขอมล สามารถน ามาประยกตใชในการจดเกบขอมลไดเปนระบบและสามารถตอบสนองการเกบอยางเปนครบถวนทกชนดตวแปรมาเปนโครงสรางเดยวกน

-------------------------------------------------------------------------

Page 24: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

265

แบบฝกหดทายบทท 10

ตอนท 1 จงเตมค าหรอขอความในชองวางตอไปนใหถกตอง

1. คยเวรดใดทใชในการสรางโครงสรางขอมลของภาษาซ …………………………………………………………………………………

2. struc ของภาษาซม กชนดประกอบดวยอะไรบาง …………………………………………………………………………………

3. การอางถงขอมลทเปนสมาชกของโครงสราง ตองใชเครองหมายใด จงยกตวอยาง ………………………………………………………………………………………

4. จงเขยนโครงสรางใหประกอบดวยตวแปรเลขจ านวนเตม 1 ตวแปร และตวแปรเลขทศนยม 1 ตวแปร ………………………………………………………………………………………

5. จงประกาศโครงสรางใหม 1 โครงสรางโดยยดโครงสรางจากขอ 4 ………………………………………………………………………………………

6. จงใหความหมาย struct point original = {10, 5}; คอ ………………………………………………………………………………………

7. จงใหความหมาย struct point **pp; คอ ………………………………………………………………………………………

8. จงใหความหมายจาก pp = &original; คอ ………………………………………………………………………………………

9. จงใหความหมายจาก printf(“original is (%d, %d)\n”, (*pp).x (*pp).y); คอ ………………………………………………………………………………………

10. จงใหความหมายจาก p->member-of-structre คอ ………………………………………………………………………………………

Page 25: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

266

ตอนท 2 จงท าเครองหมายกากบาท (x) ทบหนาขอทถกตองทสด

โดยใชโคดดานลางนตอบค าถาม

1. บรรทดใดเปนการประกาศโครงสรางทมอากเมนตเปนตวแปรตวเลขจ านวนเตม

2 ตวแปร ก. 3 ข. 4 ค. 6 ง. 7 2. บรรทดใดเปนการประกาศโครงสรางทมอากเมนตเปนโครงสราง 2 โครงสราง ก. 3 ข. 4 ค. 6 ง. 7

Page 26: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

267

3. บรรทดใดเปนการสรางโครงสรางและก าหนดตวแปรตวเลขจ านวนเตม 2 ตวแปร

ก. 3 ข. 4

ค. 6 ง. 7

4. บรรทดใดเปนการสรางโครงสรางโดยมสวนประกอบเปนพอยนเตอร

ก. 3 ข. 4

ค. 6 ง. 7

5. บรรทดใดเปนการสรางโครงสรางและก าหนดตวแปรตวเลขจ านวนเตม 2 ตวแปรอยภายใตโครงสรางแตละโครงสราง จ านวน 2 โครงสราง

ก. 8 ข. 9 ค. 10 ง. 11 6. บรรทดใดเปนการสรางพอยนเตอรเพอใชในการเกบทอยของโครงสราง ก. 8 ข. 9 ค. 10 ง. 11 7. บรรทดใดเปนน าทอยของโครงสราง มาเกบทพอยนเตอร ก. 8 ข. 9 ค. 10 ง. 11 8. บรรทดใดสงใหแสดงคาตวแปรทอยในโครงสราง มาแสดง

ก. 8 ข. 9

ค. 10 ง. 11

9. บรรทดใดเปนน าทอยของโครงสราง มาเกบทพอยนเตอร ก. 12 ข. 13 ค. 14 ง. 15 10. บรรทดใดสงใหแสดงคาตวแปรทอยในโครงสราง มาแสดง

ก. 12 ข. 13 ค. 14 ง. 15

-------------------------------------------------------------------------

Page 27: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

268

ตอนท 3 จงท าการวเคราะหค าถามและท าการเขยนอภปรายค าตอบตามทผอานเขาใจโดยยดความถกตองของเนอหาประกอบการบรรยาย

1. ใหผอานเขยนการประกาศโครงสราง ใหถกตอง

struct {

char address[20]

int num

}

2. ใหผอานเขยนแกไขโครงสราง ใหถกตอง

struct data {

int x;

int y;

};

data p1; . .

printf(“\np1 = %d”, p1);

Page 28: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

269

3. ใหผอานเขยนโครงสรางเพอใชในการเกบขอมลดงน ไปน ยหอ …………………………………………….. รน ……………………………………………….. ประเภท ..……………………………………… ผลตจากประเทศ ……………………………

4. ใหผอานเขยนเพอเกบขอมลรถยนตจ านวน 5 คน โดยทเกบขอมลยหอ รน ปทผลต ความเรวสงสด โดยใหโปรแกรมท างานดงน 1) แสดงรายละเอยดของรถยนตทจดเกบทงหมด 2) แสดงรถยนตทมความเรวสงทสด กรณทมรถยนตทมความเรวสงสดเทากน ใหพมพรายละเอยดของรถยนตนนทงหมด 3) รบขอมลปทผลต จากผใชงานโปรแกรม เพอท าการคนหาและแสดงผลขอมลของรถยนต

5. ใหผอานเขยนโปรแกรมทสามารถแสดงผลเงนรายไดของพนกงานทงหมด โดยแยกแสดงผลตามประเภทของพนกงานทใชโครงสรางและยเนยน เพอเกบขอมลเงนรายไดของพนกงานไมเกน 50 คน หากมการปอนขอมลเงนเดอนของพนกงานนอยกวา 6,000 บาทจะเปนการหยดการปอนขอมล องคกรแหงนแบงพนกงานเปน 2 ประเภท คอ พนกงานทวไป และพนกงานฝายขาย พนกงานทวไปมรายไดจากเงนเดอน และคาท างานนอกเวลา (Over Time) พนกงานฝายขายจะมรายไดจากเงนเดอน และคาคอมมสชน

-------------------------------------------------------------------------

Page 29: การเขียนโปรแกรมคอมพิวเตอร์ [สำนักพิมพ์ ศสว.]learn · การเขียนโปรแกรมคอมพิวเตอร์

การเขยนโปรแกรมคอมพวเตอร [ส านกพมพ ศสว.] สกล ค านวนชย

270

เอกสารอางอง

ศรณย อนทโกสม (2539). ทฤษฏและตวอยางโจทยการเขยนโปรแกรมดวยภาษาซ กรงเทพฯ : แมคกรอฮล อนเตอรเนชนแนล เอนเตอรไพรส, องค. ธนวา ศรประโมง (2539). การเขยนโปรแกรมภาษาซส าหรบวศวกรรม. พมพครง ท 4. กรงเทพฯ : มหาวทยาลยเทคโนโลยมหานคร. วจกษณ ศรสจจะเลศวาจา และดษฎ ประเสรฐธตพงษ ออนไลน : www.satit.su.ac.th/soottin. Brian, W. K. Programming in C: A Tutorial Online: http://www.lysator.liu.se/c/bwktutor.html. Byron S. Gottfried, “Schaum ’s Theory and problems of programming with c” McGraw-Hill,Inc., 1990. Kenneth A.Barclay. “ANSI C Problem Solving and Programming” Prentice Hall International Ltd., 1990. Steven, H. & Lutfar, R. (2006). Art of Programming Contest: C Programming | Data Structure | Algorithms (ACM supported), 2nd Edition.