ในบล๊อกนี้จะพูดถึง Flowchart เป็นหลัก เนื่องจากเคยเขียนสรุปไปแล้ว เลยจะไม่ขอพูดถึงว่า Flowchart คืออะไรอีก สำหรับใครที่ยังไม่เคยอ่านสามารถกลับไปดูได้ที่ fundamental-programming
ทำไมต้องเขียน Flowchart
จากประสบการณ์ของเราตอนเริ่มเขียนโปรแกรมใหม่ๆ และหลังๆ ลองเก็บข้อมูลจากการสอนน้องๆ ดู พบว่าสาเหตุแรกๆ ที่ได้ยินโจทย์ปุ๊บจะเริ่มเขียนโค้ดเลยอ้าว .. แล้วมันผิดตรงไหน ก็เขียนโปรแกรมนะ
ใช่ มันไม่ผิดหรอก แต่อย่างที่เคยพูดไปในหัวข้อ ก่อนจะทำให้โปรแกรมฉลาดได้ โปรแกรมเมอร์ต้องฉลาดก่อน การเขียนโปรแกรมที่ถูกต้องไม่ใช่ว่าเปิดมาก็ซัดโค้ดเลย เราต้อง "ลำดับความคิด" ให้เสร็จก่อน
ถ้ายังไม่รู้ว่าโจทย์นี้มีวิธีคิดยังไงก็อย่าเริ่มเขียนเลย เขียนไม่ได้หรอก แรกๆ ขอแนะนำให้ใช้ tool ที่มีชื่อว่า "Flowchart" ในการลำดับความคิดของเรา และใช้การเขียนในกระดาษจะดีที่สุด จนเมื่อไหร่ที่เชี่ยวชาญแล้วระดับฟังโจทย์ปุ๊บ Flowchart โผล่มาในหัวปั๊บ จะเลิกเขียน Flowchart ก่อนเขียนโปรแกรมก็ย่อมได้เพราะถ้าถึงระดับนั้นแสดงว่าคุณรู้จักการลำดับความคิดแล้วยังไงล่ะ
เขียน Flowchart (ก็ยากแล้ว) ได้แล้ว แต่ดันแปลงเป็นโค้ดโปรแกรมไม่ได้
เอาล่ะ สมมุติว่าเราได้โจทย์มาข้อหนึ่ง แล้วหลังจากนั่งๆ นอนๆ ขีดๆ เขียนๆ ไปพักใหญ่ๆ เราก็ได้เจ้านี่มาเป็น Flowchart คำตอบของโจทย์นี้ wow!
แต่เอาล่ะสิ! Flowchart ซับซ้อนขนาดนี้จะเขียนโค้ดยังไงล่ะนั่น
อันดับแรกอย่างเพิ่งกลัวมันเพียงเพราะเส้นมันเยอะ ไม่ว่ามันจะซับซ้อนแค่ไหน ส่วนใหญ่รูปแบบมันจะตกอยู่แค่ 4 รูปแบบเท่านั้นแหละ
สำหรับคนเขียนโปรแกรมคนรู้จัก statement ซึ่งเป็นเหมือนสิ่งที่ควบคุมทิศทางการทำงานของโปรแกรม (Flow control) 4 ตัวต่อไปนี้ดี น่ันคือ
จริงๆ การเขียนโปรแกรมมันก็มีแค่นี้แหละ แต่เลือกตัวไหนมาใช้กับสถานการณ์ไหนล่ะ
- if
- if-else
- while / for
- do .. while
ถ้ายังเลือกไม่เป็นงั้นเรามาดูพวกมันทีละตัว
if
"ถ้าเกิด condition ให้ทำ P (ถ้าไม่เกิดก็ไม่ทำนะ) "นิยายของ if คือการ เลือกว่าจะทำหรือไม่ทำ ดังนั้นถ้าเราเจอ Flowchart รูปร่างแบบด้านล่างนี้ นั่นคือเริ่มด้วย condition แล้วแตกเป็น 2 ทาง ด้านหนึ่งมีการทำ P อะไรสักอย่างส่วนอีกด้านเว้นว่างๆ ไว้แล้วค่อยกลับมารวมเป็นเส้นเดียวกันอีกครั้ง ... ก็ขอให้นึกถึง if ไว้ก่อนเลย
if-else
"ถ้าเกิด condition ให้ทำ P1 ถ้าไม่เกิดจะทำ P2 แทน "นิยายของ if-else คือการ ก็คล้ายๆ กับ if นั่นแหละ ต่างกันแค่ว่าอีกด้านหนึ่งของ if ที่เว้นว่างๆ ไว้คราวนี้มันจะมี P อะไรสักอย่างโผล่มาแล้ว
หมายความว่ามันจะต้องเกิดแน่นอนสักตัว ไม่ P1 ก็ P2 นะ
while / for
"ถ้าเกิด condition ให้ทำ P ไปเรื่อยๆ (ถ้าไม่เกิดก็ไม่ทำนะ) "นิยายของ while นั้นเหมือนกับ if เกือบทุกอย่างยกเว้นการทำต่อไปเรื่อยๆ
จากเส้น if ที่เดิมทำเสร็จแล้วก็จบกันเลย กลายเป็นลากกลับขึ้นข้างบนไปทำให้อีกรอบหรือที่เราเรียกกันว่า loop นั่นเอง
เอ้า เขียนให้มันสวยๆ หน่อยก็จะได้รูปแบบประมาณนี้
แล้ว for ล่ะ ... ก็เหมือนกับ while นั่นแล แต่ for เป็นการจัดให้โค้ดการเขียน loop ที่เขียนบ่อยๆ ในรูปแบบเดิมๆ นั่นคือ initialize -> condition -> Process -> update (ส่วนประกอบหลักทั้ง 4 ของการเขียน loop) อยู่เป็นสัดส่วนมากขึ้นเท่านั้นเอง แต่โดยรวมแล้วมันก็ตัวเดียวกันนั่นแหละ
do..while
"ให้ทำ P ไปเรื่อยๆ ถ้ายังเกิด condition (ถ้าไม่เกิดก็ไม่ทำนะ) "นิยายของ do..while คือการจับ while มาสลับที่ นิยามมันก็เลยสลับที่กับ while ยังไงล่ะ
จากเช็กก่อนว่าเงื่อนไขนี้เกิดมั้ยแล้วค่อยทำ
กลายเป็นทำก่อนเลยแล้วค่อยเช็กเงื่อนไขว่ายังจะทำต่อป่ะ
หมดแล้ว!
ก็มีแค่นี้แหละ 4 รูปแบบ มาทวนกันอีกรอบพร้อมจุดสังเกตนะ (จำจุดสังเกตไว้ด้วยล่ะ)
- if มีทางแยก 2 ทาง ทางหนึ่งมี Process อีกทางว่างไว้ ไม่ทำไร
- if-else มีทางแยก 2 ทาง มี Process ทั้งสองทางเลย
- while มีทางแยก 2 ทาง ทางหนึ่งมี Process (ทำเสร็จแล้ววนกลับไปข้างบน) อีกทางไม่ทำไร
- do..while เปิดมาก็ทำ Process เลย แล้วค่อยมีทางแยกเลือกว่าจะวนกลับไปข้างบนหรือไปต่อ
กลับมาดู Flowchart ของเรากันดีกว่า
อ่ะ ให้ดูอีกรอบเผื่อลืมไปแล้วโอเค มันใหญ่มาก!
แต่อย่างเพิ่งกลัว ลองดูก่อนว่ามี pattern ไหนตรงกับ "4 รูปแบบ" ของเราไหม (แน่นอนมันต้องมีอยู่แล้วล่ะ ฮา)
สำหรับตัวแรกที่เราเลือก (จริงๆ เลือกตัวไหนก่อนก็ได้นะ มีค่าเท่ากัน) ขอเลือกส่วนที่เป็น con2 เพราะมันเล็กๆ อยู่ตรงกลางพอดี
ก็จะพบว่ามันคือ "มีทางแยก 2 ทาง ทางหนึ่งมี Process (ทำเสร็จแล้ววนกลับไปข้างบน) อีกทางไม่ทำไร (จบ) "
∴ ก็เลยสรุปได้ว่า อ้อ นี่มัน while นี่นา
เห็นมั้ย ไม่ยาก ได้หนึ่งตัวแล้ว ต่อไปมาดูอะไรที่ใหญ่กว่าข้อที่แล้วขึ้นมาหน่อย ที่ con1
จะเห็นว่ามันคือ "มีทางแยก 2 ทาง ทางหนึ่งมี Process อีกทางว่างไว้ ไม่ทำไร"
ดูออกมั้ย? ก้อน Process ของมันอาจจะใหญ่สักหน่อย ตั้งแต่ C -> whileข้อเมื่อกี้ แต่มันก็ถือเป็น Process กล่องนึงได้อยู่ดี
∴ ตรงนี้ก็เลยเป็น if นั่นเอง ... เป็น if ที่มี while อยู่ข้างในนะ
แล้วเราก็จะออกไปอีกชั้นหนึ่ง ก็ไปดูที่ con3 กัน
ดูลักษณะแล้วนั้น ... "เจ้านี่มีก้อน Process (ใหญ่ยักษ์เบ้อเริ่มเทิ่ม) อยู่ข้างบน แล้วค่อยมีทางแยกเลือกว่าจะวนกลับไปข้างบนหรือไปต่อ"
∴ เลยสรุปว่ามันคือ do..while แน่ๆ ... เป็น do..while ที่มี if อยูข้างในแล้วก็มี while อยู่ข้างในอีกทีนะ อินเซ็ปชั้นนนน~
ทีนี้ก็เหลือแค่ตัวเดียวตรงท้ายสุด หลังจากทำมา 3 ข้อแล้วอันนี้คงไม่ยากนัก มันเป็นรูปร่างแบบ "มีทางแยก 2 ทาง มี Process ทั้งสองทางเลย"
ชัดๆ ขนากนี้ แน่นอนว่ามันก็ต้องเป็น
∴ ฟันธง! if-else แน่
เมื่อเรามองออกทั้งหมดแล้ว ก็เอามาเขียนโค้ด จะได้แบบนี้
A;ข้างบนนั้น do..while ใหญ่ที่สุด (แต่ A มาก่อนนะ) ข้างในจะมี if และ while ซ้อนเข้าไป แล้วพอจบ do..while เราจะเจอ if-else ต่ออีกตัวหนึ่ง
do{
B;
if( con1 )
{
C;
while( con2 )
{
D;
E;
}
}
F;
}while( con3 );
if( con4 )
{
G;
H;
}
else
{
I;
}
เรียบร้อย!
ขอบคุณมากค่ะ ยังทำต่ออยู่ไหมค่ะ
ตอบลบ