โปรแกรมจัดการคะแนน โดยแยกคะแนนย่อยให้อัตโนมัติ
สวัสดีครับ วันนี้มาลองเขียนโปรเจคชิ้นนึงที่คิดไว้เล่นๆ ที่อยากจะทำมานานแล้วแต่ก็ไม่ได้ทำซักที เมื่อมีวันหยุดยาวแล้วก็ได้เวลาพอเหมาะที่เราจะได้เริ่มทำสิ่งนี้กันซักที(ทำไว้ช่วงสงกรานต์) คิดว่าน่าจะได้ใช้ประโยชน์ในอนาคต ซึ่งจะทำให้การจัดการเกี่ยวกับข้อมูล(คะแนน)ที่มีปริมาณเยอะมากๆได้อย่างรวดเร็ว ซึ่งถ้าเราต้องจัดการกับคะแนนเหล่านั้นเองทุกๆคะแนนคงปวดหัวไม่น้อยเลยครับ.
ที่มาและความสำคัญ
จุดเริ่มต้นมาจากการที่ผมทำงานเกี่ยวข้องกับตัวเลข การรวมตัวเลข ตัวเลขในตาราง ที่มีปริมาณเยอะมากๆ จำนวนหลายๆกลุ่ม และลักษณะการรวมนั้นก็ต้องมีการแยกย่อยไปตามตัวหัวข้อที่ได้ออกแบบเอาไว้ เพื่อจะได้กรอกคะแนนให้ได้ตามเกณที่กำหนด ปัญหาคือในบางครั้งการกรอกข้อมูลนโดยที่ไม่ได้คำนึงว่าในแต่ละข้อย่อยต้องมีค่าเป็นเท่าไรแต่มักจะประเมินให้ข้อมูลนั้นไปทั้งก้อนใหญ่ๆเลยจากผลรวมของข้อมูลดิบเพื่อให้ง่ายก่อนการคิดผลรวมแล้วจากนั้นค่อยมานั้งคิดทีหลังว่า จะให้ข้อมูลย่อยในแต่ละหัวข้อเป็นเท่าไร และเมื่อรวมผลลัพธ์กันแล้วจะต้องได้เท่ากับข้อมูลต้นฉบับที่ตั้งเอาไว้
ประเด็นคือการที่ผู้ใช้งาน(ผู้กรอกข้อมูล)จะต้องมานั้นกรอกข้อมูลย่อยแก่ node แต่ละ node เพื่อให้ได้ครบตามข้อมูลก้อนใหญ่นั้นมันใช้เวลาค่อนข้างนาน ลอกนึกถึงความเป็นจริงดูซิครับผู้กรอกข้อมูลอาจจะตาลายแน่ๆ และหากข้อมูลมีจำนวนมากก็ต้องปวดหัวแน่ๆเลย ฉนั้นมันจะดีกว่าไหมหากเรา(ผู้กรอกข้อมูล)ไม่ต้องมานั้งปวดหัวกับการทำคะแนนย่อย โดยที่เราสามารถเขียนโปรแกรมให้มันเฉลี่ยๆคะแนนผลลัพธ์ออกไปป้อนในช่องต่างๆได้เอง (ผลลัพธ์จะรวมกันแล้วจะต้องได้ข้อมูลเท่ากับข้อมูลรวม) นี้จึงเป็นแนวคิดแรกที่ทำให้เกิดโปรเจคชิ้นนี้ขึ้นมา หากผู้อ่านที่เคยเรียนการเขียนโปรแกรมมาแล้วเราก็จะพบว่าจริงๆแล้วการทำงานเหล่านี้มันลักษณะการทำงานแบบซ้ำต้องนำชุดข้อมูลมาประมวลผลแบบเดียวกัน มีแพทเทิร์นการทำงานคงที่ไม่ซับซ้อนจึงอยากนำเอาองค์ความรู้ที่ได้เรียนมาประยุกต์ใช้ เพื่อให้การทำงานง่ายขึ้น
มาถึงตรงนี้หากผู้อ่านไม่เข้าใจลองดูตัวอย่างจากภาพดังนี้
ตัวอย่างตามรูปคือ(สมมุติว่าผู้เขียนเป็นครู)ตารางคะแนนในส่วนของ จิตพิสัยซึ่งจะเห็นได้ว่ามีคะแนนที่เป็นคะแนนก้อนใหญ่อยู่แล้วที่ได้จากรวบรวมคะแนนดิบจากร่อยรอยของการบันทึก อาจจะมาจากข้อมูลที่เป็นกระดาษก็ได้ สิ่งที่ครูผู้สอนต้องทำคือการกรอกคะแนนย่อยทางซ้ายมือเพื่อให้คะแนนในแต่ละหัวข้อย่อยของเด็กแต่ละคนว่าควรได้ คะแนนในส่วนหัวข้อนั้นๆเท่าไร แต่ในความเป็นจริงแล้วผู้กรอกข้อมูลหลายๆคนไม่ได้สนใจข้อมูลย่อยๆ ส่วนนั้นเลยด้วยซ้ำแต่มักนิยมใช้การรวมคะแนนที่ได้เป็นก้อนใหญ่มาแล้วแทน หรือหากผู้กรอกคะแนนต้องการกรอกคะแนนตามที่วางไว้แบบเป๊ะๆอาจจะต้องมาปวดห้วกับการรวมคะแนนมากแน่ๆ ในส่วนที่ต้องมานั้งรวมทีละคนๆเพื่อให้ครบตามจำนวนนักเรียนที่สอน และอย่าลืมว่าการยกตัวอย่างเป็นแค่นักเรียนเพียงห้องเดียวเท่านั้น และเป็นเพียงเกณฑ์เดียวจากชุดข้อมูลชุดเดียว ผู้อ่านลองคิดตามดูนะครับหากเราสอนเด็กจำนวนหลายคนหลายห้องหลายวิชา ครูที่บันทึกคะแนนคงปวดหัวแย่แน่ๆ
เนื่องจากขั้นตอนที่ออกแบบไว้สำหรับการทำงานของโปรแกรม ตัวผู้เขียนเองได้ทำการจำลองบันทึกชุดข้อมูลเอาไว้สำหรับการใช้เป็น input หรือเป็นคะแนนดิบต้นฉบับสำหรับนำมาประมวลผล โดยเลือกวิธีการบันทึกข้อมูล input ไว้ในไฟล์ text ชื่อว่า input_score_text(.txt) ไว้สำหรับการนำข้อมูลเหล่านี้ไปประมวลผลอีกที แสดงดังรูปด้านล่าง
ตัวอย่าง การรันคำสั่งและแสดงผลลัพธ์ของการทำงาน ซึ่งกระบวนการในการทำงานของโปรแกรมคือเริ่มจากการอ่านไฟล์ โปรแกรมจะทำการอ่านไฟล์ .txt เพื่อให้เป็นข้อมูลตั้งต้น ซึ่งเป็นรูปแบบข้อมูลง่ายๆที่มาจากผลรวมของคะแนนดิบที่ได้จากการรวมคะแนนร่องรอยของครูผู้สอน การนำเข้าจะมีขอบเขตสูงสุดของการประมวลผลได้สูงสุดแค่ 100 ชุดเท่านั้น กล่าวคือหากมีข้อมูลที่ต้องการประมวลผลมากกว่า 100 ชุดจะไม่สามารถทำการประมวลผลข้อมูลได้ทั้งหมด (สามารถเพิ่มหรือลดได้อีกจากการแก้ไข code)หากข้อมูลใดๆอยู่ในตำแหน่งที่เกิน 100 แล้วจะไม่ถูกนำมาประมวลผล (ในตัวอย่างโปรแกรมจะแสดงให้เห็นในบรรทัด count in array 13 มีความหมายว่าข้อมูลที่พบมี 13 จำนวน.) เมื่ออ่านชุดข้อมูลแล้วโปรแกรมจะทำการเก็บข้อมูลไว้ในตัวแปรชุด Array โปรแกรมอ่านชุดข้อมูลอัตโนมัติหากข้อมูลที่นำเข้ามามีจำนวนจริงกี่จำนวนโปรแกรมจะอ่านและบอกจำนวนได้ว่าข้อมูลที่นำเข้ามามีกี่ข้อมูล แล้วนำเข้าฟังก์ชันการเขียนไฟล์
ในส่วนของการเขียนไฟล์โปรแกรมอ่านค่าที่ถูกเก็บไว้ใน array ครั้งละ 1 index แล้วนำค่านั้นมาหารออกเป็น 5 จำนวนแล้วนำผลลัพธ์เหล่านั้นไปป้อนเข้าสู่ช่องย่อยในกรณีนี้ใช้ได้กับข้อมูลที่เป็นการหารแบบลงตัวเท่านั้น ในกรณีที่มีการหารแล้วไม่ลงตัวซึ่งมีแน่ๆเพราะข้อมูลมีตั้งแต่ 1-20 หรือ 1-30 (ตามเกณฑ์คะแนนที่ครูผู้สอนกำหนด) จะให้วิธีการคำนวนด้วยการหารแบบ mod คือการหารเพื่อให้ได้ผลลัพธ์เป็นเศษจากนั้น ผู้เขียนใช้วิธีการสุ่มค่าเศษที่เหลือเพื่อป้อนเข้าไปยังช่องย่อยเหล่านั้น โดยมีเงื่อนไขคือการรวมผลลัพธ์เหล่านั้นต้องรวมแล้วได้เท่ากับข้อมูลดิบ หรือข้อมูลต้นฉบับเท่านั้นในส่วนของกระบวนการสุ่มเพื่อแจกจ่ายไปยังช่องผมขอไม่อธิบายลงลึกแล้วกันนะครับ แต่ให้ผู้อ่านทราบคร่าวๆว่ากระบวนการทำงานเป็นอย่างไรประมาณไหน ซึ่งโปรแกรมก็จะทำการวนซ้ำแล้วประมวลผลไปเรื่อยๆจนครบทุกข้อมูล(ในตัวอย่างคือ 13 ข้อมูล, 13 index)แล้วทำการส่งออกข้อมูล เขียนข้อมูลเหล่านั้นลง file นามสกุล .csv ซึ่งเป็นไฟล์ที่จัดการเกี่ยวข้องกับตารางเพื่อนำไปใช้ต่อไป.
ผลลัพธ์การทำงานเมื่อโปรแกรมรันเสร็จแล้วจะได้ชุดข้อมูลย่อยในช่องทางซ้ายทั้ง 5 ช่องภายในระยะเวลาไม่ถึง 2 วินาที ซึ่งรวดเร็วและถูกต้องตามข้อมูลรวม แต่ยังมีข้อจำกัดอยู่บ้างคือโปรแกรมสามารถประมวลผลด้วยข้อมูลต้นฉบับแบบเรียงบรรทัดเท่านั้น ยังไม่สามารถรองรับการประมวลผลแบบขนานในบรรทัดเดียวกันได้ ข้อจำกัดเหล่านี้อาจจะถูกพัฒนาเพิ่มเติมในอนาคต
ตัวอย่างการทำงานของโปรแกรม
( ในวีดีโอแสดงตัวอย่าง ไม่ได้แสดงไฟล์ต้นฉบับที่อ่านเข้ามาเพื่อประมวลผล(ลืมเปิด) )
จากตัวอย่างการทำงานแล้ว จะเห็นได้ว่าตัวโปรแกรมสามารถทำให้ การทำคะแนนนั้นง่ายขึ้นมากเพราะตัวโปรแกรมจะคอยคิดการกรอกข้อมูลย่อยเองโดยที่ผู้ใช้งานไม่ต้องมานั้นรวมคะแนนเพื่อให้เท่ากับคะแนนช่องหลัก ส่งผลในเรื่องของการประหยัดเวลา มีความแม่นยำลดความเหนื่อยล้าของผู้ทำคะแนน(ครู) หากอ่านมาถึงตอนนี้แล้วคงจะได้เห็นถึงการทำงานของโปรแกรมแล้วว่ามันมีประโยชน์อย่างไรแน่นอนว่าสิ่งนี้ไม่ได้เกี่ยวข้องกับการสอนในวิชาใดๆเลย แต่ทุกๆการสอนนั้นล้วนผ่านกระบวนการในการตัดเกรดและรวมคะแนนทั้งนั้น ซึ่งในการทำสิ่งนี้ขึ้นมาผู้เขียนเองก็ทำเป็นแค่งานอดิเรกเท่านั้น เพื่อฝึกประบวนการคิดประบวนการเขียนโปรแกรมในมุมของผู้เขียนเองเจอปัญหาหลายอย่างในการเขียนเพื่อให้ได้ผลลัพธ์ตามที่วางแผนไว้ อีกทั้งการฝึกกระบวนการคิดลำดับขั้นตอนจนสามารถเขียนให้ได้ผลลัพธ์ออกมาใช้งานได้ตามขอบเขตหรือความสามารถของโปรแกรมที่วางเอาไว้.
สำหรับผู้อ่านบทความนี้ผมหวังว่าสิ่งที่ผมทำ คุณจะเห็นถึงประโยชน์ของมันไม่มากก็น้อย สิ่งที่ผมทำนั้นผมทำเพื่อตัวผู้เขียนเองเพราะขี้เกียจมานั้งกรอกข้อมูลจำนวนเยอะๆ ผมตาลายและบางทีก็รวมคะแนนไม่ตรงบ้างผิดบ้าง ซึ่งกระบวนการเหล่านี้ใช้เวลาในการทำงานค่อนข้างมาก..จบแล้ว ขอบคุณครับ.