Computer Programming การเขียนโปรแกรมคอมพิวเตอร์ สัปดาห์ที่ 10 ตัวแปรโครงสร้างข้อมูล(Structure)
objectives เพื่อให้นิสิตรู้จักและเข้าใจตัวแปรโครงสร้างข้อมูลในภาษาซี สามารถเขียนโปรแกรมภาษาซีโดยใช้ตัวแปรโครงสร้างข้อมูลได้ สามารถนำความรู้เรื่องตัวแปรโครงสร้างข้อมูลไปประยุกต์เพื่อแก้ไขโจทย์ปัญหาในชีวิตประจำวันได้ได้อย่างถูกต้องเหมาะสม
Outline 1 Structure 2 Array of Structure 3 Typedef (Type definition) 4 Structure & Pointer 5 Assignment #10
C Programming Structure พรีโปรเซสเซอร์ไดเร็คทีฟ #include<file.h> type function_name(type); type variable; int main() { statement-1; ... statement-n; return 0; } type function_name(type variable) return(var); ฟังก์ชันโพรโทรไทพ์ ส่วนหัวโปรแกรม ตัวแปรชนิดโกบอล ตัวแปรชนิดโลคอล ฟังก์ชันหลัก คำสั่ง ส่วนตัวโปรแกรม ฟังก์ชันย่อย
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; ……… } struct คือ บ่งบอกว่าเป็นตัวแปรชนิดโครงสร้าง(Structure) struct_name คือ ชื่อของตัวแปรชนิดโครงสร้าง type variable_1-n คือ ตัวแปรที่เกี่ยวข้องกับตัวแปรโครงสร้างที่ ต้องการเก็บ
Structure VS. Array เก็บข้อมูลจำนวนมากๆ ได้ เข้าถึงข้อมูลแต่ละตัวได้โดยง่าย ข้อจำกัด : ข้อมูลเหล่านั้นต้องเป็นชนิดเดียวกันเท่านั้น โครงสร้างข้อมูล (Structure) ข้อมูลแต่ละตัวในกลุ่มสามารถมีชนิดต่างกันก็ได้ เช่น ข้อมูลผลการเรียนของนักศึกษาแต่ละคน เทียบเท่ากับ Record ในภาษาอื่น int point[5] struct student { char stdName[20]; char stdLastName[20]; int age; float grade; }
Example of Information student นายวีกิจ นางสาวนิน วีกิจ มุนินทร์ char name[20]; รักเป็นไทย จงสวัสดิ์ char surname[30]; 16 17 int age; ชาย หญิง char sex[7]; 2.95 3.25 float grade;
Example of Variable Declaration struct student { char name[20]; char surname[30]; int age; char sex[7]; float grade; }; struct date { int day, month, year; }; struct sdate { char day[3], month[3]; char year[5]; };
สมาชิกข้อมูลภายในมี 4 ฟิลด์ (4 fields) 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 code[6]; float price; int year; } code 7 bytes 4 bytes 2 bytes
structure_name.member; Member Declaration การอ้างถึงสมาชิกในตัวแปรชนิดโครงสร้าง ทำได้โดยบอกชื่อตัวแปรโครงสร้างตามด้วยจุด และต่อด้วยชื่อสมาชิกของโครงสร้างนั้นๆ มีรูปแบบดังนี้ structure_name.member; student1.name อ้างถึงข้อมูลชื่อของตัวแปร student1 student1.surname อ้างถึงข้อมูลสกุลของตัวแปร student1 birthday.day อ้างถึงข้อมูลวันของตัวแปร birthday birthday.month อ้างถึงข้อมูลเดือนของตัวแปร birthday
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; //There is now an employee variable that has modifiable // variables inside it. employee.age = 22; employee.id_number = 1; employee.salary = 12000.21; return 0; }
Declaration & Assignment Value (cont.) สามารถกำหนดค่าทั้งหมดในตัวแปรได้ โดยใช้เครื่องหมาย { } คร่อมค่าเริ่มต้นทั้งหมด และใช้เครื่องหมาย , คั่นระหว่างค่าของสมาชิกแต่ละตัว ตัวอย่างเช่น struct date { int day; int month; int year; } ; struct date d1 = {10,5,1992}; day 10 month 5 d1 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); }
Example 2 #include <stdio.h> #include <conio.h> struct student { int id; char *name; float percentage; } student1, student2, student3; int main() { struct student st; student1.id=1; student2.name = "Angelina"; student3.percentage = 90.5; printf(" Id is: %d \n", student1.id); printf(" Name is: %s \n", student2.name); printf(" Percentage is: %f \n", student3.percentage); getch(); return 0; }
Initial Value to Member การกำหนดค่าเริ่มต้นให้ตัวแปรข้อความ struct subject { char name[20]; int credit; char grade; } s1 = {"Physics I”, 3, 'A'}; หรือ }; struct subject s1 = {"Physics I”, 3, 'A'}; name Physics I credit 3 s1 grade A
Copy Value in Same Structure 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 Structure 2 Array of Structure 3 Typedef (Type definition) 4 Structure & Pointer 5 Assignment #10
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.) การประกาศอาเรย์ของข้อมูลชนิดโครงสร้างมีรูปแบบดังนี้ เช่น ได้ตัวแปรอาเรย์ที่มีสมาชิก 3 ตัว (เพื่อเก็บข้อมูล น.ศ 3 คน) สมาชิกแต่ละตัวในอาเรย์ คือตัวแปรโครงสร้าง (structure) ชนิด student struct structure_name member [size]; struct student { char code[9]; char name[41]; float mid, lab, fin; char grade; }; struct student stu[3];
Memory Usage age name 20 bytes 2 1 grade student[0] student[1] #include <stdio.h> main() { struct profile { char name[19]; int age; char grade; }; struct profile student[3]; } age name 20 bytes 2 1 grade student[0] student[1] student[2]
Assignment Value to Array of Structure ตัวอย่างเช่น struct structure_name member [size] = { { value_list 1}, { value_list 2}, ... { value_list n} }; struct student stu[100] ={ {“61007332”, “Somchai”, 20, 15, 30, ‘C’} , {“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 #include <stdio.h> #include <conio.h> void main() { struct char id[10]; char name[30]; int age; } std[4]; int i; * printf("Please <Enter> for Input 5 record: \n"); for(i=0;i<4;i++) printf("--------------------------------------------\n"); printf("RECORD # %d \n",i+1); printf("\tCODE : "); scanf("%s",std[i].id);
Example 4 (cont.) printf("\tNAME : "); scanf("%s",std[i].name); printf("\tAGE:"); scanf("%d",&std[i].age); } //show the output to user printf("\n------ OUT PUT ------ \n"); printf(" CODE NAME AGE\n"); //For-loop for show information of each user for(i=0; i<4; i++) { printf("%s %s %d \n",std[i].id ,std[i].name,std[i].age);
Result
#include <stdio.h> #include <string.h> struct { /* 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;
strcpy(flossie.firstname,"Florence"); 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 { int day; int month; int year; }; struct person char name[30]; struct date birthday; struct person p1; trcpy(p1.name,"Somchai"); p1.birthday.day = 10; p1.birthday.month = 3; p1.birthday.year = 1992;
Outline 1 Structure 2 Array of Structure 3 Typedef (Type definition) 4 Structure & Pointer 5 Assignment #10
Type definition ในภาษาซี สามารถกำหนดชนิดตัวแปรขึ้นมาใหม่ได้ โดยใช้คำสั่ง typedef (type definition) รูปแบบ: typedef ชนิดตัวแปรที่มีอยู่แล้ว ชนิดตัวแปรใหม่; เช่น typedef int my_int; รูปแบบการใช้ typedef ร่วมกับการนิยาม structure: typedef struct{ type variable 1; type variable 2; ... type variable n; } new_definition_variable;
Type definition (cont.) ตัวอย่าง typedef struct { int day,month,year; } date; ในการประกาศตัวแปรก็สามารถใช้ชนิดตัวแปรใหม่ได้เลย เช่น date d1,d2; ข้อสังเกต เมื่อกำหนดตัวแปรหลังจากการกำหนดด้วย typedef แล้ว ไม่ต้องมีคำว่า struct นำหน้าชนิดข้อมูลอีก
How to use structure variable? struct info { char firstName[20]; char lastName[20]; int age; }; struct info i1, i2; info j; typedef struct { char firstName[20]; char lastName[20]; int age; } info; info j; struct info k;
Typedef of Typedef typedef struct { char firstName[20]; char lastName[20]; int age; } InfoT; 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; }
Example 6 (Pointer Form) #include<stdio.h> typedef struct telephone { char *name; int number; }TELEPHONE; int main() TELEPHONE index; TELEPHONE *ptr_myindex; ptr_myindex = &index; ptr_myindex->name = "Jane Doe"; ptr_myindex->number = 12345; printf("Name: %s\n", ptr_myindex->name); printf("Telephone number: %d\n", ptr_myindex->number); return 0; }
Outline 1 Structure 2 Array of Structure 3 Typedef (Type definition) 4 Structure & Pointer 5 Assignment #10
Structure & Pointer s sPtr struct student{ char name[40]; int age ; }; struct student s; struct student *sPtr; strcpy(s.name,“Somsak”); s.age = 19; sPtr = &s; s sPtr s.name s.age Somsak\0 19 xxxx xxxx หากต้องการพิมพ์ว่าชื่อนักศึกษา สามารถทำได้สองวิธีคือ printf("%s", s.name); printf("%s", sPtr->name);
Structure & Pointer (cont.) struct card { char *face; char *suit; }; struct card a; struct card *aPtr; Queen\0 mmmm a.face = “Queen”; a.suit = “heart”; heart\0 aPtr = &a; nnnn aPtr a a.face a.suit mmmm nnnn xxxx xxxx หากต้องการพิมพ์ว่าไพ่ใบนี้อยู่ในชุดไหน สามารถทำได้สองวิธีคือ printf("%s", a.suit); printf("%s", aPtr->suit);
Example 3 aPtr a int main(){ struct card { char *face; // 2,3,..,9,J,Q,K,A char *suit; // space, heart, diamond, club }; struct card a; struct card *aPtr; a.face = “Ace"; a.suit = “spade"; aPtr = &a; printf( "%s%s%s\n%s%s%s\n%s%s%s\n", a.face , " of " ,a.suit, aPtr->face , " of " , aPtr->suit, (*aPtr).face, " of " , (*aPtr).suit ); return 0; } aPtr yyyy xxxx mmmm nnnn Ace\0 space\0 Ace of spade a a.face a.suit mmmm nnnn yyyy xxxx
Example 7 #include <stdio.h> #include <conio.h> int main() { struct st { int id; char *name; char *address; }; struct st employee, *stptr; stptr = &employee; stptr->id = 1; stptr->name = "Angelina"; stptr->address ="Rohini,Delhi"; printf("Employee Information: id=%d\n%s\n%s\n", stptr->id, stptr->name, stptr->address); getch(); return 0; }
Example 8 จงเขียนโปรแกรมเก็บข้อมูลนักศึกษาจำนวน 10 คน โดยมีรายละเอียดดังนี้ ข้อมูลประกอบด้วย ชื่อกับ อายุ รับข้อมูลนักศึกษาจากคีย์บอร์ด โปรแกรมจะต้องใช้ตัวชี้ที่ชี้ไปยังข้อมูลประเภทโครงสร้าง เมื่อป้อนข้อมูลเสร็จ โปรแกรมจะค้นหานักเรียนที่อายุมากกว่า 20 ปี แสดงชื่อ ออกจอภาพ
Output Student[6] Student[0] name:tu name:joy age:25 age:12 Student[7] name:tee age:34 Student[8] name:bat age:44 Student[9] name:phon age:33 jo,23 pat,21 tu,25 tee,34 bat,44 phon,33 Student[0] name:joy age:12 Student[1] name:boy age:20 Student[2] name:jo age:23 Student[3] name:pat age:21 Student[4] name:ple age:13 Student[5] name:tom age:11
Example 8 (cont.) #include<stdio.h> #include<conio.h> int main() { struct profile{ char name[20]; int age; } s[10]; int i; struct profile *sPtr; sPtr = s;
Example 8 (cont.) for (i=0; i<10; i++) { printf("Student # %d\n\tName :", i+1 ); scanf("%s",sPtr->name); printf("\tAge:"); scanf("%d",&(sPtr->age)); sPtr++; } sPtr -= 10; if ((sPtr->age) > 20) printf("\n%s, %d",sPtr->name,sPtr->age); return 0;
Outline 1 Structure 2 Array of Structure 3 Typedef (Type definition) 4 Structure & Pointer 5 Assignment #10
Assignment จงสร้างอาร์เรย์ A เป็นอาร์เรย์ขนาด 3x3 เก็บข้อมูลตัวเลข 1-9 แล้วแสดงผลลัพธ์ตัวเลขในอาร์เรย์โดยใช้การอ้างอิงค่าตัวเลขโดยใช้ Pointer เท่านั้น x และ y เป็นตัวแปรแบบทศนิยม จงเขียนโปรแกรม ทำการสลับค่า x และ y โดยใช้ pointer เท่านั้น ให้ S เป็น Structure ที่เก็บข้อมูลตัวเลข 3 ตัว จงเขียนโปรแกรมให้เก็บข้อมูลตัวเลขตัวที่ 1 และ 2 ลงใน Structure แล้วหาผลรวมลงในตัวเลขตัวที่ 3 โดยใช้การอ้างอิงข้อมูลโดย Pointer เท่านั้น