วันศุกร์ที่ 16 ตุลาคม พ.ศ. 2552

DTS10-15-09-2552

สรุป Sorting
การเรียงลำดับ (sorting)
เป็นการจัดให้เป็นระเบียบ มีแบบแผน ช่วยให้การค้นหาสิ่งของหรือข้อมูล สามารถทำได้รวดเร็วและมีประสิทธิภาพการเรียงลำดับอย่างมีประสิทธิภาพ

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

วิธีการเรียงลำดับแบ่งออกเป็น 2 ประเภท
1.การเรียงลำดับภายใน (internal sorting) เป็นการเรียงลำดับที่ข้อมูลทั้งหมดต้องอยู่ในหน่วยความจำหลัก
2.การเรียงลำดับแบบภายนอก (external sorting) เป็นการเรียนลำดับข้อมูลที่เก็บอยู่ในหน่วยความจำสำรอง เป็นการเรียงลำดับข้อมูลในแฟ้มข้อมูล (file)

การเรียงลำดับแบบเลือก (selection sort)ข้อมูลจะอยู่ทีละตัว โดยทำการค้นหาข้อมูลในแต่ละรอบแบบเรียงลำดับ ถ้าเป็นการเรียงลำดับจากน้อยไปมาก
1.ในรอบแรกจะทำการค้นหาข้อมูลตัวที่มีค่าน้อยที่สุดมาเก็บไว้ที่ตำแหน่งที่ 1
2.ในรอบที่สองนำข้อมูลตัวที่มีค่าน้อยรองลงมาไปเก็บไว้ที่ตำแหน่งที่สอง
3.ทำแบบนี้ไปเรื่อยๆ จนครบทุกค่า ในที่สุดจะได้ข้อมูลเรียงลำดับจากน้อยไปมากตามที่ต้องการ

การเรียงลำดับแบบฟอง (Bubble Sort)
เป็นวิธีการเรียงลำดับที่มีการเปรียบเทียบข้อมูลในตำแหน่งที่อยู่ติดกัน
1.ถ้าข้อมูลทั้งสองไม่อยู่ในลำดับที่ถูกต้องให้สลับตำแหน่งที่อยู่กัน
2.ถ้าเป็นการเรียงลำดับจากน้อยไปมากให้นำข้อมูลตัวที่มีค่าน้อยกว่าอยู่ในตำแหน่งก่อนข้อมูลที่มีค่ามาก ถ้าเป็นการเรียงลำดับจากมากไปน้อยให้นำข้อมูล ตัวที่มีค่ามากกว่าอยู่ในตำแหน่งก่อนข้อมูลที่มีค่าน้อยการจัดเรียงลำดับแบบฟองเป็นวิธีที่ไม่ซับซ้อนมาก เป็นวิธีการเรียงลำดับที่นิยมใช้กันมากเพราะมีรูปแบบที่เข้าใจง่าย

DTS09-08-09-2552

กราฟ Graph
เป็นโครงสร้างข้อมุลแบบไม่เชิงเส้น อีกชนิดหนี่ง กราฟเป็นดครงสร้างข้อมูลที่มีการนำไปใช้ในงานที่เกี่ยวข้องกับการแก้ไขปัญหาที่ค่อนข้างซับซ้อน เช่น การวางข่าย งานคอมพิวเตอร์ การวิเคราะห์เส้นทางวิกฤต และปัญหาเส้นทางที่สั้นที่สุด เป็นต้น

นิยามของกราฟกราฟ
เป็นโครงสร้างข้อมูลแบบไม่เชิงเส้นที่ประกอบ ด้วยกลุ่มของสิ่งสองสิ่งคือ
1. โหนด (Nodes) หรือ เวอร์เทกซ์ (Vertexes)
2. เส้นเชื่อมระหว่างโหนด เรียก เอ็จ (Edger)

การเชื่อมต่อ
กราฟที่มีเอ็จเชื่อมต่อระหว่างโหนดสองโหนดถ้าเอ็จไม่มีลำดับ ความสัมพันธ์จะเรียกกราฟนั้นว่ากราฟแบบไม่มีทิศทาง (Undirected Garphs) และถ้ากราฟนั้นมีเอ็จที่มีลำดับความสัมพันธ์หรือมีทิศทางกำกับด้วยเรียกกราฟนั้นว่า การฟแบบมีทิศทาง(Directed Deaphs) หรือมีลูกศร เป็นกราฟที่แสดงการเชื่อม ระหว่าง Vertex โดยแสดงทิศทางการเชื่อมต่อด้วย บางครั้งเรียกว่า ไดกราฟ (Digraph) ถ้าต้องการอ้างถึงเอ็จแต่ละเส้นสามารถเขียนชื่อเอ็จกำกับไว้ก็ได้การเขียนกราฟแสดงโหนดและเส้นเชื่อมความสัมพันธ์ ระหว่างโหนดไม่มีรูปแบบที่ตายตัวการสากเส้นความสัมพันธ์เป็นเส้นลักษณะไหนก็ได้ที่สามารถแสดงความสัมพันธ์ระหว่างโหนดได้ถูกต้อง


การท่องไปในกราฟ (Graph traversal)
คือ การเข้าไปเยือนโหนดในกราฟ หลักการทำงาน คือ แต่ละโหนดจะถูกเยือนเพียงครั้งเดียวเทคนิคการท่องไปในกราฟมี 2 แบบ

1.การท่องแบบกว้าง (Breadth First Traversal) โดยเลือกโหนดที่เป็นจุดเริ่มต้น ต่อมาให้เยือนโหนดอื่นที่ใกล้กันกับโหนดเริ่มต้นที่ละระดับ จนเยือนหมดทุกโหนดในกราฟ (แบบคิว)
2.การท่องแบบลึก (Depth First Traversal) คล้ายกับการท่องทีละระดับของทรี กำหนดเริ่มต้นที่โหนดแรกและเยือนโหนดถัดไปตามแนววิถีจนไปสู่ปลายวิถี จากนั้นย้อนกลับ (backtrack) ตามแนววิถีเดิม จนสามารถดำเนินการต่อเนื่องเข้าสู่แนววิถีอื่นๆ เพื่อเยือนโหนดอื่นๆ ต่อไปจนครบทุกโหนด (แบบสแตก)

DTS08-25-08-2552

Tree (ทรี)
ทรี หรือโครงสร้างข้อมูลแบบต้นไม้ ประกอบด้วยโหนด (node) ซึ่งเป็นส่วนที่เก็บข้อมูล ในทรีหนึ่งทรีจะประกอบไปด้วยรูทโหนด (root node) เพียงหนึ่งโหนด แล้วรูทโหนดสามารถแตกโหนดออกเป็นโหนดย่อยๆ ได้อีกหลายโหนดเรียกว่าโหนดลูก (Child node) เมื่อมีโหนดลูกแล้ว โหนดลูกก็ยังสามารถแสดงเป็นโหนดพ่อแม่ (Parent Node) โดยการแตกโหนดออกเป็นโหนดย่อยๆได้อีก โหนดที่มีโหนดแม่เป็นโหนดเดียวกันเรียกว่า โหนดพี่น้อง (Siblings) โหนดที่ไม่มีโหนดลูกเรียกว่า โหนดใบ (Leave Node) เส้นเชื่อมแสดงความสัมพันธ์ระหว่างโหนดเรียกว่า กิ่ง (Beanch) คือ โหนดที่ไม่ใช่ Leaf Node

นิยามของทรี
1. นิยามทรีด้วยนิยามของกราฟทรี คือ กราฟที่ต่อเนื่องโดยไม่มีวงจรปิด (loop) ในโครงสร้าง โหนดสองโหนดใดๆ ในทรีต้องมีทางติดต่อกัน ทางเดียวกันนั้น และทรีที่มี N โหนด ต้องมีกิ่งทั้งหมด N -1เส้น การเขียนรูปแบบทรี อาจเขียนได้ 4 แบบ คือ
1. แบบที่มีรากอยู่ด้านบน
2. แบบที่มีรากอยู่ด้านล่าง
3. แบบที่มีรากอยู่ด้านซ้าย4. แบบที่มีรากอยู่ด้านขวา


การท่องไปในไบนารีทรี (Traversing Binary Tree)
คือ การเข้าไปเยือนทุก ๆ โหนดในทรี วิธีการท่องเข้าไปต้องเป็นไปอย่างมีระบบแบบแผน สามารถเยือนโหนดทุก ๆ โหนด ๆ ละหนึ่งครั้ง วิธีการท่องไปนั้นมีด้วยกันหลายแบบ โหนดที่ถูกเยือนอาจเป็นโหนดแม่ (แทนด้วย N)ทรีย่อยทางซ้าย (แทนด้วย L) หรือทรีย่อยทางขวา (แทนด้วย R)

วิธีการท่องเข้าไปในทรีมี 6 วิธีคือ
NLR LNR LRN NRL RNL และ RLN
แต่วิธีการท่องเข้าไปในทรีที่นิยมใช้กันมากเป็นการท่องจากซ้ายไปขวา 3 แบบแรก
คือ NLRLNR LRN ซึ่งลักษณะการนิยามเป็นนิยามแบบ รีเคอร์ซีฟ (Recursive)

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

DTS07-11-08-2552

เรื่อง Queue
คิว Queue เป็นโครงสร้างข้อมูลแบบเชิงเส้นซึ่งการเพิ่มข้อมุลจะกระทำที่ปลายข้างหนึ่งซึ่งเรียกว่าส่วนท้ายหรือเรียร์ (rear)และการนำข้อมูลออกจะกระทำที่ปลายอีกข้างหนึ่งซึ่งเรียกว่า ส่วนหน้าลักษณะการทำงานของคิวเป็นลักษณะของการเข้าก่อนออกก่อนหรือที่เรียกว่า FIFO (First In First Out)

การทำงานของคิวการใส่สมาชิกใหม่ลงในคิวเรียกว่า Enqueue ซึ่งมีรูปแบบคือenqueue หมายถึง การใส่ข้อมูล newElementลงไปที่ส่วนเรียร์ของคิวการนำสมาชิกออกจากคิว เรียกว่า Dequeue หมายถึง การนำข้อมูลออกจากส่วนหน้าของคิวและให้ ข้อมุลนั้นกับ elementการนำข้อมูลที่อยู่ตอนท้ายของคิวมาแสดงจะเรียกว่า Queue Rear แต่จะไม่ทำการเพิ่มข้อมูลเข้าไปในคิ

การแทนที่ข้อมูลของคิวการแทนที่ข้อมูลของคิวสามารถทำได้ 2 วิธีคือ
1.การแทนที่ข้อมุลของสแตกแบบลิงค์ลิสต์จะประกอบไปด้วย
2ส่วนคือ1.Head Nodeจะประกอบไปด้วย 3 ส่วนคือพอยเตอร์จำนวน 2 ตัว คือ Front และ rear กับจำนวนสมาชิกในคิว
2.Data Node จะประกอบไปด้วยข้อมูล (Data) และพอยเตอร์ที่ชี้ไปยังข้อมูลตัวถัดไปการดำเนินการเกี่ยวกับคิวการดำเนินการเกี่ยวกับคิว ได้แก่1.Create Queue คือ จัดสรรหน่อยความจำให้แก่ Head Node และให้ค่า ponter ทั้ง 2 ตัวมีค่าเป็น nullและจำนวนสมาชิกเป็02.Enqueue คือ การเพื่มข้อมูลเข้าไปในคิว
3.Dequeue คือ การนำข้อมุลออกจากคิว
4.Queue Front คือ เป็นการนำข้อมูลที่อยู่ส่วนต้นของคิวมาแสดง
5.Queue Rear คือ เป็นการนำข้อมุลที่อยุ่ส่วนท้ายของคิวมาแสดง
6.Empty Queue คือ เป็นการตรวจสอบว่าคิวว่างหรือไม่
7.Full Queue คือ เป็นการตรวจสอบว่าคิวเต็มหรือไม่
8.Queue Count คือ เป็นการนับจำนวนสมาชิกที่อยู่ในคิว
9.Destroy Queue คือ เป็นการลบข้อมุลทั้งหมดที่อยู่ในคิวการนำข้อมูลเข้าสู่คิว จะไม่สามารถนำเข้าในขณะที่คิวเต็ม หรือไม่มีที่ว่าง ถ้าพยายามนำเข้าจะให้เกิดความผิดพลาดที่เรียกว่า Overflowการนำข้อมุลออกจากคิว จะไม่สามารถนำอะไรออกจากคิวที่ว่างเปล่าได้ ถ้าพยายามจะทำให้เกิดความผิดพลาดที่เรียกว่า underflow

วันพฤหัสบดีที่ 15 ตุลาคม พ.ศ. 2552

ลูกแรดเตรียมพร้อมล่าเหยื่อ

สิ่งที่ได้รับจากวิชาเตรียมฝึกประสบการณ์วิชาชีพบริหารธุรกิจ

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

ประสบการณ์ของตนเองที่เกิดขึ้นจริง

เรียนรุ้การใช้ชีวิตที่จะอยู่ร่วมสังคมกับผู้อื่น และ

เรียนรู้ว่า พร้อมที่จะเสียสละ แม้ว่าบางครั้งอาจ

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

การฝึกงานหรือการทำงานในระดับที่สูงขึ้น

วันอาทิตย์ที่ 9 สิงหาคม พ.ศ. 2552

DTS06-04/08/2009

สรุปบทเรียน

สแตก(stack)

สแตก(Stack) คืออะไร

ความรู้พื้นฐานเกี่ยวกับสแตก

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

สแตกเป็นโครงสร้างข้อมูลแบบลิเนียร์ลิสต์(linear list) ที่สามารถนำข้อมูลเข้าหรือออกได้ทางเดียวคือส่วนบนของสแตกหรือ หรือเรียกว่า ท๊อปของสแตก (Top Of Stack) ซึ่งคุณสมบัติดังกล่าวเรียกว่า ไลโฟลิสต์ (LIFO list: Last-In-First-Out list) หรือ พูชดาวน์ลิสต์ (Pushdown List) คือสมาชิกที่เข้าลิสต์ที่หลังสุดจะได้ออกจากลิสต์ก่อน หรือ เข้าหลังออกก่อน การเพิ่มข้อมูลเข้าสแตกจะเรียกว่าพูชชิ่ง (pushing) การนำข้อมูลจากสแตกเรียกว่า ป๊อปปิ้ง (poping) การเพิ่มหรือลบข้อมูลในสแตกทำที่ท๊อปของสแตก ท๊อปของสแตกนี้เองเป็นตัวชี้สมาชิกตัวท้ายสุดของสแตก

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

ส่วนประกอบของสแตก

การนำสแตกไปใช้งานนั้นไม่ว่าจะเป็นโครงสร้างสแตกแบบแถวลำดับ(array)หรือ แบบลิงค์ลิสต์ (link list) เราจะมีตัวแปรตัวหนึ่งที่ใช้เป็นตัวชี้สแตก(stack pointer ) เพื่อเป็นตัวชี้ข้อมูลที่อยู่บนสุดของสแตก ซึ่งจะทำให้สามารถจัดการข้อมูล ที่จะเก็บในสแตกได้ง่าย ดังนั้นโครงสร้างข้อมูลแบบสแตกจะแบ่งออกเป็น 2 ส่วนที่สำคัญ คือ

ตัวชี้สแตก ( Stack Pointer ) ซึ่งมีหน้าที่ชี้ไปยังข้อมูลที่อยู่บนสุดของ สแตก ( Top stack )
สมาชิกของสแตก ( Stack Element ) เป็นข้อมูลที่จะเก็บลงไปในสแตก ซึ่งจะต้องเป็นข้อมูลชนิดเดียวกัน เช่น ข้อมูลชนิดจำนวนเต็ม เป็นต้น
นอกจากนี้ยังต้องมีตัวกำหนดค่าสูงสุดของสแตก ( Max Stack ) ซึ่งจะเป็นตัวบอกว่าสแตกนี้สามารถเก็บ จำนวนข้อมูลได้มากที่สุดเท่าไร เปรียบเทียบส่วนประกอบของสแตกได้กับการให้ สแตกเป็นกระป๋องเก็บลูกเทนนิส ส่วน Stack Elements หรือสมาชิกของสแตก คือ ลูกเทนนิส ส่วนตัวชี้สแตกเป็นตัวบอกว่าขณะนี้มีลูกเทนนิสอยู่ในกระป๋องกี่ลูก ส่วน Max Stack เป็นตัวบอกว่า กระป๋องนี้เก็บลูกเทนนิสได้มากที่สุดเท่าไร

การจัดการ กับสแตก

ในการทำงานของสแตก ประกอบด้วย 2 กระบวนการ คือ การเพิ่มข้อมูลลงบนสแตก (pushing stack) และ การดึงข้อมูลออกจากสแตก (poping stack)

1. การเพิ่มข้อมูลในสแตก (pushing stack) เป็นการนำข้อมูลเข้าสู่สแตก ซึ่งการกระทำเช่นนี้ เราเรียกว่า push ซึ่งโดยปกติก่อนที่จะนำข้อมูลเก็บลงในสแตกจะต้องมีการตรวจสอบพื้นที่ในสแตกก่อน ว่ามีที่เหลือว่างให้เก็บข้อมูลได้อีกหรือไม่

ในการเพิ่มข้อมูลในสแตก (pushing) สามารถทำได้โดยให้ทับบนข้อมูลสุดท้ายในสแตก และจะสามารถเพิ่มเข้าได้เรื่อย ๆ จนกว่าสแตกจะเต็ม ความหมายของคำว่า สแตกเต็ม คือท๊อปของ สแตกชี้ที่บนสุดของสแตก เช่น ถ้า สแตกนั้นจองเนื้อที่ไว้ N เนื้อที่ หมายถึงสามารถบรรจุสมาชิกในสแตกได้ N ตัว หากเป็นสแตกว่าง ค่าของท๊อปจะเป็นศูนย์ แต่หากสแตกเต็ม ค่าท๊อปจะเป็น N นั้นแสดงว่าเมื่อท๊อปชี้ที่ N หรือค่าของท๊อป เท่ากับ N ก็จะไม่สามารถ push ข้อมูลลง สแตกได้


นิยาม Push (S,x)

ถ้าให้ S เป็นสแตก และ x เป็นข้อมูลที่ต้องการใส่ในสแตก หรือดึงออกสแตก กระบวนการ push (S, x ) หมายถึง การ push ข้อมูล x ลงสแตก โดยการ push จะเริ่มจากสแตกว่างโดยให้ค่า ท๊อปมีค่าเป็นศูนย์ เมื่อมีการ push ข้อมูลเข้าในสแตก ค่า ของท๊อปจะเปลี่ยนเพิ่มขึ้นทีละหนึ่งทุกครั้งที่ทำการ push

2. การดึงข้อมูลจากสแตก (Popping Stack) หมายถึงการเอาข้อมูลที่อยู่บนสุดในสแตก หรือที่ชี้ด้วย ท๊อปออกจากสแตก เรียกว่าการ pop ในการpop นั้นเราจะสามารถ pop ข้อมูลจากสแตกได้เรื่อย ๆ จนกว่า ข้อมูลจะหมดสแตก หรือ เป็นสแตกว่าง โดยก่อนที่จะนำข้อมูลออกจากสแตก จะต้องมีการตรวจสอบว่าใน สแตกมีข้อมูลเก็บ อยู่หรือไม่


นิยาม pop(S)

ถ้าให้ S เป็นสแตก การ pop(S) คือการนำข้อมูลบนสุดในสแตกออกจากสแตกและให้ค่าเป็นข้อมูลที่นำออกจากสแตก ดังนั้น คำสั่ง x = pop(S) ก็คือการนำข้อมูลที่ท๊อปของสแตกออกมา และใส่ค่าไว้ที่ x หรือการเซตค่า x ให้เท่ากับข้อมูลที่ดึงจากสแตก

ปัญหาที่เกิดขึ้นกับสแตก

คือขอผิดพลาดที่เกิดขึ้นซึ่งมีผลมาจากการจัดการสแตกมีดังนี้

สแตกเต็ม (Full Stack)

สแตกว่าง (Empty Stack)

