วันจันทร์ที่ 23 กันยายน พ.ศ. 2556

การตรวจสอบข้อมูลบิท

การตรวจสอบบิท


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

 Hard failure Soft Eror
     หมายถึง ข้อผิดพลาดที่เกิดขึ้นเนื่องจากชิพที่ผลิตขึ้นมานั้นไม่สามารถทำงานได้ตามที่ต้องการ
เป็นความผิดปกติแบบถาวร เช่น เซลล์หน่วยความจำไม่สามารถเก็บข้อมูลไว้ได้ หรือเก็บเพียงข้อมูล 0หรือ 1แต่เพียงอย่างเดียว อาจเกิดขึ้นจากสภาพการใช้งานที่ไม่เหมาะสม การใช้งานผิดประเภท หรือการเสื่อมสภาพตามอายุการใช้งาน

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

ฟังก์ชั่นในการแก้ไขข้อผิดพลาด


     ถ้าตรวจไม่พบข้อผิดพลาดใดๆ ข้อมูลนั้นก็จะถูกส่งไปใช้งาน

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

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

โค้ดรหัสที่สามารถแก้ไขข้อผิดพลาดได้เรียกว่า Error-correcting code (ECC)

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

Syndrome word

คือ ผลที่ได้จากการเปรียบเทียบข้อมูลทางตรรกะ (Comparison logic) โดยใช้ฟังก์ชั่น exclusive OR (ถ้าบิตเหมือนกันจะได้ค่าเป็น 0 ถ้าบิตต่างกันได้ค่าเป็น 1)
เนื่องจากข้อผิดพลาดอาจเกิดขึ้นในบิตใดๆ ก็ได้จากข้อมูล M บิต และข้อมูลสำหรับการตรวจสอบอีก K บิต ดังนั้นจะได้ความสัมพันธ์



สมมติว่ามีข้อมูลขนาด 8 บิต (M = 8) จะได้ว่า
ถ้า K = 3 จะได้ว่า 231 < 8 + 3
ถ้า K – 4 จะได้ว่า 24 1 > 8 + 4

การสร้าง Syndrome word ขนาด 4 บิต สำหรับข้อมูล 8 บิต
ถ้า Syndrome word มีค่าเป็น 00000000แสดงว่าไม่มีข้อผิดพลาดในข้อมูลนั้น
ถ้า Syndrome word มี 1แทรกอยู่เพียงบิตเดียว แสดงว่าข้อผิดพลาดเกิดขึ้นในบิตตรวจสอบ (1 ใน 4 บิต) จึงไม่จำเป็นต้องแก้ไข
ถ้า Syndrome word มี 1มากกว่า 1 บิต แล้ว ค่าของบิต Syndrome word จะบอกตำแหน่งข้อมูลที่ผิดพลาด ซึ่งจะต้องกลับบิตที่ตำแหน่งนั้นเป็นบิตตรงกันข้าม

ตำแหน่งของบิตข้อมูลและบิตตรวจสอบ


ขออธิบายใรส่วนของครงนี้นะครับ
         ตรง Position Number หมายความว่า ให้เราเรียงบิทจากทางขวาไปทางซ้าน โดยเทียบจากเลยฐาน 10 ตาม Bit Position  ซึ่งวิธีคำนวณ Position Number ก็คือบวกเพิ่มอีก 1 บิทโดยเลขฐาน 2
ก่อนอื่นต้องทบทวนเรื่องเลขฐานสองกันก่อนเลยนะครับ สำหรับเลขฐานสองนั้นก็มีอยู่เพียงสองตัวคือ 0 กับ 1 นั้นเอง
ฐ.2       ฐ.10
0000 = 0
0001 = 1
0010 = 2
0011 = 3
0100 = 4
0101 = 5
บวกเพิ่มอีก 1 ไปเรื่อยๆ ซึ่งวิธีการตรวจสอบว่าถูกหรือไม่นั้นก็คือ




ลองเอาตัวเลขสี่หลักที่คำนวณได้มาเทียบในช่องข้างบนนี้ดูว่าตรงกับฐาน 10 ที่เปรียบเทียบหรือไม่
     ทีนี้ผมจะอธิบายต่อในส่วนของ Data Bit คือ บิทข้อมูลที่เราต้องการนำมาตรวจสอบ
     และ Check Bit คือ บืทตรวจสอบนั่นเอง












จากภาพด้านบน เราจะเห็นสมการการคำนวณ Check Bit นะครับว่า ทำอย่างไร
C1 หมายความให้เอาบิทในช่องของ Position Number ที่มีลำดับตัวแรกเป็น 1 (นับจากขวาไปซ้าย)
C2 หมายความให้เอาบิทในช่องของ Position Number ที่มีลำดับตัวที่ 2 เป็น1 (หลักอื่นจะเป็นอะไรก็แล้วแต่)
C4 หมายความให้เอาบิทในช่องของ Position Number ที่มีลำดับตัวที่ 3 เป็น1
C8 หมายความให้เอาบิทในช่องของ Position Number ที่มีลำดับตัวที่ 4 เป็น1
จากนั้นให้นำมา XOR กัน หมายความว่า บิทเหมือนกันได้ 0 ต่างกันได้ 1
1 XOR 1 = 0
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
  เครื่องหมายนี้หมายถึงการ XOR



ตัวอย่างการคำนวณบิทตรวจสอบ
เมื่อนำบิตตรวจสอบเก่าและบิตตรวจสอบใหม่มาเปรียบเทียบกันจะได้ว่า
ผลลัพธ์ที่ได้คือ 0110แสดงว่าบิตตำแหน่งที่ 6 (Bit position) หรือ D3 เป็นบิตที่ไม่ถูกต้อง
โค้ดรหัสที่กล่าวถึงจัดอยู่ในประเภท single-error-correcting (SEC) ซึ่งจะไม่สามารถตรวจสอบหรือแก้ไขใดๆ ถ้ามีบิตที่ผิดพลาดพร้อมกันมากกว่า 2 บิต

ลองทำโจทย์ซัก 1 ข้อนะครับ

สมมติว่า Data Bit คือ 11000010
Check Bit คือ 1011
เมื่อได้ Data Bit และ Check Bit มาแล้ว ก็นำลงไปเรียงในตรารางเลยครับ


หลังจากที่เรียงเสร็จแล้ว ก็ให้คำนวณหา Check Bit ว่าตรงตามที่ให้มาหรือไม่ โดยใช้สูตรนี้ครับ(ผมขอใช้ . แทนความหมายของ XOR ก็แล้วกันนะครับ)
C1 = D1 . D2 . D4 . D5 . D7 0 . 1 . 1 . 1 . 0 1
C2 = D1 . D3 . D4 . D6 . D7 0 . 0 . 1 . 1 . 0 X,OR กัน => 0
C3 = D2 . D3 . D4 . D8 1 . 0 . 1 . 1 1
C8 = D5 . D6 . D7 . D8 1 . 1 . 0 . 1 1


ดังนั้น บิท ที่ตรวจสอบได้จากการคำนวณ เท่ากับ 1101 (ให้เรียงจากล่างขึ้นบน)
จากนั้นเราจึง นำบิทที่เราคำนวณได้ ไป XOR กับ บิทตรวจสอบที่ให้มา


ผลการคำนวณคือ 0110 หมายความว่า มีการผิดพลาดตรงตำแหน่ง 0110 นั่นก็คือ ตำแหน่ง D3 นั่นเอง ให้ทำการแก้ไขบิท ตรงตำแหน่ง D3 ให้เป็นบิทตรงกันข้าม  จากเดิมเป็น 0 ให้เปลี่ยนเป็น 1 
เราก็จะได้ข้อมูลที่ถูกต้องก็คือ 11000110 นั่นเองครับ

หากจุดนี้เราทำการ XOR กันแล้ว ได้ 0000 หมายความว่าไม่มีบิทไหนผิดพลาดครับ

ลองเอาตัวอย่างนี้ไปทำดูนะครับ
1. ข้อมูล 11000001 บิตตรวจสอบ 0100
2. ข้อมูล 01111001 บิตตรวจสอบ 1111
3. ข้อมูล 00110110 บิตตรวจสอบ 0111
4. ข้อมูล 10101010 บิตตรวจสอบ 0100

5. ข้อมูล 10001111 บิตตรวจสอบ 0111 

  สุดท้ายนี้ขอขอบคุณข้อมูลจาก
 SCT 0001 สถาปัตยกรรมและองค์ประกอบของคอมพิวเตอร์          สำนักวิชาคอมพิวเตอร์และเทคโนโลยีสารสนเทศ มหาวิทยาลัยราชภํฏเชียงรายเป็นอย่างสูงครับ

วันอาทิตย์ที่ 22 กันยายน พ.ศ. 2556

การใช้ Control ComboBox ListBox การใช้การตรวจสอบโดย Switch case ในโปรแกรม MS visual studio 2010 (C#)

     สวัสดีทุกท่านที่เข้ามาอ่านโพสนี้นะครับ นี่เป็นโพสแรกของผมหลังจากเรียนการเขียนโปรแกรมโดยใช้ MS visual studio 2010 ซึ่งภาษาที่ผมใช้เขียนนั่นก็คือ C# นั่นเองครับ
เอาหละครับ สำหรับประเดิมบทความแรกเลยก็คือ การใช้ การใช้ Control ComboBox, ListBox ซึ่งจะใช้การใช้การตรวจสอบโดย Switch case รวมถึงการนำเอาเงื่อนไข if มาร่วมด้วยนั่นเองครับ อาจจะฟังดูงงๆ หน่อย สำหรับคนที่ไมาเคยเขียน C# นะครับ สำหรับบทความนี้นั้นผมทำเพื่อเผยแพร่เป็นวิทยาทาน ไม่มีเหตุผลใดๆแอบแฝงทั้งสิ้นนะครับ เอาละครับ ตอนนี้ก็ได้เวลาลงมือแล้วหละครับ หลังจากที่อ่านข้อความที่ผมพล่ามมานาน อิอิ
    อันดับแรกเครื่องของคุณก็จะต้องมีโปรแกรม Microsoft visual studio 2010


    หลังจากเราก็มาลุยกันเลย
สำหรับการเขียนโปรแกรมในครั้งนี้นั้นคุณก็ต้องมีโจทย์ก่อนว่าคุณต้องการที่จำเขียนโปรแกรมเพื่อคำนวณอะไร แต่สำหรับ โพสนี้นั้น ผมได้เตียมโจทย์มาเรียบร้อยแล้วครับ ปล.โจทย์นี้ ได้มาจากอาจารย์อีกทีหนึ่ง อิอิ
     และนี่ก็คือโจทย์นะครับ
ต้องการคำนวณหาราคาสินค้าก่อนหักส่วนลด จำนวนเงินส่วนลด ราคาสินค้าหลังหักส่วนลด จำนวนเงินภาษีมูลค่าเพิ่ม และจำนวนเงินที่ลูกค้าต้องการชำระออกทางจอภาพ โดยใช้ listBox และมีเงื่อนไขของการทำงานดังนี้
- ลูกค้า 1 คนสามารถเลือกซื้อสินค้าได้เพียง 1 ชนิด แต่สามารถชื้อได้มากกว่า 1 ชิ้น
- ประเภทของลูกค้า ให้ใช้ comboBox เพื่อแสดงรายการเลือก โดยแบ่งเป็น 3 ประเภทได้แก่
1. ไม่เป็นสมาชิก
ถ้าซื้อสินค้าไม่เกิน 10,000 บาท จะไม่ได้รับส่วนลด (ให้แสดงค่า 0)
ถ้าซื้อสินค้าไม่เกิน 30,000 บาท จะได้รับส่วนลดในอัตรา 3% ของมูลค่าสินค้า
ถ้าซื้อสินค้าเกิน 30,000 บาท จะได้รับส่วนลดในอัตรา 5% ของมูลค่าสินค้า
2. สมาชิกทั่วไป
ถ้าซื้อสินค้าไม่เกิน 10,000 บาท จะได้รับส่วนลดในอัตรา 3% ของมูลค่าสินค้า
ถ้าซื้อสินค้าไม่เกิน 50,000 บาท จะได้รับส่วนลดในอัตรา 7% ของมูลค่าสินค้า
ถ้าซื้อสินค้าเกิน 50,000 บาท จะได้รับส่วนลดในอัตรา 10% ของมูลค่าสินค้า
3. สมาชิก VIP
จะได้รับส่วนลดในอัตรา 10% ของมูลค่าสินค้า
- การตรวจสอบประเภทของลูกค้า ให้ใช้คำสั่ง switch/case
- การตรวจสอบราคาสินค้า ให้ใช้คำสั่ง if
- สินค้าทุกชนิดมีอัตราภาษีมูลค่าเพิ่ม 7% ของมูลค่าสินค้าหลังหักส่วนลด

หลังจากที่เราเจอโจทย์มาแบบนี้แล้วนะครับ อันดับแรกเลยที่เราจะต้องทำก็คือ การวิเคราะห์โจทย์ สำหรับขั้นตอนนี้ใครที่ไม่ชอบการวิเคราะห์ ก็อาจจะข้ามเขียนโปรแกรมไปเลยก็ได้นะครับ แต่สำหรับนักโปรแกรมเมอร์ที่ดีนั้น เราต้องรอบครอบเอาไว้ก่อน เอาหละครับ ผมว่าเรามาวิเคราะห์โจทย์กันเลยดีกว่า
   
     วิเคราะห์โจทย์
          สิ่งที่โจทย์ต้องการ  
   คำนวณหาราคาสินค้าก่อนหักส่วนลด จำนวนเงินส่วนลด ราคาสินค้าหลังหักส่วนลด จำนวนเงินภาษีมูลค่าเพิ่ม และจำนวนเงินที่ลูกค้าต้องการชำระ
          ข้อมูลออก   
   แสดงราคาสินค้าก่อนหักส่วนลด จำนวนเงินส่วนลด ราคาสินค้าหลังหักส่วนลด จำนวนเงินภาษีมูลค่าเพิ่ม และจำนวนเงินที่ลูกค้าต้องการชำระออกทางจอภาพ
          ข้อมูลเข้า
    รับข้อมูลจำนวนสินค้า, ราคาสินค้า และประเภทลูกค้าจากทางแป้นพิมพ์
          การประมวลผล
1.รับข้อมูลจำนวนสินค้า, ราคาสินค้า และประเภทลูกค้าจากทางแป้นพิมพ์
2.คำนวณหาราคาสินค้ารวม = จำนวนสินค้า * ราคาสินค้า
3.ทำการตรวจสอบว่าลูกค้าเป็นประเภทไหน โดยที่
ถ้าลูกค้าไม่เป็นสมาชิก 
        ถ้าซื้อสินค้าไม่เกิน 10,000 บาท จะไม่ได้รับส่วนลด (ให้แสดงค่า 0)
ถ้าซื้อสินค้าไม่เกิน 30,000 บาท จะได้รับส่วนลดในอัตรา 3% ของมูลค่าสินค้า
ถ้าซื้อสินค้าเกิน 30,000 บาท จะได้รับส่วนลดในอัตรา 5% ของมูลค่าสินค้า
ถ้าลูกค้าเป็นสมาชิกทั่วไป
ถ้าซื้อสินค้าไม่เกิน 10,000 บาท จะได้รับส่วนลดในอัตรา 3% ของมูลค่าสินค้า
ถ้าซื้อสินค้าไม่เกิน 50,000 บาท จะได้รับส่วนลดในอัตรา 7% ของมูลค่าสินค้า
ถ้าซื้อสินค้าเกิน 50,000 บาท จะได้รับส่วนลดในอัตรา 10% ของมูลค่าสินค้า
ถ้าลูกค้าเป็นสมาชิก VIP 
จะได้รับส่วนลดในอัตรา 10% ของมูลค่าสินค้า
4.หลังจากนั้น
            เงินหลังหักส่วนลด = ราคาสินค้ารวม - ส่วนลด
            ภาษีมูลค่าเพิ่ม = เงินหลังหักส่วนลด * 0.07
            จำนวนเงินที่ต้องชำระ = เงินหลังหักส่วนลด + ภาษีมูลค่าเพิ่ม
5.แสดงราคาสินค้าก่อนหักส่วนลด จำนวนเงินส่วนลด ราคาสินค้าหลังหักส่วนลด จำนวนเงินภาษีมูลค่าเพิ่ม และจำนวนเงินที่ลูกค้าต้องการชำระออกทางจอภาพ

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


ทำการเปิดโปรแกรม Microsoft visual studio 2010 ขึ้นมา จากนั้น
1. เลือก New Project...
2. จากนั้น ก็ทำตามขั้นตอนที่ผมกำหนดหมายเลขเอาไว้ คือถ้าเราใช้งาน C# เครื่งมันก็ฟิกให้เราอัตโนมัติเป็น C# และอันแรกที่เป็น Windows Form Application
3.ตรงจุดนี้เราก็ทำการเปลี่ยนชื่อโปรแกรมของเราได้ แต่ตอนเริ่ม โปรเจ๊คก็ถูกฟิกเอาไว้เป็น Windows Form Application1 อีกเช่นกัน
4.จากนั้นทำการกดปุ่ม OK แล้วเราก็จะได้หน้า Form แบบนี้

จากนั้นก็ทำการ Design Form กันเลยคร๊าบบ...

หลังจากที่ดีไซน์ฟอร์มเสร็จเรียบร้อยแล้วก็ทำการกำหนดค่าใน ComboBox ดังนี้
คลิ๊กตรงสามเหลี่ยมเล็กๆ ที่อยู่มุมบนขวาของ ComboBox นั้นๆ จากนั้นเลือก Edit Item... แล้วจะปรากฏหน้าต่าง String Collection Editor ขึ้นมาเราก็ทำการป้อนค่าลงไปในนั้น โดยป้อน 1 ตัวเลือกต่อ 1 แถวในนั้น


หลังจากที่ทำการออกแบบหน้าฟอร์มเสร็จเป็นที่เรียบร้อยแล้ว ก็ถึงเวลาที่ต้องเขียน โค๊ดโปรแกรมกันแล้ว
     ให้ทำการ ดับเบิ้ลคลิ๊กที่ปุ่ม button ที่เราสร้างขึ้นมา 
แล้วก็จะเจอกับหน้าต่าง Form1.cs


ให้เริ่มเขียนโปรแกรมตรงที่ Cersor ปรากฏอยู่ตรงนั้นเลย
 และนี่คือโค๊ดโปรแกรมนี้ครับ

            int ราคาสินค้า = int.Parse(textBox1.Text);
            int จำนวนสินค้า = int.Parse(textBox2.Text);
            double ส่วนลด = 0, เงินหลังหักส่วนลด = 0, ภาษีมูลค่าเพิ่ม = 0, จำนวนเงินที่ต้องชำระ;
            int ราคาสินค้ารวม = ราคาสินค้า * จำนวนสินค้า;
            listBox1.Items.Clear();
            switch (comboBox1.SelectedIndex)
            {
                case 0:

                    if (ราคาสินค้ารวม <= 10000)
                    {
                        ส่วนลด = ราคาสินค้ารวม * ส่วนลด;
                    }
                    else if (ราคาสินค้ารวม <= 30000)
                    {
                        ส่วนลด = ราคาสินค้ารวม * 0.03;
                    }
                    else
                    {
                        ส่วนลด = ราคาสินค้ารวม * 0.05;
                    }
                    break;
                case 1:

                    if (ราคาสินค้ารวม <= 10000)
                    {
                        ส่วนลด = ราคาสินค้ารวม * 0.03;
                    }
                    else if (ราคาสินค้ารวม <= 50000)
                    {
                        ส่วนลด = ราคาสินค้ารวม * 0.07;
                    }
                    else
                    {
                        ส่วนลด = ราคาสินค้ารวม * 0.1;
                    }
                    break;
                default: ส่วนลด = ราคาสินค้ารวม * 0.1; break;
            }
            เงินหลังหักส่วนลด = ราคาสินค้ารวม - ส่วนลด;
            ภาษีมูลค่าเพิ่ม = เงินหลังหักส่วนลด * 0.07;
            จำนวนเงินที่ต้องชำระ = เงินหลังหักส่วนลด + ภาษีมูลค่าเพิ่ม;
            listBox1.Items.Add("จำนวนเงินก่อนหักส่วนลด =" + ราคาสินค้ารวม);
            listBox1.Items.Add("\nจำนวนส่วนลด = " + ส่วนลด);
            listBox1.Items.Add("จำนวนเงินหลังหักส่วนลด = " + เงินหลังหักส่วนลด);
            listBox1.Items.Add("จำนวนเงินที่ต้องชำระ = " + จำนวนเงินที่ต้องชำระ);
ทำการ Coppy โค๊ดทั้งหมดนี้ลงไปที่ Cosor อยู่จากนั้นก็ทำการรันโปรแกรมดูครับ โดยกดปุ่มสามเหลี่ยมสีเขียว หรือ F5 ก็ได้ครับ
แล้วก็จะปรากฏ โปรแกรมที่เราทำไว้ขึ้นมาดังนี้ครับ

จากนั้นลองทำการกรอกข้อมูลลงไป แล้วกดปุ่มคำนวณ ดูนะครับ




ผลการทำงานของโปรแกรมที่เราเขียนขึ้นมาเองครับ สำหรับวันนี้ ก็ขอจบไว้เพียงเท่านี้นะครับ สำหรับใครที่สงสัยตรงไหน ในการเขียนโปรแกรมครั้งนี้ก็คอมเม้นได้นะครับ ส่วนการอธิธิบายการเขียนโปรแกรมอื่นเอาไว้เป็นโพสหน้าแล้วกันนะครับ ขอบคุณที่ติดตามตั้งแต่ต้นจนจบ ของคุณครับ
สอบถามเพิ่มเติมที่ facebook : https://www.facebook.com/natawout.thanata