remixman's blog

ทำไมต้อง Case-sensitive

สองสามอาทิตย์ก่อนมีรุ่นน้องมาถามผมว่า ภาษาที่เป็น Case-sensitive มีข้อดียังไง โอ ผมฟังคำถามแล้วก็แอบอึ้งไปสักพักเหมือนกัน เขียนโปรแกรมมาห้าปี ไม่เคยสงสัยเหมือนกันว่ามันมีดีหรือไม่ดีต่างกันยังไง (แต่ผมเข้าใจว่าคำถามนี้น่าจะเป็นการบ้าน มากกว่าข้อสงสัยนะครับ)

ผมเลยลองค้นข้อมูลดูก็เลยได้คำตอบมาดังนี้ครับ

1. คอมไพเลอร์ทำงานได้เร็วกว่า เนื่องจากไม่ต้องเสียเวลามาคอยเปลี่ยนตัวอักษรก่อนที่จะเอามาเปรียบเทียบกัน ข้อนี้ก็ดู make sense ดีครับ แต่ก็มีหลายคนแย้งว่า จริงๆแล้วแค่เปลี่ยนตัวอักษรให้เหมือนกัน แล้วค่อยเอามาเทียบก็ไม่น่าจะยากแล้วก็ช้าลงมากมายไม่ใช่หรอ

Taxonomy upgrade extras: 

N! มีกี่หลักกันหนอ

มีปัญหาของการเขียนโปรแกรมเพื่อหาจำนวนหลักของ $N!$ อยู่ โดยที่ $N$ นั้นมีค่าเป็นจำนวนมาก จะต้องเขียนโปรแกรมอย่างไรดี? วิธีการทั่วไปก็คือหาค่าของ $N!$ แล้วก็มานับจำนวนหลัก ด้วยการหาร 10 ไปเรื่อยๆแล้วดูว่ามีทั้งหมดกี่หลัก ตามโค้ดด้านล่างนี้

Taxonomy upgrade extras: 

นับจำนวนที่หาร N ลงตัวแบบเร็วๆ ตอนที่ 2 (เร็วกว่าเดิม ง่ายกว่าเดิม)

พอดีเมื่อวานผมเปิดอ่านหนังสือ Combinatorics ก็เห็นตัวอย่างโจทย์นับจำนวนที่หารลงตัวก็เลยบ้าจี้ลองเขียนโปรแกรมตามดู ซึ่งจริงๆแล้วเรามีวิธีที่สามารถคำนวนจำนวนที่หาร $N$ ลงตัวได้เร็วกว่า แล้วก็ง่ายกว่าด้วยครับ ไม่ต้องมานั่งหา prime ฮินดูอะไรนั่น เรียกได้ว่าสูงสุดคืนสู่สามัญจริงๆ ลองมาดูกันเลยครับ

วิธีนี้ก็จะประยุกต์จากเทคนิคที่ใช้หาค่า prime ในคราวก่อน นั่นคือวนรอบเท่ากับจำนวน $sqrt(N)$ ลองดูตัวอย่าง จำนวนที่หาร $N$ ลงตัวในแต่ละตัวดูครับ

Taxonomy upgrade extras: 

นับจำนวนที่หาร N ลงตัวแบบเร็วๆ

สมมติว่าเราต้องการหาว่าจำนวนทั้งหมดที่หาร N ลงตัวมีกี่จำนวน เช่น จำนวนที่หาร 10 ลงตัวมี 4 จำนวน ได้แก่ 1, 2, 5 และ 10 และจำนวนที่หาร 25 ลงตัวมีทั้งหมด 3 จำนวน ได้แก่ 1, 5, 25 วิธีที่ง่ายที่สุดก็คือการวนรอบตั้งแต่ค่า 1 จนถึง N แล้วดูว่ามีจำนวนใดบ้างที่หาร N ลงตัวก็จะนับเพิ่ม 1 ครั้ง ซึ่งก็จะได้โค้ดออกมาหน้าตาประมาณนี้ครับ

Taxonomy upgrade extras: 

Truncate, Floor, Ceiling และ Round

ฟังก์ชันหลักสำหรับการแปลงค่าจากเลขจำนวนจริง (floating-point) ไปยังจำนวนเติม (integer) ที่มีอยู่ในเกือบทุกภาษาคือ Trancate (trunc), Floor, Ceiling (ceil) แล้วก็ Round ครับ ซึ่งบางทีดูเผินๆแล้วอาจเกิดความสับสนได้ว่ามันต่างกันตรงไหน ซึ่งการจะเลือกใช้ให้ถูกนั้นเราจำเป็นที่จะต้องเข้าใจถึงนิยามของแต่ละตัวซะก่อน

Truncate - คือการตัดเศษทิ้งครับ พูดง่ายๆคืออะไรที่อยู่หลังจุดเอามันออกให้หมด อย่าง trunc(4.67) ก็จะได้ค่า 4 โดยไม่สนว่าเลขหลังจุดจะมีค่าเท่าไหร่

Taxonomy upgrade extras: 

Memory Debugging ด้วย Valgrind (ภาค 2 - ตีแผ่ Error แบบต่างๆ)

ต่อจากคราวก่อนนะครับ คราวนี้เราจะมาดูกันว่า Valgrind สามารถ ตรวจจับ Error แบบไหนได้บ้าง แล้วมันฟ้องออกมายังไงกัน

1. อ่านข้อมูลผิด (Invalid Read)

Taxonomy upgrade extras: 

Memory Debugging ด้วย Valgrind

เช้าวันนึงขณะที่ผมกำลังทำงาน ก็พบขึ้นมาว่าโปรเจคที่ตัวเองทำอยู่ จู่ๆมันก็พังขึ้นมาตอนรันซะงั้น (ได้ไง T_T) มองผ่านๆก็ยังหา Error ไม่เจอซักที รู้แต่มันฟ้องว่ามีปัญหาที่การจัดการ Memory (เป็นที่ฟังก์ชัน realloc กับ free) ผมจึงเริ่มไปค้นว่ามีวิธีไหนบ้างมั้ย ที่จะช่วยเช็คว่าปัญหาอยู่ตรงไหนกันแน่ เพราะตอนนั้นหายังไงก็หาไม่เจอจริงๆ (เป็นโค้ดที่คนอื่นเขียน ผมอ่านแล้วก็มึนๆเล็กน้อย) ลองหาตามบอร์ดก็เลยไปเจอเจ้า tool ตัวนึงที่ชื่อ Valgrind ซึ่งหลังจากลองใช้แล้วก็พบว่าปาฏิหาริย์มีจริง มันหาตำแหน่งของโค้ดที่จัดการกับ Memory ไม่ถูกต้องให้ได้ดีทีเดียว

Taxonomy upgrade extras: 

แนะนำเว็บดีๆ Project Euler

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

Taxonomy upgrade extras: 

Pages

Subscribe to RSS - remixman's blog