φυβλαςのβλογ
phyblasのブログ



ภาษา python เบื้องต้น บทที่ ๖: ความเป็นจริงเท็จและการตั้งเงื่อนไข
เขียนเมื่อ 2016/03/04 00:58
แก้ไขล่าสุด 2024/02/22 11:00
 

ในการทำงานกับคอมพิวเตอร์นั้นมักจะต้องมีการแบ่งแยกเงื่อนไขเพื่อที่จะให้คอมทำงานแตกต่างกันไปตามสถานการณ์

เหมือนกับที่ในธรรมชาติมักจะมีการแบ่งแยก เช่นเวลาไปเที่ยวคนต่างชาติจะต้องจ่ายค่าเข้าแพงกว่า หนังบางประเภทมีการจำกัดอายุคนดู ห้องน้ำก็มีการแยกชายหญิง สังคมมนุษย์เต็มไปด้วยการแบ่งแยก

ในคอมพิวเตอร์เองก็สามารถมีการแบ่งแยก เช่นเวลาคำนวณ เจอจำนวนบวกให้คำนวณอย่างหนึ่ง เจอจำนวนลบให้คำนวนแบบหนึ่ง เป็นต้น

หากมีการตั้งเงื่อนไขก็จะสร้างให้เกิดทางแยกในการทำงาน และทำงานได้ยืดหยุ่นกว้างขวางมากขึ้น

ในภาษาไพธอน (รวมถึงภาษาโปรแกรมอื่นๆส่วนใหญ่) คำสั่งที่ใช้ในการตั้งเงื่อนไขก็คือ if และ else



การใช้ if และ else เพื่อตั้งเงื่อนไข

โครงสร้างของการใช้ if เป็นดังนี้
if เงื่อนไข:
    คำสั่งที่จะให้ทำเมื่อเงื่อนไขเป็นจริง
else เงื่อนไข:
    คำสั่งที่จะให้ทำเมื่อเงื่อนไขเป็นเท็จ

ยกตัวอย่าง
x = int(input('1+1 เท่ากับเท่าไหร่? : '))
if x==2:
    print('ถูกต้องนะคร้าบ')
else:
    print('ไม่น่าเชื่อว่าจะมีคนตอบผิด')

ผลที่ได้ก็คือเริ่มมาโปรแกรมจะถามคำถามว่า "1+1 เท่ากับเท่าไหร่?" แล้วก็ให้พิมพ์คำตอบลงไป

ถ้าพิมพ์ 2 ลงไป ก็คือตอบถูก จะมีข้อความ "ถูกต้องนะคร้าบ" ขึ้นมา

แต่ถ้าพิมพ์ตัวเลขค่าอื่นลงไป จะมีข้อความ "ไม่น่าเชื่อว่าจะมีคนตอบผิด" ขึ้นมา

จากตัวอย่าง สรุปโครงสร้างโดยรวมก็คือ

บรรทัดแรกพิมพ์คำว่า if แล้วก็ตามด้วยเงื่อนไขจากนั้นก็ต้องพิมพ์โคลอน : จากนั้นขึ้นบรรทัดใหม่แล้วก็เขียนคำสั่งที่ต้องการให้ทำเมื่อเงื่อนไขเป็นจริงไว้ โดยที่บรรทัดถัดมานั้นจะต้องมีการเคาะเว้นวรรค

ในส่วนคำสั่งที่จะทำเมื่อเงื่อนไขเป็นจริงนั้นจะมีกี่บรรทัดก็ได้ โดยสิ่งที่เป็นตัวบ่งบอกว่าคำสั่งส่วนไหนเป็นส่วนที่จะให้ทำเมื่อเงื่อนไขเป็นจริงก็คือ การร่น (indent)

ซึ่งหมายถึงการเคาะเครื่องหมายเว้นวรรค (spacebar) ให้ตัวหนังสืออยู่ห่างออกมาทางขวาเมื่อเทียบกับคำว่า if และ else

การใช้การร่นเพื่อกำหนดขอบเขตของโครงสร้างแบบนี้เป็นเอกลักษณ์อย่างหนึ่งของภาษาไพธอน ในภาษาอื่นส่วนใหญ่เช่นภาษาซีจะใช้วงเล็บปีกกาคร่อม { } แต่ถึงอย่างนั้นก็ตาม เมื่อมีการใช้ if else คนก็มักจะนิยมทำการร่นเพื่อให้ดูแล้วเข้าใจง่าย แม้ว่าจริงๆจะไม่จำเป็นก็ตาม

ในภาษาไพธอนการร่นกลายเป็นสิ่งบังคับตายตัว ข้อดีก็คือเราไม่จำเป็นต้องใส่วงเล็บปีกกาหรือใช้สัญลักษณ์ใดๆเพื่อบ่งบอกขอบเขต

การร่นนั้นจะร่นโดยการเคาะกี่ครั้งก็ได้ แต่โดยทั่วไปแล้วมักจะร่นไป ๔ ช่อง อีดิเตอร์ส่วนใหญ่ที่รอบรับการเขียนภาษาไพธอนเวลาที่เราพิมพ์โคลอน : แล้วกด enter เพื่อขึ้นบรรทัดใหม่จะมีการร่นให้ ๔ ช่องโดยอัตโนมัติ



เมื่อจบคำสั่งที่ให้ทำเมื่อเงื่อนไขเป็นจริงแล้ว ขั้นตอนถัดมาก็คือใส่ส่วนของคำสั่งที่จะให้ทำเมื่อเงื่อนไขเป็นเท็จ ซึ่งเขียนได้โดยใช้ else

else นั้นจะต้องยกเลิกการร่นให้อยู่ในตำแหน่งเดียวกับ if จากนั้นก็ตามด้วยโคลอน : แล้วก็ขึ้นบรรทัดใหม่พร้อมกับร่นแล้วก็เขียนคำสั่งที่ต้องการให้ทำเมื่อเงื่อนไขเป็นเท็จไว้ตรงนั้น

เมื่อจบโครงสร้างในส่วนนี้แล้วหากมีคำสั่งที่จะให้ทำต่อโดยไม่เกี่ยวกับว่าเงื่อนไขจะเป็นอย่างไร ก็แค่เขียนคำสั่งถัดไปโดยให้ไม่มีการร่นบรรทัด

ลองดูอีกตัวอย่างหนึ่ง เช่น โปรแกรมหาค่าสัมบูรณ์ของค่าที่ป้อนเข้าไป

x = float(input())
if(x<0):
    print("ค่าติดลบ") x = -x
else:
    print("ค่าไม่ติดลบ")
print('ค่าสัมบูณ์คือ', x)

ในกรณีนี้ถ้าป้อนค่ามากกว่าหรือเท่ากับ 0 ลงไปจะทำให้เงื่อนไขเป็นเท็จ แล้วก็จะแสดงผลว่าค่าเป็นบวก

แต่ถ้ามากกว่า 0 เงื่อนไขจะเป็นจริง ก็จะมีการแสดงผลว่าค่าเป็นลบ พร้อมมีการคำนวณติดลบ

แต่ไม่ว่าจะเข้าเงื่อนไขอะไร สุดท้ายแล้วก็จะมีการทำสิ่งที่อยู่บรรทัดถัดไปซึ่งอยู่ในตำแหน่งที่เท่าเทียมกับ if และ else คือไม่มีการร่น นั่นคือคำสั่ง print ที่พิมพ์ค่า x ออกมา

อนึ่ง เงื่อนไขที่อยู่หลัง if อาจใส่วงเล็บครอบก็ได้ ให้ผลไม่ต่างกันกับไม่ใส่ ดังตัวอย่างที่เห็นนี้ และจะเห็นว่าในกรณีมีวงเล็บจะไม่จำเป็นต้องเว้นวรรคหลัง if

แม้ภาษาไพธอนจะไม่จำเป็นต้องใสวงเล็บหลัง if แต่การใส่วงเล็บนั้นจำเป็นในหลายภาษา เช่นภาษาซี, ฟอร์แทรน, จาวาสคริปต์, php, ฯลฯ

เนื่องจากการใส่วงเล็บทำให้การเขียนดูสวยงามมีระเบียบกว่า ดังนั้นในตัวอย่างต่อจากนี้ไปทั้งหมดจะใส่วงเล็บหลัง if เสมอ หากใครจะนำโค้ดไปเขียนตามโดยตัดวงเล็บออกไปก็ทำงานได้ไม่ต่างกัน

กรณีที่โค้ดมีอยู่เพียงบรรทัดเดียวก็สามารถเขียนคำสั่งต่อจาก if ได้เลยโดยไม่ต้องขึ้นบรรทัดใหม่ก็ได้ เช่นตัวอย่างแรกอาจเขียนใหม่เป็น
x = int(input('1+1 เท่ากับเท่าไหร่? : '))
if(x==2): print('ถูกต้องนะคร้าบ')
else: print('ไม่น่าเชื่อว่าจะมีคนตอบผิด')

