บทเรียนที่ 1 วิทย์คอม m4

การคิดเชิงคำนวณและอัลกอริทึม
💻

การคิดเชิงคำนวณและอัลกอริทึม

Computational Thinking and Algorithms

วิทยาการคำนวณ ม.4 | 6 สัปดาห์

🧠 การคิดเชิงคำนวณคืออะไร?

💡 ความหมาย

การคิดเชิงคำนวณ คือ วิธีคิดแก้ปัญหาแบบคอมพิวเตอร์ โดยแบ่งปัญหาใหญ่เป็นเล็ก หารูปแบบ เอาแต่ที่สำคัญ แล้วเขียนเป็นขั้นตอน

เหมือนเวลาเราทำอะไรก็ตาม เช่น ทำอาหาร เล่นเกม ทำโปรเจกต์ เราต้องคิดเป็นขั้นตอน วางแผน และหาวิธีที่ดีที่สุด

🎯 4 องค์ประกอบหลัก

🔨
1. แยกส่วนปัญหา
แบ่งปัญหาใหญ่เป็นปัญหาเล็กๆ ที่ทำได้ง่ายขึ้น
🔍
2. จดจำรูปแบบ
หาสิ่งที่ซ้ำกันหรือคล้ายกัน เพื่อใช้วิธีเดิม
🎨
3. คิดเชิงนามธรรม
มองเอาแต่สิ่งสำคัญ ตัดรายละเอียดที่ไม่จำเป็นทิ้ง
⚙️
4. ออกแบบอัลกอริทึม
เขียนขั้นตอนการแก้ปัญหาที่ชัดเจน ทำตามได้

🍳 ตัวอย่างง่ายๆ: ทำข้าวผัด

🔨 แยกส่วนปัญหา

  • เตรียมวัตถุดิบ (ข้าว, ไข่, ผัก)
  • เตรียมอุปกรณ์ (กระทะ, ช้อน)
  • ทำอาหาร (ผัด, ปรุงรส)
  • เสิร์ฟ

🔍 จดจำรูปแบบ

  • ทุกเมนูผัดก็ผัดคล้ายกัน (ตั้งกระทะ → ใส่น้ำมัน → ผัด)

🎨 คิดเชิงนามธรรม

  • ไม่ต้องนับข้าวทีละเม็ด (แค่ประมาณ 1 ถ้วย)
  • ไม่ต้องตั้งเวลาแม่น (ดูจากลักษณะว่าสุกแล้ว)

⚙️ ออกแบบอัลกอริทึม

  1. ตั้งกระทะ ใส่น้ำมัน
  2. ตอกไข่ใส่กระทะ ผัดให้สุก
  3. ใส่ข้าวลงไป ผัดให้เข้ากัน
  4. ใส่ผัก ปรุงรส
  5. ตักใส่จาน เสร็จ!

🔨 การแยกส่วนปัญหา (Decomposition)

💡 ทำไมต้องแยกส่วน?

เวลาเจอปัญหาใหญ่ๆ เราต้องแบ่งเป็นชิ้นเล็กๆ เหมือนกินช้างให้ทีละคำ แทนที่จะทำทั้งก้อนแล้วงง เราทำทีละส่วนจะง่ายกว่า

ทำให้เข้าใจง่าย
ปัญหาซับซ้อนกลายเป็นง่าย
👥
แบ่งงานได้
หลายคนทำพร้อมกันได้
🔧
แก้ไขง่าย
มีบั๊กแค่แก้ส่วนนั้น

📝 วิธีแยกส่วนปัญหา

1

ดูปัญหาทั้งหมด

อ่านและทำความเข้าใจว่าต้องทำอะไร เป้าหมายคืออะไร

2

แบ่งเป็นส่วนใหญ่ๆ

แยกออกเป็นหมวดหมู่ใหญ่ๆ ก่อน

3

แยกย่อยต่อไปอีก

แต่ละส่วนใหญ่แยกเป็นส่วนเล็กๆ ต่อ จนทำได้

4

ทำทีละส่วน

ทำให้เสร็จทีละส่วน แล้วค่อยนำมารวมกัน

📱 ตัวอย่าง: สร้างแอพ Instagram

ปัญหา: ต้องสร้างแอพโซเชียลมีเดียที่โพสต์รูปได้

หน้าบ้าน (Frontend)
  • หน้า Feed (ดูโพสต์)
  • หน้าโพสต์รูป
  • หน้า Profile
  • หน้าค้นหา
