Category Archives: programming

วิทย์ม.ต้น: เขียนไพธอนหาตัวประกอบเลข, หัดใช้ set, คอมพิวเตอร์โบราณ, หัดเขียนฟังก์ชั่น

วันนี้เด็กม.2-3 หัดเขียนโปรแกรมหาตัวประกอบของเลขจำนวนเต็มกันครับ เด็กๆเอาไปทำที่บ้านสัปดาห์ที่แล้ว และส่วนใหญ่ก็คิดได้ว่าควรลองเอาตัวเลขไปหารดูว่าหารลงตัวไหม ถ้าหารลงตัวก็เป็นตัวประกอบ

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

และผมให้เด็กๆคิดว่าเวลาเราหาตัวประกอบของ x เราจำเป็นต้องหาตัวหารมาทดลองตั้งแต่ 1 ถึง x เลยไหม หลังจากเด็กๆคิดสักพัก เด็กบางคนก็เข้าใจว่าเราอาจจะลองแค่ 1 ถึง sqrt(x) หรือ 1 ถึงรากที่สองของ x เท่านั้นก็ได้ถ้าตอนทดลองหารเราเก็บผลหารไว้ด้วย การทำอย่างนี้จะทำให้เราใช้เวลาคำนวณน้อยลงมาก เช่นถ้า x มีขนาดสักร้อยล้าน รากที่สองของ x จะมีขนาดประมาณหนึ่งหมื่นเท่านั้น ประหยัดเวลาไปหมื่นเท่า

นอกจากนี้เด็กๆได้เห็นวิธีเปลี่ยนลิสต์เป็นเซ็ตเพื่อกำจัดตัวประกอบที่ซ้ำออก และเห็นการเปลี่ยนเซ็ตเป็นลิสต์เพื่อจัดเรียงสมาชิกด้วย:

โหลด Jupyter Notebook ได้ที่นี่ หรือดูออนไลน์ได้ที่นี่ครับ

สำหรับม.1 ผมเล่าให้ฟังว่าเราเรียนโปรแกรมมิ่งไปเพื่อจะได้สั่งงานเครื่องจักรให้ทำงานให้เรา ยกตัวอย่างเช่นโทรศัพท์สมัยก่อนใช้คนต่อสายระหว่างคนโทร แต่สมัยนี้เครื่องจักรทำงานแทนหมดแล้ว:

การเขียนโปรแกรมสมัยก่อนใช้การต่อสายไฟต่างๆในคอมพิวเตอร์เข้าด้วยกัน:

การโปรแกรมคอมพิวเตอร์สมัย 1947 ชื่อ ENIAC ทำโดยการต่อสายไฟให้เหมาะสม ภาพนี้มาจาก http://www.history.com/news/coding-used-to-be-a-womans-job-so-it-was-paid-less-and-undervalued

และตัวอย่างการเขียนโปรแกรม Hello, World ในภาษาคอมพิวเตอร์ต่างๆ

และเด็กๆได้รู้จักคอมพิวเตอร์ที่ทำจากเฟืองอายุกว่า 2,000 ปี:

และคอมพิวเตอร์แบบเดียวกันแต่ต่อด้วย Lego:

จากนั้นเด็กๆก็หัดใช้ตัวแปรพวกจำนวนเต็ม เลขทศนิยม ข้อความ ลิสต์ และหัดเขียนฟังก์ชั่นบวกเลข 1 + 2 + 3 + … + n และอื่นๆกันครับ

โหลด Jupyter Notebook ได้ที่นี่ หรือดูออนไลน์ได้ที่นี่ครับ

วิทย์ม.ต้น: เขียนโปรแกรมไพธอนแก้ปัญหาแบบควายถึก, โปรแกรมเข้ารหัส Caesar Cipher, และเว็บฝึกเขียนไพธอน

ผมเอาโจทย์เลขนี้มาให้เด็กๆดูครับ:

โจทย์คือ a, b, c, d เป็นจำนวนเต็มบวก ผลรวมของ a, b, c, d เท่ากับ 63 ให้หาค่าที่มากที่สุดของ ab + bc + cd ในวิดีโอแสดงวิธีทำด้วยรูปภาพ แต่สมมุติว่าเด็กๆไม่รู้ว่าจะทำอย่างไรแต่มีคอมพิวเตอร์อยู่ก็สามารถเขียนโปรแกรมให้คอมพิวเตอร์ไล่ตัวเลข a, b, c, d ดูได้

ผมบอกเด็กๆว่าเดี๋ยวนี้คอมพิวเตอร์เร็วมาก ถ้ามีของสักพันล้านชิ้นก็ยังให้มันไล่ดูให้เราได้โดยรอไม่นานนัก ในโจทย์นี้ค่าที่เป็นไปได้ของ a, b, c จะประมาณ 60 แบบของแต่ละตัว และค่าของ d จะเท่ากับ 63-(a+b+c) ดังนั้นค่าที่เป็นไปได้ทั้งหมดจะประมาณ 60x60x60 หรือประมาณ 200,000 เท่านั้น คอมพิวเตอร์ไล่ให้ได้ในเวลาไม่ถึงวินาที

หน้าตาโปรแกรมก็เป็นประมาณนี้ครับ:

วิธีให้คอมพิวเตอร์ช่วยคิดนี้ทำให้เราสามารถถามคำถามมากขึ้นไปอีกได้เช่นสำหรับค่า ab + bc + cd แต่ละค่าจะมีชุด (a, b, c, d) กี่แบบ เอามาวาดฮิสโตแกรมดูดีไหม มีค่าไหนที่เป็นไปไม่ได้บ้าง ฯลฯ

สำหรับการบ้านที่ผมให้เด็กๆม.2-3 ไปพยายามเขียนฟังก์ชั่นเข้ารหัสแบบเลื่อนตัวอักษร (Caesar Cipher) ผมก็มาเขียนเฉลยให้เด็กๆดูสดๆว่าผมเขียนอย่างไร เจอปัญหาและบั๊กอย่างไร เขียนไปตรวจสอบไปอย่างไรครับ หน้าตาจอตอนเขียนก็เป็นประมาณนี้:

โหลด Jupyter Notebook ที่บันทึกการเฉลยที่นี่ครับ หรือเปิดดูในเบราเซอร์ได้ที่นี่ครับ: https://nbviewer.jupyter.org/urls/witpoko.com/wp-content/uploads/2019/06/2019-06-07_G8-9.ipynb

สำหรับเด็กๆม.1 ผมให้ทำแบบฝึกหัดกับเว็บเรียนไพธอนสองเว็บครับ ให้เขาทดลองทำแล้วเลือกดูว่าชอบอันไหนระหว่าง https://www.w3schools.com/python/ และ https://www.learnpython.org ขณะที่ทำแล้วมีปัญหาผมก็เข้าไปแนะนำ มีกระดาษทดตอนแนะนำเป็น Jupyter Notebook ให้โหลดไปดูได้ที่นี่ หรือเปิดดูในเบราเซอร์ได้ที่นี่ครับ: https://nbviewer.jupyter.org/urls/witpoko.com/wp-content/uploads/2019/06/2019-06-07_G7.ipynb

ผมไปพบลิงก์สำหรับเรียนรู้ภาษาไพธอนถ้าอ่านภาษาอังกฤษไม่คล่องด้วยครับ เข้าไปดูได้ที่ https://phyblas.hinaboshi.com/saraban/python (แต่อย่างไรก็ตามผมแนะนำให้หัดอ่านภาษาอังกฤษไปเรื่อยๆนะครับ จะได้เก่งภาษาขึ้นเรื่อยๆ)

วิทย์ม.ต้น: เขียนโปรแกรมไพธอนนับจำนวนครั้งที่ตัวอักษรอยู่ในข้อความ, โปรแกรมทายตัวเลข

ผมให้เด็กม.2-3 ไปเขียนโปรแกรมนับจำนวนครั้งว่าตัวอักษรแต่ละตัวในข้อความเกิดขึ้นกี่ครั้งเช่น ถ้าข้อความคือ “hello” โปรแกรมก็ควรนับมาว่า h เกิด 1 ครั้ง, e เกิด 1 ครั้ง, l เกิด 2 ครั้ง, และ o เกิด 1 ครั้ง โดยให้เด็กหัดใช้ดิกชันนารี

ผมเขียนโปรแกรมเฉลยให้เด็กๆดู ให้เด็กๆรู้จักใช้ “, ‘, “””, ”’ เพื่อกำหนดข้อความสตริงในไพธอน ให้เด็กรู้จักการอ้างอิงแต่ละตัวอักษรในสตริงด้วยวิธี for i in string, รู้จักวิธีดูว่ามีคีย์ k ในดิกชันนารีหรือยังด้วย if k in dictionary, รู้จักแสดงผลในดิกชันนารีตามลำดับคีย์หรือตามลำดับค่าของมันด้วย sorted(d), sorted(d, key = d.get), sorted(d, key = get, reverse = True) ได้รู้จักฟังก์ชั่น ord( ) และ chr( ) สำหรับการบ้านครั้งต่อไป

โหลด Jupyter Notebook ที่บันทึกการเฉลยที่นี่ครับ

ตัวอย่างหน้าตาการสอนเป็นประมาณนี้ครับ:

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

โหลด Jupyter Notebook ดูได้ที่นี่ครับ

หน้าตาจะเป็นประมาณนี้ครับ: