Monthly Archives: September 2009

ชาวนา กับ หมาป่า มี แพะ และกะหล่ำปีด้วย ตอน 3 ตอนจบ

        มาต่อตอนที่ 3 ตอนจบ         วันนี้มาขึ้นเรือกัน แน่นอนที่ว่าต้องมีชาวนาไปด้วย รวมกันแล้วบนเรือมีได้ 2 อย่าง มาเริ่มกันที่ชาวนาไปคนเดียวก่อน และต้องอยู่ในสถานะที่ปลอดภัยด้วย (ถ้าลืมไปอ่าน 2 ตอนก่อนหน้านี้)         สถานะที่ปลอดภัยเมื่อชาวนาไปอยู่อีกฝั่งหนึ่ง ที่ตรงข้ามกับฝั่งเดิม นั่นคือ ต้องหาว่าฝั่งตรงข้ามของชาวนาคืออะไร (other-side) และของแต่ละอย่างอยู่ฝั่งไหน เมื่อชาวนาข้ามไปแล้วปลอดภัยไหม เขียนใน LISP ได้เป็น   (defun farmer-with-him (side)    (safe (create-side (other-side (where-farmer side))                 (where-wolf side)                 (where-goat side)                 (where-cabbage side))))   มี function เพิ่มขึ้นคือ   (defun create-side (f w g c) (list f w g c))   (defun other-side (side)    (cond ((equal side 'w) 'e)              ((equal side 'e) 'w))) ต่อมาเขียนได้ไหมว่า ให้ชาวนาพาของแต่ละอย่างข้ามฝั่ง เขียนอย่างไร มาดูเฉลย         1.เริ่มต้นต้องตรวจสอบก่อนว่าของที่จะพาไปนั้นอยู่ฝั่งเดียวกับชาวนาไหม Continue reading →

ชาวนา กับ หมาป่า มี แพะ และกะหล่ำปีด้วย ตอน 2

มาต่อตอนที่ 2  ดูเงื่อนไขอื่นอีก         สถานะที่ไม่ปลอดภัย แพะ (goat, g) และกะหล่ำ (cabbage, c) อยู่ฝั่งเดียวกัน where-goat side และ where-cabb side มีค่าเท่ากัน เขียนด้วย LISP จะได้เป็น                 (equal (where-goat side) (where-cabb side)) ถ้า (where-goat side) และ (where-cabb side) มีค่าเท่ากันจะได้ผลเป็นจริง   เมื่อตรวจสอบโดยใช้ cond จะได้         cond(                         (equal (where-goat side) (where-wolf side))                 nil )         (t side) เหมือนรูปแบบแรก ถ้ามีชาวนาอยู่ด้วยก็ปลอดภัย         (not                 (equal (farmer-side state) (wolf-side state) )         ) จะเห็นว่าตรวจสอบสถานะที่ไม่ปลอดภัยง่ายกว่า ถ้าสถานะที่ไม่ปลอดภัย เป็น เท็จ แสดงว่าปลอดภัย J เมื่อรวมกับครั้งที่แล้วจะได้    (cond (            (and                         (equal (where-goat side) (where-wolf Continue reading →

ชาวนา กับ หมาป่า มี แพะ และกะหล่ำปีด้วย

        วันนี้มาดูกันว่าเราจะพา ชาวนา (f, farmer) หมาป่า (w, wolf) แพะ (g, goat) และกะหล่ำปี (c, cabbage) ข้ามแม่น้ำจากฝั่งซ้าย (w, west) ไปฝั่งขวา (e, east) ได้อย่างไร มาทดลองเขียนโดยใช้ LISP         1.เริ่มต้น ด้วยการกำหนดตัวแปรของข้อมูลก่อน โดยใช้ ADT 1.1 list ของสัญลักษณ์ farmer, wolf, goat, cabbage ใช้เป็นตัวย่อ f, w, g, c เขียนในรูปแบบของ LISP จะได้ (f w g c) 1.2 list สัญลักษณ์ ฝั่งของแม่น้ำ west, w และ east, e ใช้ร่วมกับ list ของfarmer, wolf, goat, cabbage เพื่อแทน หรือแสดงว่า แต่ละอย่างอยู่ฝั่งไหนของแม่น้ำ เช่น (w w w w) เมื่อเทียบกับ (f w g c) แล้วมีความหมายว่า ทุกอย่างอยู่ฝั่งซ้าย (ตะวันตก, west, w) และมีสถานะปลอดภัย           2.สถานะปลอดภัย         Continue reading →

Addressing Modes ของ MCS-51

Addressing Modes ของ MCS-51           มาเริ่มเรื่องนี้กันก่อนนะ Addressing Modes ของ MCS-51 มี Direct Addressing         จะใช้อ้างถึง Operand ที่เป็นหน่วยความจำข้อมูลภายใน และ SFR Register เท่านั้น ตัวอย่าง         ADD A,80H ถ้าข้อมูลใน register A เป็น 12H ข้อมูลที่อยู่ในหน่วยความจำข้อมูลภายใน ตำแหน่ง (Address) 80H มีค่าเป็น 34H         หลังทำคำสั่งจะได้ ค่าใน register A เป็น 46H   Indirect Addressing         ข้อมูลของ operand จะถูกชี้ด้วย address ที่อยู่ใน register Register ที่ใช้จะมี 2 แบบคือ 8 bits และ 16 bits ดูตัวอย่างแบบ 8 bits ก่อน เช่นถ้าต้องการให้การทำงานเหมือนกับตัวอย่าง ของ direct addressing         MOV R0,#80H         ADD A,@R0 (อาจจะมีคำถามว่าทำไมไม่ใช้แบบ direct มาใช้แบบ indirect ทำไม ?) คืนนี้แค่นี้ก่อนนะ