หน่วยการเรียนรู้ที่ 2 การแก้ปัญหาด้วยภาษาไพทอน

อ้างอิงจาก : หนังสือเรียนรายวิชาพื้นฐานวิทยาศาสตร์ เทคโนโลยี (วิทยาการคำนวณ) ของ สสวท.
ประกอบด้วยเนื้อหา ดังนี้
1.  ตัวอย่างระบบคำนวณค่าโดยสารรถประจำทาง
2. ตัวดำเนินการบูลีน
3.  การวนซ้ำด้วยคำสั่ง while
4.  เงื่อนไขทางเลือก
5.  ฟังก์ชัน

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

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

    ตัวอย่างที่ 2.1 ค่ารถโดยสาร
    รถโดยสารสาธารณะในอำเภอหนึ่ง ประกาศอัตราค่าโดยสารไว้ดังนี้

  • ผู้โดยสารทั่วไป คิดอัตราคนละ 10 บาทตลอดเส้นทาง
  • ผู้โดยสารที่เป็นเด็กอายุต่ำกว่า 3 ขวบ โดยสารฟรี
  • ผู้โดยสารสูงอายุที่มีอายุตั้งแต่ 60 ปีขึ้นไป คิดค่าโดยสารครึ่งราคา
  • ราคาค่าโดยสารสำหรับหมู่คณะที่ประกอบด้วยผู้โดยสารไม่เกิน 30 คน ถ้าค่าโดยสารรวมเป็นจำนวนตั้งแต่ 200 บาทขึ้นไปจะมีส่วนลดเพิ่มอีก 10%

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

    2. ค่าโดยสารรวมของผู้สูงอายุเป็นเท่าไร
    ตอบ ค่าโดยสารรวมของผู้สูงอายุ คำนวณได้จาก จำนวนผู้สูงอายุคุณกับค่าโดยสาร 5 บาท (ครึ่งหนึ่งของ 10 บาท)
    3. ค่าโดยสารรวมของผู้โดยสารที่จ่ายเต็มราคาเป็นเท่าไร
    ตอบ ค่าโดยสารรวมของผู้โดยสารที่จ่ายเต็มราคา คำนวณได้จาก จำนวนผู้โดยสารที่เหลือ (ผลลัพธ์จาก  ข้อ 1) คูณกับ 10 บาท
    4. ค่าโดยสารรวมทั้งหมดเป็นเท่าไรก่อนลดราคา
    ตอบ ค่าโดยสารวมทั้งหมด คำนวณได้จาก ค่าโดยสารวมของผู้สูงอายุ (ผลลัพธ์จากข้อ 2) บวกกับ

ค่าโดยสารรวมของผู้โดยสารที่จ่ายเต็มราคา (ผลลัพธ์จากข้อ 3)
    5. ได้รับส่วนลด 10% หรือไม่
    ตอบ ได้รับส่วนลดเมื่อมีจำนวนผู้โดยสารไม่เกิน 30 คน และมีค่าโดยสารรวมตั้งแต่ 200 บาทขึ้นไป
    6. หากได้รับส่วนลด ค่าโดยสารสุทธิเป็นเท่าไร
    ตอบ ค่าโดยสารสุทธิคำนวณได้จาก ค่าโดยสารรวมทั้งหมด (ผลลัพธ์จากข้อ 4) ลบด้วย 10% ของค่าโดยสารรวมทั้งหมด
    7. แสดงผลอะไรบ้าง
    ตอบ แสดงจำนวนผู้โดยสารทั้งหมด จำนวนผู้โดยสารที่จ่ายเต็มราคา จำนวนผู้โดยสารที่เป็นเด็กอายุต่ำ  กว่า 3 ขวบ จำนวนผู้โดยสารที่เป็นผู้สูงอายุ ค่าโดยสารรวมก่อนลดราคา และค่าโดยสารสุทธิหลังหักส่วนลด

นำแนวทางการแก้ปัญหาย่อยที่ได้มาเรียบเรียงเป็นอัลกอทีมในรูปแบบรหัสลำลองได้ดังนี้
    1. all <-- รับจำนวนผู้โดยสารทั้งหมด
    2. children <-- รับจำนวนผู้โดยสารที่มีอายุต่ำกว่า 3 ขวบ
    3. elders <-- รับจำนวนผู้สูงอายุ (มีอายุตั้งแต่ 60 ปีขึ้นไป)
    4. regular <-- (all - children - elders)
    5. fare_elders <-- elders*(10/2)
    6. fare_regular <-- regular*10
    7. total <-- fare _elders + fare_regular
    8. แสดงค่า all, children, elders, regular
    9. แสดงค่า total
    10. ถ้า all <= 30 และ total >= 200
        10.1 total_discounted <-- total -(total*0.1)
        10.2 แสดงค่า total_discounted

2.2 ตัวดำเนินการบูลีน

        ในชั้นมัธยมศึกษาปีที่ 1 นักเรียนสามารถเขียนโปรแกรมไพหอนให้มีการตัดสินใจทำงานแบบมีทางเลือกโดยใช้คำสั่ง if และ if-else ในเบื้องต้นมาแล้ว ในบทนี้นักเรียนจะได้เรียนรู้นิพจน์เปรียบเทียบ และตัวดำเนินการบูลีน เพื่อที่จะสามารถกำหนดเงื่อนไขสำหรับการทำงานแบบมีทางเลือกของคำสั่ง if ได้อย่างมีประสิทธิภาพมากขึ้น

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

ตัวอย่างที่ 2.2 การหาผลลัพธ์ค่าความจริงจากนิพจน์เปรียบเทียบที่มีการใช้ตัวดำเนินการบูลีนทดลองพิมพ์คำสั่งต่อไปนี้ในคอนโซล
            age = 12
            age>13 and age<19
            age>13 or age<19
            not age>13
.     จะได้ผลลัพธ์คือ
            False
            True
            True

2.3 การวนซ้ำด้วยคำสั่ง while
        ในการเขียนโปรแกรมให้ทำงานวนซ้ำชุดคำสั่งเดิม นอกจากคำสั่ง for แล้ว ภาษาไพหอนยังมีคำสั่ง whileให้เลือกใช้งาน ซึ่งคำสั่ง while จะเหมาะสมกับกรณีการวนซ้ำที่ไม่ทราบจำนวนรอบหรือจำนวนครั้งของการวนซ้ำที่แน่นอน มีรูปแบบการใช้ดังนี้
    while เงื่อนไขทางเลือก :
           ชุดคำสั่ง

2.4 เงื่อนไขทางเลือก
        คำสั่ง if-els ช่วยให้ไปรแกรมไพหอนสามารถตัดสินใจเลือทำงานชุดคำสั่งตามผลลัพธ์ของเงื่อนไขซึ่งมีสองทางเลือก และหากมีทางเลือกมากกว่านั้น ผู้เขียนโปรแกรมต้องใช้คำสั่ง if-ele ร่วมกัน หรือซ้อนกันเพื่อให้ได้จำนวนทางเลือกตามที่ต้องการไพทอนยังมีคำสั่งให้ใช้ในกรณีที่มีหลายทางเลือกคือคำสั่ง if-el if-elseซึ่งจะช่วยให้สะดวกขึ้น โดยมีรูปแบบการใช้ดังนี้

        if เงื่อนไขทางเลือก 1:
            ชุดคำสั่ง 1
        elif เงื่อนไขทางเลือก 2:
            ชุดคำสั่ง 2
        elif เงื่อนไขทางเลือก 3:
            ชุดคำสั่ง 3
      ...
        else:
            ชุดคำสั่งสุดท้าย

2.5 ฟังก์ชัน
        ฟังก์ชัน (function) เป็นโปรแกรมย่อยที่เขียนขึ้นเพื่อให้ทำงานเฉพาะตามที่กำหนด ผู้เขียนโปรแกรมสามารถเรียกใช้ฟังก์ชันได้สะดวกโดยไม่ต้องเขียนชุดคำสั่งซ้ำอีก ทำให้การเขียนโปรแกรมขนาดใหญ่ทำได้รวดเร็วและ ตรวจสอบความถูกต้องของโปรแกรมได้ง่ายขึ้น
        ไพทอนมีฟังก์ชันให้ใช้งานเป็นจำนวนมาก นักเรียนเคยใช้งานมาแล้วหลายคำสั่ง เช่น input (),  
