วันพฤหัสบดีที่ 27 สิงหาคม พ.ศ. 2558

Casio fx-5800P - เมนูตัวเลือกแบบไม่ต้องกด EXE

ตอนที่เริ่มศึกษาเจ้า 5800 ใหม่ๆ ผมมีข้อสงสัยคาใจอยู่อีกอย่างนึงคือ อยากจะทำเมนูตัวเลือกที่กดปุ๊บทำงานปั๊บ เหมือนกับคำสั่ง INKEY$ หรือ INPUT$ ใน fx-880P หลังจากเปิดหาในคู่มือหลายรอบถึงได้รู้ว่ามันคือคำสั่ง Getkey (ตามคู่มือหน้า E-119)






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






จะเห็นว่าปุ่มแต่ละปุ่มมีเลขรหัสเป็นของตัวเองที่ไม่ซ้ำกันกับปุ่มอื่นเช่น ปุ่มเลข "1" มีรหัสเป็น 35, ปุ่ม "+" มีรหัสเป็น 77, ปุ่ม "DEL" มีรหัสเป็น 34 เป็นต้น ปุ่มเดียวที่ไม่มีรหัสคือปุ่ม "AC" ที่ไม่จำเป็นต้องมีเข้าใจว่าเพราะเอาไว้สำหรับหยุดการทำงานของโปรแกรม


เพื่อทำความเข้าใจคำสั่ง Getkey เรามาลองป้อนโปรแกรมตามตัวอย่างที่อยู่ในคู่มือ แต่เพื่อให้อ่านโค้ดง่ายขึ้นเลยขอแยกบรรทัดแบบนี้





มีคำสั่งที่ไม่เคยกล่าวถึงในบทความที่ผ่านมาอยู่ 4 คำสั่งคือ Locate, Ran#, Do และ LpWhile เลยจะขออธิบายสั้นๆ ดังนี้



- Locate

เนื่องจากหน้าจอของ fx-5800P สามารถแสดงผลได้ 4 บรรทัด และในแต่ละบรรทัดแสดงตัวอักษรได้ 16 ตัว ตามภาพ





คำสั่ง Locate ก็คือคำสั่งที่ใช้กำหนดตำแหน่งที่ต้องการแสดงผลมีรูปแบบการใช้งานคือ




Locate ตำแหน่งคอลัมน์ , ตำแหน่งบรรทัด , สิ่งที่ต้องการแสดง


โดยที่



  • ตำแหน่งคอลัมน์ นั้นกำหนดได้ตั้งแต่ 1 ถึง 16(เนื่องจากในหนึ่งบรรทัดแสดงได้เพียง 16 ตัวอักษร)
  • ตำแหน่งบรรทัด กำหนดได้ตั้งแต่ 1 ถึง 4
  • สิ่งที่ต้องการแสดง นั้นอาจจะเป็น ตัวแปร, ตัวเลข หรือข้อความก็ได้

ตัวอย่างเช่น Locate 5 , 3 , "HELLO" คือการสั่งให้แสดงข้อความว่า HELLO ในบรรทัดที่ 3 และตำแหน่งที่ 5(ตัวอักษรตัวแรกเริ่มที่คอลัมน์ 5)




- Ran#

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










จะเห็นว่าผลลัพธ์ที่ได้จากคำสั่งนี้ไม่เท่ากันซักครั้งเนื่องจากค่าที่ได้ในแต่ละครั้งเกิดจากการสุ่มตัวเลข




- Do... LpWhile
Do และ LpWhile เป็นคำสั่งที่ใช้ร่วมกันในวนลูป(วนซ้ำการทำงาน)ตามเงื่อนไขที่กำหนดไว้ท้ายคำสั่ง LpWhile จากตัวอย่างข้างต้น การวนลูปเริ่มต้นที่คำสั่ง Do จากนั้นก็ทำงานตามคำสั่งที่อยู่ภายในลูปจนถึงคำสั่ง LpWhile มีการตรวจสอบตามเงื่อนไขที่ระบุไว้ท้ายคำสั่งซึ่งถ้าเป็น "จริง" โปรแกรมจะย้อนกลับไปทำที่คำสั่ง Do อีกครั้ง แต่ถ้าเงื่อนไขเป็น "เท็จ" โปรแกรมจึงจะข้ามคำสั่ง LpWhile เพื่อทำงานในบรรทัดถัดไป(ุถ้ามี) 

แต่โดยส่วนตัวแล้วผมไม่ค่อยชอบใช้คำสั่งพวก Do... LpWhile ซักเท่าไหร่เพราะขี้เกียจจำเงื่อนไขเยอะแยะหลายตัว นอกจากนี้ในภาษาของ fx-5800P ยังมีคำสั่ง While... WhileEnd อีกตัวที่พาให้สับสน(คงสับสนแค่ผมคนเดียว ^ ^) ถ้าใครขี้เกียจจำคำสั่งแบบผมจะลองหันมาใช้บริการ If... Then... IfEnd โดยแก้คำสั่งใหม่ตามโค้ดข้างล่างนี้ก็ได้ ให้ผลลัพธ์เหมือนกัน




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



  1. โปรแกรมเริ่มต้นด้วยการกำหนดตำแหน่งจุดเริ่มต้นลูป
  2. แสดงผลตัวเลขที่เกิดจากการสุ่มในบรรทัดที่ 1
  3. บรรทัดถัดมาแสดงข้อความแนะนำว่าให้กดปุ่มเลข 0(เพื่อหยุดการสุ่มตัวเลข)
  4. บรรทัดสุดท้ายตรวจสอบว่าปุ่มที่ถูกกดล่าสุดมีรหัสที่ไม่ใช่ 25 ? (ปุ่มเลข "0") ซึ่งถ้าเงื่อนไขเป็น "จริง" (ไม่กดปุ่ม 0) โปรแกรมจะกลับไปทำงานที่ตำแหน่งเริ่มต้นลูป แต่ถ้าเงื่อนไขเป็น "เท็จ" (กดปุ่ม 0) โปรแกรมจึงจะออกจากลูป



หลังจากป้อนโปรแกรมเสร็จแล้วทีนี้มาลองทดสอบการทำงานโดยการรันโปรแกรม





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







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


  1. สร้างเมนูตัวเลือก 2 ตัวคือ กดปุ่มเลข 1 คือ "YES" กดปุ่มเลข 2 คือ "NO" 
  2. หลังจากนั้นก็ใช้คำสั่ง GetKey เพื่ออ่านค่าเลขรหัสปุ่มกด
  3. เปรียบเทียบปุ่มกดเป็น "1" หรือ "2" หรือไม่ ถ้าไม่ใช่กลับไปทำงานข้อ 2
  4. ถ้าปุ่มกดเป็น "1" แสดงผล "YES", ถ้าเป็น "2" แสดงผล "NO"
ตามโค้ดด้านล่างนี้



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





เมื่อกดปุ่มเลข 1 หรือเลข 2 จะได้ผลลัพธ์ตามลำดับ







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


จบบท



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


บทความนี้เปิดประเดิม E-mail ใหม่ที่เป็นทางการมากขึ้นและขออนุณาตเปลี่ยนสรรพนามแทนตัวเองใหม่จาก "ผู้เขียน" เป็น "ผม" ก็แล้วกันเนื่องจากคำว่า "ผู้เขียน" มันทำให้รู้สึกเกร็งๆ ยังไงก็ไม่รู้ ^ ^


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

8 ความคิดเห็น:

  1. ผมอยากรู้การใช้งานปุ่มแต่ละปุ่มอ่ะครับว่ามันใช้งานยังไง

    ตอบลบ
    คำตอบ
    1. ผมไม่เข้าใจคำถาม คุณอยากรู้การทำงานของปุ่มหรือคำสั่งไหนเหรอครับ ยังไงช่วยระบุอีกที

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

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

    ตอบลบ
    คำตอบ
    1. ต้องขอโทษด้วยครับที่ตอบช้า ช่วงนี้ผมไม่ค่อยมีเวลาเข้ามาเขียนบล็อก เลยไม่รู้ว่ามีคำถามเข้ามา

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

      ลบ
  3. ผมสงสัยการใช้เครื่องหมาย ":" ครับ

    ตอบลบ
    คำตอบ
    1. เครื่องหมาย ":" (Separator หรือ Colon)

      ใช้สำหรับคั่นระหว่างชุดคำสั่งเพื่อบอกให้รู้ว่าคำสั่งที่อยู่ทางซ้าย(ของ :)และคำสั่งที่อยู่ทางขวาเป็นคำสั่งคนละชุดกัน

      โดยทั่วไปเราจะใช้ประโยชน์จากเครื่องหมายนี้ในการรวมคำสั่งหลายๆ บรรทัดให้อยู่ในบรรทัดเดียวกัน เช่น

      "A"?→A↵
      "B"?→B↵
      A+B◢

      เราสามารถเขียนใหม่ให้อยู่ในบรรทัดเดียวกันโดยใช้เครื่องหมาย : คั่นได้ดังนี้

      "A"?→A:"B"?→B:A+B◢

      ลบ