สแตกเต็ม (Full Stack)
การ push สแตกทุกครั้งจะมีการตรวจสอบที่ว่างในสแตกว่ามีที่ว่างเหลือหรือไม่ ถ้าไม่มีที่ว่างเหลืออยู่ เราก็จะไม่สามารถทำการ push สแตกได้ ในกรณีเช่นนี้เราเรียกว่าเกิดสถานะล้นเต็ม (Stack Overflow) โดย การตรวจสอบว่าสแตกเต็มหรือไม่ เราจะใช้ตัวชี้สแตก (Stack pointer) มาเปรียบเทียบกับค่าสูงสุดของ สแตก (Max stack) หากตัวชี้สแตกมีค่าเท่ากับค่าสูงสุดของสแตกแล้ว แสดงว่าไม่มีที่ว่างให้ข้อเก็บข้อมูล อีก


2. สแตกว่าง (Empty Stack)

นิยาม empty(S) ถ้า S เป็นสแตก ขบวนการ empty(S) จะส่งผลเป็นจริง (true) เมื่อสแตกว่าง และส่งผลเป็นเท็จ (false) เมื่อสแตกไม่ว่างหรือสแตกเต็ม

การ pop สแตกทุกครั้งจะมีการตรวจสอบข้อมูลในสแตกว่ามีข้อมูลในสแตกหรือไม่ ถ้าไม่มีข้อมูลในสแตก เหลืออยู่ เราก็ไม่สามารถทำการ pop สแตกได้ ในกรณีเช่นนี้เรียกว่าเกิดสถานะ สแตกจม (Stack Underflow) โดยการตรวจสอบว่าสแตกว่างหรือไม่ เราจะตรวจสอบตัวชี้สแตกว่าเท่ากับ 0 หรือ null หรือไม่ ถ้าเท่ากับ 0 แสดงว่า สแตกว่าง จึงไม่สามารถดึงข้อมูลออกจากสแตกได้

วันอังคารที่ 4 สิงหาคม พ.ศ. 2552

DTS05-28/07/2009

เรื่อง Linked List
Linked List
เป็นการจัดเก็บชุดข้อมูลมีพอยเตอร์เป็นตัวเชื่อมโยงต่อเนื่องกันไป
ตามลำดับซึ่งในลิงค์ลิสต์จะประกอบไปด้วยข้อมูลที่เรียกว่า
โหนด (Node) ในหนึ่งโหนดจะประกอบด้วย1.ส่วนของข้อมูลที่ต้อง
การจัดเก็บ เรียกว่าส่วน (Data)2.ส่วนที่เป็นพอยน์เตอร์ที่ชี้ไปยังโหนด
ถัดไป (Link) หรือชี้ไปยังโหนดอื่นๆที่อยู่ในลิสต์

**หากโหนดแรกไม่มีข้อมูลหรือไม่มีข้อมูลในโหนดที่อยู่ถัดไป
ส่วนที่เป็นพอยน์เตอร์หรือ Link จะเก็บค่า NULL เขียนแทนด้วย
เครื่องหมาย กากบาท

โครงสร้างข้อมูลแบบลิงค์ลิสต์ประกอบด้วย 2 ส่วน
1.Head Structure แบ่งเป็น 3ส่วน
-count เป็นการนับจำนวนข้อมูลที่มีอยู่ในลิสต์นั้น
-pos พอยเตอร์ที่ชี้ไปยังโหนดที่เข้าถึง
-head พอยเตอร์ที่ชี้ไปยังโหนดแรกของลิสต์
2.Data Node Structure จะประกอบด้วย ข้อมูลและพอยเตอร์
ที่ชี้ไปโหนดถัดไป

การเพิ่มข้อมูลลงไปในลิงค์ลิสต์นั้น จากที่ Head Structure
ในส่วนของ count จะมีค่าเป็น 0 นั้นหมายถึงในลิสต์นั้นยังไม่มี
ข้อมูลใดเลย ส่วน head จะมีเครื่องหมายกากบาท นั้นหมายถึง
ในลิสต์นั้นไม่มีการเชื่อมโยงไปยังข้อมูลแรก แต่ถ้าต้องการเพิ่ม
ข้อมูลลงไปในลิสต์ Data Node ในส่วนของข้อมูล (Data)จะมี
ค่าเก็บอยู่ แล้ว count ก็จะเปลี่ยนค่าจาก 0 เป็น 1 คือ การบ่งบอก
ถึงจำนวนข้อมูลที่มีอยู่ในลิสต์นั้น แล้ว head ก็จะชี้ไปยัง
ข้อมูล (Data) ตัวแรกของลิสต์ ส่วนพอยเตอร์ที่ชี้ไปโหนดถัดไป
จะเป็นเครื่องหมายกากบาทแทน

การลบข้อมูลในลิงค์ลิสต์ ถ้าต้องการลบข้อมูลตัวใดในลิสต์
สามารถลบได้เลย แต่ต้องเปลี่ยน head เพื่อชี้ไปยังข้อมูลตัวแรก
ของลิสต์กรณีที่ลบข้อมูลตัวแรกออก แล้ว link คือ เมื่อลบข้อมูล
ตัวใดออกควรชี้ link ถัดไปให้ถูกต้องด้วย

วันอาทิตย์ที่ 2 สิงหาคม พ.ศ. 2552

การบ้าน iostream.h