หลังบ้าน (Backend)
  • ระบบ 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

sum = 0 sum = sum + 1 sum = sum + 2 sum = sum + 3 ...ทำแบบนี้ต่อไปเรื่อยๆ จะเยอะมาก!

🔍 สังเกตรูปแบบ: มีการบวกซ้ำๆ หลายครั้ง

💡 ใช้ Loop แทน:

sum = 0 FOR i FROM 1 TO 10 sum = sum + i END FOR // สั้นกว่า ใช้ได้กับเลขกี่ตัวก็ได้!

✏️ ลองทำดู!

โจทย์ 1: หารูปแบบของลำดับนี้

1, 4, 9, 16, 25, ?, ?

โจทย์ 2: Facebook, Instagram, TikTok มีรูปแบบอะไรเหมือนกัน?

🎨 การคิดเชิงนามธรรม (Abstraction)

💡 ความหมาย

Abstraction คือ การมองเอาแต่สิ่งสำคัญ ตัดรายละเอียดที่ไม่จำเป็นออก เพื่อให้เห็นภาพรวมชัดขึ้น

เหมือนเวลาวาดแผนที่ เราไม่ได้วาดทุกอย่าง (ต้นไม้ รถ คน) แต่วาดแค่ถนนและจุดสำคัญ

🗺️ ตัวอย่างง่ายๆ: แผนที่รถไฟฟ้า BTS

ที่แสดง (สำคัญ)
  • ชื่อสถานี
  • เส้นทาง
  • จุดต่อสาย
ที่ไม่แสดง (ไม่จำเป็น)
  • ถนนจริง
  • ตึก ร้านค้า
  • ระยะทางแม่นยำ
  • ทิศทางที่แท้จริง

ทำไม? เพราะเราอยากรู้แค่ว่า ขึ้นสถานีไหน ต่อสายไหน ส่วนอื่นไม่สนใจ

🚗 ตัวอย่าง: การขับรถ

เวลาขับรถ เราไม่ต้องรู้ว่าเครื่องยนต์ทำงานยังไง แค่รู้ว่า:

🎮
เหยียบคันเร่ง = วิ่ง
🛑
เหยียบเบรก = หยุด
↩️
หมุนพวงมาลัย = เลี้ยว

ข้อดี: ไม่ต้องเป็นช่างก็ขับได้! ซ่อนรายละเอียดที่ซับซ้อนไว้

💻 ตัวอย่าง: ในการเขียนโปรแกรม

เวลาเราใช้ฟังก์ชัน:

// เราแค่เรียกใช้ result = calculate_average([10, 20, 30, 40]) print(result) // 25 // ไม่ต้องรู้ว่าข้างในคำนวณยังไง

ข้างในฟังก์ชันมีรายละเอียดยุ่งยาก แต่เราซ่อนไว้ ผู้ใช้แค่ใส่ตัวเลข แล้วได้คำตอบ

✏️ ลองทำดู!

โจทย์: ถ้าจะอธิบาย "วิธีส่ง LINE" ให้เด็กอายุ 5 ขวบฟัง

ควรบอกอะไร? ไม่ควรบอกอะไร?

💡 เช่น ไม่ต้องบอกว่าอินเทอร์เน็ตทำงานยังไง แค่บอกว่ากดปุ่มไหน

⚙️ การออกแบบอัลกอริทึม

💡 อัลกอริทึมคืออะไร?

อัลกอริทึม = สูตรการทำงาน หรือ ขั้นตอนที่ชัดเจน ในการทำอะไรสักอย่างให้สำเร็จ

เหมือนสูตรอาหาร ที่บอกว่าต้องทำอะไรก่อน-หลัง ใส่อะไรเท่าไหร่ ใครทำตามก็ได้ผลลัพธ์เหมือนกัน

✅ อัลกอริทึมที่ดีต้องมี:

📥
มี Input
รับข้อมูลเข้ามา (หรือไม่มีก็ได้)
📤
มี Output
ได้ผลลัพธ์ออกมา
📝
ชัดเจน
ทุกขั้นตอนเข้าใจง่าย ไม่งง
🏁
จบได้
ไม่วนลูปไม่รู้จบ
✔️
ทำได้จริง
แต่ละขั้นตอนทำได้จริง

🧃 ตัวอย่างง่ายๆ: ทำน้ำมะนาว

📥 Input: มะนาว 2 ลูก, น้ำตาล 3 ช้อน, น้ำเปล่า 1 แก้ว, น้ำแข็ง

