วันนี้เด็กๆม.ต้นหัดใช้ List และ Block ในภาษา Scratch กันครับ
เราใช้ List เป็นที่เก็บของที่เกี่ยวข้องไว้ด้วยกันครับ มันเหมือนชั้นวางของยาวๆไม่จำกัดที่เราสามารถเอาของไปใส่ที่ตำแหน่งต่างๆ สามารถเปลี่ยนของที่ตำแหน่งต่างๆได้ สามารถดูว่าชั้นวางของตำแหน่งนี้มีของอะไรอยู่ข้างใน สามารถดูว่าตอนนี้มีของวางอยู่กี่ชิ้นแล้ว
Block ใน Scratch ทำหน้าที่คล้ายๆฟังก์ชั่นในภาษาอื่นๆ คือจะรับข้อมูลเข้าไป (Input) แล้วทำงานตามขบวนการที่เรากำหนดให้ได้ผลออกมา (Result, Output) เราใช้ Block เพื่อซ่อนความซับซ้อนของโปรแกรม เพื่อเวลาเราคิดเขียนโปรแกรแก้ปัญหาอะไรบางอย่าง เราจะได้พยายามแบ่งปัญหานั้นๆให้เป็นปัญหาย่อยๆแล้วค่อยๆแก้ปัญหาย่อยๆนั้นก่อน แล้วเอาทุกอย่างมาประกอบกันเพื่อแก้ปัญหาตั้งต้นของเราในที่สุด
สำหรับเด็กม.3 ผมให้พยายามดัดแปลงการหาห.ร.ม. (GCD = Greatest Common Divisor) คราวที่แล้วที่คำนวณห.ร.ม.สำหรับเลขสองตัวให้คำนวณห.ร.ม.ของตัวเลขหลายๆตัวครับ
วิธีหาห.ร.ม.ของตัวเลขสองตัวอาจหาได้จากวิธีประมาณนี้ แบบแรกมี recursion คือการเรียกตัวเองของ Block เราตั้งชื่อว่า GCD_recursive:
แบบที่สองไม่เรียกตัวเอง แต่ทำงานวนไปเรื่อยๆจนได้คำตอบ เราตั้งชื่อว่า GCD_iterative:
เมื่อมีเลขมากกว่าสองตัว เช่นมีเลข A, B, C, D, … เราก็จะหาห.ร.ม.ของ A กับ B ก่อน แล้วเอา C มาหาห.ร.ม.กับผลของห.ร.ม.ของ A และ B แล้วเราก็เอาผลห.ร.ม.ที่ได้ไปหาห.ร.ม.กับ D อีก ทำอย่างนี้ไปเรื่อยๆจนหมดก็จะได้ห.ร.ม.ของเลข A, B, C, D ทั้งหมด ถ้าจะเขียนเป็นสัญญลักษณ์ได้ว่า
GCD(A, B, C, D,…) = GCD( GCD( GCD( A,B ), C ), D,… )
เด็กๆม.สามต้องเขียนโปรแกรมรับค่าตัวเลขหลายๆตัว เอาตัวเลขไปเก็บใน List แล้วหาห.ร.ม.ของตัวเลขทั้งหมด พอดีเวลาหมดก่อนจึงให้ไปทำกันที่บ้านแล้วไว้มาคุยกันต่อครั้งต่อไปครับ
สำหรับเด็กม. 1 และ 2 เราก็ต่อยอดจากคราวที่แล้วที่เด็กๆเขียนโปรแกรมตรวจว่าตัวเลขเป็นจำนวนเฉพาะหรือไม่ โดยคราวนี้หัดเอาส่วนที่ตรวจสอบจำนวนเฉพาะมาทำเป็น Block แล้วเรียกใช้เพื่อหาจำนวนเฉพาะ 100 ตัวแรกไปใส่ใน List
เมื่อเวลาใกล้หมด เด็กๆก็ยังมีปัญหาพอสมควรแต่มีบางคนทำได้สำเร็จแล้ว คนที่ยังทำไม่สำเร็จก็ให้กลับไปคิดทำต่อให้สำเร็จแล้วมาคุยกันต่อในครั้งหน้า ผมบอกเด็กๆว่าส่วนที่เด็กๆเรียนรู้คือวิธีคิดแก้ปัญหาให้เป็นระบบ ให้หัด debug โปรแกรมโดยแบ่งเป็นส่วนเล็กๆแล้วเช็คทีละส่วนให้ถูกต้องก่อน และนิสัยที่อดทนไม่ยอมเลิกเมื่อเจอปัญหา ทักษะเหล่านี้จะมีประโยชน์สำหรับชีวิตในอนาคตของเด็กๆ
หน้าตา Block เพื่อเช็คว่าค่า x เป็นจำนวนเฉพาะหรือเปล่าจะหน้าตาประมาณนี้ครับ:
ส่วนที่ไล่ตัวเลขไปเรื่อยๆจนได้จำนวนเฉพาะครบ 100 ตัวจะหน้าตาประมาณนี้ครับ จะมีการเรียกใช้ Block “เป็นจำนวนเฉพาะ” เพื่อตรวจสอบตัวเลขทีละตัวๆ ตัวไหนเป็นจำนวนเฉพาะก็เอาไปใส่ใน List เก็บไว้:
ผมเขียนโปรแกรมภาษา Python ที่แก้ปัญหาเดียวกันให้เด็กๆดูด้วยครับ ไว้เทอมหน้าจะเริ่มเรียนกัน