การคิดเชิงคำนวณและอัลกอริทึม
Computational Thinking and Algorithms
วิทยาการคำนวณ ม.4 | 6 สัปดาห์
🧠 การคิดเชิงคำนวณคืออะไร?
💡 ความหมาย
การคิดเชิงคำนวณ คือ วิธีคิดแก้ปัญหาแบบคอมพิวเตอร์ โดยแบ่งปัญหาใหญ่เป็นเล็ก หารูปแบบ เอาแต่ที่สำคัญ แล้วเขียนเป็นขั้นตอน
เหมือนเวลาเราทำอะไรก็ตาม เช่น ทำอาหาร เล่นเกม ทำโปรเจกต์ เราต้องคิดเป็นขั้นตอน วางแผน และหาวิธีที่ดีที่สุด
🎯 4 องค์ประกอบหลัก
🍳 ตัวอย่างง่ายๆ: ทำข้าวผัด
🔨 แยกส่วนปัญหา
- เตรียมวัตถุดิบ (ข้าว, ไข่, ผัก)
- เตรียมอุปกรณ์ (กระทะ, ช้อน)
- ทำอาหาร (ผัด, ปรุงรส)
- เสิร์ฟ
🔍 จดจำรูปแบบ
- ทุกเมนูผัดก็ผัดคล้ายกัน (ตั้งกระทะ → ใส่น้ำมัน → ผัด)
🎨 คิดเชิงนามธรรม
- ไม่ต้องนับข้าวทีละเม็ด (แค่ประมาณ 1 ถ้วย)
- ไม่ต้องตั้งเวลาแม่น (ดูจากลักษณะว่าสุกแล้ว)
⚙️ ออกแบบอัลกอริทึม
- ตั้งกระทะ ใส่น้ำมัน
- ตอกไข่ใส่กระทะ ผัดให้สุก
- ใส่ข้าวลงไป ผัดให้เข้ากัน
- ใส่ผัก ปรุงรส
- ตักใส่จาน เสร็จ!
🔨 การแยกส่วนปัญหา (Decomposition)
💡 ทำไมต้องแยกส่วน?
เวลาเจอปัญหาใหญ่ๆ เราต้องแบ่งเป็นชิ้นเล็กๆ เหมือนกินช้างให้ทีละคำ แทนที่จะทำทั้งก้อนแล้วงง เราทำทีละส่วนจะง่ายกว่า
📝 วิธีแยกส่วนปัญหา
ดูปัญหาทั้งหมด
อ่านและทำความเข้าใจว่าต้องทำอะไร เป้าหมายคืออะไร
แบ่งเป็นส่วนใหญ่ๆ
แยกออกเป็นหมวดหมู่ใหญ่ๆ ก่อน
แยกย่อยต่อไปอีก
แต่ละส่วนใหญ่แยกเป็นส่วนเล็กๆ ต่อ จนทำได้
ทำทีละส่วน
ทำให้เสร็จทีละส่วน แล้วค่อยนำมารวมกัน
📱 ตัวอย่าง: สร้างแอพ Instagram
ปัญหา: ต้องสร้างแอพโซเชียลมีเดียที่โพสต์รูปได้
- หน้า Feed (ดูโพสต์)
- หน้าโพสต์รูป
- หน้า Profile
- หน้าค้นหา
- ระบบ Login
- จัดการรูปภาพ
- ระบบ Like & Comment
- ระบบแจ้งเตือน
- ข้อมูลผู้ใช้
- ข้อมูลโพสต์
- ข้อมูล Comment
- ข้อมูล Follower
✏️ ลองทำดู!
โจทย์: ถ้าต้องจัดงานวันเปิดบ้านโรงเรียน ลองแบ่งเป็นส่วนย่อยดูว่ามีอะไรบ้าง?
💡 คิดดูว่าต้องทำอะไรบ้าง เช่น การตกแต่ง อาหาร กิจกรรม คน...
🔍 การจดจำรูปแบบ (Pattern Recognition)
💡 รูปแบบคืออะไร?
รูปแบบ คือ สิ่งที่เกิดซ้ำหรือคล้ายกัน เวลาเจอปัญหาใหม่ ถ้าเคยเจอแบบนี้มาก่อน เราก็ใช้วิธีเดิมแก้ได้เลย ไม่ต้องคิดใหม่ทั้งหมด
ประโยชน์:
🔢 ตัวอย่างง่ายๆ: ลำดับตัวเลข
2, 4, 6, 8, ?, ?
เห็นรูปแบบไหม?
รูปแบบ: +2 ทุกครั้ง
คำตอบ: 10, 12
🎮 ตัวอย่าง: เกมต่างๆ
สังเกตรูปแบบที่เหมือนกัน:
- มีหน้าเมนูหลัก
- เริ่มเกม - ตั้งค่า
- มี Health Bar
- มี Tutorial
- บันทึกเกม - โหลดเกม
- มี Feed หน้าแรก
- กด Like & Share
- แจ้งเตือน
- โปรไฟล์ส่วนตัว
- ค้นหาเพื่อน
ประโยชน์: เวลาสร้างแอพใหม่ ก็ทำตามรูปแบบนี้ได้เลย ไม่ต้องคิดใหม่ทั้งหมด
💻 ตัวอย่าง: ในการเขียนโปรแกรม
โจทย์: บวกเลข 1+2+3+4+5+6+7+8+9+10
🔍 สังเกตรูปแบบ: มีการบวกซ้ำๆ หลายครั้ง
💡 ใช้ Loop แทน:
✏️ ลองทำดู!
โจทย์ 1: หารูปแบบของลำดับนี้
1, 4, 9, 16, 25, ?, ?
โจทย์ 2: Facebook, Instagram, TikTok มีรูปแบบอะไรเหมือนกัน?
🎨 การคิดเชิงนามธรรม (Abstraction)
💡 ความหมาย
Abstraction คือ การมองเอาแต่สิ่งสำคัญ ตัดรายละเอียดที่ไม่จำเป็นออก เพื่อให้เห็นภาพรวมชัดขึ้น
เหมือนเวลาวาดแผนที่ เราไม่ได้วาดทุกอย่าง (ต้นไม้ รถ คน) แต่วาดแค่ถนนและจุดสำคัญ
🗺️ ตัวอย่างง่ายๆ: แผนที่รถไฟฟ้า BTS
- ชื่อสถานี
- เส้นทาง
- จุดต่อสาย
- ถนนจริง
- ตึก ร้านค้า
- ระยะทางแม่นยำ
- ทิศทางที่แท้จริง
ทำไม? เพราะเราอยากรู้แค่ว่า ขึ้นสถานีไหน ต่อสายไหน ส่วนอื่นไม่สนใจ
🚗 ตัวอย่าง: การขับรถ
เวลาขับรถ เราไม่ต้องรู้ว่าเครื่องยนต์ทำงานยังไง แค่รู้ว่า:
ข้อดี: ไม่ต้องเป็นช่างก็ขับได้! ซ่อนรายละเอียดที่ซับซ้อนไว้
💻 ตัวอย่าง: ในการเขียนโปรแกรม
เวลาเราใช้ฟังก์ชัน:
ข้างในฟังก์ชันมีรายละเอียดยุ่งยาก แต่เราซ่อนไว้ ผู้ใช้แค่ใส่ตัวเลข แล้วได้คำตอบ
✏️ ลองทำดู!
โจทย์: ถ้าจะอธิบาย "วิธีส่ง LINE" ให้เด็กอายุ 5 ขวบฟัง
ควรบอกอะไร? ไม่ควรบอกอะไร?
💡 เช่น ไม่ต้องบอกว่าอินเทอร์เน็ตทำงานยังไง แค่บอกว่ากดปุ่มไหน
⚙️ การออกแบบอัลกอริทึม
💡 อัลกอริทึมคืออะไร?
อัลกอริทึม = สูตรการทำงาน หรือ ขั้นตอนที่ชัดเจน ในการทำอะไรสักอย่างให้สำเร็จ
เหมือนสูตรอาหาร ที่บอกว่าต้องทำอะไรก่อน-หลัง ใส่อะไรเท่าไหร่ ใครทำตามก็ได้ผลลัพธ์เหมือนกัน
✅ อัลกอริทึมที่ดีต้องมี:
🧃 ตัวอย่างง่ายๆ: ทำน้ำมะนาว
📥 Input: มะนาว 2 ลูก, น้ำตาล 3 ช้อน, น้ำเปล่า 1 แก้ว, น้ำแข็ง
📝 ขั้นตอน:
- คั้นมะนาว 2 ลูก
- เทน้ำมะนาวลงแก้ว
- ใส่น้ำตาล 3 ช้อน
- เติมน้ำเปล่า
- ใส่น้ำแข็ง
- คนให้เข้ากัน
- ชิมรส (หวานพอดีไหม?)
📤 Output: น้ำมะนาว 1 แก้ว
🔢 ตัวอย่าง: หาเลขที่มากที่สุด
โจทย์: มีตัวเลข [15, 42, 8, 23, 67, 31] หาตัวที่มากที่สุด
วิธีคิด:
ตั้งตัวแรกเป็นตัวใหญ่ที่สุดก่อน (max = 15)
ดูตัวถัดไป (42) → 42 > 15 → max = 42
ดูตัวถัดไป (8) → 8 < 42 → ไม่เปลี่ยน
ทำต่อไปเรื่อยๆ จนครบ
ได้คำตอบ: 67
เขียนเป็น Pseudocode:
✏️ ลองทำดู!
โจทย์: เขียนอัลกอริทึม "หาว่าเลขเป็นคู่หรือคี่"
💡 คำใบ้: ใช้ % (หาเศษ) เช่น 10 % 2 = 0 (เลขคู่), 11 % 2 = 1 (เลขคี่)
📊 Flowchart และ Pseudocode
🔷 Flowchart (ผังงาน) คืออะไร?
Flowchart = ภาพวาดที่แสดงขั้นตอนการทำงาน ใช้รูปร่างต่างๆ และลูกศรเชื่อมต่อกัน
เหมือนแผนที่บอกทางว่าต้องทำอะไรบ้าง ทำก่อน-หลัง เลี้ยวตรงไหน
🔣 สัญลักษณ์ที่ใช้
| รูปร่าง | ความหมาย | ใช้เมื่อ |
|---|---|---|
|
Start/End
|
วงรี | เริ่มต้น หรือ จบโปรแกรม |
|
Process
|
สี่เหลี่ยม | คำนวณ หรือ ประมวลผล |
|
Yes/No
|
สี่เหลี่ยมข้าวหลามตัด | ตัดสินใจ (ใช่/ไม่ใช่) |
| → | ลูกศร | แสดงทิศทางการไหล |
📚 ตัวอย่าง: เช็คว่าผ่านสอบไหม?
≥ 50?
← ไม่ใช่
ใช่ →
📝 Pseudocode (รหัสเทียม) คืออะไร?
Pseudocode = เขียนอัลกอริทึมด้วยภาษาคนอ่านเข้าใจ ไม่ต้องเป็นโค้ดจริงๆ แค่เข้าใจได้
💻 เปรียบเทียบ Pseudocode กับ Python
Pseudocode
Python
เห็นไหมว่าคล้ายกันมาก แต่ Pseudocode อ่านง่ายกว่า
✏️ ลองทำดู!
โจทย์: วาด Flowchart และเขียน Pseudocode สำหรับ "ตู้ ATM ถอนเงิน"
💡 คิดขั้นตอน: ใส่บัตร → ใส่รหัส → เช็ครหัสถูกไหม → เลือกจำนวนเงิน → มีเงินพอไหม → ถอนได้
⚡ Big O Notation (วัดความเร็วอัลกอริทึม)
💡 Big O คืออะไร?
Big O = วิธีวัดความเร็วของอัลกอริทึม ว่าเมื่อข้อมูลเยอะขึ้น โปรแกรมจะช้าแค่ไหน
เหมือนเทียบว่ารถคันไหนวิ่งเร็วกว่ากัน หรือ วิธีไหนทำเร็วกว่ากัน
📊 Big O ที่พบบ่อย (จากเร็ว → ช้า)
| Big O | ชื่อเรียก | ความเร็ว | ตัวอย่าง |
|---|---|---|---|
| O(1) | Constant | ⚡⚡⚡ เร็วสุด | เข้าถึง Array[0] |
| O(log n) | Logarithmic | ⚡⚡ เร็วมาก | Binary Search |
| O(n) | Linear | ✅ ปกติ | หาเลขใน Array |
| O(n²) | Quadratic | 🐌 ช้า | Bubble Sort |
| O(2ⁿ) | Exponential | 🐌🐌 ช้ามาก | Fibonacci แบบ Recursive |
⚡ O(1) - ทำเท่าเดิมเสมอ
ตัวอย่าง: เปิดหนังสือหน้าแรก
ไม่ว่า Array มี 10 ตัว หรือ 1,000,000 ตัว → ใช้เวลาเท่าเดิม!
✅ O(n) - เพิ่มตามข้อมูล
ตัวอย่าง: หาชื่อในสมุดโทรศัพท์ โดยดูทีละคน
ถ้ามี 10 คน = ดู 10 ครั้ง | ถ้ามี 100 คน = ดู 100 ครั้ง → เพิ่มตามข้อมูล
🐌 O(n²) - ช้ามาก! (Loop ซ้อน Loop)
ตัวอย่าง: เปรียบเทียบทุกคนกับทุกคน
10 คน = 10 × 10 = 100 ครั้ง
100 คน = 100 × 100 = 10,000 ครั้ง!
→ ช้ามากๆ
🎯 เปรียบเทียบ Big O
ถ้าข้อมูล 1,000 รายการ จะใช้เวลาเท่าไหร่?
| Big O | จำนวนขั้นตอน | เวลา (สมมติ) |
|---|---|---|
| O(1) | 1 ครั้ง | ⚡ ทันที! |
| O(log n) | ~10 ครั้ง | ⚡ เร็ว |
| O(n) | 1,000 ครั้ง | ✅ โอเค |
| O(n²) | 1,000,000 ครั้ง | 🐌 ช้า |
✏️ ลองทำดู!
โจทย์: อัลกอริทึมไหนเร็วกว่ากัน?
A. หาเลขใน Array โดยดูทีละตัว → O(?)
B. หาเลขใน Array ที่เรียงแล้ว ใช้ Binary Search → O(?)
📄 ใบงาน
ดาวน์โหลดใบงานแต่ละหัวข้อ พิมพ์ในกระดาษ A4