Prac11.txt ---------- ตอนที่ ๑ ------- ปฏิบัติการตามที่กำหนดไว้ใน Lect11.txt ตอนที่ ๒ -------- การออกแบบขั้นตอนวิธีและเขียน shell script (โดยเลียนแบบจากตัวอย่าง) ศึกษาความหมายและการคำนวณเลขตรวจสอบ "เลขประจำตัวประชาชนไทย" จาก https://th.wikipedia.org/wiki/เลขประจำตัวประชาชนไทย ออกแบบและเขียนโปรแกรมโดยเลียนแบบ ดัดแปลง หรือ เพิ่มเติมจาก ตัวอย่างการวิเคราะห์และคำนวณ เลขสากลประจำหนังสือ, ISBN-10 และ ISBN-13 ที่อธิบายในชั่วโมงบรรยาย ก. โปรแกรมคำนวณเลขตรวจสอบ จากเลขประจำตัวประชาชน 12 หลัก ข. โปรแกรมตรวจสอบเลขประจำตัวประชาชน 13 หลัก ว่าเป็นชุดตัวเลขที่สมเหตสมผลหรือไม่ ตอนที่ ๓ ------- จงออกแบบขั้นตอนวิธีและเขียน shell script ตามข้อมูลรายละเอียดต่อไปนี้ :: ลักษณะของปัญหา :: ปีอธิกสุรทิน (Leap year) เป็นปีที่เดือนกุมภาพันธ์ตามปฏิทินสุริยคติ ตามระบบปฏิทินสากลที่เรียกว่า Gregorian calendar ตามชื่อของพระสันตปาปาเกรกอรีที่ 13 ผู้เริ่มต้นการใช้งานในเดือนกุมภาพันธ์ ค.ศ. 1582 พจนานุกรมฉบับราชบัณฑิตยสถานให้ความหมายของ อธิกสุรทิน ไว้ว่า "วันที่เพิ่มขึ้นในปีสุริยคติ คือในปีนั้นมีการเพิ่มวันเข้าไปในเดือนกุมภาพันธ์อีกวันหนึ่งเป็น 29 วัน" Gregorian calendar กำหนดไว้ว่าปีส่วนใหญ่ที่เป็นพหุคูณของ 4 เป็นปีอธิกสุรทิน (อธิก - เกิน, สุร - สุริยคติ, ทิน - วัน) ผู้คนโดยทั่วไปได้รับการสอนว่าระยะเวลา 1 ปีคือเวลาที่โลกโคจรรอบดวงอาทิตย์ครบหนึ่งรอบ เป็นเวลา 365 วัน เพื่อให้จำได้ง่าย และจำนวนวันต้องเป็นจำนวนเต็ม และต่อมาจึงรู้ว่าเวลาที่โลกโคจรรอบดวงอาทิตย์ใช้เวลา 365.25 วัน ดังนั้นทุกสี่ปีสี่ปีจึงต้องชดเชยเวลาที่เกินมา 1 วัน โดยกำหนดให้เดือนกุมภาพันธ์ในปีนั้นมีวันเพิ่มขึ้นเป็น 29 วัน เรึยกว่าปีอธิกสุรทิน หรือ leap year อย่างไรก็ดีเมื่อต้องทำงานหรือเขียนโปรแกรมที่เกี่ยวข้องกับเวลาจึงรู้ว่าเวลาที่โลกโคจรรอบดวงอาทิตย์ใช้เวลา 365.2425 วัน ทำให้เวลา 365.25 วันที่ใช้งานอยู่จึงเกินกว่าความเป็นจริงอยู่ประมาณ 3 วันทุกระยะเวลา 400 ปี (4 ศตวรรษ) ด้วยเหตุนี้ทุกรอบ 400 ปี จึงต้อง "งด" ชดเชยวันในเดือนกุมภาพันธ์ 3 ครั้ง คืองดในปีที่เป็นพหุคูณของ 100 แต่ไม่เป็นพหุคูณของ 400 เช่น ปี ค.ศ. 1700, 1800, 1900 "ไม่เป็น" ปีอธิกสุรทิน - หารด้วย 4 ลงตัว, หารด้วย 100 ลงตัว, แต่หารด้วย 400 ไม่ลงตัว ปี 2000 "เป็น" ปีอธิกสุรทิน - หารด้วย 4 ลงตัว, หารด้วย 100 ลงตัว, และหารด้วย 400 ลงตัว ปี 2100 "ไม่เป็น" ปีอธิกสุรทิน - หารด้วย 4 ลงตัว, หารด้วย 100 ลงตัว, แต่หารด้วย 400 ไม่ลงตัว :: ปฎิบัติการ :: จงออกแบบขั้นตอนวิธี (Algorithm) เพื่อตรวจสอบว่าปี ค.ศ. ที่ได้รับเป็นปีอธิกสุรทินหรือไม่ จากนั้นจึงเขียน shell script ชื่อ leapyear เพื่อรับค่าปี ค.ศ. ผ่าน command line argument ทำการตรวจสอบว่าปีที่ได้รับเป็นปีอธิกสุรทิน (Leap year) ตามขั้นตอน วิธีที่ออกแบบไว้ ในกรณีที่ผู้ใช้ไม่ได้กำหนดปีมาให้ ให้ดำเนินการกับปีปัจจุบัน (ปีที่อ่านได้จากระบบคอมพิวเตอร์โดยใช้คำสั่ง date) กำหนดการเรียกใช้งานและการแสดงผลดังนี้ $ leapyear 2016 2016 is a leap year, February has 29 days. $ leapyear 2014 2014 is NOT a leap year, February has 28 days. $ leapyear 2015 is NOT a leap year, February has 28 days. :: คำแนะนำ :: 1. การอ่านค่าปีปัจจุบันจากวันเวลาของระบบ ทำได้โดยใช้คำสั่ง date +%Y และเมื่อต้องการนำค่านี้ไปกำหนดให้กับตัวแปรทำได้โดยการทำ command substitution, $(date +%Y) เพื่อนำผลลัพธ์ของคำสั่งไปใช้งาน หรือ command substitution ดูรายละเอียดของคำสั่งได้ในแฟ้ม Unix03.txt 2. การคำนวณค่าของนิพจน์ทำได้โดยใช้ $((นิพจน์)) เช่น การหาเศษที่เหลือของการหาร (remainder) ของค่าในตัวแปร year ด้วย 4 ทำได้ดังนี้ $(($year % 4)) และสามารถนำไปใช้เป็นเงื่อนไขของโครงสร้าง if ดังนี้ if [ $(($year % 4)) = 0 ]; then ดูรายละเอียดของคำสั่ง test ได้จากแฟ้ม Unix03.txt