print (), int(), float() และ type () การใช้งานฟังก็ชันทำได้โดยเรียกชื่อฟังก์ชัน พร้อมกับส่งค่าของข้อมูลตามจำนวนที่ฟังก์ชันกำหนด โดยระบุอยู่ภายในเครื่องหมาย () ตามหลังชื่อฟังก์ชัน หากค่าของข้อมูลที่ส่งไปให้กับฟังก์ชันมีมากกว่าหนึ่งจำนวนจะคั่นด้วยเครื่องหมายจุลภาค (, )โดยจำนวนและชนิดข้อมูลของค่าที่จะส่งให้กับแต่ละฟังก์ชันจะต้องขึ้นอยู่กับฟังก์ชันนั้น ๆ ว่าถูกออกแบบไว้ให้รับค่าข้อมูลชนิดใด กี่จำนวน และเรียงลำดับกันอย่างไร เช่น
        print(‘area =', area) เป็นการเรียกฟังก์ชัน print () ที่ส่งค่าสตริง ‘area =' และค่าของตัวแปร area เมื่อฟังก์ชัน print () ทำงาน ก็จะพิมพ์ค่าที่ส่งให้ออกมาทางจอภาพ ตามลำดับจากซ้ายไปขวา
        int (‘20') เป็นการเรียกฟังก์ชัน int () ที่ส่งค่าสตริงไปให้เพียงหนึ่งจำนวน คือ 20

        นอกจากนี้ เรายังสามารถกำหนดให้ฟังก์ชันมีการคืนค่า (return) หรือส่งค่ากลับเมื่อฟังก์ชันทำงาน  เสร็จแล้ว ตัวอย่างเช่น การเรียกใช้ฟังก์ชัน int(‘20') เป็นการส่งค่าสตริง 20 ให้กับฟังก์ชัน int () เพื่อแปลงสตริงดังกล่าวให้เป็นค่าจำนวนเต็ม ซึ่งเมื่อฟังก์ชั้น int () ทำงานเสร็จ จะคืนค่าจำนวนเต็ม 20 กลับมา เราจึงสามารถใช้ int (‘20') ได้ในลักษณะเดียวกันกับค่าจำนวนเต็ม 20

สรุปท้ายบท
        การโปรแกรมด้วยไผทอนมีคำสั่ง if if-else สำหรับการทำงานแบบมีทางเลือก นอกจากนี้ยังมีคำสั่งสำหรับการทำงานที่มีหลายเงื่อนไข หรือ if เชิงซ้อน ได้แก่คำสั่ง if-elif-else และยังมีตัวดำเนินการบูลีนที่ใช้ในนิพจน์เปรียบเทียบสำหรับกำหนดเงื่อนไขที่ซับซ้อนขึ้น ได้แก่ and r และ not และคำสั่งสำหรับการทำงานแบบวนซ้ำ ได้แก่ for ใช้สำหรับการทำงานที่ทราบจำนวนรอบ และ while ใช้ในกรณีที่ไม่ทราบจำนวนรอบที่แน่นอน           นอกจากนี้ผู้เขียนโปรแกรมยังสามารถสร้างฟังก์ชัน และโปรแกรมย่อยให้ทำงานเฉพาะตามที่กำหนดเพื่อให้สามารถเรียกใช้งานได้โดยไม่ต้องเขียนชุดคำสั่งเดิมซ้ำอีก ทำให้สร้างโปรแกรมขนาดใหญ่ได้รวดเร็วและตรวจสอบความถูกต้องของโปรแกรมได้ง่ายขึ้น

อ้างอิงจาก : หนังสือเรียนรายวิชาพื้นฐานวิทยาศาสตร์ เทคโนโลยี (วิทยาการคำนวณ) ของ สสวท.

Comments