บทความอื่นๆ ในชุดของ Intro to Programming & Algorithm
- บทนำฉบับรวบรัด! ความรู้พื้นฐานก่อนเริ่มเขียนโปรแกรม
- รู้จักกับตัวแปลภาษา Compiler และ Interpreter
- Algorithm (1) – ขั้นตอนวิธี หัวใจสำคัญของการเขียนโปรแกรม
- Algorithm (2) – อัลกอริทึมในมุมมองของคอมพิวเตอร์
- Algorithm (3) – Decision การสร้างทางเลือกให้โปรแกรม
- Algorithm (4) – loop สั่งให้โปรแกรมทำงานซ้ำๆ
- ตัวอย่างการสร้าง Algorithm
ในบทความก่อนๆ เราสอนวิธีการเขียน Algorithm แบบพื้นฐานไปแล้ว ซึ่งอยู่ในรูปแบบของ Input → Process → Output (ย้ำกันอีกที ให้จำได้!)
แต่ Algorithm ที่เราเขียนได้ตอนนี้จะทำงานแบบตรงไปตรงมา รับค่าเข้ามา คำนวณ แล้วแสดงผล จบ! แค่นั้น ซึ่งถ้าโปรแกรมมันทำงานได้แค่นี้จริงๆ มันจะเป็นอะไรที่น่าเบื่อมาก (คือคอมพิวเตอร์จะมีความสามารถพอๆ กับเครื่องคิดเลยกันเลย)
ดังนั้น ถ้าคำสั่งที่สั่งให้คอมพิวเตอร์มีการเลือกตัดสินใจ หรือคิดว่าควรจะทำงานแบบไหน (ตามเงื่อนไขที่เรากำหนดลงไป) ก็คงจะดีนะ!
ด้วยเหตุนี้แหละ เลยเป็นที่มาของคำสั่งในการสร้างทางเลือกสำหรับคอมพิวเตอร์ นั่นคือ...
Decision
การสร้างทางเลือก ทำให้เส้นทางวิ่งของ Algorithm มีการแยกทางออกจากันได้ (ปกติการเขียน Algorithm จะเป็นเส้นเรียงต่อกันจากบนลงล่าง จะแยกทางไม่ได้)
ในการเขียนโปรแกรมส่วนใหญ่แล้ว เราต้องการให้คอมพิวเตอร์คิดหรือตัดสินใจอะไรแทนคนได้ ซึ่งหลังๆ เราจะแบ่งประเภทการเขียน Decision ได้ออกเป็น 2 แบบคือ if-else
และ loop
(ที่เดี๋ยวจะพูดถึงในบทถัดๆ ไป)
if เลือก..ด้วยคำสั่ง "ถ้า"
เป็นรูปแบบการสร้าง decision แบบง่ายที่สุดโดยเป็นการเลือกที่จะ “ทำ” หรือ “ไม่ทำ” statement ตัวนั้นๆ โดยโค้ดจะใช้ตามแพทเทิร์นข้างล่างนี่
สำหรับการเขียน Flowchart เราจะใช้สัญลักษณ์ "สี่เหลี่ยมทรง diamond" หรือ "สี่เหลี่ยมทางเพรช" ในการสร้างทางแยก แต่ถ้าเราวางทางแยกแบบธรรมดา คอมพิวเตอร์ไม่มีทางตัดสินใจได้แน่นอนว่าจะวิ่งซ้ายหรือขวา (ก็เพราะมันไม่มีสมองไง) ดังนั้นเราต้องเขียนสิ่งที่เรียกว่า "Condition" หรือ "เงื่อนไข" ลงไปด้วย
มาดูตัวอย่างกัน
ในตัวอย่างนี้ สมมุติให้เป็นโปรแกรมคิดราคาสินค้า โดยถ้าลูกค้ามีแต้มสะสมมากกว่า 50 แต้ม จะลดราคาให้ 10% (ลดราคาให้ 10% สามารถคิดง่ายๆ คือราคาจะเหลือ 90% หรือ 0.90 นั่นเอง)
ดังนั้น... ก็จะสังเกตได้ว่า เราไม่ได้ลดราคาให้เขาทุกครั้ง แต่จะลดเฉพาะครั้งที่มีแต้มสะสมมากกว่า 50 คะแนน → ดังนั้นต้องมีการสร้าง Decision ขึ้นมาให้คอมพิวเตอร์เลือกทำแน่นอน
ตามกฎการเขียน Algorithm ที่ดีจะต้องเริ่มด้วย Input และจบด้วย Output อันนี้ไม่มีปัญหา แต่ส่วนของการ Process นั้นมีการวาง Decision เป็นทางเลือกลงไปเพื่อเช็กว่า point > 50
ตามที่โจทย์ถามมารึเปล่า
สังเกตดูว่ามีเส้นแตกออกจากกล่อง Decision 2 เส้น (ปกติ Flowchart จะเรียงกันเป็นเส้นตรงเส้นเดียว) เลยต้องมีการเขียนกำกับเส้นไว้ด้วยว่าถ้าเงื่อนไขที่ตั้งไว้เป็น Yes
ให้ไปทางไหน และถ้าเป็น No
ให้ไปทางไหน
ตามโจทย์ถ้าไปทาง Yes
เราจะต้องลดราคาให้เขา 10% แต่ถ้าไม่ ก็คิดราคาเดิม = ไม่ลดราคา = ก็ไม่ต้องทำอะไรไง ... ก็เลยได้ออกมาเป็น Flowchart แบบข้างบนนั่นเองนะ
สร้าง Condition ด้วย Yes-No Question
เมื่อกี้เราบอกว่าการจะสร้างทางเลือก Decision ให้คอมพิวเตอร์เลือกทางในการทำงานได้ จะต้องมีการกำหนดเงื่อนไขขึ้นมา ซึ่งเราจะเรียกมันว่า Condition (Decision คือการสร้างทางเลือก แต่จะต้องมี Condition เป็นเงื่อนไขในการตัดสินใจ)
แต่ใช่ว่าเราจะกำหนด Condition ยังไงก็ได้ตามใจฉัน เพราะ Condition จะต้องเขียนให้อยู่ในรูปแบบของ Yes-No Question
หรือที่ภาษาโปรแกรมเรียกว่า boolean expression
นั่นเอง
พูดง่ายๆ คือคำถามนั้นจะต้องตอบด้วย "ใช่" (หรือ true
) และ "ไม่" (หรือ false
) เท่านั้น เช่น
- 1 + 2 เท่ากับ 3 ? ตอบว่า TRUE → ใช้ได้!
- 1 + 2 เท่ากับ 4 ? ตอบว่า FALSE → ใช้ได้!
- 1 + 2 = ? ต้องตอบเป็นคำเลขคำตอบจากการบวก → แบบนี้ใช้ไม่ได้นะ!
ซึ่งวิธีการง่ายๆ ที่จะให้คำถามของเราเป็น Yes-No Question คือการใช้ operator (ตัวดำเนินการ) พวกนี้
ส่วนใหญ่ก็จะเป็นตัวเปรียบเทียบแบบที่เรียนมาในวิชาคณิตศาสตร์ละนะ แต่ 6 ตัวนี้เป็นตัวที่สามารถเอาไปเขียนในภาษาโปรแกรมแทบจะทุกภาษาได้
if-else "ถ้า-แล้ว" แต่ถ้าไม่ใช่แล้วจะให้ทำอะไร
ในตัวอย่างแรก เราเพิ่มการเลือกว่าจะทำหรือไม่ทำไปแล้ว แต่ก็ยังขาดอะไรบ้างอย่างนั่นคือการกำหนดว่า "แล้วถ้าไม่ใช่ จะให้ทำอะไรล่ะ?"
นั่นเป็นที่มาของคำสั่งในรูปแบบของ if-else
นั่นเอง
โอเค มาดูตัวอย่างการใช้ if-else กันต่อเลยนะ สมมุติว่าเราต้องการเขียนโปรแกรมที่เอาไว้เช็กว่าคะแนนที่กำหนดมา Pass หรือ Not Pass โดยวิธีวัดคือถ้าได้คะแนนตั้งแต่ 50 คะแนนขึ้นไปถือว่าผ่าน
วิธีการเขียนก็คือเราก็ต้องคิดก่อนว่าจาก Condition ที่กำหนด (คือตัดผ่านที่ 50 คะแนนขึ้นไปอ่ะนะ)
ผลการตรวจสอบแน่นอนว่ามันจะแบ่งออกมาเป็น 2 เคสคือ ผ่านกับไม่ผ่าน
(สังเกตอย่างหนึ่ง คือในเงื่อนไขเราจะใช้ score ≥ 50
ไม่ใช่ score > 50
นะ เพราะเราต้องการบอกว่า แค่ 50 ก็ผ่านแล้วนะ)
นั่นก็คือหลังจากแยกฝั่ง Decision ออกเป็น 2 เส้นแล้ว ก็จะมีการทำงานบางอย่าง (ที่ไม่เหมือนกัน) ทั้ง 2 ข้างเลย
ข้อควรจำอีกอย่างคือถ้าเราเขียน Algorithm แบบนี้ block ทางฝั่งซ้าย (ฝั่ง true) และขวา (ฝั่ง false) จะไม่มีทางเกิดพร้อมกันแน่นอน! เพราะว่าตาม Algorithm แล้วคอมพิวเตอร์จะทำงานตามเส้นทางที่เราวางไว้ และในเมื่อมันแยกออกจากกันเป็น 2 เส้นทางแสดงว่ามันจะเกิด action แค่ข้างเดียวแน่นอน