วันจันทร์ที่ 21 กันยายน พ.ศ. 2558

Casio fx-5800P - โปรแกรมนาฬิกาจับเวลาอย่างง่าย

ในบทนี้เราจะมาลองเขียนโปรแกรมนาฬิกาจับเวลาอย่างง่าย แต่ก่อนจะทำการเขียนโปรแกรมนี้เราจะต้องทำความรู้จักกับสองสิ่งนี้เสียก่อนคือ

  1. สัญญาณนาฬิกา
  2. คำสั่ง For ~ To ~ Next

สัญญาณนาฬิกา
สำหรับเครื่องคอมพิวเตอร์ที่ใช้กันอยู่จะมีสมองกลที่ใช้สำหรับประมวลผลซึ่งเรียกกันติดปากว่า CPU ความเร็วในการประมวลผลของ CPU นั้นมีหน่วยเป็น Hertz(Hz) หรือเข้าใจง่ายๆ คือทำงานกี่คำสั่งต่อวินาที ตัวอย่างเช่น CPU ที่มีความเร็ว

1 Hz = ทำงาน 1 รอบคำสั่งต่อวินาที
100 Hz = ทำงาน 100 รอบคำสั่งต่อวินาที
1 KHz = ทำงาน 1,000 รอบคำสั่งต่อวินาที
1 MHz = ทำงาน 1,000,000 รอบคำสั่งต่อวินาที
1 GHz = ทำงาน 1,000,000,000 รอบคำสั่งต่อวินาที
2.4 GHz = ทำงาน 2,400,000,000 รอบคำสั่งต่อวินาที

CPU ในปัจจุบันมีการทำงานที่รวดเร็วมากอย่างเช่น CPU ที่มีความเร็ว 2.4 GHz นั้นสามารถทำงานได้สองพันสี่ร้อยล้านคำสั่งต่อวินาที

เช่นเดียวกันกับเครื่องคิดเลขที่ใช้กันอยู่โดยทั่วไปจะมีหน่วยประมวลผลที่เรียกว่า ชิปเซต (Chipset) ทำหน้าที่เป็นสมองกลให้กับเครื่องคิดเลขและมีความเร็วในการทำงานตามสัญญาณนาฬิกาเช่นเดียวกันกับ CPU ที่ใช้ในคอมพิวเตอร์แต่ความเร็วคงจะเทียบกันไม่ได้เนื่องจากขนาดและต้นทุนราคา


คำสั่ง For ~ To ~ Next
เป็นคำสั่งที่ใช้ในการวนทำงานซ้ำแบบทราบจำนวนครั้งที่แน่นอน(เว้นเสียแต่มีคำสั่งข้ามการทำงาน) รูปแบบคำสั่งเป็นดังนี้

                    For <กำหนดตัวแปรเริ่มต้น> To <ตัวแปรตัวสุดท้าย>
                    <คำสั่งภายในลูป>
                    <...>
                    <...>
                    Next

ตัวอย่าง :

                    For 1J To 4
                    Locate J,J,J
                    Next

โปรแกรมเริ่มจากการทำงานในคำสั่ง For โดยกำหนดให้ตัวแปร J มีค่าตั้งแต่ 1 ถึง 4 และกำหนดค่าเริ่มต้นรอบแรกให้ J มีค่าเท่ากับ 1 บรรทัดต่อมาเป็นคำสั่ง Locate ซึ่งเป็นคำสั่งที่ถูกกำหนดให้ทำซ้ำภายในลูป ซึ่งในรอบแรกจะแสดงผลใน คอลัมน์ที่ 1 บรรทัดที่ 1 ออกมาเป็นเลข 1 (ค่า J) บรรทัดสุดท้ายคือคำสั่ง Next ที่ใช้สำหรับกำหนดค่าตัวแปรที่กำหนดในบรรทัด For ให้เพิ่มขึ้นอีก 1 หรือ J+1J นั่นเอง เสร็จแล้วกลับไปทำงานในบรรทัดที่อยู่ภายในลูปอีกครั้งด้วยค่าตัวแปรใหม่นี้ (J=2) และทำอย่างนี้ไปเรื่อยๆ จนครบ 4 รอบ จะได้ผลลัพธ์ดังนี้

รอบที่ 1 : คอลัมน์ที่ 1 บรรทัดที่ 1 ออกมาเป็นเลข "1"
รอบที่ 2 : คอลัมน์ที่ 2 บรรทัดที่ 2 ออกมาเป็นเลข "2"
รอบที่ 3 : คอลัมน์ที่ 3 บรรทัดที่ 3 ออกมาเป็นเลข "3"
รอบที่ 4 : คอลัมน์ที่ 4 บรรทัดที่ 4 ออกมาเป็นเลข "4"

หรือ 




ไหนๆ ก็รู้คำสั่ง 
For ~ To ~ Next แล้วเรามาดูออปชั่นอีกตัวนึงที่ใช้คู่กันคือ Step


คำสั่ง For ~ To ~ Step ~ Next
ในคำสั่ง For ~ To ~ Next นั้นตัวแปรที่ระบุในคำสั่ง For จะเพิ่มขึ้นทีละ 1 ในรอบถัดๆ ไปแต่ถ้าเราต้องการให้เพิ่มขึ้นมากหรือน้อยกว่า 1 นั้นเราต้องใช้คำสั่ง Step ช่วย คำสั่ง Step เป็นออปชั่นเสริมที่ใส่เพิ่มเติมเข้าไปหลัง To เพื่อกำหนดว่าค่าตัวแปรในรอบต่อไปจะเพิ่มขึ้นหรือน้อยลงเท่าไร มีรูปแบบคำสั่งดังนี้

                    For <กำหนดตัวแปรเริ่มต้น> To <ตัวแปรตัวสุดท้าย> Step <ค่าที่เพิ่มขึ้นหรือลดลง>
                    <คำสั่งภายในลูป>
                    <...>
                    <...>
                    Next

ตัวอย่าง : ต้องการแสดงเลขคู่ตั้งแต่ 2 ถึง 10 ในบรรทัดที่สอง 

                    For 2J To 10 Step 2
                    Locate J-1,2,J
                    Next

โปรแกรมนี้กำหนดให้ค่า J มีค่าเริ่มต้นเป็น 2 และเพิ่มขึ้นทีละสองในแต่ละรอบและมีค่าถึง 10 ในรอบสุดท้าย ซึ่งได้ผลลัพธ์ดังนี้

รอบที่ 1 : คอลัมน์ที่ 1 บรรทัดที่ 2 ออกมาเป็นเลข "2"
รอบที่ 2 : คอลัมน์ที่ 3 บรรทัดที่ 2 ออกมาเป็นเลข "4"
รอบที่ 3 : คอลัมน์ที่ 5 บรรทัดที่ 2 ออกมาเป็นเลข "6"
รอบที่ 4 : คอลัมน์ที่ 7 บรรทัดที่ 2 ออกมาเป็นเลข "8"
รอบที่ 5 : คอลัมน์ที่ 9 บรรทัดที่ 2 ออกมาเป็นเลข "10"

หรือ 




หลังจากที่เข้าใจเรื่องสัญญาณนาฬิกาและการใช้คำสั่ง For แล้วทีนี้เราจะมาเข้าเรื่องนาฬิกาจับเวลาอย่างง่ายกัน 

อันดับแรกเราต้องรู้เสียก่อนว่าเครื่องคิดเลขของเรามีความเร็วของสัญญาณนาฬิกาเท่าไหร่(ประมาณ) โดยเขียนโปรแกรมสั่งให้วนลูปเปล่า(ไม่มีคำสั่งภายใน) ซัก 5000 รอบ(กะเอา ยิ่งมากรอบยิ่งใกล้เคียง) แล้วจับเวลาว่าใช้เวลาเท่าไร เขียนโปรแกรมดังนี้

                    For 1J To 5000
                    Next
                    "END"

ทดลองสั่งรันโปรแกรมพร้อมกับจับเวลา ซึ่งตอนที่ทดสอบผมนับจากนาฬิกาแขวนผนังแบบเข็มโดยนับตั้งแต่โปรแกรมเริ่มทำงานจนขึ้นข้อความ END ปรากฎว่านับได้ 38 วินาที สรุปว่าเครื่องคิดเลขของผมทำงานได้ประมาณ 5,000 รอบคำสั่ง ต่อ 38 วินาที ซึ่งคำนวณใหม่ให้เป็นวินาทีดังนี้


                    5,000 ÷ 38 = 131.58 หรือประมาณ 132 รอบต่อวินาที

ตอนนี้เราก็รู้สัญญาณนาฬิกาแบบคร่าวๆ แล้ว เราจะลองมาเขียนโปรแกรมนาฬิกาจับเวลาแบบป้อนวินาทีกัน

                    "TIMES(S)"?T↵      // บรรทัด 1
                    132TN↵               // บรรทัด 2
                    For 1J To N
                    Next
                    "READY"

โปรแกรมเริ่มจากถามเวลาที่ต้องการเป็นวินาทีในบรรทัดที่ 1 แล้วคำนวณรอบที่จะต้องวนในบรรทัดที่ 2 ทดลองรันโปรแกรมโดยป้อนค่าเวลาเป็น 60 วินาทีแล้วกดปุ่ม EXE พร้อมกับลองจับเวลาปรากฎว่าคราวนี้จับเวลาได้ 61 วินาที จึงต้องมาปรับแก้ค่าสัญญาณนาฬิกากันใหม่ดังนี้

                    จำนวนรอบที่คำนวณในบรรทัดที่สอง 132 x 60 = 7,920
                    7,920 ÷ 61 = 129.84 หรือประมาณ 130 รอบต่อวินาที

ทำการแก้ไขโค้ดใหม่ในบรรทัดที่ 2 เป็น

                    "TIMES(S)"?T
                    130TN
                    For 1J To N
                    Next
                    "READY"

ทดลองรันโปรแกรมใหม่ ซึ่งผลที่ได้ถือว่าใกล้เคียงมากเป็นที่น่าพอใจแต่ถ้าใครที่ทดลองรันแล้วผลยังไม่ใกล้เคียงก็ให้ย้อนกลับไปคำนวณความเร็วสัญญาณนาฬิกาใหม่จนกว่าจะได้ค่าที่พอใจ

ทีนี้เรามาลองสร้างนาฬิกาจับเวลาแบบถอยหลังที่มีตัวเลขแสดงกันบ้าง โดยเขียนโปรแกรมดังนี้

                    "TIMES(S)"?T
                    For TK To 1 Step -1
                    Cls
                    Locate 1,1,K
                    For 1J To 130:Next      // หน่วงเวลา 1 วินาที
                    Next
                    "READY"

ทดลองรันโปรแกรมดูโดยป้อนเวลาเป็น 60 วินาที ปรากฎว่าจับเวลาจริงได้ 63 วินาที ที่เป็นแบบนี้เนื่องจากในลูป K นั้นไม่ได้เป็นการรันลูปเปล่าแบบที่เคย เวลาในแต่ละรอบจะเท่ากับ 

                    เวลาที่ใช้ในคำสั่ง Cls + เวลาที่ใช้ในคำสั่ง Locate + หน่วงเวลา 1 วินาที

เวลารวมในแต่ละรอบจึงเกิน 1 วินาที ดังนั้นจึงใช้ค่าหน่วงเวลาเป็น 130 ไม่ได้ คำนวณค่าหน่วงเวลาใหม่ดังนี้

                    จำนวนรอบใน 60 วินาที 130 x 60 = 7,800
                    7,800 ÷ 63 = 123.81 หรือประมาณ 124 รอบต่อวินาที

ทำการแก้ไขโค้ดใหม่เป็น

                    "TIMES(S)"?T
                    For TK To 1 Step -1
                    Cls
                    Locate 1,1,K
                    For 1J To 124:Next
                    Next
                    "READY"

ทดสอบโปรแกรมอีกครั้งโดยใช้เวลา 60 วินาทีเท่าเดิม ปรากฎว่าจับเวลาได้ใกล้เคียงมาก หน้าจอเมื่อรันโปรแกรมเป็นดังนี้

หลังจากกดปุ่ม EXE แล้วตัวเลขบนหน้าจอจะเริ่มนับถอยหลังตั้งแต่ 60 ไปเรื่อยๆ 


จนเมื่อครบถึง 0 จะขึ้นข้อความ READY


แต่ถ้าหากต้องการให้เวลาใกล้เคียงกว่านี้ก็ให้เพิ่มเวลาในการทดสอบและคำนวณค่าหน่วงเวลาใหม่ไปเรื่อยๆ จนได้ค่าที่พอใจที่สุด


เสียดายที่เครื่อง 5800 นี้ไม่มีคำสั่ง BEEP(เสียงบี๊ป) ไม่อย่างนั้นโปรแกรมนาฬิกาจับเวลานี้คงจะสมบูรณ์ยิ่งขึ้นถ้ามีเสียงเตือนเมื่อเวลาครบ สำหรับเครื่องคิดเลขรุ่นอื่นๆ ก็สามารถนำไปประยุกต์ใช้ได้ หากจะต่างกันบ้างก็เพียงแต่เรื่องไวยกรณ์และความเร็วของสัญญาณนาฬิกา หรือใครมีไอเดียใหม่ๆ ก็สามารถนำไปประยุกต์ใช้ได้ตามต้องการของแต่ละบุคคล


จบบท



นอกเรื่อง (ไม่ต้องอ่านก็ได้)

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

หลังจากนี้ตั้งใจว่าจะออกนอกคอนเซ็ปท์อย่างนี้ไปอีกซัก 2-3 บท ^ ^

ไม่มีความคิดเห็น:

แสดงความคิดเห็น