#include <iostream.h>
#include <conio.h>>
int main () {
long int num;
cout<<"************* Count Back to one *************"<<'\n'<<'\n';

cout<<"Please enter number (0 to STOP):";

cin>>num;

while(num!=0){
while (num>0) {
cout<<num<<'\n';
num--;

}
cout<<"Please enter intiger(0 to STOP):";
cin>>num;
}
clrscr();
cout<<"---------------Good Bye--------------";
return 0;
}

DTS04-21/07/2009

เรื่อง Set and String

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

ตัวดำเนินการของเซ็ต (Set operators) ประกอบด้วย
- set intersection
- set union
- set difference เป็นต้น

สมมติว่า ต้องการจัดตารางเรียน 4 วิชา ได้แก่ Math, English,Physics และ
Chemistryให้กับผู้ลงทะเบียนเรียน

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


โครงสร้างข้อมูลแบบสตริง
สตริง (String) หรือ สตริงของอักขระ (CharacterString) เป็นข้อมูล
ที่ประกอบไปด้วยตัวอักษร ตัวเลขหรือเครื่องหมายเรียงติดต่อกันไป
รวมทั้งช่องว่าง

การประยุกต์ใช้คอมพิวเตอร์ที่เกี่ยวกับข้อมูลที่เป็นสตริง
มีการนำไปใช้สร้างโปรแกรมประเภทบรรณาธิการข้อความ(text editor)
หรือโปรแกรมประเภทประมวลผลคำ (word processing) ซึ่งมีการทำงาน
ที่อำนวยความสะดวกหลายอย่างเช่น การตรวจสอบข้อความ
การจัดแนวข้อความในแต่ละย่อหน้า และการค้นหาคำ เป็นต้น



สตริงกับอะเรย์
สตริง คือ อะเรย์ของอักขระเช่น char a[6] อาจจะเป็นอะเรย์ขนาด 6 ช่อง
อักขระ หรือเป็นสตริงขนาด 5 อักขระก็ได้ โดยจุดสิ้นสุดของ string
จะจบด้วย \0 หรือ null character
เช่น
char a[ ]={‘H’, ‘E’, ‘L’, ‘L’, ‘O’, ‘\0’};
char a[ ]=“HELLO”;

การกำหนดสตริง
การกำหนดสตริงทำได้หลายแบบ คือ
1. กำหนดเป็นสตริงที่มีค่าคงตัว (String Constants)
2. กำหนดโดยใช้ตัวแปรอะเรย์หรือพอยเตอร์

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

การกำหนดตัวแปร country จะแตกต่างกับการกำหนดตัวแปรอะเรย์
เพราะเป็นการกำหนดตัวแปรพอย
เตอร์ขึ้น 4 ตัว โดยให้แต่ละตัวชี้ไปยังค่าคงตัวสตริงทั้ง4 ตัว โดยที่
contry[0] จะชี้ไปที่ข้อมูลแรก contry[1]จะชี้ข้อมูลที่สอง contry[2]
จะชี้ข้อมูลที่สาม และcontry[3] จะชี้ข้อมูลตัวสุดท้าย
ในการเขียนค่าเริ่มต้น คือ ค่าคงตัวสตริง เขียนไว้ในเครื่องหมายวงเล็บ
ปีกกา และข้อมูลในเครื่องหมาย
คำพูด คือ ค่าคงตัวสตริง


ฟังก์ชัน puts ( ) ใช้ในการพิมพ์สตริงออกทางจอภาพ โดยการผ่านค่า
แอดเดรสของสตริงไปให้เท่านั้น
ข้อสังเกต
การกำหนดอะเรย์ของสตริงในลักษณะอย่างนี้ ไม่ใช่อะเรย์ที่แท้จริง
ตามหลักการของอะเรย์ เนื่องจากขนาดของช่องในอะเรย์ไม่เท่ากัน
แต่อนุโลมให้ถือว่าเป็นอะเรย์

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

เช่น
char fruit [3][7]={“Apple”, “Orange”, “Mango”};

กำหนดตัวแปร fruit เป็นแบบ 3 แถว 7 คอลัมน์ ในแต่ละช่องจะเก็บ
ข้อมูลแบบอักขระอะเรย์ของสตริงที่ยาวเท่ากัน อะเรย์ในลักษณะนี้
จะถือว่าเป็นอะเรย์ที่แท้จริง และสามารถกำหนดได้ทั้งเมื่อมีการให้ค่าเริ่มต้น
และเมื่อกำหนดเป็นตัวแปร โดยดำเนินการ
ตามแบบการกำหนดอะเรย์ 2 มิติ

สิ่งที่ได้รับจากการเรียน : ได้ทราบถึงการนำ Set และ String สามารถนำ
มาใช้กับ อะเรย์ ได้

วันอังคารที่ 30 มิถุนายน พ.ศ. 2552

DTS03-30/06/2009

สรุปบทเรียน Array and Record

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


อาร์เรย์ 1 มิติ
เป็นตัวแปรที่เก็บข้อมูลเพียงแถวเดียวหรือชั้นเดียวเช่น



ในการคำนวณหาสมาชิกของอาร์เรย์ 1 มิติทำได้ดังนี้
จำนวนสมาชิกของอาร์เรย์ = (u-l)+1
u คือค่าสูงสุด หรือ Upper bound
l คือค่าต่ำสุด หรือ Lower bound

