หลักการเขียนโปรแกรม
1. Logic Tracing: การไล่สายการทำงาน
ทักษะที่สำคัญที่สุดในการทำข้อสอบพาร์ทคอมพิวเตอร์คือการ Trace Code:
- Short-circuit Logic: ในเงื่อนไข && (AND) ถ้าตัวหน้าเป็นเท็จ เครื่องมือจะไม่เช็คตัวหลังเลย
- Pre-increment vs Post-increment: ++i (บวกก่อนใช้) vs i++ (ใช้ก่อนค่อยบวก)
- Ternary Operator: (Condition) ? True_Val : False_Val (เช่น x > 5 ? 'Big' : 'Small')
2. โครงสร้างข้อมูล (Data Structures)
ความรู้เรื่องการจัดเก็บข้อมูลในหน่วยความจำ:
| Structure | ลักษณะเด่น (Access Pattern) | ตัวอย่างการใช้งาน |
|---|---|---|
| Stack | LIFO (Last In First Out) | ปุ่ม Undo, การเรียกฟังก์ชัน (Call Stack) |
| Queue | FIFO (First In First Out) | คิวพิมพ์เอกสาร (Printer Spooler), บัตรคิว |
| Array | Index-based Access, Contiguous Memory | เก็บรายการที่มีขนาดแน่นอน เข้าถึงเร็ว O(1) |
| Linked List | Dynamic memory (Node linking) | รายการที่เพิ่มลบตรงกลางบ่อยๆ ไม่ต้องจองที่ติดกัน |
| Tree (Binary Search Tree) | Left < Node < Right | การค้นหาข้อมูลแบบ Binary Search |
| Graph | Nodes & Edges | แผนที่ GPS, Social Network Connection |
3. การเขียนโปรแกรมเชิงวัตถุ (OOP) - Deep Dive
การออกแบบโค้ดเพื่อให้จัดการง่ายและยืดหยุ่น (Reusability):
- Class vs Object: Class คือแบบร่าง (Blueprints), Object คือสิ่งที่สร้างตามร่างนั้น (Instance)
- Constructor: ฟังก์ชันพิเศษที่ทำงานทันทีเมื่อสร้าง Object เพื่อกำหนดค่าเริ่มต้น
- Interface: สัญญาใจที่ระบุว่า Class ต้องทำอะไรได้บ้าง (Method signature) แต่ไม่ได้ระบุว่าทำอย่างไร
- Abstract Class: คลาสที่สร้าง Object โดยตรงไม่ได้ ต้องมีลูกมาสืบทอดไปทำต่อ
4. Algorithm & Complexity
การวัดประสิทธิภาพของโปรแกรมด้วย Big O Notation:
- O(1): คงที่ (เร็วที่สุด) - เข้าถึง Array ด้วย Index, Hash Map lookup
- O(log n): เร็วมาก - Binary Search (ตัดครึ่งข้อมูลเรื่อยๆ)
- O(n): เส้นตรง - การ Loop หาข้อมูลใน List 1 รอบ
- O(n^2): กำลังสอง - Nested Loop (Loop ซ้อน Loop) เช่น Bubble Sort
- O(n log n): ดีที่สุดสำหรับการ Sort (Merge Sort, Quick Sort)
5. Software Development Life Cycle (SDLC)
วงจรการพัฒนาระบบ:
- Requirement Analysis: เก็บความต้องการ
- Design: ออกแบบ UI/DB
- Implementation: เขียนโค้ด (Coding)
- Testing: ทดสอบ (Unit, Integration, UAT)
- Maintenance: บำรุงรักษา
6. Flowchart และ Pseudocode - การออกแบบ Algorithm
Flowchart คือแผนภาพการทำงานของโปรแกรม ใช้สัญลักษณ์มาตรฐานแทนการทำงานแต่ละขั้นตอน เป็นเครื่องมือในการวางแผนก่อนเขียนโค้ดจริง
| สัญลักษณ์ | รูปร่าง | ความหมาย | ตัวอย่างการใช้ |
|---|---|---|---|
| Terminal | วงรี/มน | จุดเริ่มต้น (Start) หรือ จุดสิ้นสุด (End) | เริ่มโปรแกรม, จบโปรแกรม |
| Process | สี่เหลี่ยมผืนผ้า | การประมวลผล/คำนวณ | sum = a + b, count = count + 1 |
| Decision | สี่เหลี่ยมขนมเปียกปูน (Diamond) | ตัดสินใจ (มี 2 ทางออกคือ Yes/No) | if x > 10 ?, while count < 5 ? |
| Input/Output | สี่เหลี่ยมคางหมู | รับข้อมูลเข้า/แสดงผลออก | Input: รับค่า A, Output: แสดง result |
| Connector | วงกลมเล็ก | จุดเชื่อมต่อ (เมื่อ Flowchart ยาวเกินหน้า) | ต่อไปหน้า 2 |
| Flow Line | ลูกศร | ทิศทางการทำงาน | ลูกศรชี้ลง = ทำต่อ |
Pseudocode คือการเขียนอธิบายขั้นตอนของโปรแกรมด้วยภาษาที่มนุษย์อ่านเข้าใจง่าย ไม่ต้องใช้ไวยากรณ์ของภาษาโปรแกรมจริง
- ตัวอย่าง Pseudocode หาค่ามากที่สุด:
- 1. START
- 2. READ a, b, c
- 3. IF a > b AND a > c THEN max = a
- 4. ELSE IF b > c THEN max = b
- 5. ELSE max = c
- 6. PRINT max
- 7. END
7. ระบบเลขฐาน (Number Systems)
คอมพิวเตอร์ใช้ระบบเลขฐานสอง (Binary) ในการเก็บและประมวลผลข้อมูล การแปลงเลขระหว่างฐานเป็นทักษะพื้นฐานที่ต้องรู้
| ระบบฐาน | ฐาน | ตัวเลขที่ใช้ | ตัวอย่าง | การใช้งาน |
|---|---|---|---|---|
| Binary (ฐานสอง) | 2 | 0, 1 | 1010₂ = 10₁₀ | การทำงานภายในของ CPU, Memory |
| Octal (ฐานแปด) | 8 | 0-7 | 12₈ = 10₁₀ | สิทธิ์ไฟล์ใน Linux (chmod 755) |
| Decimal (ฐานสิบ) | 10 | 0-9 | 10₁₀ | ใช้ในชีวิตประจำวัน |
| Hexadecimal (ฐานสิบหก) | 16 | 0-9, A-F | 0A₁₆ = 10₁₀ | รหัสสี (#FF0000), MAC Address |
วิธีแปลง Decimal เป็น Binary: หารด้วย 2 เรื่อยๆ จนได้ 0 แล้วอ่านเศษจากล่างขึ้นบน
- ตัวอย่าง: แปลง 13₁₀ เป็น Binary
- 13 ÷ 2 = 6 เศษ 1
- 6 ÷ 2 = 3 เศษ 0
- 3 ÷ 2 = 1 เศษ 1
- 1 ÷ 2 = 0 เศษ 1
- อ่านจากล่างขึ้นบน: 1101₂ = 13₁₀
วิธีแปลง Binary เป็น Decimal: คูณแต่ละหลักด้วย 2 ยกกำลัง (เริ่มจาก 0 ทางขวา)
- ตัวอย่าง: แปลง 1101₂ เป็น Decimal
- 1×2³ + 1×2² + 0×2¹ + 1×2⁰
- = 8 + 4 + 0 + 1 = 13₁₀
8. Sorting Algorithms - อัลกอริทึมการเรียงลำดับ
การเรียงลำดับข้อมูลเป็นปัญหาพื้นฐานที่สำคัญในวิทยาการคอมพิวเตอร์ มีหลายวิธีที่มีประสิทธิภาพต่างกัน
| Algorithm | หลักการทำงาน | Time Complexity (Worst) | Space | Stable? |
|---|---|---|---|---|
| Bubble Sort | เปรียบเทียบคู่ที่อยู่ติดกัน สลับถ้าผิดลำดับ ทำซ้ำจนเรียงหมด | O(n²) | O(1) | Yes |
| Selection Sort | หาค่าน้อยสุดในส่วนที่เหลือ นำมาวางไว้ตำแหน่งแรก | O(n²) | O(1) | No |
| Insertion Sort | หยิบตัวใหม่ไปแทรกในตำแหน่งที่ถูกต้องในส่วนที่เรียงแล้ว | O(n²) | O(1) | Yes |
| Merge Sort | แบ่งครึ่งเรื่อยๆ แล้วรวมกลับโดยเรียงไปด้วย (Divide & Conquer) | O(n log n) | O(n) | Yes |
| Quick Sort | เลือก Pivot แบ่งเป็นส่วนน้อยกว่า/มากกว่า แล้วทำซ้ำ | O(n²) แต่เฉลี่ย O(n log n) | O(log n) | No |
| Heap Sort | สร้าง Heap แล้วดึงค่า max/min ออกมาเรื่อยๆ | O(n log n) | O(1) | No |
ตัวอย่าง Bubble Sort ทีละขั้นตอน: เรียง [5, 3, 8, 1]
- รอบที่ 1: [5,3,8,1] → [3,5,8,1] → [3,5,8,1] → [3,5,1,8] (8 ลอยไปท้าย)
- รอบที่ 2: [3,5,1,8] → [3,5,1,8] → [3,1,5,8]
- รอบที่ 3: [3,1,5,8] → [1,3,5,8]
- ผลลัพธ์: [1, 3, 5, 8] ✓
9. Searching Algorithms - อัลกอริทึมการค้นหา
การค้นหาข้อมูลเป็นอีกหนึ่งปัญหาพื้นฐานที่พบบ่อย มีหลายวิธีตั้งแต่ง่ายไปจนถึงซับซ้อน
| Algorithm | หลักการ | ข้อกำหนด | Time Complexity |
|---|---|---|---|
| Linear Search | ค้นหาทีละตัวจากต้นจนเจอ | ไม่ต้องเรียงก่อน | O(n) |
| Binary Search | ตัดครึ่งข้อมูลไปเรื่อยๆ จนเจอ | ต้องเรียงก่อน (Sorted) | O(log n) |
| Hash Table Lookup | คำนวณตำแหน่งจาก Key โดยตรง | ต้องสร้าง Hash Table ก่อน | O(1) เฉลี่ย |
ตัวอย่าง Binary Search: หาเลข 7 ใน [1, 3, 5, 7, 9, 11, 13]
- รอบที่ 1: กลาง = 7 (index 3), ตรงเลย!
- ถ้าหา 11:
- รอบที่ 1: กลาง = 7, 11 > 7 ไปหาฝั่งขวา [9, 11, 13]
- รอบที่ 2: กลาง = 11, เจอ!
- Binary Search เร็วมากเพราะตัดข้อมูลออกครึ่งหนึ่งในแต่ละรอบ
10. ประเภทของภาษาโปรแกรม
ภาษาโปรแกรมมีหลายระดับและหลายประเภท แต่ละแบบมีข้อดีข้อเสียต่างกัน
| ระดับ/ประเภท | ลักษณะ | ตัวอย่าง | ข้อดี/ข้อเสีย |
|---|---|---|---|
| Low-Level (ระดับต่ำ) | ใกล้เครื่อง อ่านยาก เร็วมาก | Machine Code, Assembly | เร็ว แต่เขียนยาก |
| High-Level (ระดับสูง) | ใกล้มนุษย์ อ่านง่าย ต้องแปลง | Python, Java, C# | เขียนง่าย แต่ช้ากว่า Low-Level |
| Compiled | แปลงทั้งไฟล์เป็น Machine Code ก่อนรัน | C, C++, Go, Rust | เร็วตอนรัน แต่ต้อง Compile ก่อน |
| Interpreted | แปลงทีละบรรทัดขณะรัน | Python, JavaScript, Ruby | พัฒนาเร็ว แต่รันช้ากว่า Compiled |
| Structured | เน้นโครงสร้าง Sequence, Selection, Loop | C, Pascal | เป็นระเบียบ แต่ไม่ยืดหยุ่น |
| Object-Oriented (OOP) | เน้น Object, Class, Encapsulation | Java, C++, Python | ยืดหยุ่น Reusable |
| Functional | เน้น Function ไม่มี Side Effect | Haskell, Erlang, Lisp | Predictable แต่เรียนยาก |
| Scripting | ภาษาสคริปต์สำหรับงาน Automation | Bash, PowerShell, Python | เขียนเร็ว ใช้งานเร็ว |
11. Error Handling และ Exception
ข้อผิดพลาด (Error) ในโปรแกรมมีหลายประเภท การเข้าใจและจัดการ Error เป็นทักษะสำคัญ
| ประเภท Error | เกิดตอนไหน | ตัวอย่าง | วิธีแก้ไข |
|---|---|---|---|
| Syntax Error | ตอน Compile/Parse | ลืมปิดวงเล็บ, พิมพ์คำสั่งผิด | แก้ไวยากรณ์ให้ถูก |
| Runtime Error | ตอนโปรแกรมทำงาน | หารด้วยศูนย์, เข้าถึง Array นอกขอบเขต | ใช้ Try-Catch ดักจับ |
| Logic Error | โปรแกรมรันได้ แต่ผลผิด | สูตรคำนวณผิด, เงื่อนไขผิด | Debug ด้วย Print หรือ Debugger |
| Semantic Error | ความหมายไม่ตรง | ใช้ตัวแปรผิดตัว | อ่านโค้ดทบทวน Logic |
Try-Catch-Finally: โครงสร้างการดักจับ Exception
- try { ... }: ส่วนที่อาจเกิด Error
- catch (Exception e) { ... }: ส่วนที่ทำงานเมื่อเกิด Error
- finally { ... }: ส่วนที่ทำงานเสมอ ไม่ว่าจะมี Error หรือไม่ (เช่น ปิดไฟล์)
- throw: สร้าง Exception ขึ้นมาเอง
12. โครงสร้างข้อมูลขั้นสูง (Advanced Data Structures)
เจาะลึกโครงสร้างข้อมูลที่ซับซ้อนขึ้นเพื่อการใช้งานเฉพาะทาง:
| Structure | ลักษณะเด่น | การประยุกต์ใช้ |
|---|---|---|
| Hash Table | ใช้ Key-Value pair, เข้าถึงข้อมูลเร็วมาก O(1) | Dictionary ใน Python, Map ใน Java, Caching |
| Graph | ประกอบด้วย Node (จุด) และ Edge (เส้นเชื่อ) | Social Network, ระบบนำทาง GPS, Network Topology |
| Heap (Priority Queue) | ต้นไม้ที่ Node พ่อแม่ค่ามากกว่า/น้อยกว่าลูกเสมอ | ระบบจัดลำดับงาน (Scheduler), Dijkstra Algorithm |
| Trie (Prefix Tree) | ต้นไม้ที่เก็บตัวอักษรเพื่อค้นหาคำ | ระบบ Autocomplete, Spell Checker |
13. การเขียนโปรแกรมเชิงวัตถุเชิงลึก (OOP Deep Dive)
ทำความเข้าใจ 4 เสาหลักของ OOP อย่างละเอียด:
- 1. Encapsulation (การห่อหุ้ม): ซ่อนข้อมูล (Private) และให้เข้าถึงผ่าน Method (Public Getter/Setter) เพื่อความปลอดภัย
- 2. Abstraction (ความเป็นนามธรรม): ซ่อนความซับซ้อน แสดงเฉพาะสิ่งที่จำเป็น (เช่น ขับรถโดยไม่ต้องรู้กลไกเครื่องยนต์)
- 3. Inheritance (การสืบทอด): การส่งต่อคุณสมบัติจากแม่สู่ลูก (Reusability)
- 4. Polymorphism (การพ้องรูป): ชื่อเดียวกันแต่ทำงานต่างกัน (Overloading/Overriding)
Design Patterns: รูปแบบการแก้ปัญหาที่ใช้บ่อย เช่น Singleton (สร้าง Object เดียว), Factory (โรงงานสร้าง Object), Observer (แจ้งเตือนเมื่อข้อมูลเปลี่ยน)
14. พื้นฐาน Functional Programming
แนวคิดการเขียนโปรแกรมที่กำลังนิยม เน้นฟังก์ชันทางคณิตศาสตร์:
- Pure Function: ฟังก์ชันที่ input เหมือนเดิมต้องได้ output เหมือนเดิมเสมอ และไม่มี Side Effect (ไม่แก้ค่าภายนอก)
- Immutability: ข้อมูลสร้างแล้วห้ามแก้ไข (ถ้าจะแก้ให้สร้างใหม่) ช่วยลด Bug ในระบบทำงานขนานกัน (Concurrency)
- Higher-Order Function: ฟังก์ชันที่รับฟังก์ชันอื่นเป็นพารามิเตอร์ หรือส่งคืนฟังก์ชัน (เช่น map, filter, reduce ใน JavaScript/Python)
15. การจัดการเวอร์ชันด้วย Git (Version Control)
เครื่องมือสำคัญสำหรับโปรแกรมเมอร์ยุคใหม่ในการบันทึกประวัติการแก้ไขโค้ด:
| คำสั่ง Git | ความหมาย | การทำงาน |
|---|---|---|
| git init | เริ่มต้น | สร้าง Folder .git เพื่อเริ่มเก็บประวัติ |
| git add . | เลือกไฟล์ | เลือกไฟล์ทั้งหมดเข้าสู่ Staging Area สาหรับเตรียมบันทึก |
| git commit -m | บันทึก | บันทึกการเปลี่ยนแปลงอย่างเป็นทางการพร้อมข้อความอธิบาย |
| git push | ส่งขึ้น | ส่งโค้ดจากเครื่องเราไปเก็บที่ Server (เช่น GitHub) |
| git pull | ดึงลง | ดึงโค้ดล่าสุดจาก Server ลงมาที่เครื่องเรา |
16. พื้นฐานการพัฒนา API (Application Programming Interface)
ตัวกลางที่ให้โปรแกรมคุยกันเอง:
| หัวข้อ | REST API | GraphQL |
|---|---|---|
| รูปแบบข้อมูล | JSON (ส่วนใหญ่) | JSON |
| Endpoint | มีหลาย URL ตาม Resource (เช่น /users, /posts) | มี URL เดียว (/graphql) |
| การขอข้อมูล | ได้ข้อมูลตามที่ Server กำหนดให้ (อาจมาก/น้อยเกินไป) | ขอเฉพาะ Field ที่ต้องการได้ (Flexible) |
| Method | ใช้ HTTP Method (GET, POST, PUT, DELETE) | ใช้ Query/Mutation |
17. ระดับการทดสอบซอฟต์แวร์ (Software Testing Levels)
- 1. Unit Testing: ทดสอบหน่วยย่อยที่สุด (เช่น ฟังก์ชันเดียว) โดย Developer
- 2. Integration Testing: ทดสอบการทำงานร่วมกันของหลายๆ module
- 3. System Testing: ทดสอบทั้งระบบว่าทำงานถูกต้องตาม Requirement หรือไม่
- 4. UAT (User Acceptance Testing): ให้ผู้ใช้จริงทดสอบเพื่อตรวจรับงาน