Category Archives: programming

วิทย์ม.ต้น: เขียนโปรแกรมสร้างโจทย์ตัวอักษร

สัปดาห์นี้เด็กๆม.1-3 หัดเขียนโปรแกรมไพธอนเพื่อสร้างโจทย์ตัวอักษร (ต่อเนื่องมาจากสัปดาห์ที่แล้วที่เขียนโปรแกรมไล่แทนค่าตัวอักษรเพื่อแก้โจทย์ทำนองนี้)

(โค้ดต่างๆแบบ Jupyter notebookโหลดได้ที่นี่ หรือดูออนไลน์ได้ที่นี่นะครับ)

เด็กๆพยายามแทนค่าตัวเลขแต่ละตัวด้วยตัวอักษร บางคนใช้ดิกชันนารี บางคนใช้สตริง วิธีที่ตรงไปตรงมาที่สุดอาจเป็นประมาณนี้สำหรับเด็กๆที่รู้จัก list comprehension แล้ว (ถ้าอยากรู้เรื่องไปดูที่ Comprehending Python’s Comprehensions หรือดูที่ส่วน “การสร้างลิสต์จาก for” ที่หน้านี้ นะครับ)

ถ้าไม่รู้จัก list-comprehension ก็ใช้ for loop ได้ประมาณนี้:

พอแปลงเลขเป็นตัวอักษรได้ ก็ใส่ตัวตั้งสองตัว x, y แล้วให้คอมพิวเตอร์คำนวณค่า x+y, x-y, x*y, x/y แล้วแปลงทั้งหมดเป็นตัวอักษร A-J แทนเลข 0-1 โดยระวังว่าถ้าผลลัพธ์มีตัวเลขที่ไม่มีอยู่ในพวกตัวตั้ง x, y เราจะต้องไม่แทนค่าตัวเลขด้วยตัวอักษร

เพื่อไม่ให้เดาคำตอบได้ง่ายเกินไป เราไม่ควรแทน 0 ด้วย A, 1 ด้วย B, …, 9 ด้วย J เสมอ เราจึงอาจสลับอักษร A-J ให้เป็นลำดับอื่นก่อนแทนค่า เราสามารถทำได้ด้วย random.shuffle( ) แล้วแทนค่าด้วย translate( ) ประมาณนี้:

หน้าตาฟังก์ชั่นสร้างโจทย์ตัวอักษรก็อาจมีหน้าตาประมาณนี้:

หน้าตาโจทย์ที่ได้ก็จะเป็นประมาณนี้:

สำหรับเด็กม. 1 ผมเอาภาพคอมพิวเตอร์ยุคแรกๆเช่น ENIAC ว่าเมื่อก่อนเขาโปรแกรมกันอย่างไร, ภาพเครื่องคำนวณสมัยกรีกโบราณ และภาพคุณ Katherine Johnson ที่เป็นนักคณิตศาสตร์ทำงานให้ NASA ที่เด็กๆรู้จักจากภาพยนต์เรื่อง Hidden Figures มาให้ดูด้วยครับ

คอมพิวเตอร์อิเล็กทรอนิกส์เครื่องแรกๆของโลกชื่อ ENIAC ครับ ใหญ่เต็มห้องเลย
ENIAC in Philadelphia, Pennsylvania. Glen Beck (background) and Betty Snyder (foreground) program the ENIAC in building 328 at the Ballistic Research Laboratory ภาพจาก U.S. Army Photo [Public domain]
เครื่องจักรคำนวณสมัยกรีกโบราณ เรียกว่า Antikythera mechanism เป็นฟันเฟืองต่อกันอยู่ พอหมุนๆแล้วคำนวณตำแหน่งดวงดาว เทศกาลโอลิมปิก สุริยุปราคา ฯลฯ ได้ครับ อายุประมาณ 2,000 ปี
คุณ Katherine Johnson ครับ
Katherine G. Johnson Computational Research Facility ribbon-cutting ceremony in the Reid Conference Center. Honored guests include Katherine G. Johnson and members of her family, Mayor Donnie Tuck, Senator Warner and Governor McAuliffe. Margot Lee Shetterly, author of “Hidden Figures,”

วิทย์ม.ต้น: หัดแก้และสร้างโจทย์ตัวอักษรแทนตัวเลขด้วยไพธอนกัน

วิทย์โปรแกรมมิ่งของม.2-3 เริ่มด้วยเฉลยการบ้านวาดกราฟด้วย PyPlot ที่เด็กๆไปหัดใช้กันมา มีการดูรูปกราฟว่าตัดแกน x แถวๆไหนแล้วใช้ bisection method หาค่า x ที่ละเอียดขึ้น:

มีการสร้างลิสต์ค่า x อย่างระมัดระวังไม่ให้เกิดการหารด้วยศูนย์ขึ้น:

กิจกรรมใหม่วันนี้ได้แรงบันดาลใจจากกระทู้พันทิพเรื่องการบ้านเด็กป.4 https://pantip.com/topic/39141834 ที่ถามว่าถ้า A-H เป็นตัวเลขโดดๆไม่ซ้ำกันและ AFBF + CGHB + DAFG +AEAB = BCDC ให้หาค่าว่า A-H มีค่าอะไรบ้าง เด็กๆ ม.1-3 เลยจะทดลองแก้และสร้างปัญหาตระกูลนี้กันด้วยคอมพิวเตอร์

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

ม.2-3 จะใช้ list comprehension ที่เคยใช้ไปในการบ้าน PyPlot ส่วนม.1 จะใช้ for loop กัน เด็กๆทั้งสองกลุ่มได้เห็นการใช้ len(set(x)) == len(x) ว่าลิสต์ x มีสมาชิกซ้ำกันหรือไม่ (อ่านเกี่ยวกับ set ได้ที่ Sets in Python หรือที่ ภาษา python เบื้องต้น บทที่ ๑๓: เซ็ต)

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

Jupyter notebook ของ ม.2-3 โหลดได้ที่นี่ หรือดูออนไลน์ได้ที่นี่

Jupyter notebook ของ ม.1 โหลดได้ที่นี่ หรือดูออนไลน์ได้ที่นี่

Jupyter notebook ไล่แก้ปัญหา AFBF + CGHB + DAFG +AEAB = BCDC โหลดได้ที่นี่ หรือดูออนไลน์ได้ที่นี่

วิทย์ม.ต้น: รู้จัก List Comprehension ในไพธอน, ใช้ Pyplot วาดกราฟ, หัดใช้ Command Line ต่อ

วิทย์โปรแกรมมิ่งของม.2-3 สัปดาห์นี้ เราเริ่มด้วยการใช้ bisection method เฉลยการบ้านสัปดาห์ที่แล้วครับ การบ้านคือ

ถ้าเรามีเวลาออมเงิน 20, 30, 40 ปี,

  1. ถ้าผลตอบแทน = 0.08 (8%) ต่อปี และเราออมปีละ 100,000 บาท เราจะมีเงินตอนท้ายเท่าไร
  2. ถ้าเราต้องการเงินตอนท้ายเท่ากับ 40,000,000 และออมเงินปีละ 120,000 เราต้องหาผลตอบแทนเท่าไร
  3. ถ้าเราต้องการเงินตอนท้ายเท่ากับ 40,000,000 และได้ผลตอบแทนปีละ 10% เราต้องออมเงินปีละเท่าไร

ข้อ 1 ตรงไปตรงมา หาจาก future value ของเงินที่ลงทุนไปทุกๆปีรวมกัน

สำหรับข้อ 2 และ 3 วิธีแก้สมการก็คือสร้างฟังก์ชั่นที่รับตัวแปรที่เราต้องการหา กำหนดฟังก์ชั่นให้มันเป็นศูนย์ถ้าตัวแปรของเราแก้โจทย์ที่ต้องการ แล้วก็ป้อนฟังก์ชั่นไปให้ bisection method หาคำตอบให้ครับ

หน้าตาประมาณนี้:

จากนั้นเด็กๆรู้จักกับ list comprehension ซึ่งเป็นวิธีสร้างลิสต์ที่ง่ายและเร็วครับ ควรไปอ่านและทดลองเพื่อความเข้าใจเพิ่มเติมที่ Comprehending Python’s Comprehensions หรือดูที่ส่วน “การสร้างลิสต์จาก for” ที่หน้านี้ นะครับ

เด็กๆรู้จัก list comprehension เพื่อไปป้อนให้ PyPlot วาดกราฟให้ครับ ศึกษา PyPlot ได้โดยพิมพ์ตามตัวอย่างใน Pyplot Tutorial แต่ถ้าใช้ Jupyter notebook อย่าลืมพิมพ์

%matplotlib inline
import matplotlib.pyplot as plt

ก่อนเริ่มใช้ PyPlot เพื่อเรียกใช้ฟังก์ชั่นการวาดรูปกราฟต่างๆใน matplotlib และจะได้วาดกราฟใน Jupyter notebook ไว้ด้วยกันกับโค้ดโปรแกรมครับ

หน้าตาการวาดกราฟก็อาจเป็นประมาณนี้:

เราวาดกราฟเพื่อดูหน้าตาความสัมพันธ์ต่างๆที่เราสนใจ เช่นกราฟมันตัดแกน x แกน y ที่ไหนบ้าง เพิ่มขึ้นลดลงอย่างไร ฯลฯ

สามารถดาวน์โหลด Jupyter Notebook ที่มีโค้ดต่างๆไปลองเล่นได้ที่นี่นะครับ หรือจะดูออนไลน์ที่ https://nbviewer.jupyter.org/url/witpoko.com/wp-content/uploads/2019/08/2019-08-16_G8-9.ipynb ก็ได้

สำหรับม.1 เด็กๆก็นั่งทำแบบฝึกหัดพิมพ์โปรแกรมแล้ว run บน command line แบบ python program.py arg1 arg2 ต่อไปครับ