370 likes | 676 Views
วิชา COSC2202 โครงสร้างข้อมูล (Data Structure). ทบทวนเรื่อง Array และ struct pointer การเขียนโปรแกรมติดต่อแฟ้มข้อมูล. ทบทวนเรื่อง Array.
E N D
วิชา COSC2202โครงสร้างข้อมูล (Data Structure) ทบทวนเรื่อง Array และ struct pointer การเขียนโปรแกรมติดต่อแฟ้มข้อมูล
ทบทวนเรื่อง 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 แตละตัว สมการคำนวณหาตำแหน่งข้อมูล iLoc (A[i]) = L0 + (i-L)C
Pointersและ Arraysของ Pointers • Pointer เป็นตัวแปรชนิดหนึ่งที่ทำหน้าที่เก็บตำแหน่งที่อยู่ (Address) ของตัวแปรที่อยู่ในหน่วยความจำ • รูปแบบ type *variable-name type หมายถึงชนิดของตัวแปร *หมายถึงเป็นเครื่องหมายที่แสดงว่า ตัวแปรที่ตามหลังเครื่องหมายนี้เป็น ตัวแปรพอยน์เตอร์ variable-name เป็นชื่อของตัวแปรที่ต้องการประกาศว่าเป็นชนิดพอยน์เตอร์
Pointersและ Arraysของ Pointers • char *prt; หมายความว่าประกาศว่าตัวแปร prt เป็นตัวแปรพอยน์เตอร์ที่ใช้เก็บตำแหน่งเริ่มต้นที่จะเก็บ character • int *a; หมายความว่าประกาศว่าตัวแปร a เป็นตัวแปรพอยน์เตอร์ที่ใช้เก็บตำแหน่งเริ่มต้นที่จะใช้เก็บ integer
Pointersและ Arraysของ Pointers • เครื่องหมาย & เป็นเครื่องหมายที่ใช้เมื่อต้องการให้เอาค่าตำแหน่งที่อยู่ของตัวแปรที่เก็บไว้ในหน่วยความจำออกมาใช้ เช่น x=10 (กำหนดให้ตัวแปร x ซึ่งอยู่ที่ตำแหน่ง 1000 มีค่า 10 เก็บอยู่) int *y , x=10; y = &x; ตัวแปร y ซึ่งประกาศเป็นตัวแปรพอยน์เตอร์จะเก็บค่า 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 = 25 c = *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 นั้น Array ตัวหนึ่งสามารถเก็บข้อมูลได้เฉพาะที่เป็นชนิดเดียวกันเท่านั้น (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 ตัวนี้ ให้เป็นชนิดข้อมูลใหม่ของเราเอง โดยใช้มันชื่อว่า record ดังนั้นคำว่า record นี้ จะเสมือนว่ามัน คือ int มันคือ char ทำนองนั้น (Keyword ในการประกาศชนิดข้อมูลใหม่ก็คือ typedef นั่นเอง)
Struct • การประกาศตัวแปร • สิ่งที่เราได้ทำไปคือการสร้างชนิดข้อมูลใหม่ขึ้นมา เวลาจะใช้งานมันก็ต้องประกาศเป็นตัวแปรก่อน ดังเช่น record student;หมายความว่า ให้ตัวแปรชื่อ student มีชนิดข้อมูล (data type) เป็นแบบ record ซึ่งจะเห็นว่ามันก็คล้ายกับ int x; นั่นเอง • การอ้างถึง ทำได้โดยการใช้ชื่อตัวแปรตามด้วยเครื่องหมายจุด แล้วตามด้วยชื่อ field ที่ต้องการstudent.first_name; student.last_name; student.age; student.gpa ;
ชื่อ สกุล อายุ เกรดเฉลี่ย Struct เราสามารถประยุกต์การใช้ Struct เป็น Array of Struct ได้ด้วย ตัวอย่างเช่น
Struct • การอ้างถึง ทำได้โดยใช้ชื่อตัวแปรตามด้วยเครื่องหมายก้ามปู [] ตามด้วยจุด แล้วตามด้วยชื่อ Field ที่ต้องการเช่น ชื่อของแถวบนสุด คือ student[0].first_name อายุของแถวต่อมา คือ student[1].last_name เกรดเฉลี่ยของแถวสุดท้าย คือ student[2].gpa
การเขียนโปรแกรมติดต่อแฟ้มข้อมูลการเขียนโปรแกรมติดต่อแฟ้มข้อมูล • ทำไมต้องเขียนโปรแกรมติดต่อแฟ้มข้อมูล (File) • การใช้ตัวแปรและประมวลผลตัวโปรแกรมทั้งหมด จะทำงานอยู่ในหน่วยความจำ (Memory) เท่านั้น นั่นก็หมายความว่าเมื่อโปรแกรมทำงานเสร็จข้อมูลต่าง ๆ ก็จะสูญหายไป • ถ้าต้องการให้ข้อมูล (ผลลัพธ์) นั้นยังคงอยู่ เราสามารถทำได้โดยใช้หลักง่าย ๆ คือเขียนข้อมูลผลลัพธ์นั้น เก็บเอาไว้ในไฟล์นั่นเอง • การเขียนโปรแกรมเพื่อติดต่อไฟล์ ยังมีประโยชน์ในกรณีที่เรามีไฟล์ข้อมูล input อยู่แล้ว ต้องการอ่านมันขึ้นมาแล้วประมวลผล แทนที่จะต้องมานั่งคีย์ข้อมูลด้วยตนเองมาก ๆ
ประเภทของไฟล์ • สำหรับไฟล์ข้อมูลในภาษาซีที่ใช้ในการทำงานเพื่อเก็บข้อมูลแบ่งออกเป็น 2 ประเภทคือ • Text File (Sequential Access) (*) • เป็นไฟล์ข้อมูล ที่เก็บพวกข้อความ (เปิดอ่านรู้เรื่อง) • Binary File (Random Access) • เป็นไฟล์ข้อมูล ที่เก็บเป็น Binary (0/1) ดังนั้นถ้าเราใช้โปรแกรมเช่น Notepad เปิดก็จะอ่านไม่รู้เรื่อง
การติดต่อไฟล์ • รูปแบบการประกาศใช้งานตัวแปรสำหรับเรื่องการติดต่อไฟล์ FILE *fp; • FILE เป็นประเภทข้อมูล (data type) ที่ใช้งานกับไฟล์ คล้าย ๆ กับ int, char • *fpเป็นชื่อตัวแปร pointer ที่ใช้อ้างอิงพื้นที่การทำงาน ในภาษาซี ตัวอักษรเล็ก กับ ใหญ่ มีความหมายต่างกัน (Case Sensitive) ซึ่ง FILE เป็น keyword ต้องเขียนด้วยตัวพิมพ์ใหญ่
คำสั่งที่ใช้งานกับไฟล์ข้อมูลคำสั่งที่ใช้งานกับไฟล์ข้อมูล • การเปิดไฟล์ • การปิดไฟล์ • การตรวจสอบว่าในไฟล์ยังมีข้อมูลเหลืออยู่หรือไม่ • การอ่านข้อมูลจาก Text File • การเขียนข้อมูลลง Text File
การเปิดไฟล์ fp = fopen(“file name”,“mode”); • fp คือ ชื่อตัวแปร pointer ที่จะชี้ไปหาไฟล์ที่เราต้องการ นักศึกษาจะตั้งว่าอะไรก็ได้ • fopen คือ คำสั่งสำหรับเปิดไฟล์ • file nameคือ ระบุชื่อไฟล์พร้อมนามสกุล ที่ต้องการให้ไปเปิด • modeคือ โหมดในการเปิด เนื่องจากในภาษาซีต้องระบุ ด้วยว่าจะให้เปิดเพื่ออะไร เช่น เปิดเพื่ออ่าน, เขียน, เขียนต่อท้าย เป็นต้น
Mode ในการเปิดไฟล์ • สำหรับการทำงานกับ Text File เราต้องใส่อักษร “t” เพิ่มเข้าไปใน mode ด้วย (rt, w+t เป็นต้น) • สำหรับการทำงานกับ Binary File เราต้องใส่อักษร “b” เพิ่มเข้าไปใน mode ด้วย (wb, a+b เป็นต้น)
การปิดไฟล์ • ใช้คำสั่ง fclose เมื่อเราใช้งานไฟล์เสร็จ หรือต้องการเปลี่ยน mode fclose(fp); • fcloseคือ คำสั่งสำหรับปิดไฟล์ • fp คือ ชื่อตัวแปร pointer ที่จะชี้ไปหาไฟล์นั้น ๆ
ตรวจสอบว่ายังมีข้อมูลเหลืออยู่ในไฟล์หรือไม่ feof(fp); • feof คือ คำสั่งตรวจสอบว่ายังมีข้อมูลอยู่ในไฟล์อีกหรือไม่ • fp คือ ชื่อตัวแปร pointer ที่จะชี้ไปหาไฟล์นั้น ๆ
การอ่านข้อมูลจาก Text File • fscanf คล้าย ๆ กับคำสั่ง scanf ที่ทำงานกับ Memory ซึ่งเวลาโปรแกรมทำงาน โปรแกรมก็ยังคงต้องอ่านข้อมูลเข้าไปเก็บใน Memory เช่นเดิม ดังนั้น เมื่อเราใช้คำสั่งอ่านข้อมูลจากไฟล์ จึงต้องมีตัวแปรมารอรับ โดยมีรูปแบบการเขียนคำสั่งคือ fscanf (fp, "%s", fname);
การอ่านข้อมูลจาก Text File • fscanfคือ ที่ใช้อ่านข้อมูลขึ้นมาจากไฟล์ • fp คือ ชื่อตัวแปร pointer ที่จะชี้ไปหาไฟล์นั้น ๆ • fnameคือ ชื่อตัวแปร ที่เราจะเอาไว้เก็บค่า String โดยจะเก็บ String ไปเรื่อย ๆ จนกว่าจะเจอช่องว่าง (space) • lnameคือ ชื่อตัวแปร ที่เราจะเอาไว้เก็บค่า String ต่อมาที่เจอ fscanf (fp, "%s %s", fname, lname);
การอ่านข้อมูลจาก Text File Computer science • คำว่า Computer จะถูกเอาไปเก็บในตัวแปร fname • คำว่า science จะถูกเอาไปเก็บในตัวแปร lname สำหรับการอ่านข้อมูลประเภทตัวเลขขึ้นมาคำนวณ ให้อ่านขึ้นมาโดยมองเป็น String ก่อนทั้งหมด เมื่อข้อมูลอยู่ใน Memory แล้วจึงค่อยเปลี่ยนให้มูลให้เป็น int, float หรืออื่น ๆ เพื่อนำไปใช้ต่อไป
การเขียนข้อมูลลง Text File • fprintfคือ ที่ใช้เขียนข้อมูลลงไฟล์ • fp คือ ชื่อตัวแปร pointer ที่จะชี้ไปหาไฟล์นั้น ๆ • nameคือ ชื่อตัวแปร ที่เก็บ String ที่เราต้องการจะเขียนลงไฟล์ • ageคือ ชื่อตัวแปร ที่เก็บค่าจำนวนเต็ม ที่เราต้องการจะเขียนลงไฟล์ fprintf (fp, "%s %d", name, age);
การเขียนข้อมูลลง Text File • ตัวอย่าง char name = “Teera”; int age = 30; fprintf (fp, "%s %d", name, age); fprintf (fp, "%s\t%d", name, age); Teera 30 Teera 30
ตัวอย่าง #include<stdio.h> main() { FILE *fp; //ประกาศตัวแปรชื่อ fp เป็น pointer ชีไปหาไฟล์ fp = fopen("data.txt","wt"); //สั่งสร้างไฟล์ใหม่ ชื่อ data.txt แล้วเอา fp ไปชี้ไว้ fclose(fp); //สั่งปิดไฟล์ ที่ fp มันชี้อยู่ }