📝 ขั้นตอน:

  1. คั้นมะนาว 2 ลูก
  2. เทน้ำมะนาวลงแก้ว
  3. ใส่น้ำตาล 3 ช้อน
  4. เติมน้ำเปล่า
  5. ใส่น้ำแข็ง
  6. คนให้เข้ากัน
  7. ชิมรส (หวานพอดีไหม?)

📤 Output: น้ำมะนาว 1 แก้ว

🔢 ตัวอย่าง: หาเลขที่มากที่สุด

โจทย์: มีตัวเลข [15, 42, 8, 23, 67, 31] หาตัวที่มากที่สุด

วิธีคิด:

1

ตั้งตัวแรกเป็นตัวใหญ่ที่สุดก่อน (max = 15)

2

ดูตัวถัดไป (42) → 42 > 15 → max = 42

3

ดูตัวถัดไป (8) → 8 < 42 → ไม่เปลี่ยน

4

ทำต่อไปเรื่อยๆ จนครบ

5

ได้คำตอบ: 67

เขียนเป็น Pseudocode:

FUNCTION find_max(numbers) max = numbers[0] FOR each num IN numbers IF num > max THEN max = num END IF END FOR RETURN max END FUNCTION

✏️ ลองทำดู!

โจทย์: เขียนอัลกอริทึม "หาว่าเลขเป็นคู่หรือคี่"

💡 คำใบ้: ใช้ % (หาเศษ) เช่น 10 % 2 = 0 (เลขคู่), 11 % 2 = 1 (เลขคี่)

📊 Flowchart และ Pseudocode

🔷 Flowchart (ผังงาน) คืออะไร?

Flowchart = ภาพวาดที่แสดงขั้นตอนการทำงาน ใช้รูปร่างต่างๆ และลูกศรเชื่อมต่อกัน

เหมือนแผนที่บอกทางว่าต้องทำอะไรบ้าง ทำก่อน-หลัง เลี้ยวตรงไหน

🔣 สัญลักษณ์ที่ใช้

รูปร่าง ความหมาย ใช้เมื่อ
Start/End
วงรี เริ่มต้น หรือ จบโปรแกรม
Process
สี่เหลี่ยม คำนวณ หรือ ประมวลผล
Yes/No
สี่เหลี่ยมข้าวหลามตัด ตัดสินใจ (ใช่/ไม่ใช่)
ลูกศร แสดงทิศทางการไหล

📚 ตัวอย่าง: เช็คว่าผ่านสอบไหม?

START
INPUT: คะแนน
คะแนน
≥ 50?

← ไม่ใช่

PRINT "ไม่ผ่าน"

ใช่ →

PRINT "ผ่าน"
END

📝 Pseudocode (รหัสเทียม) คืออะไร?

Pseudocode = เขียนอัลกอริทึมด้วยภาษาคนอ่านเข้าใจ ไม่ต้องเป็นโค้ดจริงๆ แค่เข้าใจได้

💻 เปรียบเทียบ Pseudocode กับ Python

Pseudocode

INPUT age IF age >= 18 THEN PRINT "บรรลุนิติภาวะ" ELSE PRINT "ยังไม่บรรลุ" END IF

Python

age = int(input("อายุ: ")) if age >= 18: print("บรรลุนิติภาวะ") else: print("ยังไม่บรรลุ")

เห็นไหมว่าคล้ายกันมาก แต่ 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) - ทำเท่าเดิมเสมอ

ตัวอย่าง: เปิดหนังสือหน้าแรก

FUNCTION get_first(array) RETURN array[0] // ทำแค่ขั้นตอนเดียว END FUNCTION

ไม่ว่า Array มี 10 ตัว หรือ 1,000,000 ตัว → ใช้เวลาเท่าเดิม!

✅ O(n) - เพิ่มตามข้อมูล

ตัวอย่าง: หาชื่อในสมุดโทรศัพท์ โดยดูทีละคน

FUNCTION find_name(list, name) FOR each person IN list IF person == name THEN RETURN "เจอแล้ว" END IF END FOR END FUNCTION

ถ้ามี 10 คน = ดู 10 ครั้ง | ถ้ามี 100 คน = ดู 100 ครั้ง → เพิ่มตามข้อมูล

🐌 O(n²) - ช้ามาก! (Loop ซ้อน Loop)

ตัวอย่าง: เปรียบเทียบทุกคนกับทุกคน

FOR i IN array FOR j IN array compare(i, j) END FOR END FOR

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

Scroll to Top