แบบฝึกหัด: ตัวแปร และฟังก์ชัน#
ข้อ 1 - 6 เป็นโจทย์ทบทวนแพตเทิร์นการเขียนโปรแกรมที่เพิ่งเรียนมา
ข้อ 7 - 13 เป็นโจทย์ปัญหาการเขียนโปรแกรมที่รวมการใช้เทคนิคทั้งหมด
โจทย์ทบทวนแพตเทิร์นการเขียนโปรแกรม#
ข้อ 1 - print
#
เขียนฟังก์ชันที่ชื่อว่า greet
ที่แสดงผลข้อความว่า “สวัสดีชาวโลก”
### เขียนฟังก์ชันที่นี่
ข้อ 2 - input
vs พารามิเตอร์#
เขียนฟังก์ชันที่ชื่อว่า add
ที่รับพารามิเตอร์สองตัว และคืนค่า (return
) เป็นผลรวมของสองค่าที่ได้รับมา
สังเกตว่าโจทย์ข้อนี้เราจะไม่ใช้ input
เพราะจะส่งค่าให้ฟังก์ชันผ่านพารามิเตอร์
### เขียนฟังก์ชันที่นี่
ข้อ 3 - ฟังก์ชันแบบมีพารามิเตอร์#
จงหาปริมาตรของกล่องที่มีความกว้าง 3 ซม. ยาว 7 ซม. และ สูง 9 ซม. โดยสร้างฟังก์ชันที่ชื่อว่า cuboid
ที่รับอาร์กิวเมนต์สามตัว (คำตอบคือ 189)
จากนั้นคำนวณปริมาตรของกล่องที่มีความกว้าง 5.5 ซม. ยาว 6 ซม. และ สูง 8 ซม. โดยเปลี่ยนค่าอาร์กิวเมนต์ (คำตอบคือ 264.0)
จากนั้นคำนวณผลรวมของปริมาตรของทั้งสองกล่อง
def cuboid(width, length, height):
### เขียนฟังก์ชันที่นี่
return 0
ข้อ 4 - print
vs return
#
จงเขียนฟังก์ชัน show_work_cuboid
ที่รับอาร์กิวเมนต์สามตัว คือความกว้าง ความยาว และความสูง โดยกำหนดให้ฟังก์ชันนี้
ไม่ต้องคืนค่าอะไรเลย
แสดงวิธีการคิดปริมาตรโดยการ
print
เช่น
>>> show_work_cuboid(2,3,4)
ความกว้าง
2
ความยาว
3
ความสูง
4
ปริมาตร
24
def show_work_cuboid(width, length, height):
### เขียนฟังก์ชันที่นี่
pass
ข้อ 5 - การอัพเดทตัวแปรในการวนซ้ำ (1)#
จงเขียนฟังก์ชันหาผลรวมตั้งแต่ 1 ถึง n เช่น
cumulative_sum(3)
= 1 + 2 + 3 = 6
cumulative_sum(5)
= 1 + 2 + 3 + 4 + 5 = 15
def cumulative_sum(n):
### เขียนฟังก์ชันที่นี่
return 0
ข้อ 6 - การอัพเดทตัวแปรในการวนซ้ำ (2)#
จงสร้างฟังก์ชันที่คำนวณแฟกทอเรียล n (\(n!\))
\(n! = 1 \times 2 \times \cdots \times n\)
fact(5)
= 1 x 2 x 3 x 4 x 5 = 120
def fact(n):
### เขียนฟังก์ชันที่นี่
return 0
โจทย์ปัญหาการเขียนโปรแกรม#
ข้อ 7 - หารสองกี่ครั้ง#
ข้อ 7.1#
จงสร้างฟังก์ชันที่รับจำนวนเต็ม 1 ตัว แล้วคืนคำตอบว่าจำนวนที่ได้รับมานั้นหาร 2 ได้กี่ครั้งค่าถึงจะกลายเป็น 1
divide_two(16)
>>>4
divide_two(4)
>>>2
โบนัส: ลองเพิ่มเงื่อนไข if
ที่จับอินพุตที่หารสองเท่าไรก็ไม่ได้ 1 (หารแล้วกลายเป็นค่าที่น้อยกว่า 1) จากนั้น print
บอกว่าอินพุตไม่ใช่เลขฐาน 2
def divide_two(n):
### เขียนฟังก์ชันที่นี่
return 0
ข้อ 7.2 ลอการิทึม#
เราสามารถใช้ฟังก์ชัน log
ทางคณิตศาสตร์ในการช่วยคำนวณข้อ 7.1 ได้ โดยที่เมื่อ
\(\log_2(x)\) = จำนวนครั้งที่ใช้ 2 หาร \(x\) ไปเรื่อย ๆ จนได้ 1
ในข้อนี้ ให้ลองใช้ฟังก์ชัน log2
(อยู่ใน module math
) ในการทำโจทย์จากข้อ 7.1
### เขียนโค้ดที่นี่
ข้อ 8 - แปลงเวลา#
เขียนฟังก์ชันในการแปลงวัน ชั่วโมง นาที เป็นวินาที
เช่น 2 วัน 5 ชั่วโมง 10 นาที เท่ากับ 191,400 วินาที
3 วัน 5 นาที เท่ากับ 259,500 วินาที
ให้ตั้งชื่อฟังก์ชันและอาร์กิวเมนต์เอง
### เขียนโค้ดที่นี่
ข้อ 9 - ไซส์เสื้อ#
เขียนโปรแกรมที่บอกว่าผู้ใช้ควรจะใส่เสื้อไซส์อะไรถ้าดูจากรอบเอว เราต้องการแปลงรอบเอวเป็นไซส์ตามตารางข้างล่างนี้
Size |
รอบเอว (เซนติเมตร) |
---|---|
S |
< 76 |
M |
76 - 84 |
L |
> 84 |
โปรแกรมจะต้องมีลักษณะดังนี้
อินพุต: รอบเอว หน่วยเป็นนิ้ว (เพราะฉะนั้นจะต้องแปลงก่อน 1 นิ้ว = 2.54 เซนติเมตร)
เอาท์พุต: สตริงที่บอกไซส์ที่เหมาะสม
def recommend_size(waist_size_in_inch):
### เขียนฟังก์ชันที่นี่
return ''
ข้อ 10 - โควิด#
สมมติว่าผู้ป่วยโควิด 19 หนึ่งคนจะมีทำให้มีผู้ติดเชื้อมากขึ้น 3 คนต่อวัน
เพราะฉะนั้นถ้าวันที่ 1 มีผู้ป่วย 5 คน
วันที่สองจะมีผู้ป่วยเพิ่มขึ้น 5 x 3 = 15 คน รวมแล้วมีจำนวนผู้ป่วย 5 + 15 = 20 คน
วันที่สามจะมีผู้ป่วยเพิ่มขึ้น 20 x 3 = 60 คน รวมแล้วมีจำนวนผู้ป่วย 20 + 60 = 80 คน
วันที่สี่จะมีผู้ป่วย 80 x 3 = 240 คน รวมแล้วมีจำนวนผู้ป่วย 80 + 240 = 320 คน
เขียนโปรแกรมที่ print จำนวนผู้ป่วยในแต่ละวันโดยที่โปรแกรมจะมีลักษณะดังนี้
อินพุต:
จำนวนผู้ป่วยตั้งต้น (วันที่ 0)
จำนวนวันที่ต้องการ print
เอาท์พุต: จำนวนผู้ป่วยในวันสุดท้าย
โปรแกรมจะต้อง print
จำนวนผู้ป่วยในแต่ละวันอีกด้วย
def compute_patients(num_initial_patients, num_days):
"""
>>> compute_patients(5, 3) # จำนวนผู้ป่วยตั้งต้น 5 คน ต้องการคำนวณ 3 วัน
Day 1: 20 patients
Day 2: 80 patients
Day 3: 320 patients
320
>>> compute_patients(10, 2) # จำนวนผู้ป่วยตั้งต้น 10 คน ต้องการคำนวณ 2 วัน
Day 1: 30 patients
Day 2: 160 patients
160
"""
return 0
ข้อ 11 - วัคซีน#
วัคซีน COVID-19 แต่ละชนิดสามารถสร้างภูมิคุ้มกันได้แตกต่างกันขึ้นอยู่กับสภาพบุคคล ซึ่งเมื่อหลังจากฉีดวัคซีนแล้ว 7 วัน คนเราจะมีภูมิคุ้มกันสูงที่สุด (สูงที่สุดไม่เกิน 500 หน่วย) แต่ว่าปริมาณภูมิคุ้มกันสูงสุดก็แตกต่างกันไป ขึ้นอยู่กับสภาพร่างกายของแต่ละคนและชนิดของวัคซีนที่ได้รับ หลังจากร่างกายเรามีภูมิคุ้มกันสูงที่สุดแล้ว ปริมาณภูมิคุ้มกันในร่างกายก็จะลดลงเรื่อยๆ โดยปริมาณภูมิคุ้มกันในวันถัดไป จะเป็น 𝛂 เท่า (อ่านว่า alpha, อัลฟ่า) ของปริมาณภูมิคุ้มกันในวันนี้ โดยที่ค่า 𝛂 ขึ้นอยู่กับสภาพร่างกายของแต่ละคน หากคนเรามีปริมาณภูมิคุ้มกันต่ำกว่า 40 หน่วย จะถือว่าไม่มีภูมิต้านทานโรค COVID-19
ตัวอย่าง
คุณยายเอ๋ อายุ 75 ปี มีโรคประจำตัวเป็นโรคเบาหวาน มีค่า 𝛂 เป็น 0.60
หลังจากรับวัคซีนไปแล้ว 7 วัน คุณยายเอ๋มีภูมิคุ้มกันสูงสุดที่ 350 หน่วย
วันถัดไป (วันที่ 8 หลังจากรับวัคซีน) คุณยายเอ๋จะมีภูมิคุ้มกันอยู่ที่ 0.60 * 350 = 210 หน่วย
วันที่ 9 จะมีภูมิคุ้มกันอยู่ 0.60 * 210 = 126 หน่วย
ข้อ 11.1 จำนวนวันที่มีภูมิ#
จงเขียนฟังก์ชัน days_to_hazard
ซึ่งรับพารามิเตอร์ 2 ตัว ได้แก่
ปริมาณภูมิคุ้มกันสูงสุด ณ วันที่ 7 หลังจากฉีดวัคซีน
ค่า 𝛂
แล้วให้ฟังก์ชันนี้คืนค่าเป็นจำนวนวันว่าคนๆ นี้มีภูมิต้านทานโรค COVID-19 ได้อยู่กี่วันหลังจากฉีดวัคซีน (ไม่นับวันที่มีปริมาณภูมิคุ้มกันต่ำกว่า 40 หน่วย)
ตัวอย่าง
>>> days_to_hazard(400, 0.80) # ปริมาณภูมิคุ้มกันสูงสุด 400 หน่วย, 𝛂 = 0.80
17
>>> days_to_hazard(200, 0.5) # ปริมาณภูมิคุ้มกันสูงสุด 200 หน่วย, 𝛂 = 0.5
9
def days_to_hazard(max_immunity, alpha):
### เขียนฟังก์ชันที่นี่
return 0
ข้อ 11.2 จุดอันตราย#
เขียนโปรแกรมโดยใช้ฟังก์ชัน days_to_hazard
เพื่อตรวจสอบว่า ระหว่างคุณยายเอ๋ในตัวอย่าง กับนายโจ้ อายุ 22 ปี ผู้ซึ่งเป็นโรคอ้วน มีค่า 𝛂 = 0.75 และมีภูมิคุ้มกันสูงสุด 300 หน่วย ใครจะถึงจุดอันตรายก่อน (ใครจะไม่มีภูมิต้านทาน COVID-19 ก่อน) โดยพิมพ์ว่า เอ๋ก่อน หรือ โจ้ก่อน ทางหน้าจอ
ข้อ 12 โรงงาน#
ข้อ 12.1 ค่าแรง#
คุณเป็นผู้จัดการโรงงานผลิดธง คุณจ่ายค่าแรงพนักงานตามจำนวนธงที่ผลิตได้ใน 1 ชั่วโมง ตามตารางด้านล่างนี้
จำนวนธงที่ผลิตได้ใน 1 ชั่วโมง |
ค่าแรง (ของชั่วโมงนี้) |
---|---|
0 |
0 |
1-10 |
50 บาท |
11-20 |
120 บาท |
>= 21 |
6.50 บาทต่อธง |
เขียนฟังก์ชันชื่อ hourly_pay
ซึ่งรับพารามิเตอร์ 1 ตัว ได้แก่ จำนวนธงที่ผลิดได้ใน 1 ชั่วโมง แล้วให้ฟังก์ชันนี้คืนค่าเป็นค่าแรงที่จะได้รับในชั่วโมงนี้
ตัวอย่าง
>>> hourly_pay(9) # ค่าแรงในชั่วโมงที่ผลิตได้ 9 ธง
50
>>> hourly_pay(25) # ค่าแรงในชั่วโมงที่ผลิตได้ 25 ธง
162.5
ข้อ 12.2 รายได้รวม#
เมื่อทำงานหลายชั่วโมงติดต่อกัน พนักงานส่วนใหญ่สามารถผลิตธงได้มากขึ้น ซึ่งแต่ละคนสามารถผลิตธงได้เพิ่มขึ้นเป็นจำนวนแตกต่างกัน เช่น
นายแมว สามารถผลิตธงได้ 6 ธง ในชั่งโมงแรก และผลิตได้เพิ่มขึ้น 3 ธง ในแต่ละชั่วโมงที่ทำงาน ฉะนั้น
ชั่วโมงที่ 1 นายแมว ผลิตได้ 6 ธง
ชั่วโมงที่ 2 นายแมว ผลิตได้ 6+3 = 9 ธง
ชั่วโมงที่ 3 นายแมว ผลิตได้ 9+3 = 12 ธง
ชั่วโมงที่ 4 นายแมว ผลิตได้ 12+3 = 15 ธง
ชั่วโมงที่ 5 นายแมว ผลิตได้ 15+3 = 18 ธง
…
นายตู้ สามารถผลิตธงได้ 9 ธง ในชั่งโมงแรก แต่ไม่สามารถผลิตเพิ่มได้เมื่อทำงานหลายชั่วโมงติดต่อกัน ฉะนั้น
ชั่วโมงที่ 1 นายตู้ ผลิตได้ 9 ธง
ชั่วโมงที่ 2 นายตู้ ผลิตได้ 9 ธง
ชั่วโมงที่ 3 นายตู้ ผลิตได้ 9 ธง
ชั่วโมงที่ 3 นายตู้ ผลิตได้ 9 ธง
…
เขียนฟังก์ชันชื่อ daily_pay ซึ่งรับ parameter 3 ตัว ตามลำดับดังต่อไปนี้
จำนวนธงที่ผลิตได้ในชั่วโมงแรก
จำนวนธงที่สามารถผลิตเพิ่มได้ในแต่ละชั่วโมง
จำนวนชั่วโมงที่ทำงานในวันนี้
ให้ฟังก์ชัน daily_pay
คืนค่าเป็นค่าแรงที่จะได้รับทั้งหมดในวันนั้น
ข้อกำหนด: ห้ามใช้คำสั่ง if
ในฟังก์ชัน daily_pay
แต่สามารถเรียกใช้ฟังก์ชันจาก 11.1 ได้
ตัวอย่าง
>>> daily_pay(6, 3, 5) # ตัวอย่างนายแมวด้านบน ทำงาน 5 ชั่วโมง
460
>>> daily_pay(9, 0, 4) # ตัวอย่างนายตู้ด้านบน ทำงาน 4 ชั่วโมง
200
ข้อ 13 - ดัชนีมวลกาย - BMI#
จงเขียนฟังก์ชันคำนวณค่า BMI สำหรับตรวจสอบภาวะไขมันและความอ้วน ที่รับอินพุต เป็นน้ำหนักและส่วนสูง มีสูตรคำนวณคือ น้ำหนักตัว(กิโลกรัม) / (ส่วนสูง(เมตร) ยกกำลังสอง) มีหลักเกณฑ์การตรวจสอบภาวะไขมันดังนี้
อ้วนมาก = 30.0 ขึ้นไป
อ้วน = 25.0 - 29.9
น้ำหนักปกติ = 18.6 - 24
ผอมเกินไป = น้อยกว่า 18.5
ให้ฟังก์ชัน compute_bmi()
return ค่า BMI และ print สภาวะไขมัน เช่น ‘น้ำหนักปกติ’ หรือ ‘ผอมเกินไป’