บทเรียนหน่วยการเรียนรู้ที่ 1 การออกแบบและการเขียนอัลกอริทึม
1. แนวคิดเชิงนามธรรม
2. อัลกอริทึมเบื้องต้น
3. การเขียนอัลกอริทึมด้วยภาษาธรรมชาติ
4. การเขียนอัลกอริทึมด้วยรหัสจำลอง
5. การเขียนอัลกอริทึมด้วยผังงาน
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1. แนวคิดเชิงนามธรรม
การออกแบบการแก้ปัญหาโดยนำแนวคิดเชิงนามธรรมมาประยุกต์ใช้ จะทำให้การแก้ปัญหา มีประสิทธิภาพมากขึ้น ในบทนี้จะกล่าวถึงกระบวนการในการพิจารณารายละเอียดของปัญหา ซึ่งจะนำไปสู่วิธีการแก้ปัญหา
“ในชีวิตประจำวัน นักเรียนคงเคยพบกับปัญหาที่ไม่รู้ว่าจะแก้ไขหรือดำ เนินการอย่างไร นั่นอาจเป็นเพราะนักเรียนยังไม่เข้าใจปัญหาดีพอ เช่น นักเรียนต้องเดินทางไปสถานที่แห่งหนึ่งด้วยรถโดยสาร นักเรียนอาจตอบว่าไม่เคยไป จะไปได้อย่างไร หากนักเรียนพิจารณารายละเอียด ต่อไปว่า สถานที่นั้นอยู่ที่ใด มีสถานที่ใดบ้างที่อยู่ใกล้เคียง ก็อาจทำ ให้นักเรียนนึกออกว่าจะสามารถเดินทางไปได้ หลังจากนั้นจะต้องหาข้อมูลเพิ่มเติมว่ามีรถโดยสารใดผ่านบ้าง แต่ถ้ารถนั้นไม่ผ่านบ้านเราจะทำอย่างไร ต้องเดินทางไปต่อรถที่ใด ราคาค่าโดยสารเป็นเท่าใด”
การพิจารณารายละเอียดของปัญหาการเดินทางของนักเรียน ทำ ให้เข้าใจเงื่อนไขที่เกี่ยวข้องและทำ ให้ทราบประเด็นที่สำคัญ เพื่อไปสู่วิธีการแก้ปัญหาที่มีประสิทธิภาพ
1.1 แนวคิดเชิงนามธรรม
แนวคิดเชิงนามธรรม (abstract thinking หรือ abstraction) เป็นองค์ประกอบหนึ่งของแนวคิดเชิงคำนวณ (computational thinking) ซึ่งใช้กระบวนการคัดแยกคุณลักษณะที่สำคัญออกจากรายละเอียดปลีกย่อยในปัญหา หรืองานที่กำลังพิจารณา เพื่อให้ได้ข้อมูลที่จำเป็นและเพียงพอในการแก้ปัญหา
ในการแก้ปัญหาหนึ่งอาจมีวิธีการแก้ปัญหาได้หลายวิธี ขึ้นอยู่กับการมองปัญหา การมองเห็นรายละเอียดเป้าหมายของโจทย์ปัญหา และประสบการณ์ของผู้แก้ปัญหา ดังตัวอย่างต่อไปนี้
ตัวอย่างที่ 1.1 คำ ทักทาย Hello ในภาษาอังกฤษรูปแบบต่าง ๆ
คำ ว่า Hello แต่ละตัวมีรูปแบบที่แตกต่างกันขึ้นอยู่กับประสบการณ์ที่ผู้เขียนแต่ละคนมี จากตัวอย่างจะเห็นรายละเอียดที่แตกต่างกัน เช่น สี รูปแบบอักษร (font) อักษรตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก และรายละเอียดอื่น ๆ เช่น การขีดเส้นใต้ หรือการเอียงของตัวอักษร โดยรูปแบบที่แต่ละคนมีอยู่ ถ้าจะถ่ายทอดให้ผู้อื่นรับรู้ และเข้าใจทุกอย่างแทบจะเป็นไปไม่ได้ และอาจจะไม่มีความจำ เป็นที่ผู้อื่นต้องรับรู้รายละเอียดทั้งหมด
ในที่นี้หากผู้รับข้อมูลต้องการทราบว่าคำ นี้ประกอบไปด้วยอักขระใดบ้าง โดยไม่สนใจประเภทของอักษรตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก คำ ว่า Hello ทุกตัวในตาราง ต่างก็มีองค์ประกอบเชิงนามธรรมเดียวกัน คือ เป็นคำ ที่ประกอบด้วยอักขระ H, E, L, L, และ O แต่ในบางสถานการณ์อาจจะสื่อว่าข้อมูลดังกล่าว เป็นเพียงอักขระภาษาอังกฤษ 5 ตัว หรือเป็นคำ ภาษาอังกฤษเพียงหนึ่งคำ
1.2 การใช้แนวคิดเชิงนามธรรมเพื่อแก้ปัญหา
ปัญหาที่กำลังพิจารณาอยู่นั้นอาจประกอบไปด้วยรายละเอียดจำนวนมาก ทั้งที่จำเป็นและไม่จำเป็นต่อการแก้ปัญหา ลองพิจารณาปัญหาในสถานการณ์สมมติดังตัวอย่างต่อไปนี้
กิจกรรม จากภาพให้นักเรียนคัดกรองรายละเอียดของคำ ว่า HELLO เมื่อระบุความต้องการที่แตกต่างกันดังนี้
❍ ข้อมูลประกอบด้วยอักขระใดบ้าง แต่ละอักขระเป็นอักษรตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่ และมีสีอะไร
❍ ข้อมูลประกอบด้วยอักขระใดบ้าง แต่ละอักขระประกอบด้วยสีอะไร
❍ ข้อมูลประกอบด้วยอักขระใดบ้าง
❍ ข้อมูลประกอบด้วยอักขระกี่ตัว
❍ ข้อมูลประกอบด้วยคำ กี่คำ
2. อัลกอริทึมเบื้องต้น
2.1 ความหมายของอัลกอริทึม (Algorithm)
มีผู้ให้ความหมายของอัลกอริทึมไว้ดังนี้
อัลกอริทึม หมายถึง ขั้นตอนวิธี ที่สามารถเข้าใจได้ และมีความยาวจำกัดบอกถึงลำดับ หรือวิธีการในการแก้ปัญหาใดปัญหาหนึ่งอย่างเป็นขั้นเป็นตอนและชัดเจน ว่าทำอย่างไร เมื่อนำเข้าอะไรแล้วจะได้ผลลัพธ์เช่นไร (วิถีมีเดีย สารานุกรมเสรี)
อัลกอริทึม (Algorithm) หมายถึง กระบวนการแก้ปัญหาที่สามารถเข้าใจได้ มีลำดับหรือวิธีการในการแก้ปัญหาใดปัญหาหนึ่งอย่างเป็นขั้นเป็นตอนและชัดเจน เมื่อนำเข้าอะไรแล้วจะได้ผลลัพธ์เช่นไร ซึ่งแตกต่างจากการแก้ปัญหาแบบสามัญสำนึก หรือฮิวริสติก (Heuristic)(http://forums.thainetdev.com/index.php?showtopic=86)
อัลกอริทึม คือ กระบวนการในการทำงานที่ใช้การตัดสินใจด้วยหลักเหตุผลและคณิตศาสตร์ เป็นตัวช่วยในการเลือกวิธีการหรือขั้นตอนการดำเนินงานต่อไปจนกระทั่งขั้นตอนสุดท้าย เป็นวิธีการที่ใช้แยกย่อยและเรียงลำดับขั้นตอนของกระบวนการในการทำงานต่างๆ เพื่อเพิ่มประสิทธิภาพในการค้นหาและแก้ไขปัญหา (www.ismed.or.th)
จากความหมายของอัลกอริทึมต่างๆ ที่กล่าวมาสรุปความหมายของอัลกอริทึมได้ดังนี้
อัลกอริทึม หมายถึง วิธีการในการทำงานอย่างใดอย่างหนึ่ง ที่มีลำดับการทำงานเป็นขั้นเป็นตอนชัดเจน และปฏิบัติตามขั้นตอนแล้วได้ผลลัพธ์ที่ถูกต้อง
2.2 คุณสมบัติของอัลกอริทึม
ในการแก้ปัญหาแต่ละปัญหามีหลายวิธี ดังนั้นการเขียนอัลกอริทึมเพื่อแก้ปัญหาแต่ละปัญหาก็มีหลายวิธีด้วย แต่ละวิธีมีทั้งข้อเด่นข้อด้อย ดังนั้นต้องเลือกให้เหมาะสมกับงานและสภาพแวดล้อมในขณะนั้น โดยทั่วไปอัลกอริทึมที่ดี ต้องมีคุณลักษณะดังต่อไปนี้
1. มีความถูกต้อง ความถูกต้องเป็นคุณสมบัติข้อแรกที่จะต้องพิจารณา นั่นคือเมื่อทำงานตามอัลกอริทึม แล้วจะต้องได้ผลลัพธ์ที่ถูกต้อง ซึ่งถ้าผลลัพธ์ที่ได้จากอัลกอริทึมไม่ถูกต้อง จะถือว่าไม่ใช่อัลกอริทึมที่ดี โดยที่ไม่จำเป็นต้องพิจารณาคุณสมบัติข้ออื่นๆ
2. ใช้เวลาในการปฏิบัติงานน้อยที่สุด
3. สั้น กระชับ มีเฉพาะขั้นตอนที่จำเป็นเท่านั้น
4. ใช้เนื้อที่ในหน่วยความจำน้อยที่สุด เนื้อที่ในหน่วยความจำจะถูกใช้สำหรับเก็บค่าของตัวแปร และเก็บคำสั่งที่ใช้ในการทำงาน ดังนั้น ถ้าอัลกอริทึมยาวเกินความจำเป็น จะทำให้ใช้เนื้อที่มาก และ ถ้ามีตัวแปรมากเกินความจำเป็น ก็จะทำให้เสียเนื้อที่ในหน่วยความจำไปด้วย
5. มีความยืดหยุ่นในการใช้งาน
6. ใช้เวลาในการพัฒนาน้อยที่สุด เมื่อนำอัลกอริทึมไปแปลงเป็นโปรแกรมภาษาคอมพิวเตอร์แล้วจะต้องใช้เวลาน้อยที่สุด
7. ง่ายต่อการทำความเข้าใจ
2.3 เครื่องมือช่วยในการเขียนอัลกอริทึม
การเขียนอัลกอริทึม เป็นการวางแผนเกี่ยวกับการแก้ปัญหา โดยจะอธิบายการทำงานที่ชัดเจนเพื่อเป็นแนวทางในการเขียนโปรแกรม ช่วยให้การเขียนโปรแกรมทำได้ง่ายขึ้น ช่วยให้โปรแกรมมีข้อผิดพลาดน้อยลง นอกจากนี้ยังช่วยตรวจสอบการทำงานของโปรแกรม ทำให้ทราบขั้นตอนการทำงานของโปรแกรมได้อย่างรวดเร็ว โดยไม่ต้องดูจากโปรแกรมจริง
ในการเขียนอัลกอริทึม มีเครื่องมือช่วยในการเขียนที่นิยมใช้ 3 แบบ คือ
1. บรรยาย (narrative description)
2. ผังงาน (flowchart)
3. รหัสเทียม (pseudo code)
3. การเขียนอัลกอริทึมด้วยภาษาธรรมชาติ
3.1 อัลกอริทึม
ขั้นตอนวิธี หรือ อัลกอริทึม (จากวิกิพีเดีย สารานุกรมเสรี)
ขั้นตอนวิธี หรือ อัลกอริทึม (อังกฤษ: algorithm) หมายถึงกระบวนการแก้ปัญหาที่สามารถเข้าใจได้ มีลำดับหรือวิธีการในการแก้ไขปัญหาใดปัญหาหนึ่งอย่างเป็นขั้นเป็นตอนและชัดเจน เมื่อนำเข้าอะไร แล้วจะต้องได้ผลลัพธ์เช่นไร ซึ่งแตกต่างจากการแก้ปัญหาแบบสามัญสำนึก หรือฮิวริสติก (heuristic)
โดยทั่วไป ขั้นตอนวิธี จะประกอบด้วย วิธีการเป็นขั้นๆ และมีส่วนที่ต้องทำแบบวนซ้ำ (iterate) หรือ เวียนเกิด (recursive) โดยใช้ตรรกะ (logic) และ/หรือ ในการเปรียบเทียบ (comparison) ในขั้นตอนต่างๆ จนกระทั่งเสร็จสิ้นการทำงาน
3.2 อัลกอริทึมด้วยภาษาธรรมชาติ
ลักษณะของการเขียนอัลกอรึมแบบบรรยาย
เป็นการแสดงขั้นตอนการทำงานในลักษณะการบรรยายเป็นข้อความด้วยภาษาพูดใดๆ เช่น ภาษาไทย ภาษาอังกฤษ ภาษาเกาหลี ภาษาญี่ปุ่น หรือ ภาษาจีน เป็นต้น ขึ้นอยู่กับความถนัดของผู้เขียนอัลกอริทึม มักเขียนบรรยายขั้นตอนการทำงานเป็นข้อๆ เช่น
การปลูกต้นไม้ แสดงขั้นตอนการทำงานด้วยอัลกอริทึมแบบบรรยายได้ดังนี้
1. ขุดหลุม
2. ใส่ปุ๋ย
3. นำต้นไม้ลงหลุม
4. กลบดิน
5. ปักหลักยึดต้นไม้
6. รดน้ำ
ข้อดี
ง่ายในการเขียนบรรยาย เนื่องจากใช้ภาษาพูดที่ผู้เขียนอัลกอริทึมคุ้นเคยอยู่แล้ว ดังนั้นจึงง่ายในการเขียนบรรยาย
ข้อเสีย
เนื่องจากการเขียนมีลักษณะบรรยาย ดังนั้น
§ ขอบเขตของการบรรยายกว้างเกินไปยืดเยื้อเกินไป
§ ยากต่อความเข้าใจ
§ ยากในตรวจสอบความถูกต้อง
§ ยากในการแปลงเป็นโปรแกรม
4. การเขียนอัลกอริทึมด้วยรหัสจำลอง
4.1 การเขียนอัลกอริทึมด้วยรหัสจำลอง
รหัสจำลองที่เรียกว่า การเขียนซูโดโค้ด (Pseudo Code)
คือการเขียนคำอธิบายขั้นตอนการทำงานของโปรแกรม โดยใช้ถ้อยคำผสมระหว่างภาษาอังกฤษและภาษาการเขียนโปรแกรมแบบโครงสร้าง ซึ่งจะช่วยให้ผู้เขียนโปรแกรมสามารถพัฒนาขั้นตอนต่าง ๆ ให้เป็นโปรแกรมได้ง่ายขึ้น ส่วนใหญ่มักใช้คำเฉพาะ (Reserve Word) ที่มีในภาษาการเขียนโปรแกรมและมักเขียนด้วยตัวอักษรตัวใหญ่ ซูโดโค้ดที่ดี จะต้องมีความชัดเจน สั้น และได้ใจความ ข้อมูลต่าง ๆ ที่ใช้จะถูกเขียนอยู่ในรูปของตัวแปร
4.2 หลักการเขียนรหัสเทียม (Pseudocode)
หลักการเขียนรหัสเทียมไม่มีกฎหรือมาตรฐานที่ตายตัว ผู้เขียนจึงอยากให้ผู้อ่านได้นำไปใช้เพื่อเป็นแนวทางในการเขียนรหัสเทียม ที่มีประสิทธิภาพยิ่งขึ้น โดยการรวบรวมหลักการต่าง ๆ ที่สำคัญเอาไว้
1. กำหนดจุดเริ่มต้นด้วยคำว่า“Begin”และจุดสิ้นสุดด้วยคำว่า“End”
2. ถ้อยคำต่าง ๆ ให้เขียนเป็นภาษาอังกฤษอย่างง่าย
3. การเขียนรหัสเทียมแต่ละคำสั่งควรเขียนเป็นบรรทัด ๆ
4. ควรมีการย่อหน้า เพื่อสะดวกต่อการอ่านและการตรวจสอบ
5. การเขียนรหัสเทียมจะเขียนจากบนลงล่าง และมีทางเข้าหนึ่งทาง ทางออกหนึ่งทาง
6. การเขียนรหัสเทียมจะไม่เขียนหมายเลขกำกับในแต่ละขั้นตอน
7. ควรใช้การย่อหน้าให้เป็นประโยชน์ การแยกคำเฉพาะ ( Keywords ) ให้มีความชัดเจน นอกจากนี้ ควรจัดรูปแบบโครงสร้างควบคุมให้เป็นสัดส่วน เพื่อให้อ่านง่าย
8. กลุ่มประโยคคำสั่งต่าง ๆ อาจถูกนำมาจัดรวมกลุ่มเข้าด้วยกันในรูปแบบของโมดูล และทำการกำหนดชื่อโมดูลขึ้นมา เพื่อให้ส่วนของโปรแกรมหลัก หรือโมดูลย่อยอื่น ๆ เรียกใช้งานได้
รูปแบบ Algorithm
<ชื่อของอัลกอริทึม>
START
1……………………………….
2……………………………….
3…………………………………
END
ตัวอย่างโจทย์
จงเขียนโปรแกรมคำนวณหาพื้นที่ สามเหลี่ยมทั่วไป โดยให้โปรแกรมมีการรับค่า ฐาน และ สูงจากทาง Keyboard จากนั้นแสดงผลลัพธ์ของพื้นที่ออกทางจอภาพ
วิเคราะห์โจทย์
แบ่งออกเป็นสองส่วนคือ ส่วนในการรับค่า คือรับค่า ฐาน และ สูงจากผู้ใช้มาเก็บไว้ในตัวแปร และส่วนในการคำนวณ
สูตรในการหาพื้นที่สามเหลี่ยมคือ (1/2) * ฐาน * สูง
ตัวอย่าง การเขียนอัลกอริทึม คำนวณหาพื้นที่สามเหลี่ยม
อัลกอริทึม (Algorithm) การหาพื้นที่สามเหลี่ยม
เริ่มต้น
รับค่าความยาวของฐานมาเก็บในตัวแปร BASE
รับค่าความยาวของสูงมาเก็บในตัวแปร HEIGHT
คำนวณหาพื้นที่ AREA = 0.5 * BASE*HEIGHT
แสดงผลพื้นที่
จบ
ซูโดโค้ด (Pseudo codes) Algorithm Triangle
START
READ BASE
READ HEIGHT
AREA = 0.5 * BASE * HEIGHT
PRINT AREA
END
5. การเขียนอัลกอริทึมด้วยผังงาน
3.1 รูปแบบการเขียนผังงาน
ลักษณะการเขียนอัลกอริทึมแบบผังงาน
การเขียนอัลกอริทึมแบบบรรยาย จะเป็นการเขียนอัลกอริทึมแบบไม่เป็นมาตรฐาน เนื่องจากเขียนบรรยายด้วยภาษาพูดใดๆ ดังนั้นคนที่จะเข้าใจได้ ต้องเป็นคนที่เข้าใจภาษาพูดนั้นด้วย และทำความเข้าใจก็ขึ้นกับการตีความของคนนำไปใช้ แต่การเขียนอัลกอริทึมแบบผังงานจะแสดงขั้นตอนการทำงานในลักษณะของรูปภาพหรือสัญลักษณ์ ซึ่งเป็นสัญลักษณ์ที่เป็นมาตรฐาน ไม่อ้างอิงภาษาใดภาษาหนึ่ง ทำให้เห็นลำดับการทำงานก่อนหลังได้ชัดเจน เช่น
การปลูกต้นไม้ แสดงขั้นตอนการปลูกต้นไม้ด้วยผังงาน ดังภาพต่อไปนี้
ภาพที่ 1 ผังงานแสดงขั้นตอนการปลูกต้นไม้
ข้อดีของการเขียนอัลกอรทึมแบบผังงาน
§ ทำความเข้าใจได้ง่าย
§ ตรวจสอบความถูกต้องได้ง่าย
§ พัฒนาโปรแกรมได้ง่าย
§ ง่ายต่อการบำรุงรักษาโปรแกรม
Flowchart (โฟลวชาร์ต)
คือ การแสดงขั้นตอนการทำงานโดยใช้สัญลักษณ์รูปภาพเป็นตัวสื่อความหมาย รูปภาพแต่ละรูปจะมีความหมายเฉพาะตัว และใช้ลูกศรกำหนดทิศทางการทำงานในแต่ละขั้นตอน
สัญลักษณ์รูปภาพของโฟลวชาร์ต
ตัวอย่าง Flow Chart การหาพื้นที่สามเหลี่ยม