9: Nested Structure

9-2: Nested for Loop

** ถ้าใช้งานบนมือถือหรือ tablet แนะนำให้ใช้ Chrome หรือ Safari เท่านั้น **

แบบฝึกหัด 9-2 ข้อที่ 1

จงเขียนโปรแกรมอ่านรายการของชื่อโรงเรียน เพื่อแสดงรายการการแข่งขันฟุตบอลแบบพบกันหมด โดยแสดงบรรทัดละคู่ (เรียงตามพจนานุกรม) ดูตัวอย่างในรูปประกอบ

___inp___ = ["BCC AC DS SK"] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t schools = input().split() schools = input().split() schools.sort() for i in range(len(schools)): for j in range(i+1, len(schools)): print(schools[i],'vs',schools[j]) Ex().has_equal_output(pre_code = "___inp___[0] = 'B D A F C'", incorrect_msg = "ยังได้ผลไม่ตรงตามโจทย์")
เรียงลำดับชื่อโรงเรียนที่รับมาก่อน แล้วค่อยจับคู่
แบบฝึกหัด 9-2 ข้อที่ 2

จงเขียนโปรแกรมที่รับจำนวนเต็ม N เพื่อแสดงตารางสูตรคูณของแม่ 2 จนถึงแม่ N ดังรูป โดยขอแสดงผลการคูณด้วย 1 ถึง 5 ก็พอ กำหนดให้ใช้แค่ 4 ช่องเพื่อแสดงผลแต่ละจำนวน โดยแสดงจำนวนแบบชิดขวา (ดูรูปประกอบ) สามารถใช้ฟังก์ชัน left_pad ที่เขียนให้แล้ว และให้เขียนโปรแกรมด้วยคำสั่ง for เท่านั้น (ห้ามใช้ while)

___inp___ = ["6"] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t def left_pad(n, k): # แปลง n เป็นสตริงที่ยาว k โดยเติมช่องว่างทางซ้าย # left_pad(12, 4) ได้ " 12" return (" "*k +str(n))[-k:] N = int(input()) def left_pad(n, k): return (" "*k +str(n))[-k:] N = int(input()) for k in range(2, N+1): line = "" for m in range(1, 6): line += left_pad(k*m, 4) print(line) Ex().check_not(has_code("while "),msg = "ข้อนี้ห้ามใช้ while ให้ใช้แต่ for") Ex().has_equal_output(pre_code = "___inp___[0] = 30", incorrect_msg = "ยังได้ผลไม่ต้องตามโจทย์")
แบบฝึกหัด 9-2 ข้อที่ 3

เขียนโปรแกรมทำงานตามผังงานในรูป (แต่แทนที่จะใช้วงวน while ให้ใช้แต่ for) หมายเหตุ: อาจต้องปรับเงื่อนไขบ้างเล็กน้อย เพื่อให้เขียนในรูปของวงวน for

___inp___ = ["20"] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t N = int(input()) print(prime) N = int(input()) prime = [True]*(N+1) prime[0] = prime[1] = False for p in range(2, int(N**0.5)+1): if prime[p] == True: for i in range(2*p, N+1, p): prime[i] = False print(prime) Ex().check_not(has_code("while "),msg = "ข้อนี้ห้ามใช้ while ให้ใช้แต่ for") Ex().has_equal_output(pre_code = "___inp___[0] = 32", incorrect_msg = "ยังได้ผลไม่ต้องตามผังงาน")
แบบฝึกหัด 9-2 ข้อที่ 4

จงเขียนฟังก์ชัน min_distance(x, y) มี x และ y เป็นลิสต์ที่เก็บพิกัด x และ y ของจุดต่าง ๆ โดยจุดที่ k มีพิกัดที่ x[k],y[k] ฟังก์ชันนี้คืนระยะทางของคู่จุดที่อยู่ใกล้กันที่สุด (ในโปรแกรมที่เขียนมีฟังก์ชัน distance มาให้ เผื่อจะใช้เป็นประโยชน์) เช่น min_distance([0, 9, 9],[0, 9, 8]) ได้ 1.0

def distance(x1,y1,x2,y2): dx = x1 - x2 dy = y1 - y2 return (dx**2 + dy**2)**0.5 #------------------------------------- def min_distance(x, y): def distance(x1,y1,x2,y2): dx = x1 - x2 dy = y1 - y2 return (dx**2 + dy**2)**0.5 #------------------------------------- def min_distance(x, y): min_distance = distance(x[0],y[0],x[1],y[1]) k = 0 for i in range(len(x)): for j in range(i+1, len(x)): d = distance(x[i],y[i],x[j],y[j]) if d < min_distance: min_distance = d return min_distance #------------------------------------- q = "`" fname = "min_distance" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์สองตัว') import random x = [random.randint(-10,10) for i in range(6)] y = [random.randint(-10,10) for i in range(6)] params = ["[0,2,3], [0,3,2]", str(x) + "," + str(y)] for p in params: fcall = fname + "(" + p + ")" func.check_call(fcall).has_equal_value(incorrect_msg=(q+fcall+q) + " ให้ผลผิด")
แบบฝึกหัด 9-2 ข้อที่ 5

จงเขียนฟังก์ชัน print_month(m, y) รับเลขเดือนและเลขปี ค.ศ. เพื่อจะแสดงปฏิทินของเดือนปีที่ได้รับ (รูปแสดงตัวอย่างปฏิทินของเดือนสิงหาคม 2019) กำหนดให้วันแรกของสัปดาห์คือวันอาทิตย์ และมีฟังก์ชัน days_in_month กับ day_of_week ให้ใช้ประโยชน์

def days_in_month(m, y): if m == 2: if y%400 or y%4==0 and y%100 != 0: return 29 else: return 28 elif m in [4,6,9,11]: return 30 else: return 31 #----------------------------------------- def day_of_week(d, m, y): # 0 -> Sunday, 1 -> Monday, ... if m < 3 : m += 12 y -= 1 c = y // 100 k = y % 100 w = (d+26*(m+1)//10+k+k//4+c//4+5*c)%7 return (w-1) % 7 #----------------------------------------- def print_month(m, y): print(" SU MO TU WE TH FR SA") def days_in_month(m, y): if m == 2: if y%400 or y%4==0 and y%100 != 0: return 29 else: return 28 elif m in [4,6,9,11]: return 30 else: return 31 #----------------------------------------- def day_of_week(d, m, y): # 0 -> Sunday, 1 -> Monday, ... if m < 3 : m += 12 y -= 1 c = y // 100 k = y % 100 w = (d+26*(m+1)//10+k+k//4+c//4+5*c)%7 return (w-1) % 7 #----------------------------------------- def print_month(m, y): print(" SU MO TU WE TH FR SA") dow1 = day_of_week(1,m,y) num_days = days_in_month(m,y) line = ' '*dow1 s = dow1 d = 1 while d <= num_days: for j in range(s,7): line += (" "+str(d))[-3:] d += 1 if d > num_days: break print(line) line = "" s = 0 q = "`" fname = "print_month" func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์สองตัว') import random my = str(random.randint(1,12)) + ", " + str(random.randint(2008, 2050)) params = ["9, 2019", my, "2, 2020"] for p in params: fcall = fname + "(" + p + ")" func.check_call(fcall).has_equal_output(incorrect_msg=(q+fcall+q) + " ยังแสดงไม่ถูกต้อง")