วันเสาร์ที่ 14 พฤศจิกายน พ.ศ. 2563

Casio fx-5800P - ตัวแปรแบบแถวลำดับ (Array)

 การใช้งานตัวแปรในเครื่อง 5800 โดยปกติแล้วจะมีอยู่ 26 ตัว คือตัวแปร A ถึง Z แต่หากจำเป็นต้องใช้ตัวแปรเกินกว่า 26 ตัว เราสามารถประกาศตัวแปรพิเศษเพิ่มเติมขึ้นมาใช้งานได้อีก โดยตัวแปรพิเศษนี้เรียกว่า Reserving Variable Memory (ตามคู่มือในหน้า E-35) ลักษณะการใช้งานก็เหมือนกับตัวแปร Array แบบ 1 มิติในภาษาโปรแกรมทั่วไป

ตัวแปร Array หรือตัวแปรแบบแถวลำดับของ 5800 มีรูปแบบเป็นตัวแปรที่ขึ้นต้นด้วยตัวอักษรได้ตัวเดียวคือตัว Z ตามด้วยวงเล็บเหลี่ยมภายในวงเล็บเหลี่ยมมีตัวเลขดัชนี(index) ที่เรียงลำดับตั้งแต่เลข 1 จนถึงตัวเลขตามจำนวนที่เราได้ประกาศไว้ หากยังนึกภาพตัวแปร Array แบบ 1 มิติไม่ออกให้นึกถึงกล่องที่วางเรียงๆ กันแล้วมีหมายเลขกำกับเพื่อระบุตำแหน่งของแต่ละกล่องตามภาพ



จากภาพเป็นการประกาศตัวแปร Z จำนวน 10 ตัว เหมือนสร้างกล่องขึ้นมา 10 กล่อง ในแต่ละกล่องสามารถใส่สิ่งของ(ข้อมูลตัวเลข) เข้าไปได้ 1 ชิ้น


ขั้นตอนการใช้งานตัวแปร Array ประกอบด้วย

  • ประกาศขนาดตัวแปร 
  • กำหนดค่าให้ตัวแปร
  • การลบตัวแปร

- การประกาศขนาดตัวแปร

การประกาศขนาดตัวแปรหรืออีกความหมายหนึ่งก็คือการกันพื้นที่บางส่วนในหน่วยความจำไว้สำหรับเก็บค่าตัวแปร

สำหรับตัวแปรแบบ Array มีรูปแบบการประกาศตัวแปรดังนี้

 ขนาดตัวแปรDimZ 

เช่น ถ้าต้องการเพิ่มตัวแปรพิเศษจำนวน 5 ตัวก็แค่พิมพ์

        5DimZ

เครื่องก็จะสร้างตัวแปรเพิ่มเติมให้เราพร้อมใช้งาน 5 ตัว คือ Z[1], Z[2], Z[3], Z[4], Z[5]


เราสามารถประกาศตัวแปรจำนวนเท่าไรก็ได้เท่าที่หน่วยความจำยังเหลือพอ ขออ้างอิงคู่มือในหน้า E-36 ระบุว่าหน่วยความจำของเครื่อง 5800 มีทั้งหมด 28500 bytes การประกาศตัวแปร Array จะกินหน่วยความจำเครื่องเท่ากับ 26 bytes บวกกับขนาดตัวแปรที่ประกาศคูณ 12 bytes(ตัวแปรหนึ่งตัวใช้หน่วยความจำ 12 bytes) ตัวอย่างเช่นถ้าเราประกาศตัว Array จำนวน 10 ตัวจะกินพื้นที่หน่วยความจำทั้งหมดเท่ากับ 26 + (10 x 12) = 146 bytes

*** การประกาศตัวแปรเพิ่มทุกหนึ่งตัวจะใช้พื้นที่หน่วยความจำ 12 bytes เสมอไม่ว่าคุณจะกำหนดค่าหรือไม่กำหนดค่าให้กับมันก็ตาม ถึงคุณไม่กำหนดค่าให้ มันก็จะมีค่าเป็น 0 (ศูนย์)อยู่ดี หรือไม่ว่าจะกำหนดค่ามันด้วยค่า 1 หรือ 1,000,000 มันก็ใช้พื้นที่ 12 bytes เท่ากัน *** 


เรามาลองทดสอบดูว่าเป็นตามในคู่มือหรือไม่ โดยกด MODE >> 5:PROG เพื่อดูหน่วยความจำที่เหลือ




จะเห็นว่าหน่วยความจำเครื่องที่ผมใช้อยู่ตอนนี้เหลืออยู่ 24226 bytes ทีนี้กลับสู่โหมดคำนวนโดย MODE >> 1:COMP ลองประกาศตัวแปรดูซัก 20 ตัวโดยพิมพ์ 

20DimZ

 กลับไป MODE >> 5:PROG อีกครั้งเพื่อดูหน่วยความจำที่เหลือ




ตอนนี้หน่วยความจำเหลือ 23960 bytes แสดงว่าหายไปเท่ากับ 24226 - 23960 = 266 bytes หรือลองคำนวณตามวิธีที่คู่มือระบุคือ 26 + (20 x 12) = 266 bytes พอดี


- การกำหนดค่าให้ตัวแปร

การกำหนดค่าให้ตัวแปรแบบ Array ก็สามารถทำได้เหมือนกับตัวแปรทั่วไป เช่น 23Z[4] ก็เป็นการกำหนดให้ตัวแปร Z[4] มีค่าเท่ากับ 23 เป็นต้น


- การลบตัวแปร

การลบตัวแปรทำได้โดยการพิมพ์

0DimZ

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

ตัวแปรพิเศษที่ไม่ได้ใช้งานแล้วควรลบทิ้งบ้าง โดยเฉพาะกรณีที่หน่วยความจำเครื่องเหลือน้อย



 การประยุกต์ใช้งานตัวแปร Array 

ประโยชน์อย่างหนึ่งของตัวแปร Array คือเราสามารถเข้าถึงข้อมูลที่มีจำนวนมากใน Array ด้วยการเขียนโปรแกรมสั้นๆ โดยใช้ลูป (Loop) เช่นในกรณีงานวงรอบเราสามารถเขียนโปรแกรมป้อนค่า Azimuth ต่อเนื่องกัน 20 ตัวโดยใช้ลูป For


***** สำหรับการเขียนโปรแกรมป้อนค่าตัวแปร Array สามารถใช้เครื่องหมาย "?" ได้เท่านั้น ถ้าใช้เครื่องหมาย "?" จะ Syntax ERROR *****


โดยปกติถ้าเราไม่ใช้ลูปในการป้อนค่าเราอาจต้องเขียนคำสั่งยาวๆ หลายบรรทัดแบบนี้


20DimZ

"Az 1"?Z[1]

"Az 2"?Z[2]

"Az 3"?Z[3]
................. 
................. 
................. 

"Az 20"?Z[20]↵ 

 


แต่ถ้าเราใช้คำสั่ง For จะทำให้เขียนสั้นลงแบบนี้


20DimZ

For 1J To 20

Cls

"AZ."

Locate 4,1,J

?Z[J]

Next


แต่ข้อด้อยอย่างนึงของ 5800 คือการที่สามารถใช้ตัวแปร Array ได้แค่ตัวแปรเดียวคือตัวแปร Z ทำให้เกิดข้อจำกัดในการใช้ตัวแปร เช่นถ้าเราต้องการเขียนโปรแกรมวงรอบให้เก็บค่า มุม 10 ค่า, ค่าระยะ 10 ค่า เมื่อคำนวนต่อมาให้เก็บค่า Azimuth อีก 10 ค่า, ค่า Lat, Dep อีกอย่างละ 10 ค่า, ฯลฯ ถ้าเป็นเครื่องรุ่นก่อนๆ ของ Casio สมัยที่ยังเป็น Pocket Computer เช่น 795P, 850P, 880P หรือพวกตระกูล PB ภาษาที่ใช้เป็นภาษาเบสิค(Basic) เราสามารถประกาศตัวแปรได้อย่างอิสระหลายๆ ตัวพร้อมกัน เช่น A[10], B[10], LAT[10] เป็นต้น

แต่เราสามารถแก้ไขปัญหานี้ได้โดยการใช้ช่วงของข้อมูลเพื่อแยกการใช้งานค่าตัวแปรที่แตกต่างกัน 

ตัวอย่าง เช่น ถ้าเราต้องการเก็บข้อมูล ค่ามุม 10 ค่า, ค่าระยะ 10 ค่า เพื่อมาคำนวณหาค่า Az เพื่อเก็บไว้อีก 10 ค่า เราอาจทำได้โดย 


ประกาศ 30DimZ โดย

Z[1] - Z[10] เก็บค่ามุม

Z[11] - Z[20] เก็บค่าระยะ

Z[21] - Z[30] เก็บค่า Az

 

 ข้อเสนอแนะ  กรณีเขียนโปรแกรมวนลูปอย่างเช่นโปรแกรมวงรอบที่ยังไม่ทราบจำนวนหมุดที่แน่ชัด แล้วไม่รู้จะประกาศไว้เท่าไรดี เราสามารถจัดการปัญหานี้โดย


