จากสัปดาห์แรกของการเรียนการสอน อ.SPN ได้ขอให้ไปทำการทดลองมาเพิ่มเติมโดยให้ลองเอา spreadsheet ที่ได้ทำนั้นมาลอง export เป็นไฟล์ csv และนำมาคำนวณ
ปัญหาที่ได้พบทั้งหมด
1. ในการเปิดไฟล์ csv มีปัญหาเรื่อง UnicodeError โดยวิธีการแก้ก็คือการใช้ตัว encoding เข้าไประบุว่าจะใช้ตัว decode ตัวไหน ในขั้นตอนการ open file csv
2. ปัญหานี้เป็นปัญหาใหญ่ซึ่งเกิดจากการออกแบบ spreadsheet ไว้ไม่ดีทำให้เมื่อเวลาดึงข้อมูล หรือ อ่านใน python แล้วไม่สามารถนำมาใช้ในการคำนวณได้ เลยจะต้องตัดคอลัมน์ออกไปหลายๆส่วนด้วยกัน และเหลือเอาไว้ที่จำเป็น ซึ่งมีแค่ ปีการศึกษา เกรด หน่วยกิต เพียงเท่านั้นจากตอนแรกที่ใส่คอลัมน์ที่ไม่จำเป็นไว้เยอะ โดยตัวผมเองนั้นใช้วิธีการตัดส่วนของ string เลยทำให้ไม่สามารถทำงานได้สะดวกหากยังเก็บคอลัมน์ที่ไม่จำเป็นไว้
3. เนื่องจากช่วงปิดเทอมนั้นไม่ได้ฝึกการทำงานเลย ทำให้มีผลกระทบอย่างมาก ทำให้งานที่ออกมางานแรกนั้นไม่ค่อยมีประสิทธิภาพ ต้องขออภัยไว้ ณ ที่นี้ด้วย และจะขอแก้ไขในงานครั้งต่อไปครับผม
4. ไม่ได้เขียนคอมเมนท์สักตัว ไม่ควรเอาเยี่ยงอย่าง
ผลการทำงาน
เทียบกับเว็บของมหาลัย
จะเห็นได้ว่ามีความถูกต้องตามที่ได้ทดลองทำ
Code
ในส่วนของโค้ดผมจะขออธิบายในส่วนของภาพรวมเพียงเท่านั้น เพราะว่าวิธีที่ใช้ในการทดลองนั้นไม่ได้ใช้วิธีที่ซับซ้อนมาก ใช้วิธีแบบเรียบง่าย มีการ import csv เพื่อใช้ในการเปิดไฟล์ csv โดยในฟังก์ชั่น main จะมีเพียงส่วนของ print และ เรียกใช้ฟังก์ชั่น 2 ตัวด้วยกันได้แก่
1. calculate_each(ปีการศึกษา)
เป็นฟังก์ชั่นในการคำนวณเกรด โดยจะเรียกใช้ฟังก์ชั่น get_grade() กับ get_credit() เพื่อนำค่าของเกรดและหน่วยกิตทุกตัวเข้ามาเก็บไว้ในตัวแปร และหลังจากนั้นจะวนลูป เพื่อทำการคูณค่าของหน่วยกิต และ เกรดของวิชานั้นๆ เมื่อเสร็จแล้วนำมาหารกับ หน่วยกิตทั้งหมด แล้วปัดเอาทศนิยม 2 ตำแหน่ง return กับไป ซึ่งค่าที่รับมาจากการเรียกนั้นคือ term เพื่อที่จะสื่อว่า ต้องการของเทอม เทอมไหน
2. calulate_all(จำนวนปีการศึกษาทั้งหมด)
เป็นฟังก์ชั่นการคำนวณเกรดเฉลี่ยสะสมโดยวิธีการคำนวณก็จะคล้ายๆกับตัว calculate_each() โดยจะใส่จำนวนปีการศึกษาว่าต้องการทราบถึงเท่าไร โดนสิ่งที่แตกต่างกับโค้ดตัวด้านบนคือจะมีการวนลูปนอกสุดเพิ่มขึ้นมา หรือก็คือการวนลูปคิดในแต่ละปีนั้นเอง โดยจะให้วนเท่ากับจำนวนของปีที่ต้องการ
ฟังก์ชั่น get_grade() และ get_credit()
ฟังก์ชั่นทั้งสองตัวนั้นมีการทำงานที่คล้ายกันมากๆ ที่ต่างกันคือตำแหน่งของ string ที่เลือกจะเก็บข้อมูลอย่างเช่น
ถ้ามองจากรูปประกอบจะเห็นได้ว่า ตัวหลัง 3 ตัว(รวมจุดทศนิยม) นั้นคือเกรดที่เรา เพราะฉะนั้นถ้าหากเราต้องการเอาเฉพาะตัวเกรด เราก็อาจจะใช้คำสั่งด้านล่าง
term_1_grade.append(row[-3:]) กับ term_1_grade.append(row[-4:-1])
เป็นคำสั่งใช้ในการ append เอาค่าเข้าไปใน list เปล่าๆโดยที่ต้องมีสองค่าก็เพราะว่า บรรทัดแรกที่จะมีปีการศึกษาด้วยนั้นจะทำให้ string มีตำแหน่งที่ไม่ตรงกัน
แต่ถ้าเป็นการหาหน่วยกิตก็จะใช้โค้ดดังนี้
term_1_credit.append(row[10]) กับ term_1_credit.append(row[1])
ซึ่งเป็นตำแหน่งของหน่วยกิตโดยที่มีสองตัวก็เพราะเหตุผลเดียวกัน
โดยในแต่ละฟังก์ชันจะมีการเก็บค่าของเทอมแต่ละเทอมเป็น 1 list จะทำให้มีทั้งหมด 4 lists และ เราเก็บทั้งหน่วยกิตกับเกรด จะทำให้เป็นทั้งหมด 8 lists แต่ว่าตอน return ค่านั้นจะนำค่าไปใส่กับ list เปล่าๆอีกทีนึงดังนี้
all_grade = [term_1_grade,term_2_grade,term_3_grade,term_4_grade]
return all_grade
all_credit = [term_1_credit,term_2_credit,term_3_credit,term_4_credit]
return all_credit
ส่วนตัวโค้ดเต็มๆนั้นผมจะอัพลง bitbucket แล้วแปะลิ้งค์ไว้ให้ครับผม