สั่งคอมพิวเตอร์ให้ “ทอนเงิน”

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

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

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

ว่าแล้วผมก็ตั้งโจทย์ขึ้นมาโจทย์นึงเลยดีกว่า โดยให้นำเสนอแนวคิดเพื่อสั่งให้คอมพิวเตอร์ “ทอนเงิน” ให้กับเรา โดยโจทย์ก็คือจำนวนเงินที่ให้ทอนคือ 5,765.75 บาท (อ่านว่า – ห้าพันเจ็ดร้อยหกสิบห้าบาทเจ็ดสิบห้าสตางค์)

จากนั้นมาลงมือทำกันดีกว่า … โดยเริ่มแรกเราต้องเตะทศนิยมออกไปก่อน จะได้คำนวนง่าย ๆ ดังรูป

ยอดเงินทอน

จากนั้นก็เริ่มสกัดเอาแบงค์ใหญ่ ๆ ออกมาก่อน โดยวิธีการหารครับ หารเอาส่วนแล้วก็หารเอาเศษง่าย ๆ เนี่ยแหล่ะ

ยอดเงินทอนแบงค์ใหญ่

ต่อไปก็คำนวนหาแบงค์เล็กบ้าง อือม ตอนนี้แบงค์สิบบาทมันไม่มีแล้วเน้อะ งั้นก็คงต้องเหมาว่าเหรียญสิบบาทเป็นพวกเดียวกับแบงค์เล็กไปก่อนก็แล้วกัน

ยอดเงินแบงค์เล็ก

สุดท้ายก็สังเคราะห์เอาจำนวนเหรียญกษาปน์ออกมา (ผมไม่ค่อยชอบเศษสตางค์เท่าไหร่ มันหนักกระเป๋า :-P)

ยอดเงินทอนเหรียญกษาปน์

รู้สึกผมจะลืมอะไรไป อือม ๆ ๆ ๆ ผมลืมจริง ๆ ด้วย ผมลืมคำนวนเหรียญสตางค์ งั้นเรามาดูดีกว่าว่าจะกระเทาะเอาเหรียญสตางค์ออกมาได้ยังไง

ยอดเงินทอนเหรียญสตางค์

เมื่อถึงตรงนี้เราก็จะได้คำตอบแล้วว่า  ยอดเงิน 5,765.75 บาทนั้น เมื่อแตกออกมาเป็นธนบัตรและเหรียญกษาปน์แล้ว เราก็จะได้เป็น …

คำตอบ 

  1. แบงค์พัน = 5 ใบ
  2. แบงค์ห้าร้อย = 1 ใบ
  3. แบงค์ร้อย = 2 ใบ,
  4. แบงค์ห้าสิบ = 1 ใบ
  5. เหรียญสิบ = 1 เหรียญ
  6. เหรียญห้า = 1 เหรียญ
  7. เหรียญห้าสิบตังค์ = 1 เหรียญ
  8. เหรียญยี่สิบห้าตังค์ = 1 เหรียญ

จะเห็นว่าถ้าเราแสดงแนวคิดแบบนี้ออกมา ไม่ใช่แค่คนเรียนคอมพิวเตอร์ที่มีทักษะทางการโค้ดโปรแกรมจะได้ประโยชน์หรอก เหล่าบรรดาคนที่เป็น advance user ซึ่งมีทักษะในการใช้โปรแกรมจำพวก Excel หรือ Access ก็จะได้ประโยชน์จากการสำแดงแนวคิดแบบนี้ด้วย

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

ป.ล. ผมลืมไปว่าเมืองไทยมันมีเหรียญสองบาทโผล่มาให้ใช้ด้วย แต่แบบว่าขี้เกียจทำรูปภาพใหม่แล้ว ก็ถือซะว่าเมืองไทยมันไม่มีเหรียญสองบาทก็แล้วกัน ฮา 😛

[tags]คอมพิวเตอร์, ซอฟต์แวร์, ทอนเงิน, เงินตรา, สั่งการ, การสร้างซอฟต์แวร์[/tags]

Related Posts