1. ประกาศตัวแปรเผื่อ

เช่น ถ้าเรามันใจว่าวงรอบที่เรารังวัดจะไม่เกิน 30 หมุดอย่างแน่นอน เราก็อาจประกาศไว้เผื่อซัก 35 ก็เพียงพอ วิธีนี้เป็นวิธีที่ง่ายต่อการเขียนโปรแกรมแต่ก็ต้องเสียพื้นที่หน่วยความจำบางส่วนที่ไม่ได้ใช้ด้วย


2. ประกาศตัวแปรเท่าที่ใช้โดยป้อนค่าจำนวนหมุดก่อน

วิธีนี้ดีกว่าวิธีแรก ไม่ต้องเสียพื้นที่ในส่วนที่ไม่ได้ใช้แต่ก็ทำให้การเขียนโปรแกรมยุ่งยากขึ้นเล็กน้อย

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


ตัวอย่าง เขียนโปรแกรมคำนวณค่าพิกัดจากข้อมูลตามภาพ




ขั้นแรกก่อนจะลงมือเขียนโปรแกรมเรามากำหนดตัวแปรที่จะใช้งานกันก่อน โดยให้

N = จำนวนหมุด
A = ค่าพิกัด N หมุดเริ่มต้น
B = ค่าพิกัด E หมุดเริ่มต้น
C = ค่า Azimuth เริ่มต้นที่ชี้มายังหมุดที่ 1
Z[ ] = ตัวแปร Array สำหรับเก็บค่า มุม, ระยะ, Azimuth โดยจากตัวอย่างนี้เราจะใช้ 

Z[1] ถึง Z[5] ในการเก็บค่ามุม

Z[6] ถึง Z[10] ในการเก็บค่าระยะ

Z[11] ถึง Z[15] ในการเก็บค่า Azimuth


การเขียนโปรแกรมจะขอแบ่งโปรแกรมออกเป็น 5 ส่วนดังนี้

  1. ป้อนข้อมูลเริ่มต้นและประกาศตัวแปร
  2. ป้อนค่ามุม
  3. ป้อนค่าระยะ
  4. คำนวณ Azimuth
  5. คำนวณค่าพิกัด

แล้วในตอนท้ายบทจะนำทั้ง 5 ส่วนมารวมกันอีกที


1. ป้อนข้อมูลเริ่มต้นและประกาศตัวแปร


Cls

"NO. OF POINT"?N

3NDimZ

"N1"?A

"E1"?B

"START AZ"?C


คำอธิบาย

เนื่องจากกำหนดให้ N เท่ากับจำนวนหมุด เราจึงประกาศตัวแปร Z ไว้สามเท่าหรือ 3N ตัว(3xN) เพื่อเก็บค่ามุม N ตัว ค่าระยะ N ตัว และค่า Azimuth อีก N ตัว

เช่นจากตัวอย่างเรามีหมุดรังวัดทั้งหมด 5 หมุด เราก็จะประกาศตัวแปร Z ไว้ 15 ตัว(3x5) เพื่อเก็บค่ามุม 5 ตัว ค่าระยะ 5 ตัว และค่า Azimuth อีก 5 ตัว


2. ป้อนค่ามุม

 

For 1J To N

Cls

"ANG."

Locate 5,1,J

?Z[J]

Next


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

ทีนี้กดหยุดโปรแกรมออกไปแล้วลองรันโปรแกรมดูอีกครั้งจะเห็นว่าค่า NO OF POINT, N1, E1, START AZ จะยังคงแสดงค่าเดิมและสามารถกด [EXE] ผ่านไปได้เลย แต่พอโปรแกรมรันถึงส่วนป้อนค่ามุมจะเห็นว่าโปรแกรมจะไม่แสดงค่ามุมเคยป้อนไว้เนื่องมาจากการที่เราต้องใช้เครื่องหมาย "?" ในการป้อนค่า Array

คงไม่ใช่เรื่องสนุกนักที่เราจะต้องป้อนค่ามุมเยอะๆ ทุกครั้งที่รันโปรแกรมใหม่โดยเฉพาะตอนที่เราเขียนและทดสอบโปรแกรม เราจะแก้ไขปัญหานี้ โดยใช้เครื่องหมาย "?" แล้วป้อนผ่านตัวแปรปกติแทน

ในที่นี้เราจะใช้ตัวแปร X สำหรับเก็บค่ามุม(ชั่วคราว)และเป็นตัวแปรแทนในการป้อนค่า โดยเราจะแก้ไขโปรแกรมในส่วนของบรรทัด


