Category Archives: มัธยม

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

ผมให้เด็กม.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 ดูได้ที่นี่ครับ

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

วิทย์ม.ต้น: Conjunction Fallacy, ประมาณปริมาตรลมด้วยเครื่องวัดความเร็วลม (Anemometer)

วันนี้เด็กๆเรียนเรื่อง The deception of specific cases (conjunction fallacy) จากหนังสือ The Art of Thinking Clearly โดยคุณ Rolf Dobelli ให้ระวังธรรมชาติของเราที่ชอบฟังเรื่องราวที่มีรายละเอียดเข้ากันได้กับอคติต่างๆของเรา และเรามักคิดว่าเรื่องราวเหล่านั้นมีโอกาสเป็นไปได้มากกว่าความเป็นจริง เวลาตัดสินใจอะไรที่สำคัญให้ป้องกันตัวจากความคิดแบบนี้ด้วย

ผมเล่าเรื่องงานวิจัยให้เด็กๆฟังเรื่องเวลาขอให้ใครทำอะไรถ้าใส่เหตุผลบางอย่างเข้าไปด้วยทำให้มีโอกาสขอสำเร็จมากขึ้นด้วย ทั้งๆที่บางครั้ง “เหตุผล” ไม่ได้เข้าท่าเลย อ่านสรุปได้ที่นี่ครับ: The Power of the Word “Because” To Get People To Do Stuff

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

นอกจากนี้ ผมเสนอเด็กๆว่าถ้าเรารู้ว่าความเร็วลมเป็นเท่าไรที่เวลาต่างๆ เราอาจเอามาวาดกราฟ ความเร็ว vs. เวลา แล้วหาความยาวของเส้นลมที่วิ่งผ่านเครื่องวัดโดยการหาพื้นที่ใต้กราฟนั้นโดยการแบ่งพื้นที่ใต้กราฟเป็นสี่เหลี่ยมคางหมูหลายๆอันแล้วบวกกัน เราทำอย่างนั้นโดยถ่ายวิดีโอการเป่าอากาศ เอาคลิปวิดีโอเข้าโปรแกรม Tracker แล้วขยับดูไปทีละเฟรม แล้วเปลี่ยนเฟรมเป็นเวลา เอาค่าความเร็วที่เวลาต่างๆใส่เข้า Excel แล้วหาพื้นที่ใต้กราฟครับ:

ภาพบรรยากาศกิจกรรมอยู่ที่นี่นะครับ

วิทย์ม.ต้น: เขียนโปรแกรม ไพธอนแปลงข้อความและเกมทายตัวเลข

ผมให้เด็กๆม.2-3 ไปพยายามเขียนโปรแกรมแปลงข้อความแบบในรูปนี้ครับ:

เด็กบางคนทำได้ บางคนยังติดอยู่ ผมจะเขียนทีละขั้นตอนให้เด็กๆดู ค่อยๆเพิ่มความสามารถโปรแกรมทีละนิดๆ และตรวจเช็คการทำงานแต่ละขั้นตอน เด็กๆได้เรียนรู้เรื่องสตริงที่ไม่สามารถเปลี่ยนแปลงได้ในไพธอน รู้จักการเก็บข้อมูลไว้ในลิสต์แล้วเปลี่ยนเป็นสตริงภายหลัง รู้จักใช้ดิกชันนารีในไพธอนเก็บข้อมูล รู้จัก .maketrans(…) และ .translate(…) ที่สตริงแต่ละตัวสามารถใช้ได้ ดู Jupyter Notebook ที่บันทึกการเรียนที่นี่นะครับ

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

วิธีที่นี้ใช้ if หลายๆอันตรงๆเลย
วิธีนี้ใช้ดิกชันนารีชื่อ translate เป็นตัวเก็บว่าอักษรอะไรเปลี่ยนเป็นอะไร ใช้ if i in translate ดูก่อนว่าตัวอักษรที่จะเปลี่ยนมีอยู่ใน translate
วิธีนี้ใช้ฟังก์ชั่นของสตริงในไพธอนชื่อ .maketrans และ .translate

สำหรับเด็กม.1 เด็กๆได้เรียนรู้เรื่องตัวแปร การเก็บข้อมูลจากผู้ใช้ด้วย input(…) การทำงานตามเงื่อนไขด้วย if … else การทำงานซ้ำๆด้วย for … in และ while(…) การสุ่มตัวเลขด้วย random.randint(…) แล้วหัดทำเกมทายตัวเลขกันครับ

เด็กๆเห็นว่าในการเดาเลขตั้งแต่ 1 ถึง 100 เราสามารถเดาไม่เกิน 7 ครั้งก็ถูกถ้าเราแบ่งครึ่งช่วงการเดาโดยเดาไปตรงกลางของช่วงที่เป็นไปได้ของตัวเลขเสมอ เพราะช่วงที่เป็นไปได้จะมีขนาดเล็กลงเรื่อยๆจาก 100, 50, 25, 13, 7, 4, 2, 1

ถ้าเดาตั้งแต่ 1 ถึง 1,000 ก็เดาไม่เกิน 7 ครั้งเพราะช่วงที่เป็นไปได้จะมีขนาดเล็กลง จาก 1000, 500, 250, 125, 63, 32, 16, 8, 4, 2, 1

ถ้าเดาตั้งแต่ 1 ถึง 2**n ก็เดาไม่เกิน n ครั้ง เพราะช่วงที่เป็นไปได้จะมีขนาดเล็กลงจาก 2**n, 2**(n-1), 2**(n-2), 2**(n-3), … , 8, 4, 2, 1

เมื่อลองคำนวณขนาด 2**i โดยให้ i เป็น 0 ถึง 30 จะเห็นว่า 2**10 มีค่าประมาณหนึ่งพัน 2**20 มีค่าประมาณ หนึ่งล้าน และ2**30 มีค่าประมาณ พันล้าน

ดู Jupyter Notebook ที่บันทึกการเรียนที่นี่นะครับ

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

เราสามารถทายตัวเลข 1 ในล้านตัวได้ภายใน 20 ครั้ง ถ้าเราแบ่งครึ่งช่วงที่ตัวเลขอยู่ข้างในให้เล็กลงครึ่งหนึ่งทุกครั้งที่ทาย