6 thoughts on “สั่งคอมพิวเตอร์ให้ “ทอนเงิน”

  1. นี่มันคล้าย ๆ ข้อสอบโอลิมปิค คอมพิวเตอร์ตอนผมอยู่ ม.ปลายเลย แต่อันนั้นจะให้เปลี่ยนเป็น เลข Roman XII อะไรทำนองเนี้ย ก็คล้าย ๆ กันนะ

  2. รุ่นผม เค้าบอกให้เขียนเอทีเอ็ม (มีแบงค์หมดได้ด้วย)
    แต่คำถามตามเว็บบอร์ดที่ผมเจอ ถ้าผมมีเวลาผมจะตอบแบบพี่ไท้นะครับ

    แต่… โลกไม่ได้สวยงามขนาดนั้น

    เพราะเจ้าของกระทู้จะมาถามต่อว่า ช่วยเขียนเป็นโค๊ดให้ดูได้หรือเปล่า….

    อันนี้มีเซ็ง -_-‘

  3. โอ้ว ถ้าเป็นข้อสอบโอลิมปิคล่ะก็ มหาหินกว่านี้เป็นสิบ ๆ เท่าเลยครับคุณข่า ผมเคยอ่านโจทย์แล้ว ไม่มีปัญญาทำได้ซักข้อเดียว T-T ความโง่ไม่เคยปราณีใครครับ

    เออ ไมคุณ patr รู้ล่ะเนี่ย T-T จริง ๆ ด้วยแหล่ะ เนี่ยเมื่อไม่กี่วันมานี้ มีคนอีเมลล์มาขอให้ผมเขียนโค้ดให้ด้วย แต่ผมไม่มีปัญญาทำให้อ่ะ เลยปฏิเสธไป

    น่าคิดนะเนี่ยคุณเอ ฮา 😛

  4. ยืนยันว่าข้อสอบโอลิมปิกคอมพิวเตอร์หินจริงๆ ครับ

    สมัยผมสอบ เจอโจทย์ว่ากำหนดพิกัด xy ของมุมของรูปหลายเหลี่ยมมาให้ และมีพิกัดของจุดอีกหนึ่งจุด ให้เขียนโปรแกรม solve ว่าจุดนี้อยู่ข้างในหรือข้างนอกรูปหลายเหลี่ยม

    โจทย์ดูเหมือนง่ายเลยครับ แต่พอทำจริงโคตรยาก สมัยนั้นใช้ Turbo Pascal เขียน

  5. ลองดูครับไม่รู้ใช้ได้เปล่า c#
    double remaining = 0;
    double thousand = 0;
    double fivehundred = 0;
    double onehundred = 0;
    double fifty = 0;
    double twenty = 0;
    double ten = 0;
    double five = 0;
    double one = 0;
    double fiftycent = 0;
    double twentyfivecent = 0;
    string[] sp = textBox1.Text.Split(‘.’);
    thousand = Math.Floor(Convert.ToDouble(sp[0])/Convert.ToDouble(1000));
    remaining = Convert.ToDouble(sp[0])%1000;
    fivehundred = Math.Floor(remaining/Convert.ToDouble(500));
    remaining = remaining%500;
    onehundred = Math.Floor(remaining/Convert.ToDouble(100));
    remaining = remaining%100;
    fifty = Math.Floor(remaining/Convert.ToDouble(50));
    remaining = remaining%50;
    twenty = Math.Floor(remaining/Convert.ToDouble(20));
    remaining = remaining%20;
    ten = Math.Floor(remaining/Convert.ToDouble(10));
    remaining = remaining%10;
    five = Math.Floor(remaining/Convert.ToDouble(5));
    remaining = remaining%5;
    one = Math.Floor(remaining/Convert.ToDouble(1));
    remaining = remaining%1;
    if(sp.Length>1)
    {
    fiftycent = Math.Floor(Convert.ToDouble(sp[1])/Convert.ToDouble(50));
    remaining = Convert.ToDouble(sp[1])%50;
    twentyfivecent = Math.Floor(remaining/Convert.ToDouble(25));
    }
    MessageBox.Show
    (
    “Thousand = “+thousand.ToString()+”\n”+
    “Fivehundred = “+fivehundred.ToString()+”\n”+
    “Onehundred = “+onehundred.ToString()+”\n”+
    “Fifty = “+fifty.ToString()+”\n”+
    “Twenty = “+twenty.ToString()+”\n”+
    “Ten = “+ten.ToString()+”\n”+
    “Five = “+five.ToString()+”\n”+
    “One = “+one.ToString()+”\n”+
    “Fiftycent = “+fiftycent.ToString()+”\n”+
    “Twentyfivecent = “+twentyfivecent.ToString()+”\n”
    );

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *