30.6.09

หัดคลาน Programming Algorithm

excel-vba-for-loop-do-while-loop-and-do-until-loop หลายๆคนที่เริ่มเขียนโปรแกรม แบบว่าเขียนตามหนังสือ หรือเขียนเพราะอยากเขียนเป็น จะเจอคำถาม คำถามหนึ่งที่บางครั้ง เราก็ลืมถามตัวเอง แล้วก็ไม่ได้หาคำตอบด้วยว่า เราจะวนลูปไปทำไม ทำไมต้องวนลูป for loop, while loop เอาไว้ทำไมหว่า !!!??? แล้วพวก if , else , else if มันเอาไว้ทำไมกัน ฉันจะใช้มันตอนไหนเนี่ย ???!!! เป็นคำถามที่เก็บเงียบสำหรับมือใหม่ ผมเองก็เคยเป็นเหมือน สมัยที่เริ่มเขียนโปรแกรมใหม่ๆ ยิ่งถ้าเป็นประเภทว่า อ่านตามหนังสือแล้วทำตามนะ แทบจะเลิกไปเลยหล่ะ มันแทบไม่ทำให้เราเข้าใจสักที ว่าเราต้องใช้พวกมันไปทำไม

วันนี้ผมจะมายกตัวอย่างให้เห็นกันแบบเป็นรูปธรรม เอาแบบว่ายกตัวอย่างในชีวิตประจำวันเรา กับขั้นตอนวิธีคิดการเขียนโปรแกรม (Algorithm) เพราะผมเห็นหลายๆคน เพื่อนๆหลายคนที่เรียนด้วยกัน เวลาเจอวิชาโปแกรมมิ่ง มักจะมาถามบ่อยๆว่าตรงนี้ทำได้งัย คิดยังงัย พอเราอธิบาย มันก็ทำหน้าเหมือนเข้าใจ แต่พอเวลาให้ไปimageเขียนเอง หรือต้องเขียนด้วยตัวเอง มักจะทำไม่ได้ เพราะว่าเค้ายังไม่เข้าใจว่า คอมพิวเตอร์มันคิดเองไม่เป็น ซึ่งบางคนอาจจะแย้งว่า computer AI ปัญญาประดิษฐ์ (Artificial Intelligence)  มันคิดเองเป็นนะ นั่นไม่ใช่มันคิดเป็นนะ เราสอนให้มันคิดต่างหากหล่ะ และพวกมันก็คิดได้เป็นเรื่องๆเท่านั้น หลายเรื่องพร้อมกัน ทำได้ยากมาก ถ้าทำได้ นั่นก็แปลว่าคนที่โปรแกรมให้มันเก่งกว่ามันต่างหาก 

นอกเรื่องไปซะยาว กลับมาเข้าขั้นตอนการคิดแบบเป็นขั้นเป็นตอนกันดีกว่า เริ่มจากปัญหาพื้นฐานทั่วไปแล้วกัน ถ้าเพื่อนต้องทำงานที่จะต้องทำซ้ำๆ กัน ยกตัวอย่างว่า ให้เพื่อนๆ หาคำว่า "Algorithm"  ที่อยู่ในหน้าเว็บนี้ เพื่อนๆ คิดว่ามีคำนี้กี่คำ หลายๆคนหัวเราะ แล้วก็ยิ้ม ง่ายจะตาย เอามาถามทำไม แล้วมันเกี่ยวกับการเขียนโปรแกรมยังงัย ก็แค่นับดูก็รู้แล้ว ใจเย็นๆครับพี่น้อง ทีผมกำลังจะสื่อสารก็คือ จริงอยู่ที่เพื่อนๆบอกว่า แค่นับเอาก็รู้อยู่แล้ว แต่เวลาที่เราจะเอาไปเขียนเป็นภาษาคอมพิวเตอร์หล่ะ มันจะเขียนยังงัย นี่งัยหล่ะ Algorithm นี่งัยหล่ะ วิธีการวางแนวคิดในการแก้ปัญหา  อย่างหนึ่งที่เห็นได้ชัดเลยว่า คนที่เขียนโปรแกรมเป็น หรือเหล่าบรรดาโปรแกรมเมอร์ทั้งหลาย ที่แตกต่างจากคนทั่วไปนั่นก็คือ Algorithm ทางภาษาคอมพิวเตอร์ครับ

 

"...... Algorithm : ขั้นตอนวิธี หรือ อัลกอริทึม (อังกฤษ: algorithm) หมายถึงกระบวนการแก้ปัญหาที่สามารถเข้าใจได้ มีลำดับหรือวิธีการในการแก้ไขปัญหาใดปัญหาหนึ่งอย่างเป็นขั้นเป็นตอนและชัดเจน เมื่อนำเข้าอะไร แล้วจะต้องได้ผลลัพธ์เช่นไร ซึ่งแตกต่างจากการแก้ปัญหาแบบสามัญสำนึก หรือฮิวริสติก (heuristic)

โดยทั่วไป ขั้นตอนวิธี จะประกอบด้วย วิธีการเป็นขั้นๆ และมีส่วนที่ต้องทำแบบวนซ้ำ (iterate) หรือ เวียนเกิด (recursive) โดยใช้ตรรกะ (logic) และ/หรือ ในการเปรียบเทียบ (comparison) ในขั้นตอนต่างๆ จนกระทั่งเสร็จสิ้นการทำงาน

ในการทำงานอย่างเดียวกัน เราอาจจะเลือกขั้นตอนวิธีที่ต่างกันเพื่อแก้ปัญหาได้ โดยที่ผลลัพธ์ที่ได้ในขั้นสุดท้ายจะออกมาเหมือนกันหรือไม่ก็ได้ และจะมีความแตกต่าง ที่จำนวนและชุดคำสั่งที่ใช้ต่างกันซึ่งส่งผลให้ เวลา (time) , และขนาดหน่วยความจำ (space) ที่ต้องการต่างกัน หรือเรียกได้อีกอย่างว่ามีความซับซ้อน (complexity) ต่างกัน

การนำขั้นตอนวิธีไปใช้ ไม่จำกัดเฉพาะการเขียนโปรแกรมคอมพิวเตอร์ แต่สามารถใช้กับปัญหาอื่น ๆ ได้เช่น การออกแบบวงจรไฟฟ้า, การทำงานเครื่องจักรกล, หรือแม้กระทั่งปัญหาในธรรมชาติ เช่น วิธีของสมองมนุษย์ในการคิดเลข หรือวิธีการขนอาหารของแมลง....."

ที่มา จากวิกิพีเดีย สารานุกรมเสรี

กลับมาที่ปัญหาของการนับคำว่า "Algorithm" หน้าเว็บเมื่อกี้ แน่หล่ะว่าเราต้องอาศัยการนับ มาช่วยในการแก้ปัญหา เราจะเริ่มจากการวางแผนในการแก้ปัญหา เอาแบบง่ายๆก่อน หลังจากนั้น เราก็จะทำให้มันรัดกุมขึ้น และครอบคลุมทุกๆเงื่อนไขที่อาจจะเกิดขึ้นได้ โดยที่ตัวโปแกรมสามารถทำงานผ่านไปได้ โดยไม่หยุดการทำงานลงกลางคัน

image ถ้าเป็นปัญหาแบบนี้ เพื่อนๆก็คงจะใช้วิธีไล่อ่านไปที่ละบรรทัด โดยใช้นิ้วหรือปากกาไล่ไปตามตัวอักษร หากว่าในบรรทัดนั้นมีคำว่า "Algorithm" ก็ต้องทำการจดบันทึกไว้ก่อน แล้วก็ไล่ไปอีกเรื่อยๆ จนสุดบรรทัด แล้วก็เอาค่าที่ได้รวมกันไว้แล้ว หรือมารวมกันทีหลัง เอามาเป็นคำตอบแน่ๆ  แน่นอนหล่ะ เราทำได้แล้ว เราแก้ปัญหาได้แล้ว ปัญหาก็คือจะเขียนมันยังงัยหล่ะ ตรงนี้มันเป็นส่วนของไวยกรณ์ (syntax) ของแต่ละโปแกรม ซึ่งเพื่อนๆสามารถหาอ่านได้จากคู่มือโปแกรม (help) หรือไม่ก็หนังสือสอนการเขียนโปรแกรม แต่ขั้นตอนการแก้ปัญหา (Algorithm) มันเป็นเรื่องของความคิดของแต่ละคน จนบางครั้งในปัญหาเดียวกันนี้ เราสามารถเขียนขั้นตอน (Algorithm) ในการแก้ปัญหาออกได้เป็นหลายๆวิธี ซึ่งขึ้นอยู่กับประสบการณ์ของแต่ละบุคคล

ถ้าในความคิดผมนะ ผมจะทำการโหลดข้อความทั้งหมดในหน้าเว็บนี้ เข้ามาเก็บไว้ในตัวแปร (ตัวแปร ก็เป็นหน่วยความจำที่รู้ตำแหน่งที่เก็บนั่นเอง) ก่อน หลังจากนั้นผมก็จะทำการการอ่านข้อมมูลทีละบรรทัด (ใช้ loop while ช่วย) โดยในขณะทีทำการอ่านทีละบรรทัดไปนั้น ผมก็ทำการเช็คไปด้วยว่าเจอคำว่า "Algorithm" ไหม ถ้าเจอ ก็บวกไว้หนึ่ง (ตรงนี้ อาจจะใช้การเพิ่มค่าตัวแปรคำตอบ ans++; ก็ได้ ) พอจบบรรทัดนึง while loop ก็ทำการเช็คว่าเป็นบรรทัดสุดท้ายหรือยัง ถ้ายัง (ข้อมูลเป็นจริง) ก็ยังจะทำการอ่านบรรทัดต่อไป ทำเช่นนี้ไปเรื่อยๆ จนสุดบรรทัดสุดท้าย โปรแกรมก็เลิกทำงานแล้วเอาคำตอบมาแสดง

เห็นไหมหล่ะครับ ว่าขั้นตอน (Algorithm) มันประมาณนี้ แต่ถ้าเกิดมีคำถามเพิ่มขึ้นมาว่า คำว่า "Algorithm" มันอยู่บรรทัดไหนบ้าง เอาหล่ะสิ เพื่อนๆคิดว่าจะเพิ่มโค๊ดเข้าไปตอนไหน เพื่อนๆบางคนอาจจะคิดออกแล้ว ว่าจะต้องเพิ่มโค๊ดเข้าไปตรงไหน แต่สำหรับคนที่ยังคิดไม่ออก ไม่เป็นไรครับ ของอย่างงี้มันขึ้นอยู่กับการฝึกฝนครับ ฝึกมากๆ เก่งมากครับ

สุดท้ายผมได้เขียน ภาษา PHP ลองแก้ปัญหาที่ถามเพื่อนไป แต่สำหรับใครที่อยากจะเขียนภาษาอื่น ก็ไม่ว่ากันครับ ก็อย่างที่บอกแหละครับ มีแค่ไวยกรณ์ (syntax) ของภาษาเท่านั้นแหละที่มันต่างกัน แต่การสื่อความหมาย มันเหมือนๆกันแหละครับ วันนี้พอแค่นี้ก่อนแหละกัน บทความนี้ชักจะยาวไปแล้ว   สวัสดีครับ

<?php
$handle = fopen("data.txt", "r");
$contents = '';
$ans = 0;
$lineNumber = 1;
while (!feof($handle)) {
    $contents = fgets($handle, 4096);
    $ans = $ans + substr_count($contents, "Algorithm");
    echo "บรรทัดที่ ".$lineNumber."  พบคำว่า Algorithm จำนวน   ".substr_count($contents, "Algorithm")."  คำ \n";
    $lineNumber++;
}
fclose($handle);
echo "\n";
echo "พบจำนวนคำว่า Algorithm ทั้งหมด ".$ans." คำ";
echo "\n";
?>

ผลลัพธ์ที่ได้จากการรัน PHP ผ่าน edit plus

image

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

Post a Comment

 

เกี่ยวกับฉัน(ไหมเนี้ย)

My photo

สวัสดีครับ ชื่อเปิ้ลนะครับ ถ้ามีอะไรให้ช่วยเหลือได้ ก็จะช่วยครับ
ผมได้สร้างบล๊อกไว้ เพื่อเก็บรวบรวมความรู้ และประสบการณ์ในการทำงานครับ แวะไปเยี่ยมชมกันได้ครับ http://mechacity.blogspot.com และบล๊อก http://faker-programmer.blogspot.com ครับ

รายการบล๊อกอื่นๆ

  • Solved: error: 'TKD2' was not declared in this scope, LIFA_Base compile error - วันนี้ จะมาเล่าถึงปัญหาที่เจอในการเบิร์นโค๊ด LIFA_Base ที่เราใช้ในการทำให้ Arduino ของเราสามารถรับคำสั่งจาก LabVIEW ได้ ปัญหานี้ เริ่มเกิดขึ้นตอนที่ Ard...
  • Type-Fu : Typing practice game online - หากใครที่สนใจ หรือจะต้องทำงานเกี่ยวกับคอมพิวเตอร์ หนึ่งในความจำเป็นก็คือ จะต้องเรียนรู้ที่พิมพ์สัมผัสได้ เพราะการที่พิมพ์สัมผ้สได้ มันได้ประโยชน์หลายๆ อย...

Blog อื่นๆ ที่น่าติดตาม

เหล่าบรรดา Blogger