Category Archives: programming

วิทย์ม.ต้น: ฝึกไพธอน, คลิปน่าสนใจ, 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 ได้จากลิงก์นี้ครับ

วิทย์ม.ต้น: หัดไพธอน (Lists, permutations), หัดใช้ TRACKER

1. คลาสรุ่นพี่ เรียน Python จากหนังสือฟรีบนเว็บชื่อ Automate the Boring Stuff with Python โดยเขียนโปรแกรมใน Mu-Editor เราคุยกันเรื่อง Lists และ ทดลองเรื่องต่างๆเกี่ยวกับ list เช่น len, การ index, append, pop, การเอา list มารวมกัน, sort, การเปลี่ยน list เป็น tuple และ set และเปลี่ยนกลับ, การใช้ in และ not in, การใช้ count, join, split

2. เฉลยการบ้านสัปดาห์ที่แล้ว:

def convert_C_to_F(c):
    "แปลงอุณหภูมิ c เซลเซียสเป็นฟาเรนไฮต์"
    return c*9/5+32

def convert_F_to_C(f):
    "แปลงอุณหภูมิ f ฟาเรนไฮต์เป็นเซลเซียส"
    return (f-32)*5/9
    
def GCD(a,b):
    "หา ห.ร.ม. ของ a และ b"
    #Euclid GCD algorithm
    while(a != b):
        if b > a:
            a, b = b, a

        a, b = a-b, b

    return(a)

3. แนะนำให้เด็กๆรู้จัก itertools.permutations มาลองหาความน่าจะเป็นที่เลขเจ็ดหลักที่มีเลข 1-7 ครบทุกตัวสามารถหารด้วย 11 ลงตัว (มีวิธีทำด้วยมือที่แสดงว่าความน่าจะเป็น = 4/35)

#ดูว่าเลข 7 หลักที่เอาเลข 1,2,3..,7 มาเรียงกันแบบไม่ซ้ำกัน
#จะหารด้วย 11 ลงตัวกี่ตัว
#มีวิธีทำด้วยมือที่แสดงว่าความน่าจะเป็นที่จะหารด้วย 11 ลงตัว
#เท่ากับ 4/35

import itertools

digits = []
for d in range(1,8):
    digits.append(str(d))

total = 0
divisible = 0

for i in itertools.permutations(digits):
    total = total + 1
    #print(i)
    number = int("".join(i))
    #print(i, number)
    if number % 11 == 0:
        print(number)
        divisible = divisible + 1

print("Total numbers: " + str(total))
print("Divisible by 11: " + str(divisible))


4. การบ้านสัปดาห์นี้คือไปอ่านบทต่อไปเรื่อง Dictionaries

5. คลาสรุ่นน้องหัดใช้โปรแกรม Tracker โดยดาวน์โหลดและติดตั้งจาก https://physlets.org/tracker/ เราถ่ายวิดีโอการตกของลูกบาสแล้วให้ Tracker บันทึกตำแหน่งดู วิธีใช้ก็เหมือนๆกับที่ผมบันทึกไว้ที่คลิปนี้ครับ:

วิดีโอและไฟล์ .trk ดาวน์โหลดได้ที่นี่ครับ

วิทย์ม.ต้น: หัดไพธอน (Functions), รู้จัก Tracker, ดูลูกตุ้มทราย, หัด Scratch (วาด Lissajous Figures)

1. คลาสรุ่นพี่ เรียน Python จากหนังสือฟรีบนเว็บชื่อ Automate the Boring Stuff with Python โดยเขียนโปรแกรมใน Mu-Editor เราคุยกันเรื่อง Functions และหัดเขียนฟังก์ชั่นง่ายๆในชั้นเรียนกัน เช่น:

def add(a,b):
    "บวก a และ b เข้าด้วยกัน"
    return a+b
    
def หารลงตัว(a,b):
    "เช็คว่า a หารด้วย b ลงตัวหรือไม่"
    if a % b == 0:
        return True
    else:
        return False
    
def number_of_digits(x):
    "บอกว่าเลขจำนวนเต็มบวก x มีกี่หลัก"
    xstr = str(x)
    return len(xstr)
    
def contain_digit(a,b):
    "ดูว่ามีเลขโดด b ในจำนวนเต็มบวก a หรือไม่"
    astr = str(a)
    bstr = str(b)
    return bstr in astr
    
def contain_digit_1(a,b):
    "ดูว่ามีเลขโดด b ในจำนวนเต็มบวก a หรือไม่"
    return str(b) in str(a)
    
def contain_1_to_n(a):
    "a เป็นจำนวนเต็ม n หลัก, เช็คว่า a มีเลขโดด 1, 2, 3,..., n ครบหรือไม่"
    num_digits = number_of_digits(a)
    for digit in range(1,num_digits+1):
        #print("digit = " + str(digit))
        if not contain_digit(a,digit):
            return False
            
    return True

2. การบ้านรุ่นพี่คือไปอ่านบทที่ 4 เรื่อง Lists ในหนังสือ Automate the Boring Stuff with Python และ เขียนฟังก์ชั่นเหล่านี้ให้ทำงานได้ถูกต้อง:

def convert_C_to_F(c):
    "แปลงอุณหภูมิ c เซลเซียสเป็นฟาเรนไฮต์"
    pass
def convert_F_to_C(f):
    "แปลงอุณหภูมิ f ฟาเรนไฮต์เป็นเซลเซียส"
    pass
    
def GCD(a,b):
    "หา ห.ร.ม. ของ a และ b"
    #Euclid GCD algorithm
    pass

3. คลาสรุ่นน้องได้เห็นว่ามีโปรแกรมชื่อ Tracker (https://physlets.org/tracker/) ที่สามารถใช้วัดการเคลื่อนที่ต่างๆจากวิดีโอได้ เช่นวันนี้เอาคลิปลูกแก้ววิ่งเป็นวงกลมในกาละมังจากการเล่นวันพุธมาดูกัน จะเห็นว่าการเคลื่อนที่ในแนวตั้ง (แกน y) และแนวนอน (แกน x) จะเป็นคลื่น (พวก sine, cosine):

4. ได้ดูลูกตุ้มทรายแกว่ง และรู้จัก Lissajous Figures

5. ดูตัวอย่าง Scratch ว่าวาดรูปพวก Lissajous Figures อย่างไร แล้วดัดแปลงทดลองเอง:

6. เด็กๆดูคลิป Moire Pattern และหาใน Scratch ว่าทำอย่างไร: