วันพฤหัสบดีที่ 2 ตุลาคม พ.ศ. 2557

Casio fx-5800P - ปัญหาการแสดงผลองศา

การแสดงผลลัพธ์ให้เป็นเลขฐานหกสิบ(องศา-ลิปดา-ฟิลิปดา)


คำสั่ง DMS สำหรับแสดงผลลัพธ์เป็นเลขฐานหกสิบ

การเรียกใช้ :



"FUNCTION"  "5:ANGLE"  "4:DMS"

รูปแบบการใช้ :
เลขทศนิยมDMS 
ตัวอย่าง : 

500R
5729.577951÷RD
DDMS◢                       // แสดงผลลัพธ์เป็น 11 27' 32.96"



ในคู่มือ Casio fx-5800P ที่หน้า E-28 มีกฎในการแสดงผลลัพธ์องศาซึ่งสร้างปัญหาในการแสดงผลลัพธ์อยู่พอสมควร กฎนี้มีอยู่ว่า


The following types of sexagesimal calculations will produce sexagesimal results.
Addition or subtraction of two sexagesimal values
Multiplication or division of a sexagesimal value and a decimal value

หรือ

การคำนวณเลขฐานหกสิบ(องศา-ลิปดา-ฟิลิปดา)ต่อไปนี้จะให้ผลลัพธ์เป็นเลขฐานหกสิบ
- บวกหรือลบเลขฐานหกสิบกับเลขฐานหกสิบ
- คูณหรือหารเลขฐานหกสิบกับจำนวนทศนิยม


อ่านดูแล้วอาจยังนึกไม่ออกว่าจะมีปัญหาอะไร เพื่อให้เห็นปัญหาเราลองมาเขียนโปรแกรมคำนวณส่วนประกอบของโค้งวงกลม(Circular Curve)ดู โดยตัวอย่างโปรแกรมนี้จะเลือกเขียนคำนวณเฉพาะค่า R, D และ Lc ที่มีปัญหาเท่านั้นเพื่อให้โปรแกรมดูง่ายขึ้น


โปรแกรมที่ 1 :

        Cls:"DELTA :"?K
Lbl 0
        Cls:"DESIGN BY :"
        "[1] R"
        "[2] D"?S
        If S<1 Or S>2:Then Goto 0:IfEnd↵        // ป้องกันการทำงานผิดพลาด
        If S=1:Then "R :"?R:IfEnd
        If S=2:Then "D :"?D:5729.577951÷DR:IfEnd
        5729.577951÷RD
        100xK÷DL
        Cls
        "R =":R
        "D =":DDMS
        "L = ":L        // ค่า Lc


ทดลองรันโปรแกรมจาก


ตัวอย่างที่ 1 :

โค้งวงกลมโค้งหนึ่งมี ∆ = 16 24' 25.9", R = 350 จงคำนวณหา D และ Lc

ผลการรันโปรแกรม :

R = 350
D = 16 22' 12.8"
L = 100 13' 33.05"

จากผลการรันโปรแกรมจะพบว่าค่า R และ D แสดงผลได้เป็นปกติตามที่ต้องการแต่ค่า Lc ซึ่งเป็นค่าความยาวโค้งให้ผลลัพธ์ออกมาเป็นเลขฐานหกสิบ ที่เป็นเช่นนี้เพราะว่า ค่า D ที่ได้จากการคำนวณโดยสูตร 5729.577951÷R นั้นให้ผลลัพธ์ออกมาเป็นจำนวนทศนิยม ต่อมาคำนวณค่า Lc โดยใช้สูตร 100x÷D ซึ่งก็คือ "ทศนิยม x เลขฐานหกสิบ ÷ ทศนิยม" จึงเป็นไปตามกฎในข้อที่สอง(คูณหรือหารเลขฐานหกสิบกับเลขทศนิยม) ผลลัพธ์ที่ได้จึงออกมาเป็นเลขฐานหกสิบ

วิธีแก้ปัญหาที่นิยมใช้กันคือ นำค่า 0(ศูนย์) มาบวกกับเลขฐานหกสิบเพื่อให้ผลลัพธ์ที่ได้ออกมาเป็นเลขทศนิยม ดังนั้นเราจะแก้ไขโค้ดโปรแกรมใหม่ดังนี้



โปรแกรมที่ 2 :

        Cls:"DELTA :"?K
Lbl 0
        Cls:"DESIGN BY :"
        "[1] R"
        "[2] D"?S
        If S<1 Or S>2:Then Goto 0:IfEnd
        If S=1:Then "R :"?R:IfEnd
        If S=2:Then "D :"?D:5729.577951÷DR:IfEnd
        5729.577951÷RD
        100xK÷DL
        L+0L        // เพิ่มบรรทัดนี้
        Cls
        "R =":R
        "D =":DDMS
        "L = ":L 


ทดลองรันโปรแกรมจาก ตัวอย่างที่ 1

ผลการรันโปรแกรม :

R = 350
D = 16 22' 12.8"
L = 100.2258474

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


ตัวอย่างที่ 2 :

โค้งวงกลมโค้งมี ∆ = 16 24' 25.9", D = 16 22' 12.8" จงคำนวณหา R และ Lc

ผลการรันโปรแกรม :

R = 350 0' 0.04"
D = 16 22' 12.8"
L = 100.2258505

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



โปรแกรมที่ 3 :

        Cls:"DELTA :"?K
Lbl 0
        Cls:"DESIGN BY :"
        "[1] R"
        "[2] D"?S
        If S<1 Or S>2:Then Goto 0:IfEnd
        If S=1:Then "R :"?R:IfEnd
        If S=2:Then "D :"?D:5729.577951÷DR:R+0R:IfEnd        // แก้ไขบรรทัดนี้
        5729.577951÷RD
        100xK÷DL
        L+0L
        Cls
        "R =":R
        "D =":DDMS
        "L = ":L 


ทดลองรันโปรแกรมจาก ตัวอย่างที่ 2

ผลการรันโปรแกรม :

R = 350.0000106
D = 16 22' 12.8"
L = 100.2258505

สุดท้ายเราก็แก้ปัญหาทั้งสองกรณี(โจทย์ตัวอย่าง)นี้ไปได้ แต่ถ้าเราต้องการเขียนโปรแกรมคำนวณรายการวางโค้ง(Layout) ต่อไป หรือโปรแกรมอื่นๆ ที่มีความซับซ้อน เราก็จะตามแก้ปัญหาอย่างนี้อีกไม่รู้จบสิ้น


มีอีกวิธีหนึ่งที่ผู้เขียนอยากจะแนะนำคือ "ให้บวกศูนย์เข้าไปหลังจากการรับข้อมูลเลขฐานหกสิบทุกครั้ง" เช่น

        "DELTA :"?K
        K+0K

หลังจากรับข้อมูลเลขฐานหกสิบแล้ว ก่อนที่จะนำไปคำนวณค่าใดๆ ให้แปลงเป็นเลขทศนิยมเสียก่อนเพื่อป้องกันการเข้าสู่กฎการแปลงเลขฐานหกสิบทั้งสองข้อ

ทีนี้เราลองนำโปรแกรมที่ 1 มาดัดแปลงใหม่ดังนี้


โปรแกรมที่ 4 :

        Cls:"DELTA :"?K:K+0K        // แก้ไขที่บรรทัดนี้
Lbl 0
        Cls:"DESIGN BY :"
        "[1] R"
        "[2] D"?S
        If S<1 Or S>2:Then Goto 0:IfEnd
        If S=1:Then "R :"?R:IfEnd
        If S=2:Then "D :"?D:D+0D:5729.577951÷DR:IfEnd        // แก้ไขที่บรรทัดนี้
        5729.577951÷RD
        100xK÷DL
        Cls
        "R =":R
        "D =":DDMS
        "L = ":L


เมื่อทดสอบโปรแกรมกับทั้งสองตัวอย่างแล้วให้ผลลัพธ์ที่ถูกต้อง วิธีนี้จะทำให้การเขียนโปรแกรมที่มีเลขฐานหกสิบเข้ามาเกี่ยวข้องง่ายขึ้น เพราะไม่ต้องกังวลว่าการคำนวณจะไปเข้ากฎทั้งสองข้อที่ตรงจุดไหนอีก



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

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