บทเรียนหน่วยการเรียนรู้ที่ 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 การหาพื้นที่สามเหลี่ยม