Category Archives: programming

วิทย์ม.ต้น: เริ่มรู้จักภาษา Python

วันนี้เด็กๆม.ต้นได้เริ่มรู้จักภาษาคอมพิวเตอร์อีกหนึ่งภาษาครับ ชื่อว่าภาษาไพธอน (Python) เป็นภาษาที่เรียนรู้ได้ค่อนข้างง่ายและใช้ได้ทั่วไปครับ วันนี้เราหัดใช้แบบออนไลน์กันที่ repl.it  ซื่งเป็นเว็บไซต์ใช้ทดลอง เรียนรู้ และสร้างผลงานด้วยภาษาคอมพิวเตอร์หลายๆภาษาครับ เข้าไปแล้วก็กดสมัคร (Sign up) แล้วเลือกภาษา Python ครับ

เว็บ repl.it ครับ
เว็บ repl.it ครับ

ชื่อเว็บ repl.it มาจากตัวย่อของ Read-Evaluate-Print-Loop ครับ คือจะให้เราพิมพ์คำสั่งเข้าไปแล้วมันก็จะอ่าน (Read) แล้วมันก็จะคำนวณผลจากคำสั่งที่เราใส่เข้าไป (Evaluate) และพิมพ์ผลลัพธ์ให้เราดู (Print) และก็กลับไปรอรับคำสั่งเราอีก (Loop) 

 พอสมัครสมาชิกและเลือกภาษา Python แล้ว หน้าจอจะมีหน้าตาประมาณนี้ครับ:

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

จากนั้นเด็กๆลองพิมพ์คำสั่งให้ Python คิดเลขให้ เอาตัวอย่างมาจากเว็บ Learn X in Y minutes ส่วนภาษา Python:

จาก https://learnxinyminutes.com/docs/python3/  ครับ
จาก https://learnxinyminutes.com/docs/python3/ ครับ

ต่อไปเด็กๆก็เข้าไปทำแบบฝึกหัดและเรียนรู้เองด้วย Auto-Graded Course with Solutions ภาษา Python โดย Vitaly Pavlenko ครับ (มีคอร์สอื่นๆที่ https://repl.it/community ด้วยนะครับ)

เวลาเด็กๆไม่เข้าใจแบบฝึกหัด เขาจะไปอ่านความรู้เพิ่มเติมที่ https://snakify.org/en/  โดยที่ในแต่ละแบบฝึกหัดจะมีลิงก์ไปส่วนต่างๆที่ควรไปอ่านครับ เช่นแบบฝึกหัดอันแรกๆก็จะให้ไปอ่านที่ https://snakify.org/lessons/print_input_numbers/ เป็นต้นครับ หน้าตาเป็นประมาณนี้ครับ:

ตัวอย่างหน้าความรู้เพิ่มเติมครับ: https://snakify.org/en/lessons/print_input_numbers/
ตัวอย่างหน้าความรู้เพิ่มเติมครับ: https://snakify.org/en/lessons/print_input_numbers/

ผมให้เด็กๆไปทยอยทำแบบฝึกหัดทั้งหลายให้หมดภายในสองสัปดาห์นี้ครับ เป็นการทำความคุ้นเคยกับภาษา Python และหัดอ่านและค้นคว้าด้วยภาษาอังกฤษไปด้วย

วิทย์ม.ต้น: หัดใช้ List และ Blockใน Scratch

วันนี้เด็กๆม.ต้นหัดใช้ List และ Block ในภาษา Scratch  กันครับ

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

Block ใน Scratch ทำหน้าที่คล้ายๆฟังก์ชั่นในภาษาอื่นๆ คือจะรับข้อมูลเข้าไป (Input) แล้วทำงานตามขบวนการที่เรากำหนดให้ได้ผลออกมา (Result, Output) เราใช้ Block เพื่อซ่อนความซับซ้อนของโปรแกรม เพื่อเวลาเราคิดเขียนโปรแกรแก้ปัญหาอะไรบางอย่าง เราจะได้พยายามแบ่งปัญหานั้นๆให้เป็นปัญหาย่อยๆแล้วค่อยๆแก้ปัญหาย่อยๆนั้นก่อน แล้วเอาทุกอย่างมาประกอบกันเพื่อแก้ปัญหาตั้งต้นของเราในที่สุด

สำหรับเด็กม.3 ผมให้พยายามดัดแปลงการหาห.ร.ม. (GCD = Greatest Common Divisor) คราวที่แล้วที่คำนวณห.ร.ม.สำหรับเลขสองตัวให้คำนวณห.ร.ม.ของตัวเลขหลายๆตัวครับ 

วิธีหาห.ร.ม.ของตัวเลขสองตัวอาจหาได้จากวิธีประมาณนี้ แบบแรกมี recursion คือการเรียกตัวเองของ Block เราตั้งชื่อว่า GCD_recursive:

วิธีหาห.ร.ม.แบบ recursive (เรียกตัวเองไปเรื่อยๆจนได้คำตอบ)
วิธีหาห.ร.ม.แบบ recursive (เรียกตัวเองไปเรื่อยๆจนได้คำตอบ)

แบบที่สองไม่เรียกตัวเอง แต่ทำงานวนไปเรื่อยๆจนได้คำตอบ เราตั้งชื่อว่า GCD_iterative:

วิธีหาห.ร.ม.แบบ iterative (ทำวนไปเรื่อยๆจนได้คำตอบ ไม่ได้เรียกตัวเองแบบ recursive)
วิธีหาห.ร.ม.แบบ iterative (ทำวนไปเรื่อยๆจนได้คำตอบ ไม่ได้เรียกตัวเองแบบ recursive)

เมื่อมีเลขมากกว่าสองตัว เช่นมีเลข 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 เป็นจำนวนเฉพาะหรือเปล่าจะหน้าตาประมาณนี้ครับ:

Block เพื่อตรวจว่า x เป็นจำนวนเฉพาะหรือไม่
Block เพื่อตรวจว่า x เป็นจำนวนเฉพาะหรือไม่

ส่วนที่ไล่ตัวเลขไปเรื่อยๆจนได้จำนวนเฉพาะครบ 100 ตัวจะหน้าตาประมาณนี้ครับ จะมีการเรียกใช้ Block “เป็นจำนวนเฉพาะ” เพื่อตรวจสอบตัวเลขทีละตัวๆ ตัวไหนเป็นจำนวนเฉพาะก็เอาไปใส่ใน List เก็บไว้:

หาจำนวนเฉพาะ 100 ตัวแรก
หาจำนวนเฉพาะ 100 ตัวแรก

ผมเขียนโปรแกรมภาษา Python ที่แก้ปัญหาเดียวกันให้เด็กๆดูด้วยครับ ไว้เทอมหน้าจะเริ่มเรียนกัน

วิทย์ม.ต้น: รู้จัก Recursion,ใช้ Scratch คำนวณห.ร.ม., ตัวเลขเป็นจำนวนเฉพาะหรือไม่

วันนี้เด็กๆม.ต้นได้เรียนรู้เรื่อง Scratch  เพิ่มเติม ให้รู้จักการแปลงขบวนการคิดไปเป็นโปรแกรมครับ

เด็กม.3 ทำความรู้จักการหาห.ร.ม. (GCD, Greatest Common Divisor) โดยใช้วิธีของยูคลิด (Euclid’s algorithm)  ที่อาศัยว่าถ้าจำนวนเต็มบวก a, b มีตัวหารร่วมมาก d  ผลต่าง  a-b  หรือ b-a ก็หารด้วย d ลงตัวเช่นกัน เราจึงสามารถเปลี่ยนปัญหาการหา ห.ร.ม. ของ a และ b เป็นปัญหาที่เล็กลงคือหา ห.ร.ม. ของ a และ a-b ถ้า a มากกว่า b หรือหา ห.ร.ม. ของ a และ b-a ถ้า b มากกว่า a

จาก https://en.wikipedia.org/wiki/Greatest_common_divisor#Using_Euclid's_algorithm
จาก https://en.wikipedia.org/wiki/Greatest_common_divisor#Using_Euclid’s_algorithm

การลบหลายๆครั้งตามวิธีด้านบนก็เหมือนกันหารแล้วดูว่าเหลือเศษเท่าไร เราจึงเขียนได้อีกแบบโดยอาศัยวิธี a mod b ที่หาเศษจากการหาร a/b

จาก https://en.wikipedia.org/wiki/Greatest_common_divisor#Using_Euclid's_algorithm
จาก https://en.wikipedia.org/wiki/Greatest_common_divisor#Using_Euclid’s_algorithm

ตัว a mod b นี้สามารถให้ Scratch คำนวณให้ได้ (เช่น 19/5 = 3 เศษ 4 ดังนั้น 19 mod 5 ก็คือ 4) ผมจึงให้เด็กๆคิดว่าจะบอกให้ Scratch คำนวณห.ร.ม. ให้เราอย่างไร

19 mod 5 = 4
19 mod 5 = 4

เด็กๆได้รู้จัก Custom Block ใน Scratch ซึ่งทำหน้าที่เหมือนฟังก์ชั่นในภาษาโปรแกรมอื่นๆ และได้เห็นว่า Custom Block เรียกตัวเองได้ ก็คือได้รู้จัก Recursive function นั่นเอง

หน้าตาการหาห.ร.ม.แบบเรียกตัวเอง (recursion) จะออกมามีหน้าตาประมาณนี้ครับ:

หาห.ร.ม.แบบเรียกตัวเอง (recursive function)
หาห.ร.ม.แบบเรียกตัวเอง (recursive function)

นอกจากเขียนการหาห.ร.ม.แบบเรียกตัวเองแล้ว เรายังสามารถเขียนแบบให้เป็น loop หรือการวนซ้ำๆจนพบคำตอบแบบนี้ด้วยครับ การวนซ้ำๆจะเรียกว่าแบบ iterative ครับ:

การหาห.ร.ม.แบบวนซ้ำๆ (iterative)
การหาห.ร.ม.แบบวนซ้ำๆ (iterative)

สำหรับเด็กม.1-2 ผมแนะนำว่า  Operators ต่างๆของ Scratch ทำอะไรบ้าง หน้าตา Operators ก็เช่นพวกนี้ครับ:

ตัวอย่าง Operator ใน Scratch
ตัวอย่าง Operator ใน Scratch

จากนั้นผมให้เด็กๆสอนให้  Scratch บอกว่าตัวเลขจำนวนเต็มบวกที่เราป้อนเข้าไปเป็นจำนวนเฉพาะหรือไม่ ให้เด็กๆสังเกตว่าถ้าได้ตัวเลขมาหนึ่งตัว เราก็ลองไล่หาตัวเลขที่น้อยกว่ามันไปลองหารดูว่าลงตัวหรือไม่ เด็กๆได้สังเกตว่าเราควรตรวจดูก่อนว่าเลขคือ  1 หรือ 2 หรือไม่ ถ้าเป็น 1 ก็ไม่เป็นจำนวนเฉพาะ ถ้าเป็น 2 ก็เป็นจำนวนเฉพาะ สำหรับเลข N ที่มากกว่า 2 เราก็เอา 2, 3, 4, …, ไม่เกิน N ไปลองหาร N ดูว่ามีตัวไหนหารลงตัวไหม ถ้ามีเราก็บอกได้ว่า N ไม่ใช่จำนวนเฉพาะ ถ้าไม่มีตัวไหนหารลงตัวเลยเราก็รู้ว่า N  เป็นจำนวนเฉพาะ  นอกจากนี้เด็กๆยังได้เห็นว่าจริงๆเราหาตัวหารที่ไม่มากกว่ารูทที่ 2 ของ N ก็พอ เพราะถ้ามีตัวหารที่มากกว่ารูทที่ 2 ของ N เราก็จะต้องเจอตัวหารอีกตัวที่น้อยกว่ารูทที่ 2 ของ N ไปก่อนแล้วแน่นอน

เด็กๆไปนั่งหัดเขียนกันประมาณ 1 ชั่วโมงครับ ก็ได้โปรแกรมกันทุกคน ใครทำได้ก่อนก็ไปให้คำปรึกษาคนที่ยังติดอยู่ ผมบอกว่าไม่ให้บอกกันแต่ให้ถามๆและชี้ๆส่วนที่อาจเป็นบั๊กจนทุกคนเข้าใจและทำได้เองกันหมด หลายๆคนตื่นเต้นมากที่คอมพิวเตอร์ตอบคำถามว่าเลขไหนเป็นจำนวนเฉพาะอย่างรวดเร็วเพราะวิธีที่เด็กๆทำด้วยมือมันทำได้ช้าและใช้กับเลขน้อยๆเท่านั้น เด็กๆได้ทดลองตรวจสอบเลขใหญ่ๆเช่น 15,485,863 และ 32,452,843  (เลขจำนวนเฉพาะตัวที่ล้านและสองล้านตามลำดับ) และพบว่ามันเป็นจำนวนเฉพาะ

หน้าตาโปรแกรมจะเป็นทำนองนี้ครับ:

 

ตัวเลขเป็นจำนวนเฉพาะไหม?
ตัวเลขเป็นจำนวนเฉพาะไหม?