?Z[J]


แก้เป็น


Z[J]X        // พักค่ามุมที่จะป้อนไว้ในตัวแปร X เพื่อให้แสดงค่ามุม

""?X            // ป้อนค่ามุมผ่านตัวแปร X เพื่อให้ใช้เครื่องหมาย "?" ได้

XZ[J]        // นำค่าที่ป้อนใส่กลับไปในตัวแปร Array


หรือแก้โปรแกรมในส่วนที่สองเป็นดังนี้


For 1J To N

Cls

"ANG."

Locate 5,1,J

Z[J]X

""?X

XZ[J] 

Next 


เท่านี้โปรแกรมก็จะแสดงค่ามุมเก่าที่ป้อนไว้และสามารถกด [EXE] ผ่านไปได้เลย



3. ป้อนค่าระยะ

 

For N+1J To 2N

Cls

"DIST."

Locate 6,1,J-N 

Locate 8,1,""

Locate 10,1,J-N+1

Z[J]X

""?X

XZ[J] 

Next


คำอธิบาย

เนื่องจากเราใช้ตัวแปร Z[1] ถึง Z[N] เพื่อเก็บค่ามุมไปแล้ว ในส่วนป้อนค่าระยะนี้เราจะกำหนดให้เริ่มป้อนจาก Z[N+1] ถึง Z[2N] หรือ Z[6] ถึง Z[10] (ตามโจทย์ตัวอย่าง)



4. คำนวณ Azimuth


// แยกคำนวณค่า Azimuth ตัวแรก(หมุดที่ 1 ชี้ไปหมุดที่ 2)

// เนื่องจากเราไม่สามารถอ้างอิงหมุดเริ่มต้น(Z[0])ในลูปได้

C+180+Z[1]Z[2N+1]

While Z[2N+1]>360

Z[2N+1]-360Z[2N+1]

WhileEnd

Cls

"AZ"

Locate 4,1,"1 → 2"

Z[2N+1]°


// คำนวณ Azimuth ที่เหลือ

For 2N+2J To 3N

Z[J-1]+180+Z[J-2N]Z[J]

While Z[J]>360

Z[J]-360Z[J]

WhileEnd

Cls

"AZ"

Locate 4,1,J-2N

Locate 6,1,""

Locate 8,1,J-2N+1

Z[J]°

Next



5. คำนวณค่าพิกัด

 

Cls

"N 1":A

"E 1":B

AG:BH

For 1J To N

Cls

"N"

Locate 3,1,J+1

G+Z[N+J]cos(Z[2N+J])G

"E"

Locate 3,3,J+1

H+Z[N+J]sin(Z[2N+J])H

Next


คำอธิบาย

ตัวแปร G และ H ใช้สำหรับคำนวณค่าพิกัดต่อเนื่องในลูป



เมื่อนำทุกส่วนของโปรแกรมมารวมกันทั้งหมดจะได้ดังนี้


Cls

"NO. OF POINT"?N

3NDimZ

"N1"?A

"E1"?B

"START AZ"?C

 

For 1J To N

Cls

"ANG."

Locate 5,1,J

Z[J]X

""?X

XZ[J] 

Next 

 

For N+1J To 2N

Cls

"DIST."

Locate 6,1,J-N 

Locate 8,1,""

Locate 10,1,J-N+1

Z[J]X

""?X

XZ[J] 

Next

 

C+180+Z[1]Z[2N+1]

While Z[2N+1]>360

Z[2N+1]-360Z[2N+1]

WhileEnd

Cls

"AZ"

Locate 4,1,"1 → 2"

Z[2N+1]°

For 2N+2J To 3N

Z[J-1]+180+Z[J-2N]Z[J]

While Z[J]>360

Z[J]-360Z[J]

WhileEnd

Cls

"AZ"

Locate 4,1,J-2N

Locate 6,1,""

Locate 8,1,J-2N+1

Z[J]°

Next

 

Cls

"N 1":A

"E 1":B

AG:BH

For 1J To N

Cls

"N"

Locate 3,1,J+1

G+Z[N+J]cos(Z[2N+J])G

"E"

Locate 3,3,J+1

H+Z[N+J]sin(Z[2N+J])H

Next


ทดสอบรับโปรแกรม


- ป้อนข้อมูลเริ่มต้น 






- ป้อนค่ามุม 





ป้อนค่าระยะ





คำนวณ Azimuth





คำนวณค่าพิกัด






จะได้ผลลัพธ์ตามตารางนี้



จบบท


ความคิดเห็น

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



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

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