วันศุกร์ที่ 15 ธันวาคม พ.ศ. 2560

แก้สมการคณิตศาสตร์ ด้วย construct 2

มีคำถามที่น่าสนใจมากเกี่ยวกับการทำแบบทดสอบในการเขียนประโยคสัญลักษณ์ทางคณิตศาสตร์ แล้วให้โปรแกรม construct2 แยกลำดับการคำนวณออกมา หลักการทำงานในลักษณะนี้ จะต้องพิจารณาความสำคัญของตัวดำเนินการทางคณิตศาสตร์ คือ ลำดับความสำคัญ เช่น () มีความสำคัญมากกว่า * หรือ / และ + หรือ - ตามลำดับ


ลักษณะหน้าจอของโปรแกรม คือ มีช่องสำหรับกรอกสมการ มีปุ่มสำหรับกด เมื่อต้องการคำนวณคำตอบ และช่องสำหรับแสดงวิธีหาคำตอบ เป็นดังนี้ครับ (สามารถ download ไฟล์โปรแกรมได้จาก link นี้)

กำหนดชื่อของ Textbox ตามตัวอักษรสีแดง

เพิ่ม Array จำนวน 3 ตัว ดังนี้ str_arr , digit_arr และ operator_arr

กำหนดคำสั่งในการประมวลผล โดยกำหนดค่าตัวแปรที่ใช้ในโปรแกรม construct2 ก่อน ดังภาพ


eq_str  เก็บข้อความสมการ
eq_txt1  เก็บตัวเลขตัวที่ 1
eq_txt2  เก็บตัวเลขตัวที่ 2
eq_txt3  เก็บตัวเลขตัวที่ 3
operator1 เก็บเครื่องหมายตัวดำเนินการที่ 1
operator2 เก็บเครื่องหมายตัวดำเนินการที่ 2
cstr  เก็บตัวอักษรในสมการ
arr_len เก็บความยาวของ array สมการ
bracket_ind เก็บตำแหน่งของ (

สร้าง Array สำหรับรายการตัวเลข และเครื่องหมาย สำหรับใช้เทียบกับสมการ ชื่อ digit_arr  และ operator_arr



ผมขออธิบายลักษณะสมการที่จะเป็นไปได้สำหรับโปรแกรมที่สร้างขึ้น มีอยู่ 3 ลักษณะ คือ
1. สมการที่เขียนต่อเนื่อง ไม่มีวงเล็บ  เช่น 150+40-30  สมการลักษณะนี้ จะอาศัยการพิจารณาลำดับความสำคัญของเครื่องหมายตัวดำเนินการทางคณิตศาสตร์
2. สมการที่มีวงเล็บเป็นกลุ่มแรก เช่น (150+40)-30  สมการลักษณะนี้ จะทำการคำนวณในวงเล็บเพื่อให้ได้คำตอบก่อนแล้วค่อยนำคำตอบมาคำนวณกับเลขตัวที่ 3
3. สมการที่มีวงเล็บเป็นกลุ่มหลัง เช่น 150+(40-30) สมการลักษณะนี้จะคำนวณกลุ่มหลังก่อน แล้วค่อยเอาคำตอบมาคำนวณกับเลขตัวที่ 1


หลังจากนั้น สร้างเหตุการณ์ เมื่อมีการกดปุ่ม Calculate เพื่อแสดงการคำนวณสมการที่พิมพ์ไว้แล้ว



1. อ่านค่าสมการจาก eq_txt ซึ่งเป็น textbox ที่เราพิมพ์สมการ มาเก็บไว้ที่ตัวแปร eq_str
2. กำหนดขนาดของ Array ชื่อ str_arr ให้เท่ากับความยาวของสมการ
3. เปลี่ยนข้อความสมการ ให้เป็นรูปแบบ Array เก็บไว้ที่ str_arr



โดยจะไม่เก็บค่าช่องว่างในสมการ และเครื่องหมาย () เข้าไปใน Array และเก็บตำแหน่งที่เจอ ( ด้วย เพื่อใช้เทียบลักษณะของสมการ ถ้าไม่เจอ ( ตำแหน่งของ ( จะมีค่าเป็น -1
เก็บความยาวของ array ไว้ที่ตัวแปร arr_len

4. แยกสมการไปเก็บไว้ที่ตัวแปรสำหรับเก็บค่าตัวเลขและเครื่องหมาย



บรรทัดที่ 7 จะวนซ้ำเรื่อยๆ ถ้าค่าใน array str_arr เป็นตัวเลข 0-9 โดยเทียบกับ digit_arr แล้วเก็บเลขแต่ละตัวไว้ที่ nstr แต่ถ้าไม่ใช่ตัวเลข ให้หยุดการวนซ้ำ
บรรทัดที่ 11 จะเก็บค่าเครื่องหมายทางคณิตศาสตร์ตัวที่ 1 ที่อยู่ถัดจากตัวเลขตัวที่ 1

ดำเนินการเช่นเดียวกันสำหรับการเก็บค่าตัวเลขตัวที่ 2 และ 3



5. สร้างฟังก์ชัน สำหรับหาค่าลำดับความสำคัญของเครื่องหมาย ดังนี้



โดย * และ /  จะมีความสำคัญมากกว่า + และ -

6. สร้างฟังก์ชันสำหรับใช้คำนวณคำตอบ โดยการส่งค่าเครื่องหมายและตัวเลขมาให้ฟังก์ชัน ชื่อ Calc



7. เปรียบเทียบตำแหน่งของวงเล็บ เพื่อหารูปแบบสมการ
ถ้าตำแหน่งวงเล็บ เท่ากับ -1 แสดงว่าไม่มีวงเล็บในสมการ ต้องคำนวณจากลำดับความสำคัญ



การเรียกใช้ function ในโปรแกรม construct2 จะใช้คำสั่ง Call ชื่อฟังก์ชัน (ค่าพารามิเตอร์)
จากบรรทัดที่ 22 จะเป็นการเรียกฟังก์ชัน priority แล้วส่งค่าเครื่องหมายไปให้ ฟังก์ชันจะคืนค่าลำดับความสำคัญมาเก็บไว้ที่ตัวแปร priority1 และ priority2



บรรทัดที่ 23 เปรียบเทียบถ้า priority2 มากกว่า priority1 ให้คำนวณจากกลุ่มด้านหลังก่อน จึงกำหนดค่าในช่อง Textbox ให้เอาตัวเลขที่ 2 และ 3 มาคำนวณ แล้วจึงไปคำนวณกับตัวเลขที่ 1 โดยการเรียกฟังก์ชัน Calc โดยส่งค่า operator และค่าตัวเลขจาก  operand_1.text และ operand_2.txt นำคำตอบที่ได้ไปเก็บไว้ที่ textbox ชื่อ answer_1 และ operand_4 แล้วเรียกฟังก์ชัน Calc เพื่อคำนวณอีกครั้ง



บรรทัดที่ 24 เปรียบเทียบถ้า priority1 น้อยกว่าหรือเท่ากับ priority2 ให้คำนวณจากซ้ายไปขวา จึงกำหนดค่าในช่อง Textbox ให้เอาตัวเลขที่ 1 และ 2 มาคำนวณ แล้วจึงไปคำนวณกับตัวเลขที่ 3 โดยการเรียกฟังก์ชัน Calc โดยส่งค่า operator และค่าตัวเลขจาก  operand_1.text และ operand_2.txt นำคำตอบที่ได้ไปเก็บไว้ที่ textbox ชื่อ answer_1 และ operand_3 แล้วเรียกฟังก์ชัน Calc เพื่อคำนวณอีกครั้ง

ถ้าตำแหน่งวงเล็บ อยู่ตำแหน่งแรก ให้คำนวณค่าตามลำดับจากซ้ายไปขวา



ถ้าตำแหน่งวงเล็บ อยู่ในกลุ่มหลัง ให้คำนวณค่าในวงเล็บหลังก่อน ค่อยนำค่าตัวเลขที่ 1 ไปคำนวณกับคำตอบที่ได้




สิ้นสุดขั้นตอนการเขียนคำสั่ง เมื่อเราทดสอบโปรแกรมจะได้คำตอบในแต่ละกรณี ดังภาพ

สมการ 150 - 8 * 5



สมการ (150 - 8) * 5



สมการ 150 - (8 * 5)



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



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

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