Category Archives: programming

วิทย์ม.ต้น: Perseverance Rover จอดที่ดาวอังคาร, หัดไพธอนต่อ

วันนี้เราคุยกันเรื่องเหล่านี้ครับ:

1. ข่าวการลงจอดที่ดาวอังคารโดยยานเพอร์เซเวอแรนซ์ (Perseverance Rover) หรือเพอร์ซี่ ข้อมูลประมาณดังในลิงก์และคลิปเหล่านี้ครับ:

ภาพแรกสุดจากยานสำรวจ Perseverance หลังจากที่ได้ลงจอดบนพื้นผิวของดาวอังคาร เวลาประมาณตีสี่ของเช้าวันที่ 19 กุมภาพันธ์…

Posted by มติพล ตั้งมติธรรม on Thursday, February 18, 2021

2. เด็กรุ่นพี่หัดเขียนโปรแกรมไพธอนต่อ วันนี้เรียนรู้เรื่องการสุ่ม เรื่องพวกนี้: import random, random.randint(), random.choice(), random.random(), random.randrange()

การบ้านให้ไปศึกษา Turtle Graphics แล้วทำแบบฝึกหัด

3. เด็กรุ่นน้องเริ่มหัดเขียนโปรแกรมภาษาไพธอน โหลด Thonny มาใช้เขียนโปรแกรม วันนี้หัดเซฟไฟล์งาน โหลดไฟล์งาน หัดใช้ print(), input(), x = int(input(…)), เอาข้อความ (สตริง) ต่อกัน, หัดใช้ f-string, รู้จัก new line character (\n)

การบ้านให้ไปเขียนโปรแกรมให้ใส่เลขสองตัวแล้วคำนวณผลบวก/ลบ/คูณ/หาร/ยกกำลัง

วิทย์ม.ต้น: หัดไพธอน, เปรียบเทียบการตกลูกบอล

วันนี้เราคุยกันเรื่องพวกนี้ครับ:

1. รุ่นพี่ฝึกไพธอนกันต่อ เขียนโปรแกรมแก้ปัญหาเล็กๆหลายๆอัน มีเฉลยการบ้านจากสัปดาห์ที่แล้วให้เด็กๆไปค้นคว้าหาทางคำนวณด้วยเศษส่วน หน้าตาประมาณนี้ (โปรแกรมเบื้องต้น ไม่มี error handling เพื่อให้เข้าใจง่าย)

# เขียนโปรแกรมรับ เศษและส่วน ตัวที่ 1 และตัวที่ 2
# หาค่า +, -, *, / ของเศษส่วน 1 และ 2

from fractions import Fraction as frac

x1 = int(input("ใส่เศษตัวแรก: "))
x2 = int(input("ใส่ส่วนตัวแรก: "))

y1 = int(input("ใส่เศษตัวที่สอง: "))
y2 = int(input("ใส่ส่วนตัวที่สอง: "))
 
x = frac(x1,x2)
y = frac(y1,y2)

print(f"{x} + {y} = {x+y}")
print(f"{x} - {y} = {x-y}")
print(f"{x} * {y} = {x*y}")
print(f"{x} / {y} = {x/y}")

นอกจากนี้ผมแสดงให้เด็กๆดูว่าใช้ฟังก์ชั่น limit_denominator ในโมดูล fractions หาเศษส่วนมาประมาณค่าต่างๆอย่างไร เช่นอันนี้ประมาณค่าพาย = 3.141592653… ให้ใกล้เคียงที่สุดด้วยเศษส่วนที่ส่วนมีขนาดไม่เกิน 1, 10, 100, … ครับ:

# ประมาณค่าพายด้วยเศษส่วน

from fractions import Fraction as frac

#ค่าพาย 200 หลัก
my_pi = "3.14159265358979323846264338327950288419716939937510582097494459230781\
6406286208998628034825342117067982148086513282306647093844609550582231\
7253594081284811174502841027019385211055596446229489549303820"


for e in range(10):
    #print(frac(my_pi).limit_denominator(10 ** e))
    x = frac(my_pi).limit_denominator(10 ** e)
    print(f"ประมาณค่าพายเป็นเศษส่วน โดยส่วนไม่เกิน {10**e:,}: {x} ≈ {float(x)}")
    

ได้ผลลัพธ์หน้าตาแบบนี้:

ประมาณค่าพายเป็นเศษส่วน โดยส่วนไม่เกิน 1: 3 ≈ 3.0
ประมาณค่าพายเป็นเศษส่วน โดยส่วนไม่เกิน 10: 22/7 ≈ 3.142857142857143
ประมาณค่าพายเป็นเศษส่วน โดยส่วนไม่เกิน 100: 311/99 ≈ 3.1414141414141414
ประมาณค่าพายเป็นเศษส่วน โดยส่วนไม่เกิน 1,000: 355/113 ≈ 3.1415929203539825
ประมาณค่าพายเป็นเศษส่วน โดยส่วนไม่เกิน 10,000: 355/113 ≈ 3.1415929203539825
ประมาณค่าพายเป็นเศษส่วน โดยส่วนไม่เกิน 100,000: 312689/99532 ≈ 3.1415926536189365
ประมาณค่าพายเป็นเศษส่วน โดยส่วนไม่เกิน 1,000,000: 3126535/995207 ≈ 3.1415926535886505
ประมาณค่าพายเป็นเศษส่วน โดยส่วนไม่เกิน 10,000,000: 5419351/1725033 ≈ 3.1415926535898153
ประมาณค่าพายเป็นเศษส่วน โดยส่วนไม่เกิน 100,000,000: 245850922/78256779 ≈ 3.141592653589793
ประมาณค่าพายเป็นเศษส่วน โดยส่วนไม่เกิน 1,000,000,000: 2549491779/811528438 ≈ 3.141592653589793

แนะนำให้เด็กๆศึกษาตัวอย่างเรื่อง fractions ที่ https://www.tutorialspoint.com/fraction-module-in-python และเรื่อง f-string ที่ https://careerkarma.com/blog/python-f-string/ นะครับ

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

บรรยากาศตอนทดลองเป็นแบบนี้:

ให้เด็กๆสังเกตดูว่าลูกบอลต่างๆ (ลูกบอลยาง, ลูกบาส, ลูกปิงปอง, ลูกบอลโฟม) ตกลงพื้นเร็วเท่ากันไหม ลูกไหนตกเร็วหรือตกช้า…

Posted by Pongskorn Saipetch on Thursday, December 17, 2020

ผมเล่าให้เด็กๆฟังว่าเวลามีของตกจากที่สูง มันจะตกเร็วขึ้นเรื่อยๆเนื่องจากแรงดึงดูดของโลก แต่ขณะเดียวกันยิ่งมันตกเร็วเท่าไร แรงต้านอากาศก็จะเพิ่มขึ้นตาม ทำให้ของแต่ละอย่างตกลงมาด้วยความเร็วต่างกันขึ้นอยู่กับรูปร่างความสามารถในการแหวกอากาศและความหนาแน่นของมัน ความเร็วสูงสุดที่ของแต่ละชิ้นที่จะตกลงมาได้เรียกว่า Terminal Velocity สำหรับคนที่กระโดดมาจากเครื่องบินแต่ร่มไม่กางความเร็วสูงสุดจะประมาณ 200-300 กิโลเมตรต่อชั่วโมง (ขึ้นกับว่ากางแขนขาเพื่อต้านลมหรือเปล่า)  แม้ว่าความเร็วการตกจะเร็วแบบนั้น แต่ก็มีคนรอดชีวิตหลายคนด้วยความโชคดีต่างๆเช่นตกโดนต้นไม้อ่อน ตกโดนสายไฟ ตกลงน้ำ

ไฟล์วิดีโอต่างๆที่ถ่ายวันนี้โหลดได้ที่นี่เผื่อใครต้องการใช้ Tracker จับตำแหน่งการตกนะครับ

วิทย์ม.ต้น: ฝึกไพธอน, คลิปน่าสนใจ, Leidenfrost Effect, ฝึก Tracker

1. มีเฉลยการบ้านที่รุ่นพี่เอาไปทำสัปดาห์ที่แล้วครับ

โจทย์ 1: เขียนโปรแกรมรับค่าตัวเลขไปเรื่อยๆ ถ้าจะหยุดให้ใส่คำว่า END แล้วโปรแกรมจะคำนวณค่าเฉลี่ยของตัวเลขที่รับเข้าไป (ใช้ while และ list)

เฉลยแบบที่ 1: คำนวณค่าเฉลี่ยโดยบวกเอง และยังไม่มีการจัดการข้อยกเว้นต่างๆที่ทำให้โปรแกรมพังได้ (ยังไม่มี error handling)

#เขียนโปรแกรมรับค่าตัวเลขไปเรื่อยๆ ถ้าจะหยุดให้ใส่คำว่า END แล้วโปรแกรมจะคำนวณค่าเฉลี่ยของตัวเลขที่รับเข้าไป (ใช้ while และ list)
#พังได้หลายแบบมาก เช่นถ้าสิ่งที่พิมพ์เข้าไปไม่ใช่ตัวเลขและไม่ใช่คำว่า END
#เราจะเรียนรู้เรื่อง exception handling ต่อไป

numbers = []
x = input("ใส่ตัวเลขเข้ามา พิมพ์ END เพื่อหยุด: ")
while x != "END":
    numbers.append(float(x))
    x = input("ใส่ตัวเลขเข้ามา พิมพ์ END เพื่อหยุด: ")
    
print("ตัวเลขคือ ",numbers)
sum = 0
for x in numbers:
    sum = sum + x
average = sum / len(numbers)
print ("ค่าเฉลี่ยคือ", average)

เฉลยแบบที่ 2: คำนวณค่าเฉลี่ยโดยใช้ฟังก์ชั่น sum() ในไพธอน และยังไม่มีการจัดการข้อยกเว้นต่างๆที่ทำให้โปรแกรมพังได้ (ยังไม่มี error handling)

#เขียนโปรแกรมรับค่าตัวเลขไปเรื่อยๆ ถ้าจะหยุดให้ใส่คำว่า END แล้วโปรแกรมจะคำนวณค่าเฉลี่ยของตัวเลขที่รับเข้าไป (ใช้ while และ list)
#พังได้หลายแบบมาก เช่นถ้าสิ่งที่พิมพ์เข้าไปไม่ใช่ตัวเลขและไม่ใช่คำว่า END
#เราจะเรียนรู้เรื่อง exception handling ต่อไป

#ใช้ฟังก์ชั่น sum() ในไพธอน

numbers = []
x = input("ใส่ตัวเลขเข้ามา พิมพ์ END เพื่อหยุด: ")
while x != "END":
    numbers.append(float(x))
    x = input("ใส่ตัวเลขเข้ามา พิมพ์ END เพื่อหยุด: ")
    
average = sum(numbers) / len(numbers)

print ("ตัวเลขคือ ", numbers)
print ("ค่าเฉลี่ยคือ", average)

โจทย์ 2: เขียนโปรแกรมรับค่าตัวเลขไปเรื่อยๆ ถ้าจะหยุดให้ใส่คำว่า END แล้วโปรแกรมจะคำนวณค่าเฉลี่ยและค่าเบี่ยงเบนมาตรฐานของตัวเลขที่รับเข้าไป (ใช้ while และ list)

เฉลยแบบที่ 1: ใช้ฟังก์ชั่น sum() ในไพธอน คำนวณค่าเบี่ยงเบนมาตรฐานเอง, ไม่มี error handling

#เขียนโปรแกรมรับค่าตัวเลขไปเรื่อยๆ #
#ถ้าจะหยุดให้ใส่คำว่า END แล้วโปรแกรมจะคำนวณค่าเฉลี่ยและค่าเบี่ยงเบนมาตรฐานของตัวเลขที่รับเข้าไป (ใช้ while และ list)
#พังได้หลายแบบมาก เช่นถ้าสิ่งที่พิมพ์เข้าไปไม่ใช่ตัวเลขและไม่ใช่คำว่า END
#เราจะเรียนรู้เรื่อง exception handling ต่อไป

import math

numbers = []
x = input("ใส่ตัวเลขเข้ามา พิมพ์ END เพื่อหยุด: ")
while x != "END":
    numbers.append(float(x))
    x = input("ใส่ตัวเลขเข้ามา พิมพ์ END เพื่อหยุด: ")
    
average = sum(numbers) / len(numbers)

sum_sq = 0
for x in numbers:
    sum_sq = sum_sq + (x-average)**2


SD = math.sqrt(sum_sq / (len(numbers)-1))
print("ตัวเลขคือ", numbers)
print("ค่าเฉลี่ยคือ", average)
print("ค่าเบี่ยงเบนมาตรฐานคือ ",SD)

เฉลยแบบที่ 2: ใช้ฟังก์ชั่น mean() และ std() ใน numpy, ไม่มี error handling

#เขียนโปรแกรมรับค่าตัวเลขไปเรื่อยๆ #
#ถ้าจะหยุดให้ใส่คำว่า END แล้วโปรแกรมจะคำนวณค่าเฉลี่ยและค่าเบี่ยงเบนมาตรฐานของตัวเลขที่รับเข้าไป (ใช้ while และ list)
#พังได้หลายแบบมาก เช่นถ้าสิ่งที่พิมพ์เข้าไปไม่ใช่ตัวเลขและไม่ใช่คำว่า END
#เราจะเรียนรู้เรื่อง exception handling ต่อไป

#ใช้ฟังก์ชั่น mean(),std()  ใน numpy

import numpy as np

numbers = []
x = input("ใส่ตัวเลขเข้ามา พิมพ์ END เพื่อหยุด: ")
while x != "END":
    numbers.append(float(x))
    x = input("ใส่ตัวเลขเข้ามา พิมพ์ END เพื่อหยุด: ")
    
average = np.mean(numbers)
SD = np.std(numbers, ddof=1)


print("ตัวเลขคือ", numbers)
print("ค่าเฉลี่ยคือ", average)
print("ค่าเบี่ยงเบนมาตรฐานคือ ",SD)

2. โจทย์รุ่นพี่วันนี้คือเขียนโปรแกรมไพธอนเพื่อแก้ปัญหาเหล่านี้ ข้อที่ทำไม่เสร็จไปทำต่อเป็นการบ้าน:

-เขียนโปรแกรมรับค่าตัวเลขไปเรื่อยๆ ถ้าจะหยุดให้ใส่คำว่า END แล้วโปรแกรมจะคำนวณค่ามากที่สุด น้อยที่สุด (ใช้ while และ list)

-เขียนโปรแกรมรับจำนวนตัวเลขที่จะป้อน แล้วรับตัวเลขไปเรื่อยๆเท่ากับจำนวนครั้งนั้น  แล้วโปรแกรมจะคำนวณค่ามากที่สุด น้อยที่สุด (ใช้ for และ list)

-เขียนโปรแกรมรับจำนวนตัวเลขที่จะป้อน แล้วรับตัวเลขไปเรื่อยๆเท่ากับจำนวนนั้น  แล้วโปรแกรมจะเรียงลำดับตัวเลขเหล่านั้นจากมากไปน้อย (ใช้ for และ list)

-เขียนโปรแกรมรับจำนวนตัวเลขที่จะป้อน แล้วรับตัวเลขไปเรื่อยๆเท่ากับจำนวนนั้น  แล้วโปรแกรมจะเรียงลำดับตัวเลขเหล่านั้นจากน้อยไปมาก (ใช้ for และ list)

3. รุ่นน้องดูคลิปน่าสนใจต่างๆดังนี้:

กาวต่อท่อ PVC หมุนในน้ำ:

จรวดน้ำแข็งแห้ง (อันตรายบ้างถ้าหลบไม่ทัน):

ระเบิดไนโตรเจนเหลว (อันตราย):

เทไนโตรเจนเหลวบนมือแล้วเกิดอะไรขึ้น:

เดินบนไฟได้อย่างไร:

และการทดลอง(ที่อันตรายที่สุดถ้าพลาด) ดูว่าเอามือของเราไปจุ่มในตะกั่วเหลวร้อนๆได้หรือไม่ ถ้าได้ทำอย่างไร

ปรากฏว่าทำได้ครับถ้าตะกั่วเหลวนั้นร้อนมากๆ (ตะกั่วเริ่มเป็นของเหลวที่ประมาณ 330 องศาเซลเซียส ในการทดลองเขาต้มตะกั่วจนร้อนประมาณ 450 องศาเซลเซียส) แล้วเอามือจุ่มน้ำให้เปียก แล้วจุ่มลงไปในตะกั่วแป๊บเดียวแล้วดึงออก (ถ้าตะกั่วไม่ร้อนมากพอ เวลาเอามือไปจุ่ม ตะกั่วจะเย็นลงพอเพียงที่จะเป็นของแข็งแล้วติดนิ้วขึ้นมาทำให้เป็นอันตราย)

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

ปรากฏการณ์นี้เป็นเรื่องเดียวกับเวลาเราหยดน้ำไปบนกระทะร้อนๆแล้วหยดน้ำลอยอยู่บนกระทะได้นานๆ เราจะสังเกตได้ว่าเวลากระทะร้อนแต่ยังไม่ร้อนมากพอ เมื่อเราหยดน้ำลงไปน้ำจะฟู่ๆแล้วระเหยหายไปอย่างรวดเร็ว นี่เป็นเพราะความร้อนจากกระทะทำให้หยดน้ำส่วนที่ติดกับกระทะร้อนกลายเป็นไอ แต่เมื่อกระทะร้อนขึ้นมากๆ ไอน้ำที่เกิดขึ้นจะเกิดขึ้นเร็วพอและมากพอที่จะกลายเป็นชั้นไอน้ำรองรับหยดน้ำให้ลอยอยู่เหนือกระทะนานๆเนื่องจากชั้นไอน้ำนำความร้อนได้ช้ากว่าเวลาหยดน้ำติดกับกระทะตรงๆ ปรากฏการณ์นี้เรียกว่า “ปรากฏการณ์ลีเดนฟรอสท์” (Leidenfrost Effect)

4. รุ่นน้องหัดใช้ Tracker ต่อ โดยทำตามวิธีในคลิปนี้ คราวนี้หัดใช้ Auto Tracker ติดตามภาพวัตถุที่สนใจครับ:

เด็กๆสามารถโหลดไฟล์วิดีโอการทดลองต่างๆไปหัดใช้กับ Tracker ได้จากลิงก์นี้ครับ