หากไม่มีสิ่งที่ต้องการให้ทำเมื่อเงื่อนไขเป็นเท็จก็อาจไม่ต้องใส่ else แต่ใส่แค่ if เฉยๆก็ได้ เช่น
x = int(input('โปรดระบุอายุผู้เข้าชม'))
if(x<18): print('คำเตือน: ผู้ชมอายุต่ำกว่า 18 ปีไม่แนะนำให้เข้าชม กรุณาใช้วิจารณญาณ')

ผลลัพธ์
โปรดระบุอายุผู้เข้าชม: 17
คำเตือน: ผู้ชมอายุต่ำกว่า 18 ปีไม่แนะนำให้เข้าชม กรุณาใช้วิจารณญาณ

แต่ถ้าใส่เลข 18 ขึ้นไปจะไม่มีอะไรขึ้นมา



การเขียนผังงาน

เพื่อให้เข้าใจการทำงานของโปรแกรมได้ง่ายอาจต้องมีการเขียนผังงาน (flow chart) เพื่อให้เห็นภาพชัดเจนขึ้น

ตัวอย่างแผนภาพผังงานสำหรับตัวอย่างแรก





การเขียนนิพจน์ทางตรรกศาสตร์

จากตัวอย่างที่ผ่านมาจะเห็นเงื่อนไขที่ถูกเขียนอยู่หลัง if นั้นอยู่ในรูปของตัวแปรหรือข้อมูลสองตัวเปรียบเทียบกันแล้วพิจารณาว่าสิ่ง ที่เขียนนั้นเป็นจริงหรือเท็จ การเขียนในลักษณะนี้เรียกว่าเป็น นิพจน์ทางตรรกศาสตร์

เมื่อพิจารณาเงื่อนไขแล้วก็จะส่งค่าบูลออกมา โดยหากเป็นจริงจะให้ค่า True หากเป็นเท็จจะให้ค่า False

การเขียนนิพจน์แสดงเงื่อนไขในการเขียนโปรแกรมนั้นมีความใกล้เคียงกับในทาง คณิตศาสตร์ แต่ก็มีค่าออกไปบ้าง ดังนั้นจำเป็นต้องทำความเข้าใจสักหน่อย

เช่น จากตัวอย่างข้างต้นอาจมีคนสงสัยว่าทำไมเวลาที่เขียนเท่ากับภายในส่วนของ เงื่อนไขจะต้องเขียนเครื่องหมาย == สองตัวแบบนี้ แทนที่จะเขียนอันเดียวเป็น =

ความจริงแล้วเป็นเพราะเครื่องหมายเท่ากับอันเดียว = กับสองอัน == นั้นถือว่ามีความหมายต่างกัน ใช้ในคนละสถานการณ์

หากเขียนเครื่องหมายเท่ากับ = ตัวเดียวจะเป็นการป้อนค่าให้กับตัวแปร ซึ่งในกรณีนี้จะไม่สามารถสลับสิ่งที่อยู่ทางซ้ายและขวาของ = ได้

แต่หากเขียนสองอัน == จะหมายถึงการเปรียบเทียบว่าซ้ายกับขวาว่าเท่ากันหรือเปล่า ถ้าเท่ากันก็คืนค่า True ถ้าไม่เท่ากันก็คืนค่า False สิ่งที่อยู่สองข้างของ == นั้นสามารถสลับกันได้



การเปรียบเทียบระหว่างข้อมูล ๒ ตัว

x < y หมายถึง x น้อยกว่า y
x <= y x น้อยกว่าหรือเท่ากับ y
x > y x มากกว่า y
x >= y x มากกว่าหรือเท่ากับ y
x == y x เท่ากับ y
x != y x ไม่เท่ากับ y



การเปรียบเทียบระหว่างข้อมูลต่างชนิดกัน

ข้อมูลที่เป็นตัวเลขทั้งจำนวนจริงและจำนวนจริงสามารถนำมาเปรียบเทียบกันได้ตามปกติ เช่น
3 > 3.1 # ได้ False
7.0 == 7 # ได้ True

แต่จำนวนจริงหรือจำนวนเต็มไม่สามารถนำไปเปรียบเทียบกับจำนวนเชิงซ้อนได้
3 > (3+0j) # ได้ TypeError: '>' not supported between instances of 'int' and 'complex'

ยกเว้นเครื่องหมาย == สามารถเปรียบเทียบได้
3 == (3+0j) # ได้ True

ข้อมูลตัวเลขไม่สามารถนำไปเปรียบเทียบกับสายอักขระได้
3.1 > '3' # ได้ TypeError: '>' not supported between instances of 'float' and 'str'

สำหรับเครื่องหมาย == สามารถใช้เทียบได้ แต่จะได้เท็จเสมอ
3 == '3' # ได้ False

สำหรับเรื่องของการเปรียบเทียบระหว่างสายอักขระนั้นจะยกไปพูดถึงในบทที่กล่าวถึงสายอักขระอย่างละเอียดอีกที



การรวมหลายนิพจน์เข้าด้วยกัน

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

ให้ A และ B ในที่นี้เป็นข้อมูลชนิดบูลที่ได้มาจากการพิจารณาเงื่อนไข ค่าความจริงที่ได้จาก and กับ or จะเป็นไปตามตารางนี้

A B A and B A or B
จริง จริง จริง จริง
จริง เท็จ เท็จ จริง
เท็จ จริง เท็จ จริง
เท็จ เท็จ เท็จ เท็จ

เช่น
x = 10
x > 0 and x < 5 # ได้ False
x > 0 or x < 5 # ได้ True
x > 0 and x < 15 # ได้ True
x > 15 or x < 5 # ได้ False

หากต้องการให้ผลที่ได้กลับเป็นในทางตรงกันข้ามสามารถทำได้โดยเติม not เช่น
x > 0 and not x < 5 # ได้ True
not x > 0 or x < 5 # ได้ False

สามารถใส่วงเล็บเพื่อให้มีการคิดผลในวงเล็บก่อน ดังนั้นการใส่วงเล็บกับไม่ใส่ให้ผลต่างกัน
not (x > 0 and x < 5) # ได้ True
not x > 0 and x < 5 # ได้ False



การใช้ if elif else

บางครั้งเราอาจไม่ได้พิจารณาเงื่อนไขที่แบ่งสถานการณ์ออกเป็นแค่ ๒ กรณี แต่อาจแบ่งย่อยมากกว่านั้น ในกรณีนั้นใช้แค่ if else ไม่เพียงพอ ต้องใช้ if elif else

ตัวอย่าง โปรแกรมคำนวณเกรดโดยการป้อนคะแนนเข้าไปแล้วให้พิจารณาว่าควรจะได้เท่าไหร่โดยดูจากช่วงคะแนน
khanaen = float(input('จงป้อนคะแนนของคุณ: '))
if(khanaen<50): print('คุณได้ F เสียใจด้วย พบกันใหม่ปีหน้า')
elif(khanaen<60): print('คุณได้ D')
elif(khanaen<70): print('คุณได้ C')
elif(khanaen<80): print('คุณได้ B')
elif(khanaen<=100): print('คุณได้ A ยินดีด้วย ทำได้ดีมาก')
else: print('คะแนนไม่ควรเกิน 100')

ตัวอย่างผล
ครั้งที่ ๑
จงป้อนคะแนนของคุณ: 49
คุณได้ F เสียใจด้วย พบกันใหม่ปีหน้า  
ครั้งที่ ๒
จงป้อนคะแนนของคุณ: 81
คุณได้ A ยินดีด้วย ทำได้ดีมาก
ครั้งที่ ๓
จงป้อนคะแนนของคุณ: 555
คะแนนไม่ควรเกิน 100





เงื่อนไขซ้อนกันหลายชั้น

บางครั้งเงื่อนไขก็ไม่ได้แยกเป็นหลายทางพร้อมๆกัน แต่บางครั้งต้องผ่านเงื่อนไขหนึ่งจึงจะมีการทำอะไรต่อแล้วจึงเจอกับเงื่อนไขต่อไปอีก

ในสถานการณ์แบบนี้จะเกิดเป็นเงื่อนไขซ้อนเงื่อนไข คือภายในส่วนคำสั่งหลัง if มี if ซ้อนอยู่อีกอัน ซึ่งกรณีนี้คำสั่งที่อยู่ภายใต้เงื่อนไขของ if ตัวในก็จะต้องมีการร่นไปอีก

ยิ่งมีการซ้อนก็จะยิ่งมีการร่น เกิดเป็นโครงสร้างเป็นชั้นๆ
if(เงื่อนไข):
    คำสั่ง
    if(เงื่อนไข):
        คำสั่ง
    else:
        คำสั่ง
    คำสั่ง
else:
    คำสั่ง
    if(เงื่อนไข):
        คำสั่ง
    else:
        คำสั่ง
    คำสั่ง

ตัวอย่าง สมมุติว่ากำลังเล่นเกมอยู่ เกมนี้มีระบบคำนวณโอกาสที่เราจะเอาชนะศัตรูได้โดยการให้ป้อนเลเวลของตัวเรา และศัตรูลงไป สูตรคำนวณโอกาสชนะเป็น % คือ 50 + เลเวลเรา - เลเวลศัตรู

