แบบฝึกหัด: ตัวแปร และฟังก์ชัน#

ข้อ 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

ข้อ 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 จำนวนผู้ป่วยในแต่ละวันโดยที่โปรแกรมจะมีลักษณะดังนี้

อินพุต:

  1. จำนวนผู้ป่วยตั้งต้น (วันที่ 0)

  2. จำนวนวันที่ต้องการ 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 ตัว ได้แก่

  1. ปริมาณภูมิคุ้มกันสูงสุด ณ วันที่ 7 หลังจากฉีดวัคซีน

  2. ค่า 𝛂

แล้วให้ฟังก์ชันนี้คืนค่าเป็นจำนวนวันว่าคนๆ นี้มีภูมิต้านทานโรค 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 สำหรับตรวจสอบภาวะไขมันและความอ้วน ที่รับอินพุต เป็นน้ำหนักและส่วนสูง มีสูตรคำนวณคือ น้ำหนักตัว(กิโลกรัม) / (ส่วนสูง(เมตร) ยกกำลังสอง) มีหลักเกณฑ์การตรวจสอบภาวะไขมันดังนี้

  1. อ้วนมาก = 30.0 ขึ้นไป

  2. อ้วน = 25.0 - 29.9

  3. น้ำหนักปกติ = 18.6 - 24

  4. ผอมเกินไป = น้อยกว่า 18.5

ให้ฟังก์ชัน compute_bmi() return ค่า BMI และ print สภาวะไขมัน เช่น ‘น้ำหนักปกติ’ หรือ ‘ผอมเกินไป’