03 September 2020

Learn to Code 1 - บทที่ 7 Algorithms

Algorithms

บทสุดท้ายที่มาพร้อมกับความท้าทาย มาเขียนอัลกอริทึ่ม (Algorithms) หรือ ชุดของคำสั่งที่สร้างไว้ตามขั้นตอนกันเถอะ!


บทนี้เป็นการทบทวนความรู้จากบทเรียนที่ผ่านมาทั้ง 6 บท 

1. Commands (คำสั่ง)
2. Functions (ฟังก์ชัน)
3. For Loops (ทำคำสั่งซ้ำด้วย for)
4. Conditional Code (if, else)
5. Logical Operators (AND, OR, NOT)
6. While Loops (ทำคำสั่งซ้ำด้วย while)
7. Algorithms (ชุดของคำสั่งที่สร้างไว้ตามขั้นตอน)



The Right-Hand Rule


กฎมือขวา

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

เพื่อแก้สถานการณ์นี้ Learn to Code1 จึงแนะนำ กฎมือขวา นั่นก็คือให้สร้างเงื่อนไขโดยการเช็คเส้นทางด้านขวามือ

เพื่อให้เข้าใจง่าย... เราขอเปลี่ยนชื่อใหม่ว่า กฎกำแพงมือขวา


สรุปสั้นๆ 

ก็คือ การเดินเลาะกำแพงไปเรื่อยๆ โดยให้ กำแพงอยู่ด้านขวามือเสมอ



ในแบบฝึกหัดชื่อ Adjusting Your Algorithm (ปรับอัลกอริทึ่มของคุณ) จะมีคำใบ้ว่า เราจะต้องสร้าง Function เพื่อจัดการกับสิ่งกีดขวาง 3 กรณี ดังนี้

  • กีดขวางด้านขวา และ ด้านหน้า 
  • กีดขวางด้านขวา
  • ไม่ถูกกีดขวาง

แต่เดี๋ยวก่อน!

เขียนตรงตามคำใบ้เป๊ะ แต่ทำไมตัวละครยังเดินวนล่ะ ??

เรามาดูเฉลยของแบบฝึกหัด Adjusting Your Algorithm กันค่ะ



เฉลย

func rightHandRule() {

   if !isBlockedRight { 
   turnRight()
   moveForward()

   } else if !isBlocked {   
   moveForward()

   } else if isBlockedRight {   
   turnLeft()

   }

}


while !isOnClosedSwitch {
    rightHandRule()
    if isOnGem {
        collectGem()
    }
}
toggleSwitch()



คำอธิบาย

ฟังก์ชันชื่อ rightHandRule กฎมือขวา

ถ้าไม่มีสิ่งกีดขวางด้านขวา ( ! is blocked right ) จงหันขวา เดินหน้า 1 ก้าว

นอกเหนือจากนั้น ถ้าไม่มีสิ่งกีดขวางด้านหน้า ( ! is blocked ) จงเดินหน้า 1 ก้าว

นอกเหนือจากนั้น ถ้ามีสิ่งกีดขวางด้านขวา ( is blocked right ) จงหันซ้าย


ในขณะที่ ไม่ได้อยู่บนสวิตช์ที่ปิดอยู่ ( ! is on closed switch ) จงทำคำสั่งในวงเล็บปีกกาต่อไปนี้

   {

      ทำงานตามขั้นตอนในฟังก์ชันชื่อ rightHandRule 

      ถ้า อยู่บนที่ซึ่งมีอัญมณี { จงเก็บอัญมณี }

   }

จงกดสวิตช์

-- จบการทำงาน --


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



-- ดีบี --