ส่วน 2 มิติสามารถหาได้ดังนี้

จำนวนสมาชิก = M x N


รูปแบบของการประกาศตัวแปรอาร์เรย์มิติเดียว

type array-name[n];
type คือ ชนิดของตัวแปรอาร์เรย์ที่จะสร้างขึ้น เช่น int,float,char เป็นต้น
array-name คือ ชื่อของตัวแปรอาร์เรย์ที่ต้องตั้งให้สื่อและเข้ากับชนิดของตัวแปร
และจะต้องไม่ไปตรงกับคำสงวนของภาษาซีด้วย
n คือขนาดของตัวแปรอาร์เรย์ที่จะสร้างขึ้น

เช่น int num[3];

การกำหนดข้อมูลให้กับตัวแปรอาร์เรย์
เราสามารถกำหนดไปพร้อมกับการประสร้างตัวแปรได้เลย เช่น

type array-name = {value-1,value-2,....value-n};

value-1,value-2 คือข้อมูลที่กำหนดให้ตัวแปรและต้องเป็นชนิดเดียวกับตัวแปรนั้น ๆ ด้วย เช่น

int number[3] = {23,-123,43};
char name[5] = "BENZ";

อาร์เรย์ 2 มิติ
มีลักษณะการกำหนดตำแหน่งแบบแถวและคอลัมน์

รูปแบบของการประกาศตัวแปรอาร์เรย์ 2 มิติ

type array-name[n][m];
type คือ ชนิดของตัวแปรอาร์เรย์ที่จะสร้างขึ้น เช่น int,float,char เป็นต้น
array-name คือ ชื่อของตัวแปรอาร์เรย์ที่ต้องตั้งให้สื่อและเข้ากับชนิดของตัวแปร
และจะต้องไม่ไปตรงกับคำสงวนของภาษาซีด้วย
n คือ จำนวนแถวของตัวแปรอาร์เรย์
m คือ จำนวนคอลัมน์ของตัวแปรอาร์เรย์

เช่น int num[3][5];

Structure โครงสร้างข้อมูล
หมายถึง การที่นำข้อมูลที่มีความเกี่ยวข้องกัน เช่น ข้อมูลของนักศึกษาที่อาจประกอบด้วย
ชื่อ,นามสกุล,อายุ,เพศ,ชั้นเรียน มารวมกันและจัดทำเป็นโครงสร้างข้อมูล ดังภาพ



แต่ในการเรียนใช้งานจริง ๆ เราจะต้องสร้างตัวแปรชนิดโครงสร้างขึ้นมาใช้งานจริง ๆ
ไม่สามารถใช้โครงสร้าง student ได้
การประกาศตัวแปรชนิดโครงสร้าง
struct name {
type var-1;
type var-2;
.....
type var-n;
} struct-variable;

struct คือ คำที่ใช้กำหนดโครงสร้างข้อมูล
(ต้องมีเสมอ)
name คือ ชื่อของโครงสร้างข้อมูลที่จะสร้างขึ้น
type var-1,type var-2 คือชื่อตัวแปร
ในกลุ่มโครงสร้างข้อมูล
struct-variable คือชื่อของตัวแปรชนิดโครงสร้าง
ที่ต้องการสร้างขึ้นจะมีลักษณะโครงสร้างภายใน
เหมือนกับโครงสร้างข้อมูลที่กำหนด


** กรณีประกาศตัวแปรโครงสร้างหลายตัวใช้คอมม่าขั้นหรือประกาศอีกแบบ เช่น
struct struct-name variable;

ตัวอย่าง
struct student student1;

*** เราสามารถประกาศ Structure หนึ่งเป็นสมาชิกของอีก Structure ก็ได้
แต่ต้องประกาศตัวที่จะนำไปใส่ไปไว้อีก Structure ก่อน

การอ้างถึงสมาชิกในตัวแปรชนิดโครงสร้าง
struct-name.variable-name
struct-name คือ ชื่อของตัวแปรชนิดโครงสร้าง (ไม่ใช่ชื่อโครงสร้าง)
. คือเครื่องหมายขั้นระหว่างชื่อตัวแปรชนิดโครงสร้างกับตัวแปรที่เป็นสมาชิก
variable-name คือชื่อของตัวแปรที่เป็นสมาชิก


การกำหนดข้อมูลให้ตัวแปรชนิดโครงสร้าง
เราสามารถกำหนดได้เหมือนตัวแปรทั่วไปแต่ต้องอ้างอิงถึงสมาชิกให้ถูกต้อง เช่น

student1.age = 15;
student1.sex = 'M';

กรณีถ้าเป็นอาร์เรย์ของตัวแปรชนิดโครงสร้างสามารถเขียนได้ดังนี้

student1[0].age = 15;
student1[1].sex = 'M';

วันเสาร์ที่ 27 มิถุนายน พ.ศ. 2552

VDO แนะนำตัว


VDO แนะนำตัว

นายธีระ หนูเอี่ยม


วันศุกร์ที่ 26 มิถุนายน พ.ศ. 2552

DTS02-23/06/2009

สรุปบทเรียน

