The words you are searching are inside this book. To get more targeted content, please make full-text search by clicking here.
Discover the best professional documents and content resources in AnyFlip Document Base.
Search
Published by ttacademic9, 2020-03-06 04:12:53

python101_workbook_v1.0.2

python101_workbook_v1.0.2

Python ๑๐๑

ภาควชิ าวศิ วกรรมคอมพวิ เตอร์ คณะวศิ วกรรมศาสตร์
สงิ หาคม ๒๕๖๑
v1.0.2

ผอู้ ่านสามารถดาวน์โหลดหนังสือรุน่ ลา่ สุด
และรว่ มแสดงความคิดเหน็ /ขอ้ แนะนำ� เกี่ยวกบั หนงั สอื เล่มนีท้ ี่

www.cp.eng.chula.ac.th/books/python101
ขอบคณุ ครับ

กติ ติภณ พละการ, กิตตภิ พ พละการ, สมชาย ประสทิ ธ์จิ ตู ระกูล, สกุ รี สินธุภิญโญ
Python ๑๐๑ / กติ ตภิ ณ พละการ, กติ ติภพ พละการ, สมชาย ประสทิ ธจิ์ ตู ระกูล, สุกรี สนิ ธภุ ิญโญ

1. การเขียนโปรแกรม (คอมพวิ เตอร)์
2. ไพทอน (คอมพวิ เตอร)์

005.133

ISBN 978-616-407-189-6

พมิ พ์ครัง้ ที่ 1 จ�ำนวน 1,000 เลม่ พ.ศ. 2560
พิมพค์ รัง้ ท่ี 2 จ�ำนวน 1,000 เล่ม พ.ศ. 2561

สงวนลขิ สทิ ธติ์ าม พ.ร.บ. ลิขสทิ ธิ์ พ.ศ. 2537/2540
การผลติ และการลอกเลียนหนงั สือเล่มน้ีไมว่ ่ารปู แบบใดทั้งส้นิ
ตอ้ งไดร้ ับอนญุ าตเป็นลายลักษณอ์ กั ษรจากเจา้ ของลขิ สทิ ธิ์

จดั พมิ พ์โดย
ภาควิชาวศิ วกรรมคอมพิวเตอร์
คณะวศิ วกรรมศาสตร์ จุฬาลงกรณม์ หาวทิ ยาลยั
พญาไท กรุงเทพฯ 10330
https://www.cp.eng.chula.ac.th

เขา้ ชมหนงั สือเลม่ อน่ื ๆ ของภาควิชาได้ที่
https://www.cp.eng.chula.ac.th/books

ออกแบบปก : กมลพรรณ ลวิ้ ประเสริฐ
ออกแบบรปู เล่ม : ภานกุ ร สุนทรเวชพงษ์

พิมพ์ท่ี โรงพมิ พ์แหง่ จุฬาลงกรณ์มหาวทิ ยาลัย โทรศพั ท์ 0-2218-3549-50 โทรสาร 0-2218-3551

ค�ำน�ำ

วิชา ๒๑๑๐๑๐๑ การเขียนโปรแกรมคอมพิวเตอร์ เป็นหนึ่งในวิชาพื้นฐานทางวิศวกรรมศาสตร์ ท่ีนิสิตช้ันปีที่ ๑
คณะวิศวกรรมศาสตร์ ทุกคนต้องลงทะเบียนเรียน วัตถุประสงค์หลักของวิชานี้คือ ให้นิสิตเข้าใจหลักการในการใช้ค�ำส่ังต่าง ๆ
ของภาษาโปรแกรม เพ่ือเขียนโปรแกรมคอมพิวเตอร์ให้ตรงตามข้อก�ำหนดท่ีได้รับ การเขียนโปรแกรมเป็นความสามารถท่ีต้อง
ลงมอื ฝึกฝนฝกึ ปฏิบตั ิด้วยตนเอง เหมือนกบั ทกั ษะอื่นทางวศิ วกรรมที่จ�ำเป็นต้องฝึก ๆ ๆ ให้ชำ� นาญจึงจะได้ผล ไม่สามารถได้มา
ด้วยการอ่าน ๆ ๆ จำ� ๆ ๆ
หนังสือ Python ๑๐๑ เล่มนี้ถูกจัดท�ำข้ึน เพ่ือให้นิสิตใช้ทบทวนเนื้อหาหลังชมภาพยนตร์บรรยายเน้ือหาด้วยตนเอง
ในแตล่ ะบท ใชเ้ ตรยี มตวั กอ่ นเขา้ เรยี น และใชร้ ะหวา่ งการเขยี นโปรแกรมจรงิ ในหอ้ งปฏบิ ตั กิ ารทจี่ ดั ขนึ้ เปน็ กจิ กรรมประจำ� ทกุ สปั ดาห์
โดยมีระบบ Grader ช่วยตรวจสอบความถูกตอ้ งของผลการทำ� งานของโปรแกรมอย่างอัตโนมตั ิ นิสติ จะไดฝ้ กึ เขียนโปรแกรมตาม
โจทย์ ฝกึ หาทผี่ ิด และฝึกตรวจสอบความถกู ตอ้ งของโปรแกรมท่พี ัฒนาขึ้น นอกจากนี้ ยงั มแี บบฝึกปฏบิ ัติเพ่ิมเติมอีกมากมายใน
ระบบ Grader ให้นสิ ติ ไดท้ ำ� เสริมอกี ดว้ ย
ผู้เขียนต้องขอขอบคุณ ผศ. ดร. นัทที นิภานันท์ ผู้ปรับปรุงระบบตรวจโปรแกรมอัตโนมัติ Grader เพ่ือใช้ประกอบ
การเรียน การสอน และการสอบวิชาการเขียนโปรแกรมมาตั้งแต่ปีการศึกษา ๒๕๕๗ ขอขอบคุณบุคลากรของศูนย์คอมพิวเตอร์
คณะวิศวกรรมศาสตร์ ที่ให้บริการจัดเตรียมความพร้อมของอุปกรณ์และเครือข่ายในห้องปฏิบัติการ ขอขอบคุณคณาจารย์และ
นสิ ิตช่วยสอนท่รี ่วมกันสรา้ งโจทยป์ ญั หา สอน และปรับปรงุ วชิ า ๒๑๑๐๑๐๑ ตลอดมา ขอขอบคุณ ภานุกร สนุ ทรเวชพงษ์ และ
อตคิ ณุ ออไอศรู ย์ ทชี่ ว่ ยจดั รปู เลม่ และ กมลพรรณ ลว้ิ ประเสรฐิ ทชี่ ว่ ยออกแบบหนา้ ปก ขอขอบคณุ ภาควชิ าวศิ วกรรมคอมพวิ เตอร์
ทใ่ี หก้ ารสนบั สนนุ ในสารพดั เรอื่ ง และทา้ ยสดุ ทต่ี อ้ งขอบคณุ ทส่ี ดุ กค็ อื นสิ ติ คณะวศิ วฯ กวา่ หลายพนั คนทข่ี ยนั หมน่ั ศกึ ษาและฝา่ ฟนั
อปุ สรรคในการเรยี นวิชาพน้ื ฐานบังคบั ท่ีคอ่ นขา้ งไมค่ ุน้ เคยนจ้ี นสำ� เร็จ *

กิตติภณ พละการ
กิตตภิ พ พละการ
สมชาย ประสิทธิจ์ ตู ระกลู
(ผู้เรยี บเรยี งและรวบรวมเนอื้ หา)
สกุ รี สนิ ธุภญิ โญ (ที่ปรกึ ษา)
ภาควิชาวิศวกรรมคอมพวิ เตอร์
คณะวศิ วกรรมศาสตร์
จุฬาลงกรณม์ หาวทิ ยาลยั
๑๒ สิงหาคม ๒๕๖๐

* ภาควิชาวิศวกรรมคอมพวิ เตอรข์ อขอบคุณ บรษิ ัท เอก็ ซอนโมบิล จำ� กัด ที่ใหก้ ารสนับสนนุ คา่ ใชจ้ ่ายสำ� หรบั การจัดพมิ พใ์ ห้กบั
นสิ ิตทกุ คนท่ีลงทะเบียนเรยี นวิชา ๒๑๑๐๑๐๑ ใช้ประกอบการเรียนในปกี ารศกึ ษา ๒๕๖๐ และ ๒๕๖๑

ขอขอบคุณ

คณาจารย์คณะวศิ วกรรมศาสตร์ จฬุ าลงกรณม์ หาวทิ ยาลยั

ผศ. ดร. ชัยเชษฐ์ สายวจิ ิตร
ศ. ดร. ไพศาล กติ ติศภุ กร
รศ. ดร. อาณัติ เรืองรศั มี
รศ. ดร. พิสุทธ์ิ เพียรมนกุล
อ. ดร. กรวิก ตนักษรานนท์
อ. ดร. พรรณี แสงแก้ว
รศ. ดร. ณัฐชา ทวแี สงสกุลไทย
อ. ดร. เชษฐา พนั ธเ์ ครือบตุ ร
อ. ดร. สุรฐั ขวัญเมือง
ผศ. ดร. อนุรักษ์ ศรอี รยิ วฒั น์
ผศ. ดร. จิรวัฒน์ ชีวรุ่งโรจน์
ผศ. ดร. ณฐั วุฒิ หนไู พโรจน์

ศิษยเ์ ก่าภาควิชาวิศวกรรมคอมพวิ เตอร์
คณะวศิ วกรรมศาสตร์ จฬุ าลงกรณม์ หาวทิ ยาลยั

คณุ วโรรส โรจนะ
คุณธนาวัฒน์ มาลาบปุ ผา
คณุ ลสิ า ตรงประกอบ
คณุ ภัทราวธุ ซอื่ สัตยาศลิ ป์
คุณวโิ รจน์ จริ พัฒนกลุ
คณุ สุภชัย สตุ ัณฑวบิ ลู ย์
คณุ ศุภเสฏฐ์ ชชู ยั ศรี
คณุ ณัฐชยา ลลี ะศุภกลุ

ทกี่ รณุ าใหค้ วามรู้ถงึ ความสำ� คญั ของการเขยี นโปรแกรมกบั งานทางวิศวกรรมในสาขาต่าง ๆ

ขอขอบคณุ ภาพประกอบจาก

https://commons.wikimedia.org/wiki/File:WomaBallPython.jpg (ภาพง)ู
https://pixabay.com/en/snake-python-tree-python-terrarium-1184810/ (ภาพลายหนังง)ู
https://pixabay.com/photo-1745096/ (ภาพพน้ื หลังหนา้ ปก)
https://www.python.org/community/logos/ (สญั ลกั ษณ์ Python)
http://www.pythontutor.com (ภาพประกอบค�ำอธบิ ายเนื้อหา)

สารบญั 1
5
00 : Programming in Engineering 15
01 : Data Type, Variable and Expression 29
02 : Selection ( if-elif-else ) 43
03 : Repetition ( while, for ) 55
04 : String 65
05 : File 75
06.1 : List 83
06.2 : Nested List 91
06.3 : List Comprehension 109
07 : Tuple, Dictionary and Set 121
08 : Function and Recursion 133
09 : NumPy 149
10 : Class 157
11 : Solutions to Exercises
Appendix



00 : Programming in Engineering

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

ผศ. ดร. ชยั เชษฐ์ สายวจิ ิตร
ภาควชิ าวิศวกรรมไฟฟา้

Programming เป็นเคร่ืองมือที่ช่วยในการหาค�ำตอบเพื่ออธิบายปรากฏการณ์
หรือพฤติกรรมพลวัตของหน่วยปฏิบัติการหรือกระบวนการต่าง ๆ นอกจากนี้
ยังใช้ประมาณค่าตัวแปรหรือพารามิเตอร์ และพัฒนาไปสู่การท�ำนายปรากฏการณ์หรือ
พฤติกรรมพลวัตของหน่วยปฏิบตั ิการหรือกระบวนการตอ่ ไป

ศ. ดร. ไพศาล กิตตศิ ุภกร
ภาควชิ าวศิ วกรรมเคมี

ในทางวิศวกรรมโยธา โปรแกรมมีใช้กันอย่างมากเพื่อใช้จ�ำลองพฤติกรรมของ 1
โครงสร้างเช่น อาคาร สะพาน ฐานราก ภายใต้การรับแรงซ่ึงจะท�ำให้ทราบ
แรงที่เกิดกับโครงสร้างเพ่ือท่ีวิศวกรโยธาจะท�ำการออกแบบโครงสร้างให้ปลอดภัย
และประหยัด และในการก่อสร้างก็ต้องใช้โปรแกรมเพื่อการวางแผนและจัดการ
การก่อสร้าง นอกจากนั้นก็มีการใช้โปรแกรมในการจ�ำลองระบบขนส่งเพ่ือการออกแบบ
หรือวเิ คราะหร์ ะบบคมนาคมแบบตา่ ง ๆ

รศ. ดร. อาณัติ เรอื งรัศมี
ภาควิชาวิศวกรรมโยธา

00 : Programming in Engineering

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

รศ. ดร. พสิ ุทธิ์ เพียรมนกลุ
ภาควชิ าวิศวกรรมสิง่ แวดลอ้ ม

การเขยี นโปรแกรมมีความสำ� คัญกบั งานทุกดา้ นของวิศวกรรมส�ำรวจ โดยเฉพาะ
อย่างยิ่งงานด้าน GIS ที่ต้องการการเขียนโปรแกรมในการจัดการ ประมวลผล
วิเคราะห์ และแสดงผลข้อมูล โดยเฉพาะข้อมูลขนาดใหญ่ท่ีซอฟต์แวร์พื้นฐาน
โดยทั่วไปเช่น MS Excel ไม่สามารถรองรับได้ นอกจากนี้ ยังมีความส�ำคัญต่อการ
พฒั นาซอฟตแ์ วรด์ า้ นแผนท่ี โดยเฉพาะระบบแผนทบ่ี นเวบ็ ทตี่ อ้ งอาศยั การพฒั นาดว้ ย
การเขยี นโปรแกรม และการเขยี นโปรแกรมส�ำคัญมากท่ีสดุ กบั การศกึ ษาในระดบั สงู
เนอ่ื งจากจะตอ้ งพัฒนาซอฟตแ์ วรใ์ หมข่ ้นึ มาใหม่เอง

อ. ดร. กรวกิ ตนกั ษรานนท์
ภาควชิ าวศิ วกรรมส�ำรวจ

Programming มีความส�ำคัญต่อการเรียนในสาขาวิชาวิศวกรรมนิวเคลียร์ค่อนข้างมาก
การประมวลผลการตรวจวัดรังสีแบบท่ีเป็นจ�ำนวนนับรังสี จ�ำนวนข้อมูลการนับรังสี
มีจ�ำนวนมากต่อการวัด เครื่องตรวจนับรังสีต้องใช้โปรแกรมคอมพิวเตอร์ในการรวบรวม
และประมวลผลขอ้ มลู มาสรา้ งเป็นแถบสเปกตรัมข้อมูล ส�ำหรับการประมวลผลทไี่ ดจ้ ากภาพ
การฉายรังสีแบบภาพคอนทราสขาว-ด�ำ การถ่ายภาพรังสีแบบทะลุผ่านและมีสเต็ปการถ่าย
หมุนรอบวัตถุน้ันที่เรียกว่า CT-scan เม่ือรวบรวมผลของแต่ละสเต็ปมารวมกันจะได้
ภาพตดั ขวางของวตั ถหุ รอื ถา้ มกี ารวดั ในแนวตง้ั ดว้ ยทำ� ใหไ้ ดภ้ าพสดุ ทา้ ยเปน็ ภาพ 3D ซงึ่ จะได้
เป็นโมเดลท่ีมีรายละเอียดภายในด้วย โดยเทคนิคนี้ท�ำให้ได้ข้อมูลภายในของวัตถุหรือแม้แต่
ภายในของร่างกายมนุษย์ได้ และยังออกแบบโปรแกรมในการควบคุมอุปกรณ์การตรวจวัดรังสีให้ท�ำงานได้อย่างอัตโนมัติ และ
ควบคมุ ได้จากระยะไกล ท�ำใหผ้ ู้ใช้รับปริมาณรังสีน้อยลง ส�ำหรับระบบการควบคุมการทำ� งานทั้งหมดของโรงไฟฟา้ นวิ เคลยี รน์ ้ัน
ท�ำโดยโปรแกรมคอมพิวเตอรท์ ั้งหมด

อ. ดร. พรรณี แสงแก้ว
ภาควชิ าวศิ วกรรมนิวเคลียร์

2 00 : Programming in Engineering

บทบาทของวิศวกรรมอุตสาหการ คือ การออกแบบ ด�ำเนินการ ปรับปรุงและ
สร้างสรรค์นวตั กรรมระบบ ทั้งการผลติ บรกิ าร และ ธรุ กจิ
ทักษะ Programming ช่วยให้มีตรรกะการคิดอย่างมีเหตุผล อีกท้ังยังเป็น
เคร่ืองมือในการวิเคราะห์และประมวลผลอย่างรวดเร็วและแม่นย�ำตามตัวแปรและ
ข้อจำ� กดั ในบรบิ ทหน่ึง ๆ ซึง่ มีความซับซ้อนมากขึ้นในอนาคต

รศ. ดร. ณัฐชา ทวีแสงสกลุ ไทย
ภาควิชาวิศวกรรมอุตสาหการ

วิทยาการทางดา้ นวศิ วกรรมโลหการและวสั ดุ เปน็ ความรทู้ เี่ กย่ี วขอ้ งกบั หลกั การพน้ื ฐาน
ของวัสดุต่าง ๆ กระบวนการแปรรูปและขึ้นรูปโลหะ สมบัติของวัสดุ และการเลือก
และออกแบบวสั ดทุ ่เี หมาะสมกบั งานท่หี ลากหลาย ดงั นัน้ เพือ่ ใหส้ ามารถพัฒนาวัสดุใหม่
ให้มีสมบัติต่าง ๆ ทด่ี ีข้ึน Computer Programming จงึ เขา้ มามบี ทบาทสำ� คัญในการ
สรา้ งแบบจำ� ลองตา่ ง ๆ เพอื่ เช่ือมโยงความสมั พนั ธร์ ะหว่าง กระบวนการผลิต - โครงสรา้ ง
ของวัสดุ - สมบัติของวสั ดุ - ความสามารถในการใชง้ าน ในปัจจุบันมีการน�ำ Computer
Programming เข้ามาใช้อย่างแพร่หลายมากข้ึน อาทิเช่น การท�ำนายโครงสร้าง
จุลภาคของวัสดุภายหลังการข้ึนรูปด้วยกรรมวิธีต่าง ๆ เช่น Casting, 3D printing,
Metal Forming จนสามารถท�ำให้ปรับปรุงให้วัสดุมีความแข็งแรงท่ีสูงข้ึนได้ หรือมีการ
น�ำมาใชเ้ พ่อื ท�ำนายการพังเสยี หายของวสั ดุจากการเกดิ Fatigue และ Corrosion ทำ� ให้
สามารถวางแผนการซ่อมบ�ำรุงได้อย่างเหมาะสมมากข้ึน นอกจากน้ันยังมีการน�ำ Artificial Intelligence เข้ามาใช้เพื่อหา
ส่วนผสมของวสั ดุใหม่ ๆ ทีย่ งั ไมเ่ คยมกี ารค้นพบอกี ดว้ ย

อ. ดร. เชษฐา พันธ์เครือบุตร
ภาควชิ าวศิ วกรรมโลหการ

Programming เป็นเคร่ืองมือท่ีใช้ในการสร้าง ค�ำนวณและวิเคราะห์ผลของ
แบบจ�ำลองทางวิศวกรรมของระบบทางกล ความร้อน ของแข็งและของไหล
นอกจากแบบจ�ำลองแล้ว ยังใช้ในการควบคุมระบบทางกลต่าง ๆ เช่น ระบบ
อัตโนมัตหิ นุ่ ยนต์ เปน็ ตน้

อ. ดร. สรุ ัฐ ขวญั เมอื ง
ภาควชิ าวศิ วกรรมเครอื่ งกล

00 : Programming in Engineering 3

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

ผศ. ดร. อนุรักษ์ ศรอี ริยวัฒน์
ภาควิชาวิศวกรรมแหลง่ น้ำ�

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

ส�ำหรับงานวิศวกรรมเหมืองแร่มีการน�ำ Programming ไปใช้ในการออกแบบ
การท�ำเหมืองแร่ เช่น การเปิดหน้าดินเพ่ือน�ำแร่ออกมา การค�ำนวณเสถียรภาพของ
ชนั้ ดนิ การขนสง่ วตั ถดุ บิ จากบรเิ วณหนา้ เหมอื ง การใชธ้ รณสี ถติ เิ พอื่ ประกอบการคำ� นวณ
ปริมาณส�ำรอง เปน็ ต้น

ผศ. ดร. จริ วัฒน์ ชีวรุ่งโรจน์
ภาควชิ าวศิ วกรรมเหมืองแร่และปโิ ตรเลยี ม

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

ผศ. ดร. ณฐั วฒุ ิ หนไู พโรจน์
ภาควิชาวิศวกรรมคอมพิวเตอร์

4 00 : Programming in Engineering

01 : Data Type, Variable and Expression

สรุปเนื้อหา

ตวั แปรเป็นทเี่ ก็บขอ้ มลู ในโปรแกรม ต้องมีช่ือกำ� กบั
• ชือ่ ตัวแปรประกอบด้วยตวั อกั ษร ตัวเลข หรือเครื่องหมายขีดเส้นใต้ _ ตัวองั กฤษใหญไ่ มเ่ หมอื นตัวเล็ก
ห้ามข้นึ ตน้ ช่ือด้วยตวั เลข
• อยา่ ตัง้ ชื่อตัวแปรซำ�้ กับชอ่ื ฟังกช์ นั ใน Python เชน่ int, str, max, sum, abs, ...
(ไม่หา้ มถ้าจะต้งั ซ�้ำ แตไ่ ม่ควรทำ� อย่างยง่ิ )

ขอ้ มูลใน Python ทนี่ ำ� มาประมวลผลมหี ลายประเภท ทีเ่ ราจะศกึ ษาในบทนีม้ ดี งั ต่อไปนี้

int จ�ำนวนเตม็ -10 (Python ห้ามไมใ่ ห้เขียน 0 นำ� หน้าจำ� นวนเต็ม เชน่ 020)
5000011

float จ�ำนวนจริง 10.0 มคี ่าเทา่ กับ 1.23×1059
1.23e59

str ขอ้ ความ 'Programming is easy'
"Let's go shopping"

การใหค้ า่ กบั ตัวแปร

• a = b = c = 0.0 ให้ตัวแปร a b และ c เกบ็ จำ� นวนจริง 0.0

• a = 5; b = 6; a,b = b,a ตวั แปร a กบั ตวั แปร b สลับคา่ กัน ได้ a เก็บ 6 และ b เก็บ 5

• a = x ถ้า x ไม่เคยมีการให้ค่ามากอ่ น คำ� สง่ั นี้จะผิด เพราะไมร่ วู้ า่ x มคี ่าเท่าใด

ตัวด�ำเนินการ ลำ� ดับการท�ำงาน และการแปลงประเภทข้อมูล

• ตวั ดำ� เนินการ บวก (+), ลบ (-), คูณ (*), ยกกำ� ลัง (**), หาร (/), หารปัดเศษ (//), เศษจากการหาร (%)

• การดำ� เนนิ การระหว่างจ�ำนวนเต็มกบั จ�ำนวนจริงจะได้ผลเป็นจำ� นวนจรงิ (เชน่ 2 + 1.0 ได้ 3.0)

• // กบั จ�ำนวนลบ : 1//2 ได้ 0, (-1)//2 ได้ -1, 11//10 ได้ 1, (-11)//10 เหมอื น 11//-10 ได้ -2

• a = 3+97//2**3%8 a มีค่า 3+97//8%8 = 3+12%8 = 3+4 = 7

• a = 12//3/2+2**3**2 a มีค่า 12//3/2+2**9 = 12//3/2+512 = 4/2+512 = 2.0+512 = 514.0

• a += 2 ก็คือ a = a + 2, a //= 2 ก็คอื a = a // 2, a *= -1 ก็คอื a = a * -1

• ถา้ import math จะมีคา่ คงตัวและฟงั ก์ชันทางคณิตศาสตร์ให้ใชม้ ากมาย

o math.pi, math.e, math.sin(x), math.cos(x), math.sqrt(x), math.log(x,b), ...

• น�ำสตรงิ บวกกนั คอื น�ำสตรงิ มาตอ่ กัน เชน่ '12'+'23' คอื '1223'

• สตรงิ คณู กบั จำ� นวนเตม็ คอื นำ� สตรงิ นน้ั มาตอ่ กนั เปน็ จำ� นวนครง้ั เทา่ กบั คา่ ของจำ� นวนเตม็ นนั้ เชน่ '12'*3 คอื '121212'

• ฟงั กช์ ัน int, float และ str มีไวเ้ ปล่ยี นประเภทขอ้ มูล เชน่
o int('12') ได้ 12, float('1.2') ได้ 1.2, str(12//2) ได้ '6', str('Aa') ได้ 'Aa'

• ข้อควรระวงั : รคู้ วามแตกตา่ งของ / กับ // และศกึ ษาลำ� ดับการทำ� งานของ operator ใหด้ ี
ถา้ ไม่มน่ั ใจ ใสว่ งเล็บ เชน่ a/2*b เท่ากบั (a/2)*b แต่ a/(2*b) เทา่ กบั a/2/b

01 : Data Type, Variable and Expression 5

คำ� สง่ั การแสดงข้อมลู ทางจอภาพ

• print(a,b,c) นำ� คา่ ในตวั แปร a b และ c มาแสดงตอ่ กนั คน่ั ดว้ ยชอ่ งวา่ งบนบรรทดั เดยี วกนั

• print(str(a)+str(b)+str(c)) นำ� คา่ ในตวั แปร a b และ c มาเปลยี่ นเปน็ สตรงิ ตอ่ กนั แลว้ แสดงบนบรรทดั เดยี วกนั

คำ� สงั่ การอา่ นข้อมลู จากแปน้ พมิ พ์

• a = input() อา่ นขอ้ ความจากแป้นพิมพห์ นึ่งบรรทัด เกบ็ ใสต่ ัวแปร a (เปน็ สตรงิ )

• a = input().strip() อา่ นขอ้ ความจากแป้นพิมพ์หนงึ่ บรรทัด ตดั ชอ่ งว่างทางซ้ายและขวาออก
เกบ็ ใส่ตวั แปร a

• a = int(input()) อ่านจ�ำนวนเตม็ หนึง่ จำ� นวนจากแปน้ พิมพ์ เก็บใส่ตวั แปร a

• a = float(input()) อ่านจ�ำนวนจรงิ หนง่ึ จำ� นวนจากแป้นพิมพ์ เก็บใสต่ ัวแปร a

• ถา้ ต้องการอา่ นข้อมูลหลาย ๆ ตวั ทีผ่ ู้ใชป้ ้อนเข้ามาในบรรทัดเดยี วกนั โดยข้อมูลแตล่ ะตัวคน่ั ดว้ ยชอ่ งว่าง

o a,b,c = [e for e in input().split()] หรือ
a,b,c = input().split() อ่านสตริง 3 ตวั

o x,y = [int(e) for e in input().split()] อา่ นจ�ำนวนเต็ม 2 จำ� นวน

o a,b,c = [float(e) for e in input().split()] อา่ นจำ� นวนจริง 3 จำ� นวน

o หากจะอ่านจ�ำนวนจรงิ ตามด้วยจำ� นวนเต็ม กอ็ ่านเปน็ สตรงิ ก่อน โดยใช้ค�ำส่ัง f,n = input().split()
แล้วจึงคอ่ ยแปลงเป็นจ�ำนวนจริงกบั จำ� นวนเต็ม โดยใช้ค�ำสัง่ f = float(f); n = int(n)

*** ถา้ โจทย์บอกว่าข้อมูลทรี่ บั มาคน่ั ด้วยชอ่ งว่างในบรรทัดเดยี วกัน อยา่ ใช้ input().split(' ')

แต่ควรใช้ input().split() แทน

เรื่องผดิ บ่อย

รบั ขอ้ มูลจากแปน้ พมิ พแ์ ลว้ ลมื แปลง x = input()
เป็นจำ� นวน กอ่ นนำ� ไปค�ำนวณ
จ�ำล�ำดับการท�ำงานของตัวดำ� เนนิ การ y = x**2 + 7 ผิดเพราะ x เปน็ สตริง
+ - * / // % ** ผดิ
(** ทำ� ก่อน * / // % ทำ� กอ่ น + -) y = x / 2*a จะได้ y = (x/2)*a
y = x**1/3 ถา้ ตอ้ งการคำ� นวณ
ลืมใส่ * ส�ำหรับการคณู ตอ้ งเขยี น y = x/(2*a)
10e7 มีคา่ ไม่เท่ากับ 107 จะได้ (x**1)/3
1e3 ไมใ่ ช่จำ� นวนเตม็ 1000 ถ้าต้องการหารากทส่ี ามของ x
ต้องเขยี น y = x**(1/3)

y = 2x + 1 ต้องเขยี น y = 2*x + 1

10e7 มีคา่ เทา่ กบั 10×107 อยากได้ 107 ต้องเขยี น 1e7

1e3 มีคา่ เท่ากับ 1000.0 ดงั นน้ั 2345 % 1e2 ได้ 45.0

6 01 : Data Type, Variable and Expression

ส�ำหรับผู้ทีเ่ คยเรยี นภาษา C ++k คอื การตดิ บวกคา่ ใน k สองคร้งั จงึ มคี ่าเทา่ กบั k ค่าใน k ไมเ่ ปลย่ี น
อย่าเผลอเขยี นค�ำสง่ั ++k หรือ --k --k คอื การตดิ ลบค่าใน k สองคร้ัง จึงมคี ่าเทา่ กบั k ค่าใน k ไมเ่ ปลย่ี น
ลมื import math เมอื่ ใช้ฟังก์ชนั ของ
y = (-b+math.sqrt(b*b-4*a*c)) / (2*a)
math
จะฟ้องว่าไม่ร้จู กั math
ใสว่ งเลบ็ เปดิ กับปิดไม่ครบ
import math วงเลบ็ ปดิ มนี ้อยไป
สะกดช่ือตัวแปรผดิ หรอื ผิดเรอ่ื งการใช้
ตัวอังกฤษเลก็ กับใหญ่ y = 2+(x*abs(y-z/2)
ตงั้ ชือ่ ตัวแปรซ�้ำกับชื่อฟงั ก์ชนั มาตรฐาน y = -b+math.sqrt(b*b-4*a*c)) / (2*a) ขาดวงเลบ็ เปดิ
ใน IDLE ตัวแปรที่ถกู ต้องมีสีดำ� เป็นสีอ่นื จะ
สร้างปญั หา count = 0 Count กับ count เปน็ คนละตวั
Count = count + 1
น�ำข้อมลู ทีไ่ ม่ใชส่ ตรงิ มาบวกกับสตรงิ
int = 27

print( int ) ได้ 27
แต่หลงั จากนี้ ใช้คำ� ส่ัง a = int(input())
เพอ่ื อา่ นขอ้ มูลจากแปน้ พมิ พ์ แล้วแปลงเปน็ จ�ำนวนเต็มไม่ไดแ้ ลว้
(IDLE แสดง int ด้วยสมี ว่ ง)

import math

a = math.pi * r**2 ผิด

print('area = '+a)
print('area = '+str(a)) แปลง a เปน็ สตริงกอ่ น
แบบนี้ print แปลง a เปน็ สตริงให้
print('area =',a)

แบบฝกึ หัด Code

Problem
Input: รบั จ�ำนวนเตม็ 3 จำ� นวนจากแปน้ พมิ พ์
(บรรทัดละจำ� นวน) เก็บในตวั แปร h, m และ s ซึง่ แทนจำ� นวน
ชั่วโมง นาที และ วนิ าที
Process: คำ� นวณจ�ำนวนวนิ าทรี วมท่ีคิดจาก h, m และ s
Output: จ�ำนวนวินาทรี วมทัง้ หมดท่ีคำ� นวณได้

Input: รบั จ�ำนวนจรงิ 1 จ�ำนวนจากแปน้ พมิ พ์ เก็บใน x
Process: ค�ำนวณ
Output: คา่ y ทคี่ �ำนวณได้

01 : Data Type, Variable and Expression 7

Problem Code
Input: รับจำ� นวนจรงิ 1 จำ� นวนจากแปน้ พิมพ์ เก็บใน a
Process: ให้ x มีคา่ เป็น 1 จากนน้ั ท�ำค�ำสงั่
x = (x + a/x)/2 จำ� นวน 4 ครงั้
Output: คา่ x ทีไ่ ด้จากการทำ� งานขา้ งบนนี้

Input: มี 2 บรรทัด แตล่ ะบรรทดั มจี �ำนวนจรงิ 3 จำ� นวน คัน่ ดว้ ย
ชอ่ งวา่ ง อา่ นบรรทดั แรกเกบ็ ใน v1, v2, v3 แทนเวกเตอร์
v = (v1, v2, v3) อ่านบรรทดั ท่สี องเก็บใส่ u1, u2, u3 แทน
เวกเตอร์ u = (u1, u2, u3)
Process: ค�ำนวณ dot product ของเวกเตอร์ v กับ u
Output: ค่า dot product ท่ีคำ� นวณได้

Input: อา่ นจ�ำนวนจรงิ 4 จำ� นวนค่นั ดว้ ยช่องวา่ งจากแป้นพมิ พ์
เกบ็ ใน x1, y1, x2 และ y2 ค่าของ x1, y1 แทนพกิ ดั ของจดุ ที่ 1
และ x2, y2 แทนพิกดั ของจดุ ที่ 2 บนระนาบ x-y
Process: คำ� นวณระยะหา่ งส้ันสดุ ระหวา่ งจดุ ท้ังสอง
Output: ระยะห่างท่ีหาได้

Input: อา่ นพกิ ัดเชิงขัว้ ของจดุ บนระนาบ ซง่ึ เปน็ จำ� นวนจริง
2 จำ� นวนคั่นด้วยชอ่ งวา่ ง เกบ็ ในตวั แปร r และ theta
(เป็นเรเดียน)
Process: ค�ำนวณคา่ x และ y ซึง่ เปน็ พิกดั คารท์ ีเซียน
ของจุด (r, theta) ทอี่ ่านเขา้ มา
Output: ค่า x และ y (คนั่ ด้วยช่องว่าง)
Input: อ่านพิกดั คารท์ เี ซียนของจดุ บนระนาบ ซ่ึงเป็นจำ� นวนจรงิ
2 จำ� นวนคั่นดว้ ยช่องวา่ ง เก็บในตวั แปร x และ y
Process: ค�ำนวณค่า r และ theta (เป็นเรเดียน) ซงึ่ เปน็
พกิ ัดเชิงข้วั ของจดุ (x, y)
Output: ค่า r และ theta (ค่นั ดว้ ยชอ่ งว่าง)

8 01 : Data Type, Variable and Expression

Problem Code
Input: อ่านจำ� นวนจริง 5 จ�ำนวน คน่ั ด้วยชอ่ งวา่ ง
Process: คำ� นวณค่าเฉล่ียของจำ� นวนทง้ั ห้า
Output: คา่ เฉลยี่ ท่หี าได้

Input: รับขอ้ มลู 3 ตวั a, b กับ c ค่ันดว้ ยช่องวา่ ง
a และ b เป็นตัวอกั ษร ส่วน c เป็นจ�ำนวนเตม็
Output: ตวั อักษรใน a ตอ่ กับตวั อกั ษรใน b ต่อกับ
คา่ ของจ�ำนวนเต็มใน c ต่อกับ ชุดของตัวอักษรใน a ต่อกบั ตัวอกั ษร
ใน b ท่ีซ้ำ� ๆ กนั เปน็ จำ� นวน c ชุด
เช่นผู้ใช้ปอ้ น v o 5 จะแสดง vo5vovovovovo

ตวั อย่างการแก้โจทย์ปัญหา
Triangle

จงเขยี นโปรแกรมคำ� นวณพนื้ ทส่ี ามเหลย่ี มทท่ี ราบความยาวดา้ นสองดา้ น (a กบั b) และมมุ ระหวา่ งดา้ นสองดา้ นนน้ั (C) จากสตู ร

► ข้อมูลน�ำเข้า

บรรทดั แรกคือความยาวด้าน a (หนว่ ยเปน็ เซนติเมตร)
บรรทัดทส่ี องคอื ความยาวดา้ น b (หน่วยเป็นเซนตเิ มตร)
บรรทดั ท่สี ามคอื มุมระหวา่ งดา้ นทง้ั สอง C (หนว่ ยเป็นองศา)
► ข้อมูลสง่ ออก
พ้ืนท่ีของสามเหลีย่ มทีร่ บั เป็นข้อมูลนำ� เขา้ (หน่วยเป็นตารางเซนติเมตร) แสดงในรปู แบบที่แสดงตามตัวอย่างดา้ นลา่ ง
► ตัวอย่าง

Input (จากแป้นพิมพ์) Output (ทางจอภาพ)

10.0 area = 50.0 (sq cm)
10
90.0 area = 77.162458338772 (sq cm)

1e1
2e1
50.5

01 : Data Type, Variable and Expression 9

ตวั อยา่ งการเขียนโปรแกรม คำ� อธบิ าย
โปรแกรม Invalid Syntax ผิดทีบ่ รรทดั ที่ 4
ลมื เขียน * --> เปล่ยี นเปน็ area = 1/2*a*b*sin C
a = input()
b = input() Invalid Syntax ผิดทบ่ี รรทดั ท่ี 4
C = input() ลืมใส่วงเลบ็ --> เปล่ยี นเปน็ area = 1/2*a*b*sin(C)
area = 1/2 a*b*sin C
print(area) สง่ั run, ใสข่ ้อมลู , ผิดที่บรรทดั ท่ี 4
a = input()
b = input() TypeError: can't multiply sequence by non-int of
C = input() type 'float'
area = 1/2*a*b*sin C
print(area) แปลวา่ ระบบไมส่ ามารถคณู ได้ เพราะ a เป็นสตรงิ (b และ C ดว้ ย)
a = input() จากบรรทดั ท่ี 1, 2 และ 3 จงึ ตอ้ งแปลงให้เป็นจ�ำนวนก่อน ในโจทย์
b = input() ไมไ่ ดบ้ อกว่าความยาวด้านและมมุ เป็น int หรอื float แตถ่ า้ ดูตวั อยา่ ง
C = input() พบว่าใส่ได้ท้งั int และ float จงึ ต้องแปลงสตรงิ จาก input()
area = 1/2*a*b*sin(C) ให้เปน็ float
print(area) Invalid Syntax บอกวา่ ผิดบรรทดั ที่ 2
ระบบบอกผดิ บรรทัดใด ใหด้ บู รรทดั ก่อนหนา้ ดว้ ย เพราะผดิ ก่อนหน้า
a = float(input() บางทีลามมาบรรทัดถัดมา ในทน่ี ้ี เห็นไดว้ ่า ลืมใสว่ งเล็บปิด
b = float(input())
C = float(input()) ส่งั run, ใส่ข้อมลู , ผดิ ท่บี รรทดั ที่ 4
area = 1/2*a*b*sin(C)
print(area) NameError: name 'sin' is not defined
a = float(input())
b = float(input()) แปลวา่ ระบบไม่รู้จกั ค�ำว่า sin ก็เพราะวา่ ตอ้ งเขยี น math.sin
C = float(input())
area = 1/2*a*b*sin(C) สงั่ run, ใส่ขอ้ มลู , ผดิ ทบ่ี รรทัดที่ 4
print(area)
a = float(input()) NameError: name 'math' is not defined
b = float(input())
C = float(input()) แปลว่า ระบบไม่รู้จักค�ำว่า math กเ็ พราะว่าต้อง import math
area = 1/2*a*b*math.sin(C)
print(area)

10 01 : Data Type, Variable and Expression

โปรแกรม คำ� อธิบาย

import math สง่ั run, ใสข่ ้อมูลตามตัวอย่างแรก
a = float(input())
b = float(input()) 10
C = float(input()) 10
area = 1/2*a*b*math.sin(C) 90
print(area)
ไดผ้ ล
สามารถใช้ฟังก์ชนั
math.radians(d) ซ่ึงรบั d 44.699833180027895
เปน็ องศาไดผ้ ลเปน็ เรเดียน
ไม่ตรงกบั ทแ่ี สดง ต้องได้พ้ืนท่ี 50.0 ไดผ้ ลผิด ก็นา่ จะผดิ ที่การคำ� นวณ
import math ลองคำ� นวณเองดู
a = float(input())
b = float(input()) 1/2*10*10*math.sin(90) = 1/2*10*10*1
C = float(input())
CR = C*math.pi/180 ก็น่าจะได้ 50.0 แล้วทำ� ไมไมใ่ ช่ ไมใ่ กล้เคียงด้วย ตวั ท่ีนา่ สงสยั สดุ กน็ ่าจะ
area = 1/2*a*b*math.sin(CR) เปน็ math.sin(90) เมื่อเรยี กใชฟ้ ังกช์ ัน เราต้องเข้าใจกฎเกณฑข์ อง
print(area) การเรียกใช้ด้วย ลองค้น python math.sin ในเนต็ จะพบข้อความว่า

import math math.sin(x)
a = float(input()) Return the sine of x radians.
b = float(input())
C = float(input()) แสดงวา่ ตอ้ งแปลงองศาเปน็ เรเดยี นก่อนสง่ ไปให้ math.sin กต็ ้อง
CR = C*math.pi/180 คิดวิธีแปลง: 180 องศา เทา่ กับ , C องศาก็เทา่ กับ C* /180
area = 1/2*a*b*math.sin(CR) แลว้ จะใชค้ ่า เทา่ ไรดี จะใช้ C*(22/7)/180 หรือ
print("area =",area, "(sq cm.)") C*3.14159/180 แตน่ ่าจะรวู้ ่า ควรใช้ math.pi เพราะระบบเกบ็ คา่
import math
a = float(input()) ทล่ี ะเอยี ดมากไวท้ น่ี ี่ ดังน้ันใช้ CR = C*math.pi/180 เปลีย่ นเป็น
b = float(input()) เรเดยี นก่อนแล้วค่อยไปใช้
C = float(input())
CR = C*math.pi/180 สั่ง run, ใสข่ ้อมูลตามตัวอย่างแรก, ได้ 50.0 ถกู ต้อง run อีกครงั้ ,
area = 1/2*a*b*math.sin(CR) ใส่ขอ้ มลู ของอีกตวั อยา่ ง
print("area =",area, "(sq cm)")
1e1
2e1
50.5

ได้ 77.162458338772 ก็ถกู ตอ้ ง
submit เข้า Grader ตรวจใหค้ ะแนน --> ได้ 0, ทำ� ไม ????
คำ� นวณพืน้ ทไี่ ด้ถกู ตอ้ ง แต่แสดงผลไมเ่ หมือนกับท่โี จทยบ์ อก ดทู ตี่ วั อย่าง

area = 50.0 (sq cm)

แตโ่ ปรแกรมแสดงแคพ่ ื้นท่ี แก้ไขบรรทัดสดุ ท้ายให้ตรงตามตัวอย่าง

สั่ง run, ใส่ขอ้ มลู ตามตวั อย่างแรก, ได้

area = 50.0 (sq cm.)

มน่ั ใจว่าถกู , submit เขา้ Grader, แตต่ รวจแล้วได้ 0, ท�ำไม ????
ใจเยน็ ๆ ดใู ห้มั่นใจว่าเหมือนทโ่ี จทยต์ ้องการไหม ?

area = 50.0 (sq cm)

พบว่ามีจุดเกินมาหน่งึ ตัว ก็ลบจุดทง้ิ

สั่ง run, ใสข่ อ้ มูลตามตัวอย่างแรก, ได้

area = 50.0 (sq cm)

มั่นใจว่าถูก ชัวร์, submit เข้า Grader ตรวจ ได้ 100 เต็ม

01 : Data Type, Variable and Expression 11

ตัวอย่างโจทย์ปัญหา

แปลงอณุ หภมู ิ

สตู รในการเปลีย่ นคา่ จากองศาเซลเซียสไปเปน็ องศาฟาเรนไฮต์และเคลวนิ มีดังน้ี

ให้อ่านข้อมูลอุณหภูมิ (หน่วยเป็นองศาเซลเซียส) จากนั้นค�ำนวณหาค่าองศาฟาเรนไฮต์และเคลวินด้วยสมการด้านบน
เมอ่ื C คอื องศาเซลเซียส F คือ องศาฟาเรนไฮต์ และ K คอื เคลวิน
► ขอ้ มลู นำ� เข้า
หนึง่ บรรทดั ประกอบด้วยค่าองศาเซลเซียสเป็นจ�ำนวนจริง
► ข้อมูลส่งออก
มีหนึง่ บรรทดั ประกอบด้วยตวั เลขจำ� นวนจริงสองจำ� นวน ตวั แรกเป็นองศาฟาเรนไฮต์ และตัวทส่ี องเป็นเคลวนิ
► ตวั อยา่ ง

Input (จากแป้นพมิ พ์) Output (ทางจอภาพ)

39.85 103.73 313.0

12 01 : Data Type, Variable and Expression

Triangle 2

จงเขียนโปรแกรมค�ำนวณหาความยาวของด้านที่สามของสามเหล่ียม เมื่อเราทราบความยาวด้านสองด้าน (a กับ b)
และมุมระหว่างด้านสองดา้ นนน้ั (C) ซง่ึ คำ� นวณได้จาก Law of Cosines

► ข้อมลู นำ� เขา้
บรรทดั แรกคือความยาวด้าน a (หนว่ ยเปน็ เซนติเมตร)
บรรทดั ทีส่ องคอื ความยาวดา้ น b (หนว่ ยเป็นเซนติเมตร)
บรรทดั ท่สี ามคอื มมุ ระหว่างดา้ นทั้งสอง C (หน่วยเปน็ องศา)
► ข้อมลู สง่ ออก
ความยาวดา้ นทีส่ ามของสามเหล่ยี มทร่ี ับเป็นขอ้ มลู นำ� เขา้ (หน่วยเป็นเซนตเิ มตร) แสดงในรปู แบบทีแ่ สดงตามตวั อย่างดา้ นล่าง
► ตวั อย่าง

Input (จากแป้นพิมพ์) Output (ทางจอภาพ)

3 c = 5.0 cm.
4
90

7.0 c = 25.0 cm.
24.0
90.0

10 c = 9.999999999999998 cm.
10
60

3 c = 2.9999999999999996 cm.
3
60

ข้นั ตอนการทำ� งานของโปรแกรม

1. รับข้อมลู จากแป้นพมิ พ์ เปลย่ี นเป็นจ�ำนวนจรงิ แล้วเกบ็ ในตัวแปร a
2. รับขอ้ มูลจากแปน้ พิมพ์ เปล่ียนเป็นจ�ำนวนจรงิ แล้วเก็บในตวั แปร b
3. รบั ขอ้ มูลจากแปน้ พมิ พ์ เปลี่ยนเป็นจำ� นวนจรงิ แล้วเก็บในตวั แปร D
4. น�ำ D ท่ีมหี นว่ ยเป็นองศา แปลงเปน็ เรเดยี น เกบ็ ในตัวแปร C
5. ค�ำนวณความยาวของดา้ นท่สี าม ดว้ ยสตู ร
6. แสดงความยาวด้านที่คำ� นวณได้ทางจอภาพในรูปแบบท่แี สดงตามตวั อยา่ ง

01 : Data Type, Variable and Expression 13

ISBN

ISBN (International Standard Book Number) เป็นตวั เลขจ�ำนวน 10-13 หลกั ท่ีใชร้ ะบหุ นงั สอื แต่ละเล่ม โจทยข์ อ้ น้ี
สนใจเฉพาะ ISBN ทมี่ ี 10 หลกั การตรวจสอบความถกู ต้องของ ISBN จะใชต้ ัวเลขหลักสุดท้ายเปน็ check digit ในการตรวจสอบ
ความถกู ตอ้ งของตวั เลขอ่นื ๆ โดยวิธีท่ีใชต้ รวจสอบคือ

10n1 + 9n2 + 8n3 + 7n4 + 6n5 + 5n6 + 4n7 + 3n8 + 2n9 + n10 จะต้องหารด้วย 11 ลงตวั
ตัวอย่างเชน่ หากตวั เลข 9 หลักแรกคือ 020131452 จะได้ว่า

10*0 + 9*2 + 8*0 + 7*1 + 6*3 + 5*1 + 4*4 + 3*5 + 2*2 + n10 = 83 + n10 ตอ้ งหารด้วย 11 ลงตัว
จะได้วา่ n10 ต้องมีค่าเทา่ กับ 5 เพ่ือให้ผลรวมเปน็ 88 ซง่ึ หารดว้ ย 11 ลงตวั และได้ ISBN คือ 0201314525
หากกำ� หนดตวั เลขหลกั ท่ี 1-9 มาให้ จงคำ� นวณหา ISBN ท้ังสบิ หลกั

► ขอ้ มลู น�ำเขา้

มบี รรทดั เดียว ระบุ ISBN หลกั ท่ี 1-9

► ข้อมลู ส่งออก

มีบรรทัดเดยี ว แสดง ISBN ทงั้ สบิ หลกั รับประกนั วา่ กรณีทดสอบจะไมม่ กี รณีที่ n10 เท่ากบั 10
► ตัวอยา่ ง

Input (จากแปน้ พิมพ์) Output (ทางจอภาพ)

020131452 0201314525

100000000 1000000001

14 01 : Data Type, Variable and Expression

02 : Selection ( if-elif-else ) Code

สรุปเนอื้ หา if C1 :
P1
Flowchart

if C1 : if not C1 :
pass P1

else :
P1

if C1 :
P1

else :
P2

if C1 :
P1

elif C2 :
P2

elif C3 :
P3

else :
P4

02 : Selection ( if-elif-else ) 15

Flowchart Code

if C1 :
P1

if C2 :
P2

if C3 :
P3

else :
P4

if C1 :
if C2 :
P2
if C3 :
P3
else :
P4

else :
P1
if C4 :
P5
elif C5 :
P6
P7

ตัวอย่างเงื่อนไขท่ีเขียนแทนกันได้

not(x == 0) x != 0
not(x==2 or x==4)
not(x<2 and y>=4) x!=2 and x!=4
3<=x and x<9
a < b and b < c and c < d and d <= e x>=2 or y<4
c=='a' or c=='e' or c=='i' or c=='o' or c=='u'
3 <= x < 9

a < b < c < d <= e

c in ('a', 'e', 'i', 'o', 'u') หรือ

c in 'aeiou'

16 02 : Selection ( if-elif-else )

if condition : t = value1 if condition else value2
t = value1
ใช้เฉพาะกรณีการให้คา่ กบั ตัวแปร ถา้ เงอื่ นไขเปน็ จริงให้ค่าหน่งึ
else : เป็นเทจ็ ให้อีกคา่ หนึง่
t = value2
t = True if s > a+b%7 else False
if s > a + b % 7 :
t = True หรือเขยี นสั้น ๆ

else : t = (s > a + b % 7)
t = False

การเปรยี บเทยี บทีใ่ ช้บอ่ ย

if a%2 == 0 : a เปน็ เลขค่หู รือไม่
a หารดว้ ย 100 ลงตวั หรือไม่
if a%100 == 0 : เลขหลักรอ้ ยของ a คอื 9 หรอื ไม่ หรือ
กเ็ หมอื นกัน
if (a//100)%10 == 9 : x มีคา่ ในช่วงต้ังแต่ a ถงึ b หรอื ไม่

if (a%1000)//100 == 9:

if a <= x <= b :

if abs(a-b) <= max(abs(a),abs(b))*1e-10 :
ตรวจว่าจ�ำนวนจรงิ a มคี า่ ใกลก้ ับ b หรอื ไม่ โดยตรวจว่า a กบั b ต่างกัน
เชงิ สมั พัทธ์ไม่เกิน 10-10 หรือไม่

mx = a

if b > mx : mx = b

if c > mx : mx = c mx เกบ็ คา่ มากสุดของ a,b,c และ d หรือเขียนโดยใชฟ้ ังกช์ นั max
max(a,b,c,d) หาค่ามากสดุ ของ a,b,c และ d
if d > mx : mx = d

mx = max(a,b,c,d)

เรอ่ื งผิดบ่อย if x = 0 : ตอ้ งเขียน if x == 0 :
แบบนไ้ี ดจ้ รงิ ตลอด
ต้องการเปรียบเทียบความเท่ากนั แต่ใช้ = if x != 2 or x != 3 : แบบนี้ไดเ้ ทจ็ ตลอด
ใช้ and กบั or ผิดความหมาย if x <= 3 and x == 4 :
ท�ำใหไ้ ดค้ า่ จริงหรือเทจ็ ตลอด
เยอ้ื งค�ำส่งั ภายใน if หรอื else ไมต่ รงกนั if x > 0 :
a = math.sqrt(x)
ใช้ tab ผสมกับ blank ในการเยือ้ งคำ� สงั่
print(a) ทุกบรรทัดใน if เยอ้ื งบรรทัดไม่ตรงกนั ผิด

tab ผสมกับ blank ก็อาจดวู า่ เย้ืองตรงกัน แตผ่ ิด (IDLE จดั การเร่ือง
tab กับ blank ให้ จึงไมผ่ ิด แต่ถ้าใช้ notepad จะผดิ )

02 : Selection ( if-elif-else ) 17

เข้าใจผิดเก่ยี วกบั การเปรียบเทยี บสตรงิ 'abcdegh' < 'b' เป็นจริง
สตรงิ เปรียบเทยี บกนั ตามลำ� ดับแบบท่เี ขยี นใน เปน็ จรงิ
พจนานกุ รม โดย '1234' < '9' ได้ 1234
ได้ 9
'0' < '9' < 'A' < 'Z' < 'a' < 'z' สมมติว่า ได้ True ถ้า x = '1234', y = '9'
ได้ False ถ้า x = 1234, y = 9
print(x)

print(y)

print( x < y )

print( x < y )

เร่อื งที่ปรบั ปรงุ ได้

ค�ำส่ังท่ีเหมือนกนั ทั้งในกลมุ่ หลงั if และ if d > 0 : a=9
กลมุ่ หลงั else อาจแยกออกมาข้างนอกก็ได้ a=9 if d > 0:
การใช้ if-elif-else ท่ีตรวจคา่ ว่าตกอยใู่ น c += d - 5
ช่วงใด สามารถลดการเปรยี บเทียบลงได้ ถา้ จัด e=c c += d - 5
ลำ� ดับการเปรยี บเทียบให้เหมาะสม else:
else:
a=9 c -= d + 7
c -= d + 7 e=c
e=c if s >= 80 :

if s >= 80 : g = 'A'
g = 'A' elif s >= 70 :

elif 70 <= s < 80 : g = 'B'
g = 'B' elif s >= 60 :

elif 60 <= s < 70 : g = 'C'
g = 'C' elif s >= 50 :

elif 50 <= s < 60 : g = 'D'
g = 'D' else :

else : g = 'F'
g = 'F'

18 02 : Selection ( if-elif-else )

แบบฝกึ หดั Code

Problem
Input: รับจ�ำนวนเตม็ 3 จ�ำนวน ค่ันดว้ ยชอ่ งวา่ ง
Process: หามธั ยฐานของจ�ำนวนทัง้ 3
Output: มัธยฐานท่ีหาได้

Input: รับข้อมูลของวงกลม 2 วง บรรทดั ละหน่ึงวง
ประกอบดว้ ยจำ� นวนจริง 3 จำ� นวนคัน่ ด้วยชอ่ งว่าง แทน
พิกัด x กบั y ของจุดศูนยก์ ลาง และรัศมีของวงกลม
Process: ตรวจวา่ วงกลมสองวงทร่ี ับมาทับกนั หรือแตะกัน
หรอื ไม่
Output: แสดงค�ำว่า touch เม่อื ขอบของท้งั สองวงแตะกัน
พอดี แสดงค�ำวา่ overlap เมอ่ื สองวงทับกัน ถ้าไมแ่ ตะ
หรือทับ ใหแ้ สดงคำ� ว่า free
Input: รับจำ� นวนจรงิ 2 จ�ำนวน ค่ันด้วยชอ่ งว่าง แทนพิกดั
(x, y) บนระนาบสองมติ ิ
Process: ตรวจวา่ พกิ ัด (x, y) อยูบ่ รเิ วณใดในระนาบ
Output: ต�ำแหนง่ ของพกิ ัด (x, y) ว่า อยใู่ นจตุภาคใด
หรืออยู่บนแกน x หรอื y หรืออยูท่ ่ีจุดก�ำเนิด
Input: รับจ�ำนวนเตม็ 5 จำ� นวน ค่นั ดว้ ยช่องวา่ ง
Process: ตรวจว่าลำ� ดับจากซา้ ยไปขวาของจ�ำนวนทรี่ ับมา
เรียงจากนอ้ ยไปมากหรอื ไม่
Output: ผลการตรวจว่า True หรอื False

02 : Selection ( if-elif-else ) 19

Problem Code
Input: รับจ�ำนวนเต็ม 4 จ�ำนวน คัน่ ดว้ ยช่องวา่ ง
Process: หาผลรวมของจำ� นวนท่รี บั มา โดยไม่รวมจ�ำนวนที่
มากสุดหนง่ึ จ�ำนวน และจ�ำนวนทนี่ อ้ ยสดุ หน่ึงจำ� นวน
Output: ผลรวมทีห่ าได้

Input: รบั จ�ำนวนเตม็ หน่งึ จำ� นวนเก็บในตวั แปร a
Process: ตรวจว่ามีจำ� นวนเตม็ x ทีค่ ่า x3 เท่ากับ a หรือไม่
Output: ถ้ามี แสดงค่าของ x ถา้ ไม่มี แสดง Not Found

Input: รับจำ� นวนเตม็ แทนรอบอก (หนว่ ยเปน็ น้วิ )
Process: หาขนาดของเสอื้ ยดื โปโลตามรอบอกดงั นี้
น้อยกวา่ 37 น้ิว ขนาด XS
ตง้ั แต่ 37 แตไ่ มถ่ ึง 41 นว้ิ ขนาด S
ตัง้ แต่ 41 แต่ไมถ่ ึง 43 น้วิ ขนาด M
ตั้งแต่ 43 แต่ไม่ถงึ 46 นว้ิ ขนาด L
ตงั้ แต่ 46 นวิ้ เปน็ ต้นไป ขนาด XL
Output: ขนาดเส้ือโปโลตามรอบอกที่ได้รบั

20 02 : Selection ( if-elif-else )

ตวั อยา่ งการแก้โจทย์ปัญหา

a

สลากกนิ แบง่

หากเราซอื้ สลากกนิ แบง่ เรยี งหมายเลขตงั้ แตห่ มายเลข n1 ตอ่ เนอ่ื งไปจนถงึ หมายเลข n2 (เชน่ หมายเลข 10300 ถงึ 13999)
และงวดน้ีรางวัลที่ 1 คือหมายเลข p1 เลขท้ายสองตัวคือหมายเลข p2 และ เลขท้ายสามตัวคือหมายเลข p3 เราจะได้รางวัล
รวมเปน็ เงินเท่าไร
ก�ำหนดให้สลากกินแบ่งที่ขายน้ีเป็นรุ่นพิเศษ เป็นเลข 5 หลัก รางวัลที่หน่ึง 10,000 บาท หน่ึงรางวัล รางวัลเลขท้าย
สองตวั หน่ึงหมายเลข 25 บาท และรางวลั เลขทา้ ยสามตัวหนึ่งหมายเลข 100 บาท
► ข้อมูลนำ� เขา้
หน่ึงบรรทัดประกอบด้วยจำ� นวนเต็ม 5 จำ� นวน p1 p2 p3 n1 n2 คัน่ ด้วยช่องวา่ ง
► ขอ้ มูลสง่ ออก
เงนิ รางวลั รวมทไี่ ด้รับ
► ตวั อยา่ ง

Input (จากแป้นพมิ พ์) Output (ทางจอภาพ)

01234 11 811 01000 01250 10075

99999 99 999 99950 99999 10125

19999 13 001 09015 13000 1275

ตวั อยา่ งการเขยี นโปรแกรม ค�ำอธบิ าย
โปรแกรม บรรทดั แรกรับข้อมลู ใสต่ วั แปร p1, p2, p3, n1 และ
n2 ให้ตวั แปร s เก็บเงนิ รางวัลรวม เรมิ่ ด้วยการตรวจว่า
p1,p2,p3,n1,n2 = \ หมายเลขของรางวัลท่ี 1 อยู่ในช่วงหมายเลขท่ซี ้อื หรอื ไม่
[int(e) for e in input().split()] (n1 <= p1 <= n2) ถ้าใชก่ เ็ พ่มิ เงินรางวัล 10,000 บาท
ตามดว้ ยการตรวจรางวลั เลขทา้ ยสองตวั แล้วก็สามตวั
s=0 ในลกั ษณะเดยี วกัน
if n1 <= p1 <= n2 : ส่งั run, ใสข่ อ้ มลู ตามตัวอยา่ ง
01234 11 811 01000 01250, ได้ 10000 บาท
s += 10000 ไมต่ รงตามตวั อยา่ ง ไดแ้ คร่ างวลั ทห่ี นงึ่ เลขทา้ ยตรวจไมพ่ บ
if n1 <= p2 <= n2 :

s += 25
if n1 <= p3 <= n2 :

s += 100
print(s)

02 : Selection ( if-elif-else ) 21

โปรแกรม ค�ำอธบิ าย

p1,p2,p3,n1,n2 = \ การเขยี นโปรแกรมทมี่ หี ลาย ๆ กรณี ควรแยกทดสอบ
[int(e) for e in input().split()] หากเขยี นรวดเดยี ว จะหาทผี่ ดิ ลำ� บาก ใจเยน็ ๆ
ขอเขยี นและทดสอบกรณรี างวลั ทหี่ นงึ่ กอ่ น
s=0 สงั่ run, ใสข่ อ้ มลู 12345 00 000 12000 13000
if n1 <= p1 <= n2 : ได้ 10000 ถกู ตอ้ ง (ทดสอบกรณอี ยรู่ ะหวา่ ง)
สงั่ run, ใสข่ อ้ มลู 12345 00 000 12345 13000
s += 10000 ได้ 10000 ถกู ตอ้ ง (ทดสอบกรณอี ยทู่ ข่ี อบลา่ ง)
print(s) สงั่ run, ใสข่ อ้ มลู 12345 00 000 12000 12345
ได้ 10000 ถกู ตอ้ ง (ทดสอบกรณอี ยทู่ ข่ี อบบน)
p1,p2,p3,n1,n2 = \ สง่ั run, ใสข่ อ้ มลู 12345 00 000 12345 12345
[int(e) for e in input().split()] ได้ 10000 ถกู ตอ้ ง (ทดสอบกรณแี คใ่ บเดยี วและถกู รางวลั )
สง่ั run, ใสข่ อ้ มลู 12345 00 000 12346 14000
s=0 ได้ 0 ถกู ตอ้ ง (ทดสอบกรณอี ยนู่ อกชว่ งทางซา้ ย)
#if n1 <= p1 <= n2 : สงั่ run, ใสข่ อ้ มลู 12345 00 000 12000 12344
# s += 10000 ได้ 0 ถกู ตอ้ ง (ทดสอบกรณอี ยนู่ อกชว่ งทางขวา)
if n1%100 <= p2 <= n2%100 : สรปุ วา่ กรณรี างวลั ทหี่ นง่ึ ถกู ตอ้ ง

s += 25 คราวนี้สนใจกรณเี ลขท้ายสองตัว จะ comment ค�ำสั่ง
print(s) ตรวจรางวัลที่หนึ่งออก ถ้ากลับไปดูโปรแกรมแรกที่เขยี น
ค�ำสั่ง if n1 <= p2 <= n2 ตรวจเลขท้ายไม่ครบ
ทุกกรณี เชน่ ซอ้ื หมายเลข 10000 ถงึ 10099 เลขทา้ ย
p2 = 50 การทดสอบ n1 <= p2 <= n2 เปน็ เท็จ
แตค่ วามจริงแลว้ ถกู เลขทา้ ยสองตวั จงึ ตอ้ งเปลี่ยนเปน็
ทดสอบเฉพาะสองหลักขวาเทา่ นั้น ด้วยค�ำส่ัง

if n1%100 <= p2 <= n2%100

สั่ง run, ใส่ 00000 50 000 10000 10099
ได้ 25 ถูกตอ้ ง
สง่ั run, ใส่ 00000 50 000 10000 10199
ได้ 25 ผิด นา่ จะได้ 50
ส่ัง run, ใส่ 00000 50 000 10000 10299
ได้ 25 ผิด น่าจะได้ 75

22 02 : Selection ( if-elif-else )

โปรแกรม คำ� อธบิ าย

p1,p2,p3,n1,n2 = \ คำ� สงั่
[int(e) for e in input().split()]
if n1%100 <= p2 <= n2%100 : s += 25
s=0
#if n1 <= p1 <= n2 : ใช้ไดเ้ ฉพาะ กรณที ี่ 3 หลักแรกของ n1 และ n2 เทา่ กัน
# s += 10000 เทา่ นัน้ (เมื่อ n//100 มคี า่ เทา่ กบั n2//100)
if n1//100 == n2//100 : จงึ ขอจดั การเปน็ สองกรณีคอื
A. กรณี 3 หลักแรกเท่ากนั เช่น 10000 ถึง 10099
if n1%100 <= p2 <= n2%100 :
s += 25 ท�ำเหมอื นเดิม
B. กรณี 3 หลักแรกไม่เท่ากนั เช่น 10000 ถงึ 10299
else:
s += 25*(n2//100 - n1//100 + 1) เมื่อนำ� 102 - 100 = 2 แสดงว่า
ถูกเลขทา้ ยสองตัว 2 หมายเลข ก็คูณดว้ ย 25
print(s) ส่ัง run, ใส่ 00000 50 000 10000 10199
ได้ 50 ถูกต้อง
สัง่ run, ใส่ 00000 50 000 10000 10299
ได้ 75 ถูกต้อง
สง่ั run, ใส่ 00000 50 000 10060 10680
ได้ 175 ผดิ นา่ จะได้ 150

p1,p2,p3,n1,n2 = \ กรณขี อง p2 = 50, n1 = 10060 และ
[int(e) for e in input().split()] n2 = 10680 การตรวจสอบน่าจะซับซอ้ นเลก็ นอ้ ย
s=0 แบ่งเป็นสามช่วง คือ
#if n1 <= p1 <= n2 :
# s += 10000
if n1//100 == n2//100: ช่วงท่ี 1 ชว่ งที่ 2 ชว่ งท่ี 3
if n1%100 <= p2 <= n2%100 :
s += 25
else: 10060 - 10100 - 10600 -
10099 10599 10680

if n1%100 <= p2 : # ชว่ ง 1 3 หลกั ซ้าย 2 หลกั ขวา 3 หลกั ซา้ ย
s += 25 เท่ากนั 00 ถงึ 99 เทา่ กนั
ดูเฉพาะ ถกู เลขท้าย ดูเฉพาะ
if p2 <= n2%100 : # ช่วง 3 2 หลกั ขวา แน่นอน 2 หลกั ขวา
s += 25 ดูเฉพาะสาม
n1%100<=p2 หลักซา้ ย p2<=n2%100
s += 25*((n2//100-1) - \ # ช่วง 2
(n1//100+1) + 1)
print(s)

60<=50 เท็จ จาก 101 50<=80 จรงิ
ไมถ่ กู เลขท้าย ถึง 105 ถูก 1 ครัง้
ถูกรางวัล

(105-101+1)

คร้งั

สงั่ run, ใส่ 00000 50 000 10000 10299
ได้ 75 ถูกตอ้ ง
สั่ง run, ใส่ 00000 50 000 10060 10680
ได้ 150 ถูกต้อง

02 : Selection ( if-elif-else ) 23

โปรแกรม ค�ำอธิบาย
แต่ถา้ พิจารณาให้ละเอียด จะพบว่า คำ� สั่งท่พี ิจารณาท้ัง
p1,p2,p3,n1,n2 = \ 3 ช่วงนั้น ครอบคลมุ กรณี if n//100 == n2//100
[int(e) for e in input().split()] ทเ่ี ราเขยี นไว้ตอนต้น คอื กรณีท่ีสามหลกั ซ้ายมคี า่ เทา่ กนั
s=0 จงึ ลบทง้ิ ได้กลายเปน็ โปรแกรมข้างซ้ายนี้
#if n1 <= p1 <= n2 : สั่ง run, ใส่ 00000 50 000 10000 10299
# s += 10000 ได้ 75 ถูกตอ้ ง
สัง่ run, ใส่ 00000 50 000 10060 10680
if n1%100 <= p2 : #ช่วง 1 ได้ 150 ถูกตอ้ ง
s += 25
การตรวจเลขทา้ ย 3 ตัวก็คลา้ ยกบั เลขทา้ ย 2 ตัว สามารถ
if p2 <= n2%100 : #ช่วง 3 ท�ำในลกั ษณะเดยี วกัน โปรแกรมทางขวาเพ่มิ การตรวจ
s += 25 เงนิ รางวัล ทง้ั รางวลั ที่ 1 เลขท้าย 2 และ 3 ตวั คราวนี้ก็
ส่งั ทดสอบการท�ำงานด้วยตวั อย่างทีโ่ จทย์ให้มา
s += 25*((n2//100-1) - \ #ชว่ ง 2 สั่ง run, ใส่ 01234 11 811 01000 01250
(n1//100+1) + 1) ได้ 10075 ถกู ตอ้ ง
print(s) สั่ง run, ใส่ 99999 99 999 99950 99999
ได้ 10125 ถกู ต้อง
p1,p2,p3,n1,n2 = \ ส่ัง run, ใส่ 19999 13 001 09015 13000
[int(e) for e in input().split()] ได้ 1275 ถูกต้อง

s=0
if n1 <= p1 <= n2 :

s += 10000

if n1%100 <= p2 :
s += 25

if p2 <= n2%100 :
s += 25

s += 25*(n2//100 - n1//100 - 1)

if n1%1000 <= p3 :
s += 100

if p3 <= n2%1000 :
s += 100

s += 100*(n2//1000 - n1//1000 - 1)
print(s)

24 02 : Selection ( if-elif-else )

ตัวอยา่ งโจทยป์ ญั หา

Days in Month

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

(ปี ค.ศ. หารดว้ ย 4 ลงตัว แตห่ ารด้วย 100 ไมล่ งตัว) หรือ (ปี ค.ศ. หารด้วย 400 ลงตวั )
► ข้อมลู นำ� เขา้
มี 1 บรรทดั ประกอบดว้ ยจ�ำนวนเต็ม 2 ตัว คือ เดอื นและปเี ป็นพุทธศกั ราช
► ข้อมูลส่งออก
จ�ำนวนวันของเดือนและปขี องขอ้ มลู นำ� เข้า
► ตัวอย่าง

Input (จากแป้นพมิ พ)์ Output (ทางจอภาพ)

10 2557 31

2 2557 28

4 2556 30

2 2547 29

02 : Selection ( if-elif-else ) 25

ตดั เกรด

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

คะแนนรวม ( x ) เกรด
80 ≤ x ≤ 100
75 ≤ x < 80 A
70 ≤ x < 75 B+
65 ≤ x < 70 B
60 ≤ x < 65 C+
55 ≤ x < 60 C
50 ≤ x < 55 D+
0 ≤ x < 50 D
F
กรณีอ่นื ๆ ERROR

► ขอ้ มลู นำ� เข้า
มีบรรทดั เดยี ว แทนคะแนนทีจ่ ะตัดเกรด เปน็ จ�ำนวนจริง
► ขอ้ มูลส่งออก
มบี รรทัดเดยี ว ระบเุ กรดท่ไี ด้รบั โดยในกรณีท่คี ะแนนมีข้อผิดพลาด ใหแ้ สดงผลว่า ERROR
► ตัวอยา่ ง

Input (จากแป้นพมิ พ)์ Output (ทางจอภาพ)

87.25 A

69.95 C+

120 ERROR

26 02 : Selection ( if-elif-else )

คิดค่าท่ีจอดรถ

ให้รับเวลาเข้าและออกของรถคันหน่ึง (เปิดบริการตั้งแต่ 7:00 - 23:00) จากนั้นค�ำนวณค่าที่จอดรถที่ต้องจ่าย
โดยหลักเกณฑ์การคำ� นวณมดี งั น้ี

1. จอดรถไมเ่ กิน 15 นาที ไม่คดิ ค่าบริการ
2. จอดรถเกนิ 15 นาที แตไ่ ม่เกนิ 3 ชว่ั โมง คดิ ค่าบรกิ ารช่ัวโมงละ 10 บาท เศษของชว่ั โมงคิดเป็นหน่ึงชัว่ โมง
3. จอดรถต้งั แต่ 4 ชวั่ โมง ถงึ 6 ช่ัวโมง คิดคา่ บริการชัว่ โมงที่ 4-6 ช่วั โมงละ 20 บาท เศษของช่วั โมงคดิ เปน็ หนง่ึ ชั่วโมง
4. จอดรถเกนิ 6 ช่วั โมงขน้ึ ไป เหมาจ่ายวนั ละ 200 บาท

► ขอ้ มลู น�ำเข้า
มี 4 บรรทัด แต่ละบรรทัดมีจ�ำนวนเต็มหนง่ึ จำ� นวน
โดยบรรทดั ที่ 1-2 เปน็ ชั่วโมงและนาทีของเวลาเขา้ และบรรทดั ท่ี 3-4 เป็นชั่วโมงและนาทีของเวลาออก
► ขอ้ มลู สง่ ออก
มีบรรทัดเดยี ว เป็นค่าทจี่ อดรถที่ตอ้ งจา่ ย ให้แสดงผลลพั ธเ์ ปน็ จำ� นวนเตม็
► ตวั อย่าง

Input (จากแปน้ พิมพ)์ Output (ทางจอภาพ)

70
0
7
15

7 10
0
7
16

7 30
30
10
30

7 50
30
10
31

7 200
30
13
31

02 : Selection ( if-elif-else ) 27

วโรรส โรจนะ 
Intania 85

CEO & Co-Founder 
Dek-D Interactive co., ltd.

Programming จ�ำเป็นมากในการเริ่มกิจการด้าน IT เพราะกิจการส่วนใหญ่ท่ีสามารถอยู่รอดได้ ผู้ก่อต้ังซึ่งเป็น
ผทู้ เ่ี ขา้ ใจผลติ ภณั ฑท์ จี่ ะสรา้ งมากทสี่ ดุ ตอ้ งมสี ว่ นรว่ มในการพฒั นาระบบเอง ถงึ จะสามารถถา่ ยทอดความคดิ และ
ผลกั ดนั ผลติ ภณั ฑท์ ดี่ อี อกมาได้ เรยี กวา่ มเี งนิ มากแคไ่ หน ถา้ ตอ้ งไปจา้ งใหค้ นอนื่ มาเขยี นโปรแกรมแทนใหย้ งั ไงกส็ ู้
คนทมี่ ีทงั้ ไอเดยี และทกั ษะลงมือเขียนโปรแกรมเองไดย้ าก

นอกจากน ี้ Programming ยงั เปน็ การฝกึ วธิ คี ดิ แกป้ ญั หาอยา่ งเปน็ ขน้ั ตอน ทำ� ใหผ้ เู้ รยี นมรี ะบบการคดิ ซงึ่ สามารถ
ประยุกตไ์ ปแก้ปัญหาได้ในหลายแขนงอยา่ งทผี่ เู้ รยี นคาดไม่ถึงอกี ดว้ ย (เทพในหลาย ๆ วงการจบวิศวฯ คอม)

03 : Repetition ( while, for )

สรปุ เนื้อหา Code

Flowchart while True :
P4

while True :
P1
if C2 :
P3
break
P2

while True :
if C1 : break
P2

while True : while C2 :
if not C2 : break P2
P2

03 : Repetition ( while, for ) 29

Flowchart Code

while C1 :
P1
while C2 :
P2
P3

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

while i < j :

...

i += 2

เงื่อนไข i < j ขา้ งบนน้จี ะเป็นเท็จได้ (เพื่อให้ออกจากวงวน) ก็ดว้ ยการทค่ี า่ ของ i เพมิ่ ข้นึ หรือคา่ ของ j ลดลง
ค�ำสัง่ i += 2 ในตัวอยา่ งขา้ งบนสรา้ งความมั่นใจว่า วงวนนท้ี �ำงานแลว้ จะมีจดุ ส้ินสดุ และออกจากวงวน

Flowchart Code Flowchart Code

k=0 Done for k in range(n) :
while k < n : P1

P1 Not Done
k += 1

Not Done Done for p in range(m) :
Not Done Done for k in range(n) :
P1

30 03 : Repetition ( while, for )

Flowchart Code

Done for k in range(m) :
Not Done P1
if C :
P3
break
P2

else:
P4

จะมาทำ� หลงั else ของ for กเ็ มอื่ ท�ำครบทุกรอบ
หลงั ท�ำรอบที่ k = m-1 เสร็จ ก็มาท�ำที่ P4 ก่อนออกจากวงวน

while C1 :
P1
if C2 :
P3
break
P2

else:
P4

จะมาทำ� หลงั else ของ while กเ็ มือ่ ทำ� จนเงื่อนไข C1 ของ while
เป็นเทจ็ กม็ าท�ำท่ี P4 กอ่ นออกจากวงวน

range(start, stop, step)

• start, stop และ step ต้องเปน็ จำ� นวนเตม็

• for k in range(10) : k = 0, 1, 2, ..., 9

• for k in range(2,10) : k = 2, 3, 4, ..., 9

• for k in range(2,10,2) : k = 2, 4, 6, 8

• for k in range(10,1,-2) : k = 10, 8, 6, 4, 2
• for k in range(11,11) :
• for k in range(9,10,-1) : ไมท่ �ำสกั รอบ เพราะ step เปน็ บวก และ start >= stop
ไม่ทำ� สกั รอบ เพราะ step ติดลบ และ start <= stop



*** break จะย้ายการทำ� งานออกจากวงวนที่ break น้ันอยู่เท่าน้นั

for i in range(5): # break นีอ้ อกจาก for j
for j in range(6): # break นี้ออกจาก for i
if condition1 :
break
if condition2 :
break


03 : Repetition ( while, for ) 31

วงวนทพ่ี บบ่อย

เมื่อต้องการทำ� อะไรบางอยา่ งซ้�ำกนั n คร้ัง เชน่ ต้องการอา่ นขอ้ มูลจำ� นวน 10 ตัว เพือ่ หาค่าเฉลย่ี
ใช้ for k in range(n)
s=0
เมื่อตอ้ งการน�ำค่าท่สี ร้างจาก
for k in range(10) : # เป็นแคค่ ำ� สง่ั ควบคุมจำ� นวนรอบการทำ� ซ้ำ�
range(start, stop, step)
a = float(input())
มาใช้ในการประมวลผล s += a
ใช้ for k in range(...) print('average =', (s/10))

เม่ือตอ้ งการประมวลผลชดุ คำ� สัง่ ซ้ำ� ๆ เชน่ ตอ้ งการหาว่า q เป็นจำ� นวนเฉพาะหรอื ไม่ ใช้วงวน for หาวา่
จนกว่าเง่ือนไขหนึง่ จะเป็นจริง จ�ำนวนเตม็ มากกว่าหนึง่ ขนาดเลก็ สุดอะไร ท่ีหาร q ลงตัว
ใช้ while หรือใช้ if break ในวงวน
for k in range(2, q+1) : # k = 2,3,...,q
เม่ือต้องการแจกแจงวธิ ีการเลือกหมายเลข
จากหมายเลข 0 ถงึ n-1 if q % k == 0 : break # มกี ารนำ� k มาใช้
จำ� นวน 2 หมายเลข แบบเลอื กแล้ว
ไมเ่ ลือกอกี (คอื แจกแจงการเลอื ก if k == q :
หมายเลขออกมาทลี ะคู่) print(q,'is prime')

for i in range(n) : else:
for j in range(i+1, n) : print(q, '=', k, 'x', q//k)

ได้ i<j ทกุ ๆ กรณี เชน่ ต้องการหาคา่ เฉลยี่ จากชดุ ขอ้ มลู ทผ่ี ใู้ ช้ป้อนเข้ามาเรอ่ื ย ๆ
หรือถา้ ต้องการให้ i = j ดว้ ย กเ็ ปน็ จนกว่าจะรบั จำ� นวนตดิ ลบ

for i in range(n) : s=0 s=0
for j in range(i, n) : n=0 n=0
while True : t = float(input())
ได้ i≤j ทุก ๆ กรณี while t >= 0 :
t = float(input())
if t < 0 : break s += t
s += t n += 1
n += 1 t = float(input())
if n == 0 : if n == 0 :
print('No Data') print('No Data')
else : else :
print('avg =',(s/n)) print('avg =',(s/n))

เชน่ จงหาวา่ มีจำ� นวนเต็ม x y และ z อะไรบ้างทีท่ ำ� ให้สมการ
z3 = x2 + y2 เป็นจริง (x กบั y มคี า่ 0 ถึง 19) เช่น 53 = 52+102
แตเ่ ราไม่ต้องการค�ำตอบ 53 = 102+52 เพราะซ้�ำ จงึ ตอ้ งกำ� หนดว่า x < y
แต่ถา้ เราต้องการคำ� ตอบ 83 = 162+162 ด้วย กต็ ้องให้ x <= y โดย
ให้ y มคี า่ เรม่ิ ท่ี x เป็นต้นไป ด้วย for y in range(x,n) ข้างลา่ งน้ี

n = 20 # ปหาดั รเศากษที่สามแลว้
for x in range(1,n) : #

for y in range(x,n):
t = x**2 + y**2
z = int(round(t**(1/3),0))

if z**3 == t :
print( z,x,y )

32 03 : Repetition ( while, for )

เรื่องผดิ บอ่ ย

เข้าใจผิดเร่อื งตวั สุดทา้ ยของ range for k in range(1,5) k = 1,2,3,4 (ไมร่ วม 5)

ใช้วงวน ท�ำอะไรบางอย่าง เพอื่ สรปุ ว่า เปน็ A หรือ เชน่ ตอ้ งการหาวา่ q เป็นจ�ำนวนเฉพาะหรือไม่
เป็น B โดยจะเปน็ A เมอื่ เง่อื นไข C เปน็ จริง for k in range(2, q) :
อย่างนอ้ ยหนงึ่ คร้ัง แตจ่ ะเปน็ B เม่ือ C ตอ้ ง if q % k == 0 :
ไมเ่ ป็นจริงทุกครั้งทุกรอบ ถา้ เขียน print(q,'is composite') # สรปุ ถกู เพราะ
# หาตวั หารพบ
for k in range(...) : else :
if C : print(q,'is prime') # ผิด สรปุ เร็วไป
print('A') # ตอ้ งวนทดสอบตอ่
else :
print('B') แกโ้ ดยใช้ตวั แปรเกบ็ สภาวะการตรวจ เปน็ ดังนี้

แบบน้ีผดิ เพราะสรปุ ว่าเป็น B เร็วไป ยังตรวจ iscomposite = False
ไมค่ รบทุกรอบทกุ กรณี แก้ไขด้วยการใช้ตัวแปร for k in range(2,q) :
เกบ็ สภาวะการตรวจ
if q % k == 0 :
found = False print(q,'is composite')
for k in range(...): iscomposite = True
break
if C :
print('A') if not iscomposite :
found = True print(q,'is prime')
break
หรือใช้ for-else ก็งา่ ยกว่า
if not found :
print('B') for k in range(2,q) :
if q % k == 0 :
หรือใช้ for-else ก็ง่ายกวา่ print(q,'is composite')
break
for k in range(...):
if C : else :
print('A') print(q,'is prime')
break
เชน่ จากชดุ คำ� สัง่ ตรวจสอบจ�ำนวนเฉพาะขา้ งบนน้ี ถา้ เขยี น
else: for k in range(2,q+1): # เขยี น q+1 แทนที่จะเป็น q
print('B')
if q % k == 0 :
วงวน ทำ� จำ� นวนรอบน้อยไปหรือมากไปกวา่ ท่ี print(q,'is composite')
ตอ้ งการ (โดยท่ัวไปมกั ขาดหรือเกนิ ไปหนึง่ รอบ) break

else :
print(q,'is prime')

แบบน้เี กินไปรอบ ทำ� ให้ผลออกมาเป็น composite เสมอ
เพราะอะไร ?
หรอื อยากหาคา่ ของ ถา้ เขียน

s=0
for k in range(1,n):

s += k**3
print(s)

กจ็ ะพบวา่ ขาดไปรอบ

03 : Repetition ( while, for ) 33

ลมื ปรบั ค่าของตัวแปรทใี่ ชใ้ นเงอ่ื นไขของ while เชน่ ตอ้ งการวนรับจำ� นวนจากผู้ใช้ มาหาคา่ เฉลยี่ จนกว่าจะพบ
หรือไม่ก็ปรบั คา่ ผิด ความผดิ พลาดแบบน้ีอาจท�ำให้ จ�ำนวนลบ
วนท�ำงานไมส่ ิ้นสุด
ต้งั ค่าใหก้ ับตวั แปรทคี่ วรจะใหค้ า่ กอ่ นเข้าวงวน s=n=0
แตก่ ลบั ไปเขยี นในวงวน t = float(input())
while t >= 0 :

s += t
n += 1
print('avg =', (s/n))

ใช้ t ในการตรวจสอบเง่อื นไขของ while แตค่ ่า t ไมไ่ ด้
เปลย่ี นแปลงเลยในวงวน ถา้ หลดุ เขา้ มาในวงวนไดจ้ ะเกิดอะไรขึ้น ?
ควรแกเ้ ป็น

s=n=0 # เพิม่ บรรทดั น้ี
t = float(input())
while t >= 0 :

s += t
n += 1
t = float(input())
print('avg =', (s/n))

เชน่ ตอ้ งการวนรบั จำ� นวนจากผู้ใช้ มาหาคา่ เฉลี่ยจนกว่าจะพบ
จำ� นวนลบ

while True : # บรรทัดนีไ้ มน่ ่ามาอยู่ในวงวน
s=n=0

t = float(input())
if t < 0 : break
s += t
n += 1

print('avg =', (s/n))

จะเกิดอะไรขนึ้ ?

เรอื่ งแปลกของ for ใน Python

หลังจากวนท�ำงานใน for k จนเรียบร้อยแลว้ for k in range(1,5):
คา่ k หลังออกจากวงวน จะมีค่าเท่ากับ ...
คา่ สุดท้ายที่ทำ� งานในวงวน
print(k) # ได้ 4 เพราะเปน็ ค่าสุดท้ายทที่ ำ� ในวงวน

for m in range(4,10):
if m % 3 == 0 : break
...

print(m) # ได้ 6 เพราะค่าสุดท้ายในวงวนคือ 6
กอ่ นจะ break ออก

for w in range(10,10):
...

print(w) # ผิด เพราะไม่ไดเ้ ข้าไปท�ำในวงวน, w จึงไม่มีค่า

34 03 : Repetition ( while, for )

การปรบั ค่า k ภายในวงวน for k in range(1, 4) : 1
print(k) 3
for k in range(...) k += 2 2
print(k) # ได้ผลตามทางขวาบน 4
จะไม่มีผลตอ่ การเปล่ยี นคา่ k ในรอบถดั ไป 3
ถา้ ตอ้ งการเปล่ยี น k ต้องใช้ while 5
เพราะฉะนั้น ถ้าต้องการปรบั คา่ ของ k ในวงวน k=1 1
ตอ้ งใช้วงวน while แทน while k < 4 : 3
3
print(k) 5
k += 2
print(k)

แบบฝกึ หดั

Problem Code
Input: ไมม่ ี
Process: หาจ�ำนวนเตม็ บวก k ทม่ี คี า่ น้อยสดุ ทท่ี ำ� ให้ มี

ค่าไม่เทา่ กับ 1 (เนอ่ื งจากความไมแ่ มน่ ย�ำ 100%
ของจ�ำนวนจรงิ ในคอมพิวเตอร์)
Output: จำ� นวนเต็ม k ทีห่ าได้
Input: ไม่มี
Process: หาจำ� นวนเตม็ บวก k ที่มคี ่านอ้ ยสุดท่ที �ำให้

เปน็ จริง จากสตู ร
Output: จำ� นวนเต็ม k ทห่ี าได้
Input: ไมม่ ี
Process: คำ� นวณค่าประมาณของ

Output: ค่าประมาณของ ท่หี าได้
Input: อ่านจำ� นวนเตม็ 2 จำ� นวน a กับ b
Process: ค�ำนวณค่าจากสูตร

Output: ค่าที่ค�ำนวณได้
Input: อา่ นจ�ำนวนเต็ม 2 จำ� นวน a กับ b
Process: คำ� นวณค่าจากสูตร

Output: คา่ ทคี่ �ำนวณได้

03 : Repetition ( while, for ) 35

Problem Code
Input: บรรทดั แรกรบั จำ� นวนเต็มเกบ็ ในตวั แปร n
(n จะมีค่ามากกว่า 0) และอีก n บรรทดั เปน็ จ�ำนวนเต็ม
บรรทัดละจำ� นวน
Process: หาผลต่างของคา่ มากสดุ กับคา่ นอ้ ยสุด
และหาวา่ มีกจี่ ำ� นวนทเ่ี ปน็ เลขลบ
Output: ผลตา่ ง และจ�ำนวนเลขลบทหี่ าได้

Input: จ�ำนวนเต็มเก็บในตัวแปร n
Process: หาจำ� นวนเตม็ บวก w, x, y และ z ทั้งหมดที่
w3 = x2 + y2 + z2 โดยที่ 1 ≤ x ≤ y ≤ z ≤ n
Output: คา่ ของ w, x, y และ z ที่หาได้

ตวั อยา่ งการแกโ้ จทย์ปัญหา
Approximation of sine

ค่าของ sin(x) คำ� นวณไดด้ ว้ ยอนุกรมเทย์เลอร์ ดงั แสดงขา้ งลา่ งนี้

จงเขยี นโปรแกรมรับค่าของ x เพอื่ คำ� นวณค่า sin(x) ให้ไดค้ วามแมน่ ย�ำมากทีส่ ุดเทา่ ที่จะมากได้ ดว้ ยสูตรข้างบนนี้

► ข้อมลู นำ� เข้า
หน่ึงบรรทดั ประกอบดว้ ยจำ� นวนจริง x (หน่วยเป็นองศา)
► ขอ้ มูลสง่ ออก
คา่ ประมาณของ sin(x) จากสูตรขา้ งต้น
► ตวั อยา่ ง

Input (จากแป้นพมิ พ)์ Output (ทางจอภาพ)

45 0.7071067811865475
36045 0.7071067811865475

36 03 : Repetition ( while, for )

ตัวอย่างการเขยี นโปรแกรม คำ� อธบิ าย
โปรแกรม เรม่ิ ดว้ ยการรบั ขอ้ มลู , แปลงเปน็ float, แลว้ เปลย่ี นเปน็ เรเดยี น
สตู รการคำ� นวณมลี กั ษณะเปน็ การบวกซำ้� ๆ กนั หลาย ๆ พจนท์ ใี่ ชค้ า่ ของ
import math k ทเี่ รมิ่ จาก 0 เพม่ิ ขน้ึ ทลี ะ 1 ไปเรอื่ ย ทำ� ใหค้ ดิ ถงึ การใชว้ งวน for
x = math.radians(float(input())) ปญั หาคอื จะตอ้ งหมนุ คำ� นวณกร่ี อบ กพี่ จน์ จงึ จะละเอยี ดสดุ ๆ ตามท่ี
n = 30 โจทยต์ อ้ งการ
s=0
for k in range(n+1): ขอลองตงั้ ให้ n = 30 มตี วั แปร s เกบ็ ผลลพั ธ์ คำ� นวณคา่ ของพจน์
# k=0,1,...,n ตรงไปตรงมาตามสตู ร ซง่ึ มกี ารยกกำ� ลงั ดว้ ย ** และการหาคา่
แฟกตอเรยี ลดว้ ย math.factorial
s+=(-1)**k*x**(2*k+1) \ สง่ั run, ใส่ 45 เปน็ ขอ้ มลู , ไดผ้ ลเปน็ 0.7071067811865475 ถกู ตอ้ ง
/math.factorial(2*k+1) อยากใหล้ ะเอยี ดกวา่ น้ี ลองตงั้ n = 100 ดู
สงั่ run, ใส่ 45 เปน็ ขอ้ มลู , ไดผ้ ลผดิ ทบ่ี รรทดั ทม่ี กี ารคำ� นวณ
print(s)
OverflowError: int too large to convert to float
import math
x = math.radians(float(input())) แปลวา่ มกี ารแปลงจำ� นวนเตม็ เปน็ float แตจ่ ำ� นวนเตม็ มขี นาดใหญ่
n = 100 เกนิ ท่ี float จะรบั ได้ แลว้ จะรไู้ ดอ้ ยา่ งไรวา่ ผดิ ตรงไหน
s=0 หาก run ดว้ ย IDLE เมอื่ เกดิ ขอ้ ผดิ พลาดแลว้ เราสามารถขอดตู วั แปร
for k in range(n+1): ตา่ ง ๆ ได้ เชน่ อยากรคู้ า่ k เมอ่ื เกดิ ความผดิ พลาด กใ็ สค่ ำ� สงั่ print(k)
# k=0,1,...,n ที่ Python shell จะแสดงวา่ ผดิ ตอนที่ k มคี า่ เปน็ 85 กล็ องคำ� นวณ
คา่ ตา่ ง ๆ ในสตู ร ดวู า่ ผดิ ทใี่ ด
s+=(-1)**k*x**(2*k+1)\
/math.factorial(2*k+1) >>> print(k)
85
print(s) >>> print((-1)**k)
-1
>>> print(x**(2*k+1))
1.1491314574538792e-18
>>> print(math.factorial(2*k+1))
12410180702176678234248405241031039926166055775
01693185388951803611996075221691752992751978120
48758557646495950167038705280988985869071076733
12420322184843643104735778899685482782907545415
61964852153468318044293239598173696899657235903
94761615227855818006117636510842880000000000000
0000000000000000000000000000
>>>

กไ็ มม่ อี ะไรผดิ แตจ่ ากทบี่ อกวา่ ผดิ เพราะแปลงจำ� นวนเตม็ ทใ่ี หญเ่ กนิ ไป
เปน็ float ทำ� ใหว้ เิ คราะหไ์ ดว้ า่ ผลของการหาคา่ แฟกตอเรยี ลตอ้ งแปลง
เปน็ float เพอื่ ไปเปน็ ตวั หารในสตู ร หากลองคำ� สงั่ นที้ ่ี Python shell

>>> print(1/math.factorial(2*k+1))

กพ็ บวา่ ผดิ ดว้ ยเหตผุ ลเดยี วกนั

03 : Repetition ( while, for ) 37

โปรแกรม ค�ำอธิบาย

import math แก้ปัญหาโดยไมใ่ ชจ้ �ำนวนเต็มขนาดใหญ่ แต่มองวา่ การคำ� นวณหา
x = math.radians(float(input())) พจนใ์ นแตล่ ะรอบนน้ั สามารถค�ำนวณได้จากพจน์ในรอบกอ่ นได้
n = 100 ไมน่ ่าต้องค�ำนวณ , และ ทกุ รอบ แต่สามารถ
s=f=x คำ� นวณจากความสัมพันธด์ ังนี้
for k in range(1,n+1):

f *= (-1)*x**2/((2*k)*(2*k+1))
s += f
print(s)

ดงั นน้ั

พจนใ์ นรอบที่ k ตัวคณู พจน์ในรอบที่ k−1

เร่ิมด้วย f = x (คอื พจนท์ ่ี k = 0)

k=1 f = (-1)*x**2/((2*k+1)*(2*k)) * f
= -(x**2)/(3*2) * x
= -(x**3)/(3!)
k=2
f = -(x**2)/(5*4) * -(x**3)/(3!)
k=3 = +(x**5)/(5!)

f = -(x**2)/(7*6) * (x**5)/(5!)
... = -(x**7)/(7!)

import math ด้วยแนวคิดน้ีเขียนโปรแกรมได้ดงั code ทางซ้าย
x = math.radians(float(input())) สง่ั run, ใส่ 45 เปน็ ขอ้ มลู , ไดผ้ ลเปน็ 0.7071067811865475 ถกู ตอ้ ง
s=f=x ถา้ ลองเพิม่ ค�ำสงั่ print(k, s) ในวงวน for จะพบวา่ ค่า s
k=1 มีคา่ ไมเ่ ปลย่ี นแปลงตงั้ แต่ k = 8 เปน็ ตน้ ไป แสดงว่าการคำ� นวณ
while f != 0: ต้งั แต่รอบที่ 8 เปน็ ต้นไป ไม่มีประโยชน์เลย แต่ถา้ ใส่ x = 180
เปน็ ข้อมูลนำ� เขา้ พบว่า k = 22 เป็นตน้ ไปจะไมเ่ ปล่ยี นแปลง
f *= (-1)*x**2/((2*k)*(2*k+1)) จึงควรปรบั การทำ� งานของโปรแกรมใหต้ รวจสอบวา่ หากคา่ ในตวั แปร
s += f s ไม่เปล่ยี นแปลง หรอื ใช้วธิ ตี รวจสอบวา่ เม่ือ f เปน็ 0 ก็สามารถ
k += 1 หยุดการค�ำนวณได้ โดยเปลีย่ นจากการใช้
print(s) วงวน for เป็นวงวน while จะเหมาะสมกวา่
โดยมีเงอ่ื นไข while f != 0 เป็นตัวก�ำหนดวา่ ต้องท�ำต่อในวงวน
เม่อื f ยังไมเ่ ท่ากับ 0 ตวั แปร k เร่มิ ต้นที่ 1 ในรอบแรก และ
เพิม่ ทลี ะ 1 ในรอบถัด ๆ ไป
สงั่ run, ใส่ 45 เปน็ ขอ้ มลู , ไดผ้ ลเปน็ 0.7071067811865475 ถกู ตอ้ ง
และถา้ ลอง print(k) ดูใน Python shell จะพบวา่ k = 8
เมอ่ื ออกจากวงวน ดว้ ยวิธีน้ีเราไมต่ อ้ งกำ� หนดจำ� นวนรอบใหก้ บั วงวน
มาลองตัวอยา่ งท่ี 2 สั่ง run, ใส่ 36045 เป็นขอ้ มลู , ไดผ้ ลเปน็
2.541635699930208e+252 ผิด เกิดอะไรขน้ึ ?

38 03 : Repetition ( while, for )

โปรแกรม คำ� อธิบาย
คา่ 36045 เมอ่ื แปลงเปน็ เรเดียนแลว้ x มคี า่ มาก การคำ� นวณคา่ f
import math ในวงวนจะลดความแมน่ ย�ำลงด้วยเหตุทจ่ี ำ� นวนจุดหลงั ทศนยิ มของ
x = float(input()) float มจี �ำนวนจ�ำกัด ท�ำให้การคำ� นวณผดิ พลาด ด้วยคุณสมบตั ิ
x = math.radians(x%360) ของฟังก์ชนั sin ทเ่ี ป็นเชงิ คาบ เราควรลดขนาดของคา่ x ลงด้วยการ
s=f=x เปล่ียนคา่ 36045 องศาเปน็ 36045 % 360 = 45 องศา
k=1 กอ่ นเปลีย่ นเป็นเรเดียน จะเพ่ิมความแม่นย�ำและลดความผิดพลาด
while f != 0: ในการค�ำนวณ ได้ผลดัง code ทางซ้าย

f *= (-1)*x**2/((2*k)*(2*k+1))
s += f
k += 1
print(s)

ตัวอยา่ งโจทย์ปญั หา

Multiples of 3 or 5

จงเขียนโปรแกรมที่ค�ำนวณหาผลรวมของจ�ำนวนเต็มบวกทุกจ�ำนวนที่มีค่าต่�ำกว่าจ�ำนวนท่ีเป็นข้อมูลน�ำเข้าและ
มี 3 หรือ 5 เปน็ ตัวประกอบ เช่น หากขอ้ มลู นำ� เข้าคือ 20 ค�ำตอบท่ีเราตอ้ งการจะเทา่ กบั 3 + 5 + 6 + 9 + 10 + 12 + 15 + 18 = 78
(สงั เกตว่าค�ำตอบของเราไมร่ วมค่า 20 เนอื่ งจากเราสนใจเฉพาะจ�ำนวนทมี่ คี ่าต�่ำกว่า 20)
► ข้อมูลน�ำเขา้
มบี รรทดั เดยี ว เปน็ จ�ำนวนเตม็ บวก
► ข้อมลู ส่งออก
มบี รรทดั เดยี ว แสดงผลรวมของจำ� นวนเต็มบวกทกุ จำ� นวนทม่ี ีค่าต่�ำกว่าจำ� นวนท่เี ปน็ ขอ้ มลู นำ� เข้าและมี 3 หรอื 5 เปน็ ตัวประกอบ
► ตวั อยา่ ง

Input (จากแปน้ พมิ พ์) Output (ทางจอภาพ)

20 78

25 143

30

03 : Repetition ( while, for ) 39

Average until -1

ใหอ้ า่ นขอ้ มูลจากแปน้ พมิ พ์ที่เป็นจ�ำนวนจริงจนกว่าจะพบคา่ -1 เพื่อหาค่าเฉลย่ี ของจำ� นวนเหลา่ นน้ั ทง้ั หมด (ไมร่ วม -1)

► ข้อมลู น�ำเข้า

จ�ำนวนจริงบรรทัดละ 1 จ�ำนวนหลายบรรทัด บรรทัดสดุ ท้ายคอื -1

► ข้อมูลส่งออก
มีบรรทัดเดียว แสดงคา่ เฉล่ยี ของจำ� นวนทงั้ หมด (ไมร่ วม -1) ออกทางหนา้ จอ
ในกรณที ีม่ จี ำ� นวนขอ้ มูลเปน็ 0 ให้แสดง No Data
► ตัวอยา่ ง

Input (จากแปน้ พิมพ)์ Output (ทางจอภาพ)

2295.498850599365 5111.43305555306
8502.139421733784
515.0100470901091
3705.6829835190097
8722.343211974356
4446.712951812571
6375.086965715
3801.511489785674
7638.911577747659
-1

-1 No Data

40 03 : Repetition ( while, for )

สามเหลย่ี มมุมฉาก

โจทยน์ สี้ นใจเฉพาะสามเหล่ียมมุมฉากทีค่ วามยาวดา้ นทกุ ดา้ นเปน็ จ�ำนวนเตม็
จงเขียนโปรแกรมอ่านค่าความยาวเส้นรอบรูปจากแป้นพิมพ์ เพ่ือหาจ�ำนวนเต็มมากสุดที่เป็นความยาวของด้านตรงข้าม
มมุ ฉากของสามเหลย่ี มมมุ ฉากทมี่ คี วามยาวเสน้ รอบรปู ตามทไ่ี ดร้ บั เชน่ ใหเ้ สน้ รอบรปู ของสามเหลย่ี มยาว 90 จะมสี ามเหลย่ี มมมุ ฉาก
ตามข้อกำ� หนดอยู่สองรปู คือ 15, 36, 39 และ 9, 40, 41 คำ� ตอบทีต่ อ้ งการคอื 41 เพราะเป็นความยาวดา้ นตรงขา้ มมมุ ฉากที่ยาวสดุ
ของสามเหลย่ี มมมุ ฉากตามขอ้ กำ� หนด และมเี สน้ รอบรปู ยาว 90
► ขอ้ มูลนำ� เขา้
มบี รรทดั เดยี วเปน็ จ�ำนวนเต็มบวก แทนความยาวเสน้ รอบรปู ของสามเหลยี่ มมมุ ฉากตามขอ้ กำ� หนด
(รบั ประกนั ว่า มสี ามเหลย่ี มมมุ ฉากทมี่ ีความยาวเสน้ รอบรูปเทา่ กับจ�ำนวนท่เี ปน็ ข้อมลู น�ำเขา้ )
► ข้อมูลสง่ ออก
มบี รรทดั เดยี วแสดงความยาวของดา้ นตรงข้ามมมุ ฉากท่ยี าวท่ีสุดของสามเหลี่ยมมมุ ฉากตามขอ้ ก�ำหนด
► ตวั อยา่ ง

Input (จากแป้นพมิ พ)์ Output (ทางจอภาพ)

30 13

90 41

03 : Repetition ( while, for ) 41

ธนาวฒั น์ มาลาบุปผา 
Intania 84
CEO & Co-Founder of Priceza

Programming เป็นหนึ่งในวิชาที่ผมชอบเรียนมากท่ีสุดวิชานึงเลยตอนปี 1 เหตุผลเพราะว่ามันช่วยให้ผมมี
กระบวนการคดิ และการแก้ปัญหาต่าง ๆ อยา่ งเปน็ ระบบ จนมาถึงตอนทอี่ ยากทำ� Startup สร้าง Priceza ขนึ้ มา
ดว้ ยความเขา้ ใจใน Programming ทำ� ให้ผมมพี ้ืนฐานวธิ ีคดิ ในการศกึ ษาพัฒนาระบบต่าง ๆ ที่เราไม่เคยพัฒนา
ขนึ้ มาก่อน และท�ำใหเ้ ราศึกษาและวจิ ัยตง้ั แตต่ ้น จนพฒั นามนั ขนึ้ มาได้ในทส่ี ดุ

ลิสา ตรงประกอบ 
Intania 81
Google Inc.

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

04 : String

สรปุ เนอ้ื หา

สตริง (string) เก็บอักขระ (character) ต้ังแต่ศูนย์ตัวข้ึนไป เรียงจากซ้ายไปขวาต่อกันไป แต่ละตัวมีเลข index
ระบุต�ำแหน่ง โดย index ของตัวซ้ายสุดคือ 0 อักขระแต่ละตัวในสตริงเป็นได้ท้ังตัวอักษร ตัวเลข และสัญลักษณ์พิเศษต่าง ๆ
การเขยี นสตริงท�ำได้หลายแบบดังนี้

• เขียนครอบดว้ ย อญั ประกาศเด่ียว 'I am "Python".' 'I\'m Python.'

• เขยี นครอบดว้ ย อัญประกาศค่ ู "I'm Python." "I am \"Python\"."

• เขียนครอบดว้ ย อญั ประกาศเดยี่ วสามตัวติด '''I'm "Python".'''

• เขียนครอบด้วย อัญประกาศคู่สามตวั ติด """I'm "Python"."""
หมายเหตุ : 12 เปน็ int ไมใ่ ชส่ ตรงิ แต่ '12' คือสตรงิ ถ้าตอ้ งการแปลงจ�ำนวนในตัวแปร x ใหก้ ลายเป็นสตริง ใช้ str(x)

ตวั อยา่ งการเข้าใช้อักขระและสตรงิ ยอ่ ยในสตริง (สมมติให้ s = "ABCDEFG")

• len(t) ไดจ้ �ำนวนตวั อกั ขระใน t โดย len('') ได้ 0
• s[0] เหมือน s[-len(s)] ได้ "A" ส่วน s[-1] เหมอื น s[len(s)-1] ได้ "G"
• อยา่ ลมื วา่ index ของสตรงิ s ตอ้ งอยใู่ นชว่ ง 0 ถงึ len(s)-1 จากซา้ ยไปขวา และ -1 ถงึ -len(s) ถอยจากขวามาซา้ ย

ดงั นน้ั เราเขยี น s[k] ได้ โดยท่ี -len(s) ≤ k ≤ (len(s)-1) เพราะฉะนน้ั "01234"[-6] กบั "01234"[5] ผดิ
• s เหมอื น s[:] เหมอื น s[0:] เหมือน s[:len(s)] เหมอื น s[::] เหมอื น s[::1]
• s[::2] หยบิ ตัวท่ี index คู่ได้ "ACEG", s[1::2] หยบิ ตัวท่ี index คี่ได้ "BDF"
• s[::-1] เหมือน s[-1::-1] เหมอื น s[-1:-(len(s)+1):-1] ได้ "GFEDCBA"
• ถ้าเขียน s[a:b] เพ่อื เลือกสตรงิ ย่อยออกมา ค่า a กบั b เปน็ อะไรกไ็ ด้ ไมผ่ ิด

o "01234"[2:50000] ได้ "234", "01234"[4999:50000] ได้ ""
o "01234"[-500:-2] ได้ "012", "01234"[-3:-500:-1] ได้ "210",

"01234"[-500:-300] ได้ ""
• ใช้ for c in s : เพื่อแจกแจงอกั ขระทลี ะตวั ใน s จากซา้ ยไปขวาเก็บในตวั แปร c นำ� ไปใช้ในวงวนได้

ตวั อยา่ งการจัดการสตริง (ให้ s = " Python 3.6 ")

• t = s.upper() ได้ t เกบ็ " PYTHON 3.6 " s เหมอื นเดมิ

• t = s.lower() ได้ t เกบ็ " python 3.6 " s เหมอื นเดมิ

• t = s.strip() ได้ t เกบ็ "Python 3.6" s เหมอื นเดมิ

• s = s.strip().upper() ได้ s เกบ็ "PYTHON 3.6"

• k = s.find(c) คนื index นอ้ ยสดุ ทพ่ี บ c ใน s เรม่ิ คน้ ตงั้ แต่ index 0 ถา้ ไมพ่ บ จะไดผ้ ลเปน็ -1
k = "engineering".find("ng") ได้ k เกบ็ 1 เพราะ "ng" ปรากฏเรม่ิ ท่ี index 1 ใน "engineering"
คำ� สง่ั if c in s กเ็ หมอื นกบั if s.find(c) >= 0

• k = s.find(c,j) คนื index นอ้ ยสดุ ทพี่ บ c ใน s เรมิ่ คน้ ตงั้ แต่ index j เปน็ ตน้ ไป

• นำ� สตรงิ บวกกนั คอื นำ� สตรงิ มาตอ่ กนั เชน่ '12'+'23' คอื '1223'

• สตรงิ คณู กบั จำ� นวนเตม็ คอื นำ� สตรงิ นนั้ มาตอ่ กนั เปน็ จำ� นวนครงั้ เทา่ กบั คา่ ของจำ� นวนเตม็ นนั้ เชน่ '12'*3 คอื '121212'

04 : String 43


Click to View FlipBook Version