Category Archives: programming

วิทย์ม.ต้น: โปรแกรม Scratch หาความชันของจุดตัดเส้นตรง, ประมาณค่า π (ค่าพาย)

วันนี้ผมเฉลยข้อสอบภาคที่แล้วครับ หน้าตาข้อสอบเป็นอย่างนี้ ให้เด็กๆไปทำที่บ้านมีเวลาตอนปิดเทอม 1 เดือน:

ข้อ 1-4 ก็ตอบได้ด้วยโน้ตที่นักเรียนบันทึระหว่างเรียน หรือไปดูที่ผมสรุปไว้ที่เว็บวิทย์พ่อโก้เช่นกดไล่ดูตาม https://witpoko.com/?tag=วิทย์ม-ต้น ครับ

สำหรับข้อ 5 ผมทำบนกระดานให้ดูว่าถ้ารู้จุดสองจุด (x1, y1) และ (x2, y2) เราจะรู้ว่าความชันและจุดตัดแกน x แกน y อยู่ที่ไหนบ้างดังนี้:

แล้วก็เขียนโปรแกรม Scratch เพื่อคำนวณค่าเหล่านั้นไว้ที่ https://scratch.mit.edu/projects/258997829/ หน้าตาจะเป็นปรมาณนี้ครับ:

ถ้าเด็กๆยังงงๆอยู่ลองไปลองเล่นขยับจุดไปมาที่หน้านี้ก็ได้ครับ: https://www.mathsisfun.com/algebra/line-equation-2points.html

สำหรับข้อ 6 เราประมาณค่า π  โดยการบวกลบเลขที่เล็กลงไปเรื่อยๆ ในที่นี้คือ  4 ( 1/1 – 1/3 + 1/5 – 1/7 + 1/9 ….) ไปเรื่อยๆ เราสามารถเขียนโปรแกรม Scratch ได้แบบ https://scratch.mit.edu/projects/259001246/ หน้าตาประมาณนี้ครับ:

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

นอกจากนี้ผมลองเขียนวิธีประมาณค่า π  ด้วย Python เพื่อให้เด็กๆเห็นว่ามันจัดการได้ง่ายกว่าด้วย Scratch ที่ https://repl.it/@PongskornSaipet/Approximating-Pi โดยประมาณ 2 แบบ แบบแรกคือประมาณค่า π = 4(1 – 1/3 + 1/5 – 1/7…) คือแบบที่อยู่ในข้อสอบ อีกแบบคือประมาณค่า π = sqrt(12) (1 – 1/(3×3) + 1/(5×9) – 1/(7×27) … ) ตามวิธีหนึ่งในหน้า  Approximations of π  ครับ พบว่าวิธีที่สองบวกลบเลขไม่กี่ตัวก็ได้ค่าใกล้ความจริงแล้วครับ เร็วกว่าวิธีแรกมากๆ

สำหรับการบ้านเด็กๆ ผมให้เด็กไปอ่าน Cognitive Biases มาสัปดาห์ละอย่างน้อย 3 ตัว ให้ทำโน้ตให้ตัวเองเข้าใจ และหัดแก้โจทย์เขียนโปรแกรม Python ต่อไป พยายามทำให้ได้อย่างน้อยเฉลี่ยวันละ 1 ข้อครับ

วิทย์ม.ต้น: เริ่มรู้จักภาษา 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 ที่แก้ปัญหาเดียวกันให้เด็กๆดูด้วยครับ ไว้เทอมหน้าจะเริ่มเรียนกัน