วิชา cosc2202 โครงสร้างข้อมูล (data structure)
DESCRIPTION
วิชา COSC2202 โครงสร้างข้อมูล (Data Structure). ทบทวนเรื่อง Array และ struct pointer การเขียนโปรแกรมติดต่อแฟ้มข้อมูล. ทบทวนเรื่อง Array. - PowerPoint PPT PresentationTRANSCRIPT
ทบทวนเรื่�อง Array และ struct pointer การื่เขี�ยนโปรื่แกรื่มติ�ดติ�อแฟ้�ม
ขี�อม�ล
ว�ชา COSC2202 โครื่งสรื่�างขี�อม�ล (Data Structure)
ทบทวนเรื่��อง Array Array เป"นโครื่งสรื่�างขี�อม�ลท�ปรื่ะกอบด�วยกล#�มขีอง
ติ$วแปรื่ท�เป"นค�าอะไรื่ก&ได� แติ�ติ�องม�ชน�ดเด�ยวก$น ขี�อม�ลแติ�ละติ$วใน Array เรื่�ยกว�าสมาช�กขีอง array การื่อ�างถึ)งจะเรื่�ยกช�อติ$วแปรื่ array แล�วติามด�วยหมายเลขีด$ชน� (index ) ขีองสมาช�กท�ติ�องการื่อ�างถึ)ง โดยสมาช�กติ$วแรื่กจะแทนด�วยล,าด$บหมายเลขี 0 สมาช�กติ$วท�2 แทนด�วยล,าด$บหมายเลขี 1 ..จนถึ)งล,าด$บท� n
ทบทวนเรื่��อง Arrayติ$วอยาง char a[4]; int num[10]; int a[2][3];
ขีนาดขีอง subscript = upper bound – lower bound + 1
ขีนาดขีองอะเรื่ย = ผลค�ณขีองขีนาดขีอง subscript แติละติ$ว
สมการื่ค,านวณหาติ,าแหน�งขี�อม�ล i -0Loc (A[i]) = L + (i L)C
Pointers และ Arrays ของ Pointers Pointer เป"นติ$วแปรื่ชน�ดหน)งท�ท,าหน�าท�เก&บติ,าแหน�งท�อย��
(Address ) ขีองติ$วแปรื่ท�อย��ในหน�วยความจ,า รื่�ปแบบ
- *type variable name
type หมายถึ)ง ชน�ดขีองติ$วแปรื่ * หมายถึ)ง เป"นเครื่�องหมายท�แสดงว�า ติ$วแปรื่ท�ติามหล$งเครื่�องหมาย
น�2เป"นติ$วแปรื่พอยน4เติอรื่4
variable-name เป"นช�อขีองติ$วแปรื่ท�ติ�องการื่ปรื่ะกาศว�าเป"นชน�ดพอยน4เติอรื่4
Pointers และ Arrays ของ Pointers
char * prt; หมายความว�า ปรื่ะกาศว�าติ$วแปรื่ prt เป"นติ$วแปรื่พอยน4เติอรื่4ท�ใช�เก&บติ,าแหน�งเรื่�มติ�นท�จะเก&บ character
int * a; หมายความว�า ปรื่ะกาศว�าติ$วแปรื่ a เป"นติ$วแปรื่พอยน4เติอรื่4ท�ใช�เก&บติ,าแหน�งเรื่�มติ�นท�จะใช�เก&บ integer
Pointers และ Arrays ของ Pointers
เครื่�องหมาย & เป"นเครื่�องหมายท�ใช�เม�อติ�องการื่ให�เอาค�าติ,าแหน�งท�อย��ขีองติ$วแปรื่ท�เก&บไว�ในหน�วยความจ,าออกมาใช� เช�น x=10 (ก,าหนดให�ติ$วแปรื่ x ซึ่)งอย��ท�ติ,าแหน�ง 1000 ม�ค�า 10 เก&บอย��)
int * y , x=10; y = &x;
ติ$วแปรื่ y ซึ่)งปรื่ะกาศเป"นติ$วแปรื่พอยน4เติอรื่4จะเก&บค�า 1000 ซึ่)งเป"นติ,าแหน�งท�อย��
ติ$วอย�าง Pointers และ Arrays ของ Pointers
ค,าส$งท� 1 : int a, *ptr, b, c , *d;
int a, *ptr, b, c , *d; a=25;ptr = &a;
b = a; ค,าส$งท� 2 : a = 25c = *ptr;d = ptr;
ติ$วอย�าง Pointers และ Arrays ของ Pointers
ค,าส$งท� 3 : ptr = &a;int a, *ptr, b, c , *d; a=25;ptr = &a;
b = a; ค,าส$งท� 4 : b = a; c = *ptr;d = ptr;
ติ$วอย�าง Pointers และ Arrays ของ Pointers
ค,าส$งท� 5 : c = *ptr;int a, *ptr, b, c , *d; a=25;ptr = &a;
b = a; ค,าส$งท� 6 : d = ptr; c = *ptr;d = ptr;
Struct Struct เป"นท�เก&บช#ดขีองขี�อม�ลคล�ายก$บ Array แติ�
ถึ�าเป"น Array น$2น Array ติ$วหน)งสามารื่ถึเก&บขี�อม�ลได�เฉพาะท�เป"นชน�ดเด�ยวก$นเท�าน$2น (Data Type เด�ยวก$น ) แติ�ส,าหรื่$บ Struct ติ$วหน)ง ๆ สามารื่ถึเก&บขี�อม�ลได�หลาย ๆ ชน�ด เช�น int, float, char ด�วยการื่ใช�ช�อติ$วแปรื่เด�ยวก$น ชื่��อชื่��อ สกุ�ลสกุ�ล อายุ�อายุ�เกุรื่ดเฉล��ยุเกุรื่ดเฉล��ยุ
Structปรื่ะกาศ Struct โดยใช�ช�อ Struct ว�า data_recใน data_rec ม�ขี�อม�ลเก&บได� 4 fields ได�แก� ติ$วแปรื่ first_name เป"น String ขีนาด 20 ช�อง ติ$วแปรื่ last_name เป"น String ขีนาด 20 ช�อง ติ$วแปรื่ age เป"นชน�ดจ,านวนเติ&ม ติ$วแปรื่ gpa เป"นชน�ดทศน�ยม ปรื่ะกาศ Struct ติ$วน�2 ให�เป"นชน�ดขี�อม�ลใหม�ขีองเรื่าเอง โดยใช�ม$นช�อ
ว�า record ด$งน$2นค,าว�า record น�2 จะเสม�อนว�าม$น ค�อ int ม$นค�อ char ท,านองน$2น (Keyword ในการื่ปรื่ะกาศชน�ดขี�อม�ลใหม�ก&ค�อ typedef น$นเอง)
Struct การื่ปรื่ะกาศติ$วแปรื่
ส�งท�เรื่าได�ท,าไปค�อการื่สรื่�างชน�ดขี�อม�ลใหม�ขี)2นมา เวลาจะใช�งานม$นก&ติ�องปรื่ะกาศเป"นติ$วแปรื่ก�อน ด$งเช�น record student; หมายความว�า ให�ติ$วแปรื่ช�อ student ม�ชน�ดขี�อม�ล (data type)
เป"นแบบ record ซึ่)งจะเห&นว�าม$นก&คล�ายก$บ int x; น$นเอง การื่อ�างถึ)ง ท,าได�โดยการื่ใช�ช�อติ$วแปรื่ติามด�วยเครื่�องหมายจ#ด แล�วติามด�วยช�อ
field ท�ติ�องการื่ student.first_name;student.last_name;student.age;student.gpa ;
Struct
เรื่าสามารื่ถึปรื่ะย#กติ4การื่ใช� Struct เป"น Array of Struct ได�ด�วย ติ$วอย�างเช�น
ชื่��อชื่��อ สกุ�ลสกุ�ล อายุ�อายุ�เกุรื่ดเฉล��ยุเกุรื่ดเฉล��ยุ
Struct การื่อ�างถึ)ง ท,าได�โดยใช�ช�อติ$วแปรื่ติาม
ด�วยเครื่�องหมายก�ามป� [] ติามด�วยจ#ด แล�วติามด�วยช�อ Field ท�ติ�องการื่เช�น ชื่��อของแถวบนส�ด คื�อ
student[0].first_nameอายุ�ของแถวต่�อมา คื�อ student[1].last_nameเกุรื่ดเฉล��ยุของแถวส�ดท�ายุ คื�อ student[2].gpa
ติ$วอย�าง
การื่เขี�ยนโปรื่แกรื่มติ�ดติ�อแฟ้�มขี�อม�ล ท าไมต่�องเข�ยุนโปรื่แกุรื่มต่$ดต่�อแฟ้&มข�อม'ล (File) การื่ใช�ติ$วแปรื่และปรื่ะมวลผลติ$วโปรื่แกรื่มท$2งหมด จะท,างานอย��ใน
หน�วยความจ,า (Memory) เท�าน$2น น$นก&หมายความว�าเม�อโปรื่แกรื่มท,างานเสรื่&จขี�อม�ลติ�าง ๆ ก&จะส�ญหายไป
ถึ�าติ�องการื่ให�ขี�อม�ล (ผลล$พธ์4 ) น$2นย$งคงอย�� เรื่าสามารื่ถึท,าได�โดยใช�หล$กง�าย ๆ ค�อเขี�ยนขี�อม�ลผลล$พธ์4น$2น เก&บเอาไว�ในไฟ้ล4น$นเอง
การื่เขี�ยนโปรื่แกรื่มเพ�อติ�ดติ�อไฟ้ล4 ย$งม�ปรื่ะโยชน4ในกรื่ณ�ท�เรื่าม�ไฟ้ล4ขี�อม�ล input อย��แล�ว ติ�องการื่อ�านม$นขี)2นมาแล�วปรื่ะมวลผล แทนท�จะติ�องมาน$งค�ย4ขี�อม�ลด�วยตินเองมาก ๆ
ปรื่ะเภทขีองไฟ้ล4 ส,าหรื่$บไฟ้ล4ขี�อม�ลในภาษาซึ่�ท�ใช�ในการื่ท,างานเพ�อเก&บ
ขี�อม�ลแบ�งออกเป"น 2 ปรื่ะเภทค�อ Text File (Sequential Access) (*)
เป"นไฟ้ล4ขี�อม�ล ท�เก&บพวกขี�อความ (เป=ดอ�านรื่� �เรื่�อง)
Binary File (Random Access) เป"นไฟ้ล4ขี�อม�ล ท�เก&บเป"น Binary (0/1) ด$งน$2นถึ�า
เรื่าใช�โปรื่แกรื่มเช�น Notepad เป=ดก&จะอ�านไม�รื่� �เรื่�อง
การื่ติ�ดติ�อไฟ้ล4 รื่'ปแบบกุารื่ปรื่ะกุาศใชื่�งานต่*วแปรื่ส าหรื่*บเรื่��องกุารื่
ต่$ดต่�อไฟ้ล,
FILEFILE เป-นปรื่ะเภทข�อม'ล เป-นปรื่ะเภทข�อม'ล (data type)(data type) ท��ใชื่�งานกุ*บไฟ้ล, คืล�ายุ ๆ ท��ใชื่�งานกุ*บไฟ้ล, คืล�ายุ ๆ กุ*บ กุ*บ int, charint, char
*fp*fp เป-นชื่��อต่*วแปรื่เป-นชื่��อต่*วแปรื่ pointer pointer ท��ใชื่�อ�างอ$งพื้�1นท��กุารื่ท างานท��ใชื่�อ�างอ$งพื้�1นท��กุารื่ท างาน
FILE *fp; FILE *fp;
ในภาษาซี� ต่*วอ*กุษรื่เล4กุ กุ*บ ใหญ่� ม�คืวามหมายุต่�างกุ*น (Case Sensitive) ซี6�ง FILE เป-น keyword ต่�องเข�ยุนด�วยุต่*วพื้$มพื้,ใหญ่�
ค,าส$งท�ใช�งานก$บไฟ้ล4ขี�อม�ล กุารื่เป7ดไฟ้ล, กุารื่ป7ดไฟ้ล, กุารื่ต่รื่วจสอบว�าในไฟ้ล,ยุ*งม�ข�อม'ลเหล�ออยุ'�หรื่�อไม� กุารื่อ�านข�อม'ลจากุ Text File กุารื่เข�ยุนข�อม'ลลง Text File
การื่เป=ดไฟ้ล4
fp ค�อ ช�อติ$วแปรื่ pointer ท�จะช�2ไปหาไฟ้ล4ท�เรื่าติ�องการื่ น$กศ)กษาจะติ$2งว�าอะไรื่ก&ได�
fopen ค�อ ค,าส$งส,าหรื่$บเป=ดไฟ้ล4 file name ค�อ รื่ะบ#ช�อไฟ้ล4พรื่�อมนามสก#ล ท�ติ�องการื่ให�ไปเป=ด mode ค�อ โหมดในการื่เป=ด เน�องจากในภาษาซึ่�ติ�องรื่ะบ#
ด�วยว�าจะให�เป=ดเพ�ออะไรื่ เช�น เป=ดเพ�ออ�าน , เขี�ยน ,เขี�ยนติ�อท�าย
เป"นติ�น
fp = fopen(“file name”,“mode”); fp = fopen(“file name”,“mode”);
Mode ในการื่เป=ดไฟ้ล4ModeMode คื าอธิ$บายุคื าอธิ$บายุ
r เป=ดไฟ้ล4 เพ�ออ�านเท�าน$2น
w เป"นการื่สรื่�างไฟ้ล4ใหม� ถึ�าหากไฟ้ล4น$2นม�อย��แล�วจะถึ�กสรื่�างท$บท$นท� (overwritten)
a การื่เป=ดไฟ้ล4 เพ�อบ$นท)กขี�อม�ลติ�อท�ายขี�อม�ลเด�ม , หรื่�อเป"นการื่สรื่�างไฟ้ล4 ถึ�าไฟ้ล4น$2นย$งไม�ม�อย��
r+ เป=ดไฟ้ล4 เพ�ออ�านและปรื่$บปรื่#งแก�ไขี
w+ เป"นการื่สรื่�างไฟ้ล4ใหม� และบ$นท)กขี�อม�ล ถึ�าหากไฟ้ล4น$2นม�อย��แล�วจะถึ�กสรื่�างท$บท$นท�
a+ การื่เป=ดไฟ้ล4 เพ�อบ$นท)กขี�อม�ลติ�อท�ายขี�อม�ลเด�ม,เป=ดไฟ้ล4 เพ�ออ�านและปรื่$บปรื่#งแก�ไขีขี�อม�ลท�ท�ายส#ดขีองไฟ้ล4,เป"นการื่สรื่�างไฟ้ล4 ถึ�าไฟ้ล4น$2นย$งไม�ม�อย��
Mode ในการื่เป=ดไฟ้ล4 ส,าหรื่$บการื่ท,างานก$บ Text File เรื่าติ�องใส�
อ$กษรื่ “t” เพ�มเขี�าไปใน mode ด�วย (rt, w+t เป"นติ�น)
ส,าหรื่$บการื่ท,างานก$บ Binary File เรื่าติ�องใส�อ$กษรื่ “b” เพ�มเขี�าไปใน mode ด�วย (wb, a+b เป"นติ�น)
การื่ป=ดไฟ้ล4 ใช�ค,าส$ง fclose เม�อเรื่าใช�งานไฟ้ล4เสรื่&จ หรื่�อ
ติ�องการื่เปล�ยน mode
fclose ค�อ ค,าส$งส,าหรื่$บป=ดไฟ้ล4 fp ค�อ ช�อติ$วแปรื่ pointer ท�จะช�2ไปหาไฟ้ล4
น$2น ๆ
fclose(fp); fclose(fp);
ติรื่วจสอบว�าย$งม�ขี�อม�ลเหล�ออย��ในไฟ้ล4หรื่�อไม�
feof ค�อ ค,าส$งติรื่วจสอบว�าย$งม�ขี�อม�ลอย��ในไฟ้ล4อ�กหรื่�อไม�
fp ค�อ ช�อติ$วแปรื่ pointer ท�จะช�2ไปหาไฟ้ล4น$2น ๆ
feof(fp); feof(fp);
การื่อ�านขี�อม�ลจาก Text File fscanf คล�าย ๆ ก$บค,าส$ง scanf ท�ท,างานก$บ
Memory ซึ่)งเวลาโปรื่แกรื่มท,างาน โปรื่แกรื่มก&ย$งคงติ�องอ�านขี�อม�ลเขี�าไปเก&บใน Memory เช�นเด�ม ด$งน$2น เม�อเรื่าใช�ค,าส$งอ�านขี�อม�ลจากไฟ้ล4 จ)งติ�องม�ติ$วแปรื่มารื่อรื่$บ โดยม�รื่�ปแบบการื่เขี�ยนค,าส$งค�อ fscanf (fp, "%s", fname); fscanf (fp, "%s", fname);
การื่อ�านขี�อม�ลจาก Text File
fscanf ค�อ ท�ใช�อ�านขี�อม�ลขี)2นมาจากไฟ้ล4 fp ค�อ ช�อติ$วแปรื่ pointer ท�จะช�2ไปหาไฟ้ล4น$2น ๆ fname ค�อ ช�อติ$วแปรื่ ท�เรื่าจะเอาไว�เก&บค�า String โดยจะเก&บ String
ไปเรื่�อย ๆ จนกว�าจะเจอช�องว�าง (space) lname ค�อ ช�อติ$วแปรื่ ท�เรื่าจะเอาไว�เก&บค�า String ติ�อมาท�เจอ
fscanf (fp, "%s %s", fname, lname); fscanf (fp, "%s %s", fname, lname);
การื่อ�านขี�อม�ลจาก Text File
คื าว�า Computer จะถ'กุเอาไปเกุ4บในต่*วแปรื่ fname คื าว�า science จะถ'กุเอาไปเกุ4บในต่*วแปรื่ lname
Computer science Computer science
ส,าหรื่$บการื่อ�านขี�อม�ลปรื่ะเภทติ$วเลขีขี)2นมาค,านวณ ให�อ�านขี)2นมาโดยมองเป"น String ก�อนท$2งหมด เม�อขี�อม�ลอย��ใน Memory แล�วจ)งค�อยเปล�ยนให�ม�ลให�เป"น int, float หรื่�ออ�น ๆ เพ�อน,าไปใช�ติ�อไป
การื่เขี�ยนขี�อม�ลลง Text File
fprintf ค�อ ท�ใช�เขี�ยนขี�อม�ลลงไฟ้ล4 fp ค�อ ช�อติ$วแปรื่ pointer ท�จะช�2ไปหาไฟ้ล4น$2น ๆ name ค�อ ช�อติ$วแปรื่ ท�เก&บ String ท�เรื่าติ�องการื่จะเขี�ยนลงไฟ้ล4 age ค�อ ช�อติ$วแปรื่ ท�เก&บค�าจ,านวนเติ&ม ท�เรื่าติ�องการื่จะเขี�ยนลง
ไฟ้ล4
fprintf (fp, "%s %d", name, age); fprintf (fp, "%s %d", name, age);
การื่เขี�ยนขี�อม�ลลง Text File ติ$วอย�าง
char name = “Teera”;int age = 30; fprintf (fp, "%s %d", name, age);fprintf (fp, "%s %d", name, age);
fprintf (fp, "%s\t%d", name, age);fprintf (fp, "%s\t%d", name, age);
Teera 30Teera
30
ติ$วอย�าง#include<stdio.h>main(){
FILE *fp; //ปรื่ะกาศติ$วแปรื่ช�อ fp เป"น pointer ช�ไปหาไฟ้ล4fp = fopen("data.txt","wt"); //ส$งสรื่�างไฟ้ล4ใหม� ช�อ data.txt แล�วเอา fp ไปช�2ไว�fclose(fp); //ส$งป=ดไฟ้ล4 ท� fp ม$นช�2อย��
}
ติ$วอย�าง
ติ$วอย�าง