เพียงแต่ว่าขอบเขตเลเวลของผู้เล่นต้องเป็นจำนวนเต็มบวก ไม่เกิน 100 ส่วนศัตรูต้องไม่เกิน 500 ถ้าหากป้อนตัวเลขที่ไม่ได้อยู่ในขอบเขตนี้ก็จะขึ้นเตือนมาแล้วหยุดทำงานไป ทันที
lv_rao = int(input('คุณเลเวล: '))
if(lv_rao<1 or lv_rao>100):
    print('เลเวลผู้เล่นต้องอยู่ระหว่าง 1 ถึง 100')
else:
    lv_sattru = int(input('ศัตรูเลเวล: '))
    if(lv_sattru<1 or lv_sattru>500):
        print('เลเวลศัตรูต้องอยู่ระหว่าง 1 ถึง 500')
    else:
        if(lv_rao+50<=lv_sattru):
            print('ศัตรูเมพเกินไป')
        elif(lv_rao-50>=lv_sattru):
            print('ศัตรูกากเกินไป')
        else:
            print('คุณมีโอกาสชนะ', 50+lv_rao-lv_sattru,'%')

ตัวอย่างผล
ครั้งที่ ๑
คุณเลเวล: 101
เลเวลผู้เล่นต้องอยู่ระหว่าง 1 ถึง 100

ครั้งที่ ๒
คุณเลเวล: 50
ศัตรูเลเวล: 600
เลเวลศัตรูต้องอยู่ระหว่าง 1 ถึง 500

ครั้งที่ ๓
คุณเลเวล: 80
ศัตรูเลเวล: 200
ศัตรูเมพเกินไป

ครั้งที่ ๔
คุณเลเวล: 90
ศัตรูเลเวล: 110
คุณมีโอกาสชนะ 30 %



การใช้ข้อมูลชนิดต่างๆแทนค่าความจริงเท็จ

ปกติเวลาตั้งเงื่อนไขโดยเปรียบเทียบข้อมูลผลที่ได้จะออกมาเป็นตัวแปรชนิดบูลซึ่งมีค่าได้แค่ True หรือ False

แต่ที่จริงแล้วก็ไม่ใช่ว่าหลัง if จะใส่ได้แต่ค่า True หรือ False ลงไปเท่านั้น แต่สามารถใส่ข้อมูลชนิดอื่นลงไปได้ทุกชนิด แล้วข้อมูลจะถูกแปลงเป็นชนิดบูลไปก่อนนำไปพิจารณาเป็นเงื่อนไข

โดยปกติแล้วเราสามารถแปลงข้อมูลจากชนิดใดๆเป็นชนิดบูลได้ โดยถ้าเป็นจำนวนตัวเลข ค่า 0 จะได้ False นอกนั้นจะได้ True ถ้าเป็นสายอักขระ ค่าว่างเปล่าจะได้ False นอกนั้นจะได้ True
bool(1) # ได้ True
bool(0.1) # ได้ True
bool(0) # ได้ False
bool(0.0) # ได้ False
bool('0') # ได้ True
bool('') # ได้ False

ลองนำค่าไปใช้กับ if
if(10): print('จริง')
else: print('เท็จ')

ผลจะได้ว่าเป็นจริงดังนั้นจึงแสดงผล จริง



สรุปเนื้อหา
  • ในโปรแกรมจะต้องมีการตัดสินจริงเท็จเพื่อกำหนดเงื่อนไขให้เกิดทางแยก
  • คำสั่งสำหรับสร้างเงื่อนไขคือ if elif else
  • เงื่อนไขตัดสินจากนิพจน์ทางตรรกศาสตร์ ซึ่งประกอบไปด้วย == > < >= <= and or not เป็นต้น ซึ่งให้ผลลัพธ์เป็นข้อมูลชนิดบูล True หรือ False
  • โครงสร้าง if elif else สามารถซ้อนกันกี่ชั้นก็ได้
  • ข้อมูลชนิดอื่นก็สามารถนำมาใช้แทนค่าบูลเพื่อพิจารณาค่าความจริงเท็จได้เช่นกัน



อ้างอิง




-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

目次

日本による名言集
モジュール
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
機械学習
-- ニューラル
     ネットワーク
javascript
モンゴル語
言語学
maya
確率論
日本での日記
中国での日記
-- 北京での日記
-- 香港での日記
-- 澳門での日記
台灣での日記
北欧での日記
他の国での日記
qiita
その他の記事

記事の類別



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  記事を検索

  おすすめの記事

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

ไทย

日本語

中文