18 ธันวาคม 2561

[Q&A] ทำไม x = x + 1 | คำถามที่มือใหม่หลายคนสงสัย

ผู้เขียนเจอคนที่หัดเขียนโปรแกรมมือใหม่หลายคน (รวมทั้งนักสร้างเกมมือใหม่) อ่านตัวอย่างโค้ดจากตำราหรือเรียนจากอาจารย์แล้วถามว่า "ทำไม x = x + 1", "ทำไม i = i + 1" หรือตัวแปรอื่นที่เป็นทำนองนี้ ต้องอธิบายเรื่องนี้ให้มือใหม่ฟังหลายต่อหลายครั้ง ผู้เขียนจึงเขียนบทความนี้เพื่อตอบคำถามยอดฮิตคำถามนี้ไว้ที่นี่เลย

อันดับแรกผู้อ่านต้องแยก "สมการ (equation)" ในคณิตศาสตร์กับ "นิพจน์ (expression)" ในภาษาคอมพิวเตอร์ออกจากกันก่อน ทั้งสองอย่างนี้มีวิธีการเขียนเหมือนกัน แต่ความหมายของสมการกับนิพจน์แตกต่างกัน มือใหม่หลายคนคุ้นเคยกับสมการจากวิชาคณิตศาสตร์แล้วนำสมการมาปะปนกับนิพจน์ จึงทำให้สงสัยเรื่องนี้กันเป็นจำนวนมาก


สมการ VS นิพจน์

ทั้งสมการและนิพจน์มีวิธีการเขียนเหมือนกัน จุดเด่นคือการมีเครื่องหมาย "=" เช่น y = 2m - 7 ตัวอย่างนี้เป็นได้ทั้งสมการและนิพจน์ขึ้นอยู่กับหน้าที่ในบริบทนั้น

สมการนิพจน์
ข้อแตกต่าง
ฝั่งซ้ายและฝั่งขวาของเครื่องหมาย "="
ต้องเท่ากันทั้งสองฝั่ง
ฝั่งซ้ายเท่ากับฝั่งขวาของเครื่องหมาย "="
ไม่สนใจว่าฝั่งขวาเท่ากับฝั่งซ้ายหรือไม่
ตัวอย่างA = B

หมายถึง ค่าของ A เท่ากับค่าของ B
และ ค่าของ B ก็เท่ากับค่าของ A
A = B

หมายถึง ค่าของ A เท่ากับค่าของ B
แต่ ค่าของ B อาจไม่เท่ากับค่าของ A ก็ได้
การใช้งาน
หาตัวแปรที่ไม่ทราบค่า
(อยู่ส่วนใดของสมการก็ได้)

ฝั่งซ้ายกับฝั่งขวาสามารถสลับกันได้
นำค่าที่ทราบอยู่แล้ว
จากฝั่งขวามาใส่ฝั่งซ้าย

ฝั่งซ้ายกับฝั่งขวาไม่สามารถสลับกันได้





ทำความเข้าใจ "นิพจน์"

ประโยคที่ใช้ในการเขียนโปรแกรมและมีเครื่องหมาย "=" คือนิพจน์ ไม่ใช่สมการ นิพจน์เป็นการนำค่าจากฝั่งขวามาใส่ในตัวแปรฝั่งซ้ายเท่านั้น เช่น
  • X = 1 หมายความว่า นำค่า 1 มาใส่ในตัวแปร X
  • X = 42 / 7 หมายความว่า นำค่า 42 / 7 ซึ่งเท่ากับ 6 มาใส่ในตัวแปร X
  • X = Y หมายความว่า นำค่า Y มาใส่ในตัวแปร X (ไม่ใช่นำค่า X ไปใส่ในตัวแปร Y)

ถ้าฝั่งซ้ายและฝั่งขวามีตัวแปรเดียวกัน ให้ยึดตามกฎเดิมคือนำค่าจากฝั่งขวามาใส่ฝั่งซ้ายเท่านั้น ค่าของตัวแปรในฝั่งขวาคือค่าเดิม ส่วนค่าของตัวแปรในฝั่งซ้ายคือค่าที่ผ่านการคำนวณจากฝั่งขวาแล้ว เช่น
  • x = x + 1 หมายความว่า นำค่า x (ค่าเดิม) มาบวกด้วย 1 แล้วนำค่าที่บวกเสร็จแล้วมาใส่ในตัวแปร x (ได้ค่าใหม่) หรือกล่าวง่าย ๆ คือนิพจน์นี้เพิ่มค่า x ไปอีก 1 หน่วยนั่นเอง
  • price = price * price หมายความว่า นำค่า price (ค่าเดิม) คูณด้วยค่า price (ค่าเดิม) แล้วนำค่าที่ได้จากการคูณมาใส่ในตัวแปร price (ได้ค่าใหม่)
  • Income = Income - Tax หมายความว่า นำค่า Income (ค่าเดิม) ลบด้วยค่า Tax แล้วนำค่าที่ได้มาใส่ในตัวแปร Income (ได้ค่าใหม่) ในกรณีนี้ตัวแปร Income จะเปลี่ยนไป แต่ตัวแปร Tax จะมีค่าเหมือนเดิม

มีเพียงตัวแปรที่อยู่ฝั่งซ้ายของเครื่องหมาย "=" ที่จะเปลี่ยนไป ส่วนตัวแปรอื่นที่ไม่ได้อยู่ในฝั่งซ้ายแต่อยู่ในฝั่งขวาจะไม่เปลี่ยนแปลง


"นิพจน์" ใช้แทน "สมการ" ไม่ได้!

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

สมมติว่าโจทย์คือ "แนนมีลูกอม 2 เม็ด ต้ามีลูกอมมากกว่าแนนเท่าไร ถ้าต้ามีลูกอม 5 เม็ด" จากโจทย์ข้อนี้สามารถเขียนสมการเป็น 2 + X = 5 โดยให้ X แทนผลต่างของจำนวนลูกอม หรือจะเขียนสมการกลับข้างเป็น 5 = X + 2 ก็ได้ หรือจะเขียนเป็น X = 5 - 2 หรือ 5 - 2 = X ก็ยังได้ ไม่ว่าตัวแปร X จะอยู่ตรงไหนก็สามารถแก้สมการได้อย่างถูกต้อง แต่ถ้าจะนำ "สมการ" นี้มาให้คอมพิวเตอร์คำนวณซึ่งต้องใส่เป็น "นิพจน์" จะต้องจัดให้ตัวแปร X อยู่ฝั่งซ้ายเท่านั้น และห้ามใส่ตัวเลขอื่นในฝั่งซ้ายอย่างเด็ดขาด โจทย์ข้อนี้จึงเขียนเป็นนิพจน์ได้เป็น X = 5 - 2 เท่านั้น ไม่สามารถสลับฝั่งได้

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


ตัวอย่างการเปลี่ยน "สมการ" ให้เป็น "นิพจน์"

โจทย์ข้อที่ 1 ครูคณิตศาสตร์ต้องการเขียนโปรแกรมเพื่อตรวจการบ้านของนักเรียนชั้น ม.4 สมการของกราฟเส้นตรงคือ y = mx + c ครูคนนี้ทราบค่าของตัวแปร y, m และ c อยู่แล้ว สิ่งที่ไม่ทราบคือค่า x จงแปลงสมการ y = mx + c ให้เป็นนิพจน์เพื่อหาค่า x

วิธีทำ ใช้วิธีย้ายสมการจนกว่าจะมีตัวแปร x จะอยู่ฝั่งซ้ายเพียงตัวเดียว
y = mx + c
mx + c = y
mx = y - c
x = (y - c) / m

คำตอบ นิพจน์ที่ครูต้องการคือ x = (y - c) / m

โจทย์ข้อที่ 2 นักสร้างเกมคนหนึ่งต้องการสร้างเกมยิงปืน FPS 3D เขาต้องการให้เกมสมจริงจึงเขียนโปรแกรมให้คอมพิวเตอร์คำนวณแรงโน้มถ่วงด้วย เขาทราบจากอินเทอร์เน็ตว่าการคำนวณความเร็วภายใต้แรงโน้มถ่วงใช้สูตรเดียวกับการเคลื่อนที่ภายใต้ความเร่ง สูตรคือ s = (u)(t) + (1/2)(a)(t^2) เขาทราบค่าของตัวแปรทุกตัวยกเว้น t จงแปลงสมการ s = (u)(t) + (1/2)(a)(t^2) ให้เป็นนิพจน์เพื่อหาค่า t

วิธีทำ ใช้วิธีย้ายสมการจนกว่าจะมีตัวแปร t จะอยู่ฝั่งซ้ายเพียงตัวเดียว ตัวแปร t ห้ามมีสัมประสิทธิ์หรือยกกำลังสอง
s = (u)(t) + (1/2)(a)(t^2)
(u)(t) + (1/2)(a)(t^2) = s
(1/2)(a)(t^2) + (u)(t) - s = 0
ใช้สูตรแยกพหุนามยกกำลังสอง ต้องแบ่งตัวแปร t ออกเป็นสองตัวคือ t1 และ t2 เพราะคำตอบจากสูตรแยกพหุนามมีสองค่า
t1 = [(-u) + [(u^2) - (4)(1/2)(a)(s)] ^ (1/2)] / [(2)(1/2)(a)]
t2 = [(-u) - [(u^2) - (4)(1/2)(a)(s)] ^ (1/2)] / [(2)(1/2)(a)]

คำตอบ นิพจน์ที่นักสร้างเกมต้องการคือ
t1 = [(-u) + [(u^2) - (4)(1/2)(a)(s)] ^ (1/2)] / [(2)(1/2)(a)] และ
t2 = [(-u) - [(u^2) - (4)(1/2)(a)(s)] ^ (1/2)] / [(2)(1/2)(a)]
นักสร้างเกมคนนี้ต้องเขียนโปรแกรมเพิ่มเติมเพื่อเลือกว่าจะใช้ตัวแปร t1 หรือตัวแปร t2


บทความเพิ่มเติม [สอนสร้างเกม] เรียนสร้างเกมกับมิกิจัง : บทที่ 4 นิพจน์ (Expression)

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

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