17 สิงหาคม, 2557

อยากเขียนโปรแกรม เริ่มยังไงดี? - ตอนที่ 3 แปลงความคิดในหัว (Flowchart) ให้กลายเป็น Code

2:45
ในบล๊อกนี้จะพูดถึง 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{
    B;
  
    if( con1 )
    {
        C;
      
        while( con2 )
        {
            D;
            E;
        }
    }
  
    F;
}while( con3 );

if( con4 )
{
    G;
    H;
}
else
{
    I;
}
ข้างบนนั้น do..while ใหญ่ที่สุด (แต่ A มาก่อนนะ) ข้างในจะมี if และ while ซ้อนเข้าไป แล้วพอจบ do..while เราจะเจอ if-else ต่ออีกตัวหนึ่ง
เรียบร้อย!

1 ความคิดเห็น: