Structure Programming การเขียนโปรแกรม คอมพิวเตอร ์ สั ปดาหที ์ ่ 10 ตัวแปรโครงสรางข ้ ้อมูล(Structure) Outline 1 Objective 2p Structure 3 Array of Structure 4 Typedef (Type definition) 5 Assignment objectives เพือ ่ ให้นิสิตรูจั วแปรโครงสร้าง ้ กและเขาใจตั ้ ข้อมูลในภาษาซี สามารถเขียนโปรแกรมภาษาซีโดยใช้ตัวแปร โครงสรางข อมู ้ ้ ลได้ สามารถนาความรูเรื ่ งตัวแปรโครงสรางข อมู ้ อ ้ ้ ลไป ประยุกตเพื ่ แกไขโจทย ปั ิ ประจาวัน ์ อ ้ ์ ญหาในชีวต ไดได กตองเหมาะสม ้ อย ้ างถู ่ ้ Outline 1 Objective 2p Structure 3 Array of Structure 4 Typedef (Type definition) 5 Assignment Why structure variable is essential? การเก็บข้อมูลเราอาจจาเป็ นต้องใช้ข้อมูลทีห ่ ลากหลาย รูปแบบแตเป็ ่ ส ี ่ วนรวมกั น ่ นกลุมข ่ ้อมูลทีม ่ • รายละเอีย ดของนัก ศึ กษาอาจจะมีข้ อมู ล รหัส ชื่อ สกุ ล อายุ เกรดเฉลี่ย ของนั ก ศึ กษา ซึ่ ง เรา จะต้ องสร้ างตัว แปรขึ้น มาใช้ ในการเก็ บ ข้ อมูล ของ นักศึ กษา 5 ตัวแปรดวยกั น ้ ทัง้ ทีจ ่ ริง แล้ว ข้อมูล ทัง้ หมดมีส่วนเกีย ่ วข้อง คือเป็ น ของนักศึ กษาคนเดียวกัน หากมีจานวนนักศึ กษามากๆ การสร้างตัวแปรและใช้งานตัวแปร อาจจะเกิดความ สั บสนขึ้นได้ ดังนั้นเราจึง ควรนาโครงสร้างข้ อมูลมา ช่วยในการจัดการกับข้อมูลเหลานี ่ ้ Structure Variable โครงสร้างข้อมูล (Structure) เป็ นการกาหนดชนิด ข้อมูลใหมขึ ้ มาใช้งาน โดยชนิดข้อมูลนี้เกิดจากการ ่ น รวมกั น ของ ชนิ ด ข้ อมู ล พื้ น ฐา นที่ อ า จ จ ะเป็ นชนิ ด เดียวกันหรือตางชนิ ดกันก็ได้ ่ ตัวอยาง อมู ่ วา่ “Student” ่ : โครงสรางข ้ ้ ลนักศึ กษาให้ชือ ประกอบดวย ้ ชือ ่ เป็ นชนิด char นามสกุลเป็ นชนิด char อายุเป็ นชนิด int เพศเป็ น char เกรดเฉลีย ่ เป็ น float Structure Variable Declaration struct structure_name { type variable_1; type variable_2; type variable_3; ……… } คือ บ่งบอกว่าเป็ นตัวแปรชนิดโครงสร้าง(Structure) struct_name คือ ชื่อของตัวแปรชนิ ดโครงสร้าง type variable_1-n คือ ตัวแปรที่เกี่ยวข้องกับตัวแปรโครงสร้างที่ ต้องการเก็บ struct Structure VS. Array • • • อะเรย ์ (array) เก็บข้อมูลจานวนมากๆ ได int้ point[5] เข้าถึงข้อมูลแตละตั วไดโดยง าย ่ ้ ่ ข้อจากัด : ข้อมูลเหลานั ่ ้ นต้องเป็ นชนิด เดียวกันเทานั ่ ้น โครงสร้างข้อมูล (Structure) struct ช student { น ก็ ไ ด้ • ข้อมูล แต่ละตัวในกลุมสามารถมี นิดต่างกั ่ char เช่น ข้อมูลผลการเรียนของนั กศึ กstdName[20]; ษาแตละคน ่ • char stdLastName[20]; เทียบเทากั บ Record ในภาษาอื น ่ ่ } int age; float grade; Example of Information student นายวีกจ ิ นางสาวนิน วีกจ ิ มุนินทร ์ รักเป็ นไทย จงสวัสดิ ์ 16 17 char sex[7]; ชาย หญิง float grade; 2.95 3.25 char name[20]; char surname[30]; int age; Example of Variable Declaration struct student { char char int char float name[20]; surname[30]; age; sex[7]; grade; int day, month, year; char char day[3], month[3]; year[5]; }; struct date { }; struct sdate { }; พิจ ารณาสมาชิกในโครงสร้ างข้อมูล เราเรียกข้อมูล ยอยเหล านี ่ ่ ้วา่ “ฟิ ลด ์ (Field)” struct address { char name[30]; char detail[50]; int age; char telephone[10]; }; struct student { char name[30]; char surname[50]; int Id; }; ชือ ่ ของ Structure สมาชิกขอมู ้ ลภายในมี 4 ฟิ ลด ์ (4 fields) Memory Usage struct book { char float int } code 6 bytes code[6]; price; year; price 4 bytes year 2 bytes Member Accessing การอ้ างถึง สมาชิก ในตัว แปรชนิ ด โครงสร้ าง ท าได้ โดยบอกชือ ่ ตัวแปรโครงสร้างตามดวยจุ ด และตอด ้ ่ ้วย ชือ ่ สมาชิกของโครงสร้างนั้นๆ • มีรป ู แบบดังนี้ structure_name.member; student1.name อ้างถึงขอมู ่ ของตัว ้ ลชือ แปร student1 student1.surname อ้างถึงขอมู ้ ลสกุลของ ตัวแปร student1 birthday.day อ้างถึงขอมู ้ ลวันของตัว Declaration & Assignment Value #include <stdio.h> struct income { float salary, bonus; int age; }; void main(void) { struct income somsri; somsri.salary = 18000.00; somsri.bonus = 30000.00; somsri.age = 23; } Example 1 #include <stdio.h> #include <string.h> struct database { int id_number; int age; float salary; }; int main() { database employee; has modifiable //There is now an employee variable that // variables inside it. employee.age = 22; employee.id_number = 1; employee.salary = 12000.21; return 0; } Declaration & Assignment Value (cont.) สามารถก าหนดค่ าทั้ง หมดในตัว แปรได้ โดยใช้ เครื่ อ งหมาย{ } คร่ อมค่ าเริ่ ม ต้ นทั้ง หมด และใช้ เครื่ อ งหมาย , คั่น ระหว่ างค่ าของสมาชิ ก แต่ ละตัว ตัวอยางเช ่ ่น struct { int int int } ; struct d1 date day; month; year; date d1 = {10,5,1992}; day 10 month 5 year 1992 String Assignment ถ้าสมาชิกของโครงสร้างเป็ นข้อความ เราจะกาหนด ตรงๆ เหมือนสมาชิกทีเ่ ป็ นชนิดอืน ่ ไมได ่ ้ วิธก ี ารกาหนดข้อมูลชนิดข้อความ ให้ทาการกาหนด ผานค าสั่ ง strcpy หรือรับคาจากคี ยบอร ดด ่ ่ ์ ์ ้วยคาสั่ ง gets หรือ scanf ก็ได้ #include <stdio.h> #include <string.h> struct letter { char name[20]; char address[30]; char message[40]; }; void main(void) { struct letter first; printf("Enter name :"); gets(first.name); printf("Enter address :"); scanf("%s",first.address); strcpy(first.message, "How r u?"); printf("\nNAME is %s",first.name); printf("\nAddress is %s",first.address); printf("\nMessage : %s",first.message); } Initial Value to Member การกาหนดคาเริ ่ ต้นให้ตัวแปรขอความ ่ ม ้ struct subject { char name[20]; int credit; char grade; } s1 = {"Physics I”, 3, 'A'}; หรือ struct subject s1 name Physics I credit 3 grade A { char name[20]; int credit; char grade; }; struct subject s1 = {"Physics I”, 3, 'A'}; Copy Value in Same Structure การคัดลอก (Copy) ค่าของตัว แปรโครงสร้างชนิ ด เดียวกัน สามารถทาไดโดยใช ่ งหมาย " = " เช่น ้ ้เครือ struct date { int day,month,year; } d1, d2; แทนทีจ ่ ะกาหนดคาสมาชิ กทีละตัว ่ d2.day = d1.day; d2.month = d1.month; d2.year = d1.year; สามารถกาหนดคาเป็ เลยเช ่ นตัวแปรโครงสรางได ้ ้ ่ น d2 d1; = Comparison of Structure ในการเปรีย บเทีย บค่ าของตัว แปรโครงสร้ างนั้ น ให้ เปรียบเทียบคาของสมาชิ กแตละตั ว ่ ่ น าตัว แปรโครงสร้ างมาเปรีย บเทีย บกัน โดยตรงไม่ ได้ เช่น หากมีการตัวแปรชนิด struct date ชือ ่ วา่ d1 และ d2 struct date { int day,month,year } d1,d2; จะนา d1 และ d2 มาเปรียบเทียบกันโดยตรงไมได ่ ้ if(d1 == d2) printf(“d1 is the same date as d2”); Outline 1 Objective 2p Structure 3 Array of Structure 4 Typedef (Type definition) 5 Assignment Array of Structure ปกติเราจะใช้ข้อมูลชนิดโครงสร้างมากกวาหนึ ่ง ่ ข้ อมู ล เช่ นโครงสร้ างนั ก เรีย นประกอบด้ วย รหัส, ชื่อ, เพศ, และอายุ โดยส่วนมากเราจะมี ข้อมูลของนักเรียนหลายคน ดังนั้นเราสามารถ สร้ างตัว แปรของนัก เรีย นให้ เป็ นอาเรย ของตั ว ์ แปรโครงสร้ าง เพื่ อ ท าการเก็ บ ข้ อมู ล แบบ โครงสรางไว เป็ ่ วข้องกัน เช่น ้ ้ นกลุมข ่ ้อมูลทีเ่ กีย โครงสร้างนัก เรีย น ซึ่ง โรงเรีย นหนึ่ ง จะต้องมี นักเรียนหลายคน จะต้องเก็บข้อมูลของนักเรียน ่ นามาประมวลผลตอไป เหลานี ่ ่ ้เพือ Array of Structure (cont.) ข้อมูลโครงสราง 1 ตัว ก็คอ ื ขอมู ้ ้ ล 1 รายการ (1 record) เช่น ประกาศขอมู ด student ้ ลโครงสรางชนิ ้ struct student { char code[9]; char name[41]; float mid, lab, fin; char grade; } stu1; stu1 เป็ นตัวแปรโครงสราง ้ สามารถเก็บขอมู ้ ลนักศึ กษาได้ 1 คน ต้องการเก็บขอมู ้ ลนักศึ กษาหลายๆ คนนั้น ไมต ่ ้องประกาศ ตัวแปรโครงสรางหลายๆ ตัว ้ โดยสามารถสรางอาเรย ของโครงสร าง ้ ้ (Arrays of ์ structures) ได้ Array of Structure (cont.) การประกาศอาเรยของข อมู รป ู แบบ ้ ลชนิดโครงสรางมี ้ ์ ดังนี้ struct structure_name member เช่น struct student [size]; { char code[9]; char name[41]; float mid, lab, fin; char grade; }; struct student stu[3]; ไดตั ่ ส ี มาชิก 3 ตัว (เพือ ่ เก็บขอมู ้ วแปรอาเรยที ้ ล ์ ม น.ศ 3 คน) สมาชิกแตละตั วในอาเรย ์ คือตัวแปรโครงสราง ่ ้ Memory Usage #include <stdio.h> main() { struct profile { char name[19]; int age; char grade; }; struct profile student[3]; } nam e student[0] student[1] student[2] 20 bytes age 2 1 grad e Assignment Value to Array of Structure struct structure_name member [size] = { { value_list 1}, { value_list 2}, ... { value_list n} }; ตัวอยางเช ่ ่น struct student stu[100] ={ 30, ‘C’} , }; {“61007332”, “Somchai”, 20, 15, {“61017332”, “Decha”, 25, 18, 40, ‘A’} , {“61027332”, “Tanee”, 12, 15, 25, ‘D’} Example 3 #include <stdio.h> #include <string.h> main() { struct profile { char name[20]; int age; char grade; }student[10]; //Assignment value to each field of member strcpy(student[0].name, “Manee”); student[2].age = 12; student[4].grade = ‘A’; //show some field of each member printf(“%s\n”,student[0].name); printf(“%d\n”,student[2].age); printf(“%c\n”,student[4].grade); } Example 4 1.#include <stdio.h> 2.#include <conio.h> 3.void main() 4.{ 5. struct 6. { 7. char id[10]; 8. char name[30]; 9. int age; 10. } std[4]; 11. int i; 12.* 13. printf("Please <Enter> for Input 5 record: \n"); 14. for(i=0;i<4;i++) 15. { 16. printf("-------------------------------------------\n"); 17. printf("RECORD # %d \n",i+1); 18.* 19. printf("\tCODE : "); 20. scanf("%s",std[i].id); Example 4 (cont.) 21. printf("\tNAME : "); 22. scanf("%s",std[i].name); 23. printf("\tAGE:"); 24. scanf("%d",&std[i].age); 25. } 26. //show the output to user 27. printf("\n------ OUT PUT ------ \n"); 28. printf(" CODE NAME AGE\n"); 29. //For-loop for show information of each user 30. for(i=0; i<4; i++) 31. { 32. printf("%s %s %d \n",std[i].id ,std[i].name,std[i].age); 33. } 34. } Result /* The mechanism of a structure */ /* Define a type "person" to include firstname,surname, age and child count */ #include <stdio.h> #include <string.h> struct { char firstname[20]; char surname[20]; float age; int childcount; } person; int main () { /* Create two persons */ person jimmy, flossie; float avage; /* Fill up each of the persons with information */ strcpy(jimmy.firstname,"James"); strcpy(jimmy.surname,"Conway"); jimmy.age = 32.0; jimmy.childcount = 2; strcpy(flossie.firstname,"Florence"); strcpy(flossie.surname,"Conway"); flossie.age = 21.0; flossie.childcount = 2; /* Calculate the average age of the persons */ avage = (flossie.age + jimmy.age) / 2.0; /* Print out the persons names and the average age */ printf ("About %s and %s ...n",flossie.firstname,jimmy.forename); printf ("Their average age is %.2fn",avage); return 0; } Structure of Structure struct date { strcpy(p1.name,"Somchai"); int day; p1.birthday.day = 10; int month; p1.birthday.month = 3; int year; p1.birthday.year = 1992; }; struct person { char name[30]; struct date birthday; }; struct person p1; Structure of Structure struct date { struct node int day; { int month; char data; int year; struct node next; }; }; struct person { char name[30]; struct date birthday; }; ห้ ามซ้ อนข้ อมูลชนิด โครงสร้ างแบบเดียวกันใน ตัวเอง Outline 1 Objective 2p Structure 3 Array of Structure 4 Typedef (Type definition) 5 Assignment Type definition ในภาษาซี สามารถกาหนดชนิดตัวแปรขึน ้ มา ใหมได ่ ้ โดยใช้คาสั่ ง typedef (type definition) รูปแบบ: typedef ชนิดตัวแปรทีม ่ อ ี ยูแล ้ ่ ว ตัวแปรใหม;่ เช่น typedef int my_int; บการนิยาม รูปแบบการใช้ typedef รวมกั ่ structure: typedef struct{ type variable 1; type variable 2; ชนิด Type definition (cont.) ตัวอย่าง typedef struct { int day,month,year; } date; ในการประกาศตัวแปรก็สามารถใช้ ชนิดตัวแปรใหม่ ได้ เลย เช่ น date d1,d2; ข้อสั งเกต เมือ ่ กาหนดตัวแปรหลังจากการกาหนดดวย ้ ไมต ่ ้องมีคาวา่ struct นาหน้าชนิดขอมู ้ ลอีก How to use structure variable? struct info { char firstName[20]; char lastName[20]; int age; }; typedef struct { char firstName[20]; char lastName[20]; int age; } info; info j; struct info i1, i2; struct info k; info j; Typedef of Typedef typedef struct { char firstName[20]; char lastName[20]; int age; } InfoT; typedef struct { InfoT info; double salary; } EmployeeT; EmployeeT e1; e1.info.age = 21; Example 5 (Regular Form) #include<stdio.h> typedef struct telephone { char *name; int number; }TELEPHONE; int main() { TELEPHONE index; index.name = "Jane Doe"; index.number = 12345; printf("Name: %s\n", index.name); printf("Telephone number: %d\n", index.number); return 0; } Outline 1 Objective 2p Structure 3 Array of Structure 4 Typedef (Type definition) 5 Assignment Assignment 1. ให้นิสิตสรางข อมู น ้ มา เพือ ่ ้ ้ ลชนิดโครงสรางขึ ้ ใช้เก็บขอมู ้ ลดังนี้ 1. รหัสนิสิต (ID) 2. เกรดเฉลีย ่ (ตัวแปรแบบทศนิยม) 3. รับข้อมูลจากแป้นพิมพ ์ มาเก็บไว้ โดยจะ เก็บขอมู ้ ลนิสิตจานวน 5 คน 4. ทาการเรียงขอมู ่ เี กรดน้อยสุด ้ ลของนิสิตทีม ไปหาเกรดมากสุดจากนั้นแสดงรหัสนิสิตที่ เรียงตามเกรดเฉลีย ่ พรอมกั บเกรดทีเ่ รียงดวย ้ ้