เรียน ความหมายของโครงสร้างข้อมูล ได้รู้ว่า โครงสร้างข้อมูลมี 2 ประเภท

1.โครงสร้างข้อมูลทางกายภาพ
2.โครงสร้างข้อมูลทางตรรกะ

โครงสร้างข้อมูลทางกายภาพ ได้แก่ แถวลำดับ(เป็นการเก็บข้อมูลเดียวกันเท่านั้น) ระเบียนข้อมูล (เป้นการเก้บข้อมูลมากกว่า 1 ชนิด ใน Key เดียวกัน) และ แฟ้ม ข้อมูล

โครงสร้างข้อมูลทางตรรกะ มี 2 ประเภท
1. โครงสร้างข้อมูลแบบชิงเส้น (จะมีรูปแบบที่สัมพันธ์ และต่อเนื่องกัน)
2. โครงสร้างข้อมูลแบบไม่เชิงเส้น (มีความสัมพันธ์ในหลายทิศทาง หรือ หลากหลายนั้นเอง)

การแทนข้อมูลในหน่วยความจำหลัก มี 2 ประเภท
1 การแทนที่ข้อมูลแบบสแตติก
( เป็นการแทนที่ข้อมูลที่ต้องจองก่อน และไม่สามารถ ลด หรือเพิ่ม ในภายหลังได้)
2.การแทนข้อมูลแบบไดนามิก
(เป็นการแทนที่ข้อมูลโดยไม่ต้องจอง และสามารถ เพื่มหรือลด ในภายหลังได้)

ขั้นตอนวิธี
คือการแก้ไขปัญหาอย่างมีระบบ สามารถเขียนได้หลายแบบ กระชับและเหมาะสม

ขั้นตอนมี 7 ข้อ
พูดโดยรวมแล้ว ให้มีความถูกต้อง มีความรวดเร็วในการทำงาน มีความยืดหยุ่นในการทำงานและ
ง่ายต่อการเข้าใจ พัตนาง่าย หรือพูดอีกอย่างคือ ทำให้ดีที่สุดในทุกๆทางที่จะทำได้

เรื่อง สัญลักษณ์ ในการเขียนผังงาน(ตัวดำเนินงานในรูปลักษณ์ของผังงาน)

เรื่องนิพจน์(เรื่อง เครื่องหมาย > < = )

เรื่อง ภาษาขะนตอนวิธี
1.ตัวแปรต้องเป้น อักษร อักษรผสม และตัวเลข
2.การกำหนดตัวแปร ใช้เครื่องหมาย
3.นิพจน์ การคำนวนตามลำดับขั้นตอน
4.ข้อความไปยังขั้นตอน ใช้รูปแบบ คือ
Goto เลขที่ชั้นตอน
5.เรื่องเงือนไข
แบบทางเลือกเดียว
if (condition) then statement 1
แบบสองทางเลือก
if (condition) then statement 1
else statement 2

6. การวนซํา
7.คำอธิบาย บอกถึงรายละเอียดต่างๆของขั้นตอนทำงาน

มีการทดสอบ หลัง ช.ม
ทดสอบว่า รู้ จักความหมายของตัวแปร
ทดลอบ ว่ารู้จักการวนวซซํา หรือไม่
for(I=1,I<10,I++);
วนกลับทั้งหมด 10 ครั้ง Iจะมีค่า=10 ในแต่ละรอบ I จะบวก 1

การบ้าน

#include <stdio.h>
#include <string.h>
void main()
{
struct resume {
char name[20],surname[20],nickname[10],sex[10],id[15];
int age;
short int thisyear;
long int birthyear;
float grade;
double run;
unsigned long int hight;
unsigned int weight;

};

struct resume student;
strcpy(student.name,"Teera");
strcpy(student.surname,"Noo-eiam");
strcpy(student.nickname,"Pack");
strcpy(student.id,"50132792077");
strcpy(student.sex,"male");
student.grade=2.64;
student.thisyear=2009;
student.birthyear=1988;
student.hight=178;
student.weight=77;
student.run=1.981231;
student.age=21;

printf(" Name:%s\n\n",student.name);
printf(" Surname:%s\n\n",student.surname);
printf(" Nickname : %s\n\n",student.nickname);
printf(" ID : %s\n\n",student.id);
printf(" Age:%d\n\n",student.age);
printf(" Grade:%.2f\n\n",student.grade);
printf(" Sex:%s\n\n",student.sex);
printf(" Hight : %d cm.\n\n",student.hight);
printf(" Weight : %d km.\n\n",student.hight);
printf(" Run 100 m. : %f minute\n\n",student.run);
printf(" Birth :%d\n\n",student.birthyear);
printf(" This Year : %d\n",student.thisyear);
}

วันอังคารที่ 23 มิถุนายน พ.ศ. 2552

ประวัติ




นายธีระ หนูเอี่ยม รหัสประจำตัว 50132792077


Mr.Teera Noo-eiam


ชื่อเล่น แพ็ค


หลักสูตร การบริหารธุรกิจ (คอมพิวเตอร์ธุรกิจ) คณะ วิทยาการจัดการ



มหาวิทยาลัยราชภัฎสวนดุสิต



e-mail address : u50132792077@gmail.com