งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

โครงสร้างข้อมูลพื้นที่สุด ที่ไม่เคยเลย จะไม่ใช้อาร์เรย์

งานนำเสนอที่คล้ายกัน


งานนำเสนอเรื่อง: "โครงสร้างข้อมูลพื้นที่สุด ที่ไม่เคยเลย จะไม่ใช้อาร์เรย์"— ใบสำเนางานนำเสนอ:

1 โครงสร้างข้อมูลพื้นที่สุด ที่ไม่เคยเลย จะไม่ใช้อาร์เรย์
5. Array โครงสร้างข้อมูลพื้นฐานที่สุด นั้นหมายถึงง่ายที่สุดด้วย แต่อาจรู้สึกว่ายาก เมื่อต้องประยุกต์ใช้งานในรูปแบบซับซ้อนของอาร์เรย์ แต่ทำได้เท่านี้ก็ถือว่า ใช้ได้แล้ว เพราะทำไม่ได้ตรงใหนก็ค่อยเปิดดู หรือทดลองดูได้ โครงสร้างข้อมูลพื้นฐานนี้ ที่เรียกว่าอาร์เรย์ แท้จริงแล้ว ใช้สำหรับเก็บข้อมูล เราใช้อาร์เรย์เก็บข้อมูล ที่มีขนาดเล็กๆ แสดงว่า ถ้าเก็บข้อมูลขนาดใหญ่ไม่เหมาะสม นั้นหมายความต่อไปว่า ยังมีโครงสร้างช้อมูลอื่นๆ อีก ที่เหมาะสมกับการเก็บช้อมลขนาดใหญ่ ซึ่งรวมไปถึงความซับซ้อนทีมากขึ้นด้วย ในเมื่ออาร์เรย์เป็นโครงสร้างข้อมูลพิ้นฐาน จึงควรเข้าใจ การใช้งาน และการประยุกต์นำไปใช้งาน ซึ่งอาร์เรย์นี้ มีแนวคิดการใช้งานเหมือนกันกับภาษาอื่นๆ เช่น ภาษา Java, C++, Php, Pascal แต่ที่ไม่เหมือนกันก็เพียงไวยากรณ์ ทางภาษาเท่านั้น ภาษาซีชาร์ป มีวิธีการเขียน การประกาศใช้งาน อาร์เรย์ ที่ง่ายเพราะการประกาศใช้งานอาร์เรย์ มีรูปแบบที่แน่นอน ไม่เหมือนกับภาษาอื่น เช่น C++ ประกาศได้ตั้งหลายแบบ ทำแบบนี้ก็ได้ ทำแบบนั้นก็ได้ งงไปหมด สำหรับผู้เริ่มเรียนรู้ใหม่ ต่อไปนี้เรามาเริ่มเรียนรู้ การใช้งานอาร์เรย์กัน จากพื้นฐาน ไปจน ขั้นชั้นสูง ของอาร์เรย์ โครงสร้างข้อมูลพื้นที่สุด ที่ไม่เคยเลย จะไม่ใช้อาร์เรย์ C# Programming with Visual C# 2010 Express

2 เป้าหมายการเรียนรู้ เป้าหมายการใช้อาร์เรย์
การสร้างค่าเริ่มต้นของอาร์เรย์ และอโนนิมัสไทป์ การสร้างอาร์เรย์หลายมิติ พร็อบเพอร์ตี้พื้นฐาน และเมธอดพื้นฐานในการใช้ อาร์เรย์ การนำอาร์เรย์ไปใช้งาน กับสเตทเม้นท์ต่างๆ อาร์เรย์ลิสท์ มีประเด็นไม่มากมายนั้น ที่เรา น่าจะรู้จักอาร์เรย์ ว่ามันทำอะไร ใช้งานอะไร ได้บ้าง แต่ทุกประเด็น เป็นหัวข้อมูลหลัก ที่ควรจะได้เข้าใจ ใช้งานได้ เริ่นต้นจาก เราใช้อาร์เรย์ทำอะไร ซึ่งเรารู้ว่าพื้นฐานมาบ้างแล้วว่า ใช้สำหรับเก็บข้อมูล ข้อมูลแบบใดที่เก็บได้ ข้อมูลแบบใดเก็บไม่ได้ ลักษณะข้อมูลที่เหมาะสม การนำไปใช้อะไรที่ดี หรือเหมาะสม แบบใดไม่ดี เป็นเรื่องแรกๆ ที่ควร เข้าใจ ธรรมชาติของอาร์เรย์ เมื่อรู้จักอาร์เรย์แล้ว เราจะประกาศใช้อาร์เรย์กันอย่างไร เราจะเริ่มจากการประกาศอาร์เรย์ แบบพื้นฐาน แล้วทำลองเขียนโปรแกรมให้อ่าน ข้อมูลจากอาร์เรย์ในลักษณะต่างๆ ซึ่งทุกคนทำได้ไม่ง่าย เหมือนกับเล่นเกมคอมพิวเตอร์ที่ต้องอาศัยการเรียนรู้ หลายวัน ยิ่งเกมซับซ้อน ต้องเรียนรู้เป็นเดือน ผมหมายถึงเกมกลยุทธ์ ต่างๆ เชื่อเถอะว่า มันไม่ยาก เมื่อเขียน ใช้ อาร์เรย์ได้แล้ว ควรทำความเข้าใจเพิ่มอีกนิดว่า ยังมีอาร์เรย์ แบบ อโนนีมัสไทป์ (anonymous type) หรืออาร์เรย์ไม่ทราบชนิดช้อมูล เป็นอาร์เรย์ ที่ยังคงสงวนชื่อชนิดข้อมูลที่เก็บ แบบนี้ก็มี แถมทีมากด้วย เป็นลูกเล่น ที่ประยุกต์ต่อไปกับ ความต้องการทีมากขึ้น กับข้อจำกัดของการเขียนโปรแกรม อาร์เรย์ มีคุณสมบัติ หรือพร็อปเพอร์ตี อะไรบ้าง มีเมธอดอะไรบ้าง ที่เรียกใช้งาน ได้ง่ายๆ ไม่ต้องประดิษฐ์ เขียนเองทั้งหมด เช่น เราต้องการทราบว่า อาร์เรย์มีขนาดเท่าใด ก็เรียกใช้พร็อปเพอร์ตี หาขนาดอาร์เรย์ เราต้องการทำสำเนาอาร์เรย์ ก็จะใช้เมธอดสำหรับทำเสาอาร์เรย์ ต่อมา ก็จะเป็นการประยุกต์ใช้อาร์เรย์กับคำสั่งต่างๆ เช่น ใช้กับ for{ ..} foreach{..} กับงานโปรแกรมต่างๆ สุดท้าย ก็จะเป็น นำเสนออาร์เรย์ลิส เพียงเล็กน้อย เพื่อเปรียบเทียบการใช้งานกับอาร์เรย์ C# Programming with Visual C# 2010 Express

3 ตอบว่าทำได้ก็ถูก ตอบว่าทำไม่ได้ก็ถูก ณ ตอนนี้คิดเพียงทำไมได้ไปก่อน
อาร์เรย์คืออะไร อาร์เรย์คือชุดของลำดับที่ใช้เก็บข้อมูล ทุกๆ ข้อมูลที่เก็บ ข้อมูลมีชนิดข้อมูลเดียวกัน การสร้างอาร์เรย์อย่างง่ายทำได้โดยการสร้างเป็นอาร์เรย์มิติ เดียว เช่น รายชื่อลูกค้า มองเป็นรายการๆ แถวยาว แถวเดียว อาร์เรย์สองมิติมีลักษณะเป็นเหมือนตาราง ที่มีคอลัมน์ และแถว อาร์เรย์สามมิติมีลักษณะเป็นเหมือนก้อนลูกบาศก์ ที่มีทั้งกว้าง ยาว และลึก สำหรับอาร์เรย์ที่มากกว่า 3 มิติ จะจิตนาการยากขึ้นไป หากจะเก็บข้อมูลต่างชนิดในอาร์เรย์จะทำอย่างไร ? อาร์เรย์คืออะไร เป็นคำถามเริ่มต้น สำหรับคนที่ไม่รู้จักอาร์เรย์มาก่อน อาร์เรย์ก็คือที่เก็บข้อมูลชนิดหนึ่ง ให้นึกถึงช่องเก็บข้อมูล ที่มีหลายช่อง ช่องหนึ่งเก็บข้อมูลได้หนึ่งอย่าง มี สาม ช่องก็เก็บข้อมูลได้สามอย่าง เหล่านี้เป็นต้น ที่เก็บข้อมูลนี้ จะต้องเก็บข้อมูลที่เป็นชนิดเดียวกันหมด เช่น เมื่อช่องแรกเก็บข้อมูลเป็น int ช่องต่อมา และต่อๆ ไป จะต้องเก็บข้อมูล เป็น int ด้วย มันเป็นกฎเกณฑ์ ที่เป็นอย่างนี้ หมายความว่าถ้าไม่ทำตามกฎนี้ ก็จะทำให้โปรแกรมไม่ทำงาน หรืออย่างน้อยก็จะคอมไพล์ไม่ผ่าน อาร์เรย์อย่างง่าย คืออาร์เรย์มิติเดียว มิติเดียวคือช่องเก็บข้อมูลมีภายใน มีช่องเดียวไม่มีช่องย่อย ภายในช่องเก็บข้อมูลนั้น เช่น การเก็บรายชื่อลูกค้า ที่เก็บเป็นแถวยาว แถวเดียว อาร์เรย์แบบนี้เป็นอาร์เรย์ประกาศใช้งานได้ง่าย และโดยทั้งไปเราก็จะใช้อาร์เรย์แบบนี้ นอกเสียจาก การเก็บข้อมูลที่ต้องการมิติมากว่านี้ เช่น เก็บข้อมูลเป็นลักษณะตารางข้อมูล ตารางข้อมูล มีกว้าง และยาว นั้นคือมีสองมิติ การใช้อาร์เรย์แบบนี้เรียกว่าอาร์เรย์สองมิติ ของดูอีกทีว่า ถ้าต้องการข้อมูลที่ แถวแรก คอลัมน์แรก ก็คือ ข้อมูลซ้ายสุด บนสุด นั้นเอง จะเห็นว่า การได้ข้อมูลมาต้องระบุ ทั้ง แถว และคอลัมน์ หรือสองมิติ จึงจะได้ข้อมูล เทียบกับอาร์เรย์มิติเดียว ที่ระบุตำแหน่งที่ต้องการเพียงมิติเดียวเท่านั้น นั้นหมายความว่า ถ้ามีอาร์เรย์สามมิติ ก็จะต้องระบุตำแหน่งข้อมูลที่ต้องการสามมิติ อาร์เรย์สามมิติ เทียบได้กับลูกบาศก์ ที่กว้าง ยาง และลึก อารร์เรย์ที่มากกว่าสามมิติอาจจิตนาการยากไปอีก อาร์เรย์ข้อมูลพื้นฐานนี้ มีคำถามว่า จะเก็บข้อมูลต่างชนิดเก็บได้หรือไม่ ซึ่งอธิบายไปแล้วว่าทำไม่ได้ โดยหลักการ จะต้องใช้โครงสร้างข้อมูลแบบอื่น ที่จะเก็บข้อมูลต่างชนิดได้ เช่น ArrayList จะลดข้อจำกัดนี้ได้ ตอบว่าทำได้ก็ถูก ตอบว่าทำไม่ได้ก็ถูก ณ ตอนนี้คิดเพียงทำไมได้ไปก่อน C# Programming with Visual C# 2010 Express

4 ลักษณะของอาร์เรย์ มีลักษณะทั่วไปคือ
การเก็บข้อมูลในอาร์เรย์มีลักษณะเป็นลำดับ ตามเลขดัชนี ที่เริ่มต้นค่าแรกที่ศูนย์ ความยาวของอาร์เรย์มีจำกัด และเก็บได้ไม่เกินค่าสูงสุด ของอาร์เรย์ที่เก็บได้ อาร์เรย์มีมิติได้หลายมิติ และจำนวนมิติก็คือขนาดของ แร็งค์ (rank) การเข้าถึงอาร์เรย์ได้โดยการระบุเลขดัชนีของอาร์เรย์ การเก็บอาร์เรย์ในหน่วยความจำ จะเก็บเรียงติดกัน ทำ ให้การเข้าถึงอาร์เรย์ทำได้รวดเร็ว อาร์เรย์มีลักษณะทั่วไป เพิ่มเติมที่ควรทำความเข้าใจอีกนิด คือ อาร์เรย์มีการเก็บข้อมูลเป็นลำดับ หมายความว่า ข้อมูลลำดับแรก ลำดับที่สอง ที่สาม และต่อๆ ไป ลำดับแรกหรือที่หนึ่งในอาร์เรย์ มีดัชนีที่ศูนย์ ในอาร์เรย์ใช้เลขดัชนี เริ่มต้นที่ศูนย์ ลำดับแรกคือ ดัชนีศูนย์ ลำดับที่สอง ก็คือดัชนีที่หนึ่ง เป็นอย่างนี้ต่อๆไป ถ้าต้องเข้าสู่ข้อมูลที่เท่าใด ก็หาดัขนีของอาร์เรย์แล้วลบค่าลงหนึ่ง ขนาดของอาร์เรย์ มีขนาดจำกัด เพราะตอนประกาศใช้อาร์เรย์จะต้องประกาศขนาดเริ่มต้นให้อาร์เรย์ก่อนว่ามีขนาดเท่าใด เช่น ประกาศว่าจะมีอาร์เรย์ ขนาด ห้า (ดัชนี้ก็จะเริ่มจาก ศูนย์ถึงสี่ ใช่หรือไม่) ก็หมายความว่าจะมีช่องเก็บข้อมูลที่เป็นลำดับห้าช่อง จะใช้งานเกินกว่า นี้ไม่ได้ นี้คือจำกัดของอาร์เรย์ ถ้าไม่ทราบแน่ชัดว่าจะเก็บข้อมูลเท่าไหร่ดี จะประกาศอาร์เรย์อย่างไร คำตอบก็ให้ประกาศเยอะๆ ไว้ก่อน ซึ่งก็ได้ แต่ไม่ดีสักเท่าไหร่ เพราะ การประกาศอาร์เรย์เยอะๆ มันจะทำการจองหน่วยความจำทีเรียงติดกัน จำนวนมาก หากไม่ใช้งานก็สิ้นเปลืองทรัพยากรระบบ ควรใช้โครงสร้างข้อมูลแบบอื่นๆ จะเหมาะสมมากว่า หากเคยเรียนวิชาโครงสร้างข้อมูลมาบ้าง หรือไม่เคยก็ขอบอกไว้เลยว่า โครงสร้างข้อมูลแบบที่ต้องใช้ pointer หรือตัวชี้ตำแหน่ง สร้างเป็นโครงสร้างข้อมูล จะชี้ตำแหน่งถัดไปเรื่อยๆ จะเหมาะสมกว่าเพราะต้องระบุขนาดเริ่มต้น เมื่อต้องการเพิ่มก็ชี้ตำแหน่งถัดไปเรื่อยๆ เนื่องจากอาร์เรย์มีการเก็บข้อมูลที่เรียงติดๆ กัน และทราบขนาดแน่นอน ทำให้เข้าถึงข้อมูลได้รวดเร็ว การใช้งานอาร์เรย์จึงมีข้อดีตรงนี้ เราสามารถใช้พร็อปเตอร์ตี Rank หาขนาดมิติของอาร์เรย์ได้ หาขนาดจาก พร็อปเพอร์ตี Length มีพร็อปเพอร์ตีอื่นๆ อีกมาก ที่ทำให้ใช้อาร์เรย์ได้ง่ายขึ้น Index 0 Index 6 C# Programming with Visual C# 2010 Express

5 การประกาศอาร์เรย์ การประกาศอาร์เรย์ทำได้เหมือนการประกาศตัวแปร เพียงแต่ ต้องมีเครื่องหมายวงเล็บฉาก “[ ]” หลังชนิด ข้อมูล เช่น int [ ] x; แต่ยังไม่มีค่าในหน่วยความจำ การให้มีค่าใน หน่วยความจำจะต้องระบุค่าขนาดอาร์เรย์เริ่มต้นและใช้คีย์ เวิร์ด “new” ดังตัวอย่างเช่น int[ ] x = new int[4]; CLR จะจองหน่วยความจำพร้อมทั้งกำหนดค่าเริ่มต้นให้ อัตโนมัติ ค่าเริ่มของของ int จะเป็น 0 ส่วนค่าเริ่มต้นของ string เป็น null ขึ้นอยู่กับชนิดข้อมูล ชนิดข้อมูลที่เป็น อ๊อปเจ็ค มีค่าเริ่มต้นเป็น null ชนิดข้อมูลเป็นวาลูไทป์ มีค่าเป็นตาม ชนิดวาลูไปท์ การประกาศอาร์เรย์ ประกาศว่ามีอาร์เรย์ ที่ให้ใช้งาน การประกาศ ประกาศบอกว่า มีอาร์เรย์ชื่ออะไร ใช้ชื่อตัวแปรตามที่เคยเรียนมาก่อน ว่ามีหลักเกณฑ์อย่างไร เช่น ใช้คีย์เวิร์ด เป็นชื่อตัวแปรไม่ได้ การประกาศตัวแปรอาร์เรย์ต้องระบุด้วยว่า มีชนิดข้อมูลเป็นแบบใด หลังชนิดตัวแปรต้องตามด้วย เครื่องหมายวงเล็บเหลี่ยม ( [ ] } เช่นปประกาศว่า int [ ] myArray; การประกาศแบบนี้ ไม่ได้กำหนดขนาดเริ่มต้น เพราะเพียงแค่บอกให้รู้ว่ามีตัวแปร แต่ถ้าจะใช้งานตัวแปรอาร์เรย์ต้อง บอกขนาดเริ่มต้นก่อน เช่น บอกขนาดเริ่มต้นว่า อาร์เรย์มีขนาดเริ่มต้นเท่ากับ สี่ หมายความว่ามีสมาชิกได้สี่ตัว เริ่มเลขดัชนีแรกที่ศูนย์ จนถึง ดัชนีเลขที่สาม int [ ] myArray = new int [ 4 ]; ทำให้ myArray พร้อมใช้งานแล้ว ว่ามีอาร์เรย์ มีชนิดข้อมูลเป็น int มีขนาดของอาร์เรย์ เท่ากับ สี่ การประกาศต้องประกาศในรูปแบบพื้นฐานนี้เท่านั้น การประกาศ แบบอื่นๆ เช่น ในตัวอย่างนี้ ผิด แม้ใช้ได้ในภาษาอื่น C# Programming with Visual C# 2010 Express

6 dataType[ ] name0; การประกาศอาร์เรย์ √ ประกาศได้
dataType[ ] name1 = new dataType[ size ] type[ ]name; type name[ ]; type[4] name; √ ประกาศได้ X ประกาศไม่ถูกต้อง X ประกาศไม่ถูกต้อง C# Programming with Visual C# 2010 Express

7 การประกาศอาร์เรย์หลายมิติ
การประกาศอาร์เรย์หลายมิติหรือมีแร็งค์มากกว่าหนึ่ง เรา ใช้การจิตนาการมิติของอาร์เรย์ ทำได้ดีเพียง 3 มิติ ถ้า ให้หนึ่งมิติคือ แถว สองมิติคือตาราง และสามมิติคือ ลูกบาศก์ การกำหนดขนาดมิติทำได้ถึง 32 มิติ การประกาศให้มีมิติทำได้โดยการเพิ่มเครื่องหมายจุลภาค ขั้นระหว่างช่องว่าง แต่ละช่องว่างคือมิติ เช่น มีหนึ่ง จุลภาคหมายถึงมีหนึ่งมิติ เพราะมีสองช่องว่าง ([ , ]) สอง จุดภาคมีสามมิติ เพราะมีสามช่องว่าง ([ , , ]) dataType[ , , ] array1 = new dataType[ Size1, Size2 , ]; การกำหนดอาร์เรย์หลายมิติ ทำไม่เกิน 32 มิติ เราใช้พร็อปเพอร์ตั้ง Rang เพื่อตรวจสอบมิติของอาร์เรย์ หาขนาดอาร์เรย์ ได้ด้วยพร็อปเพอร์ตี Length หรือเมธอด GetLength( ) การประกาศอาร์เรย์ หลายมิติ ทำได้โดยการ ใช้เครื่องหมาย จุดภาคกั้น เช่น [ , ] หมายถึงอาร์เรย์สองมิติ ถ้าเป็น [ , , ] หมายถึงอาร์เรย์สามมิติ สมมุติว่า จะประกาศอาร์เรย์ จะเก็บข้อมูลตัวเลขจำนวนเต็ม ในรูปตารางข้อมูล ขนาดตาราง 5x5 คือห้าแถวห้าคอลัมน์ จะเขียนได้ว่า int [ , ] myArray = new int[ 5, 5 ]; ห้าตัวแรก กับ ห้าตัวหลัง อะไรเป็นแถว อะไรเป็นคอลัมน์ มันเป็นจิตนาการ ถ้าจิตนาการว่า 5 แรกเป็นแถวก็ได้ ห้าตัวแรกเป็นคอลัมน์ก็ได้ เพราะกลับตาราง 90 องศา ก็ เปลี่ยนแถว เป็นคอลัมน์ได้ ไม่มีอะไรยึดแน่นอน นอกจากเราจะยึดว่า ตัวหน้าเป็นคอลัมน์ แล้วตัวหลังเป็นแถว ดังนั้นในจิตนาการของเราเป็นแบบนี้แล้ว การดำเนินการของเราที่ทำงานก็อาร์เรย์ ก็จะต้องเข้าใจว่าเป็นแบบนี้ เป็นกรอบอ้างอิง C# Programming with Visual C# 2010 Express

8 Jagged array การประกาศอาร์เรย์หลายมิติ ที่กำหนดขนาดเริ่มต้น บางส่วน สามารถทำได้ เช่นการประกาศให้มีอาร์เรย์มี ขนาดแถว 3 และไม่ระบุขนาดหลัก การกำหนดอย่างนี้มี ประโยชน์ในกรณีที่ไม่ต้องการกำหนดการจอง หน่วยความจำเพราะยังไม่ทราบขนาดที่แน่ชัด อาร์เรย์ แบบนี้เรียกว่า แจ็กเกดอาร์เรย์ ตัวอย่าง แจ็กเกดอาร์เรย์สองมิติ dataType [ ][ ] JaggedArray = new dataType[10][ ]; แจ็กเกดอาร์เรย์ เป็นการประกาศอาร์เรย์แบบหลายมิติ ลักษณะหนึ่งก็ได้ หรือมองว่าเป็นอาร์เรย์ของอาร์เรย์ ก็จะเป็นอาร์เรย์มิติเดียว เช่น ประกาศว่า int [ ] [ ] jag = new int[ 2 ] [ ]; จะเป็นอาร์มิติเดียว เมื่อมองว่า เป็นอาร์เรย์ของอาร์เรย์ เพราะอาร์เรย์นี้ ประกอบไปด้วยอาร์เรย์ นั้นเอง (งงหรือเปล่า) อธิบายใหม่ว่า อาร์เรย์นี้ มีสมามชิกสองตัว แต่ละตัวบรรจุอาร์เรย์ที่ยังระบุขนาด อาร์เรย์แบบนี้มีข้อดีตรงที่ไม่ต้องระบุขนาด ให้ระบุขนาดเมื่อต้องการใช้งาน ให้ตรงกับงานขณะรันไทม์ได้ เช่น ต้องการอาร์เรย์ แน่ๆ เลยว่า มีสมาชิก สอง ตัว แต่ภายในสมาชิกนี้ ยังไม่สามารถว่าจะเก็บแน่นอนเท่าใด จะเขียนว่า int[ ][ ] myArray1 = new int[2][ ]; //บอกว่า มีอาร์เรย์ ขนาดสอง myArray1[0] = new int[2]; // บอกว่า สมาชิกตัวแรก มีขนาดสอง myArray1[1] = new int[3]; // บอกว่า สมาชิกตัวที่สอง มีขนาดสาม myArray1[0][0] = 1; //บอกว่า สมาชิกตัวแรก ของสมาชิกตัวแรก มีค่าเท่ากับ 1 myArray1[0][1] = 2; // บอกว่า สมาชิกตัวที่สอง ของสมาชิกตัวแรก มีค่าเท่ากับ 2 myArray1[1][0] = 3; //บอกว่า สมาชิกตัวที่แรก ของของสมาชิกตัวที่สอง มีค่าเท่ากับ 3 myArray1[1][1] = 4; myArray1[1][2] = 5; C# Programming with Visual C# 2010 Express

9 การกำหนดขนาดอาร์เรย์ขณะรันไทม์
การกำหนดขนาดอาร์เรย์ไม่จำเป็นตัองกำหนดได้ขณะ คอมไพล์เท่านั้น เราสามารถกำหนดขณะรันไทม์ได้ โดย มีความเร็วเท่ากันทุกกรณีกับการกำหนดขนาดคอมไพล์ (หรือขณะออกแบบโปรแกรม) การกำหนดขนาดอาร์เรย์ขณะรันไทม์ Console.WriteLine("Enter num of rows matrix:"); string r = Console.ReadLine( ); int rows = int.Parse(r); Console.WriteLine("Enter num of columns matrix:"); string c = Console.ReadLine(); int cols = int.Parse(c); int[,] matrix = new int[rows, cols]; C# Programming with Visual C# 2010 Express

10 การตรวจสอบขอบเขตอาร์เรย์
การเข้าถึงอาร์เรย์ในแต่ละหน่วย ระบุได้ด้วยเลขดัชนี แต่ การระบุหน่วยดัชนีที่เกิดขอบเขตของอาร์เรย์จะทำให้เกิด ความผิดพลาด IndexOutOfRangeException ทางที่ดีควรจะแน่ใจในขนาดของอาร์เรย์ โดยการใช้พร๊ อบเพอร์ตี้ Length หรือจะใช้เมธอด GetLength( ) ความแตกต่างของทั้งสอง คือ Length จะให้ขนาดทั้ง หน่วย หรือนับทุกหน่วยของอาร์เรย์ แต่ GetLength( ) จะนับขนาดในมิติหนึ่งๆ เท่านั้น สมมุติให้อาร์เรย์มีมิติ เท่ากับ 2 แต่ละแถวและหลักมี ขนาด 2 แต่ละแถวและหลักวัดด้วย GetLength( ) = 2 และมีขนาดทั้งหมดวัด Length = 4 (มาจาก ขนาดแถว x ขนาดหลัก) ความผิดพลาดที่เกิดขึ้นบ่อยๆ คือ การเข้าถึงอาร์เรย์ แต่อยู่นอกขอบเขต ของอาร์เรย์ที่จะมีได้ เรียกความผิดพลาดนี้ว่า IndexOutOfRangeException เช่น ประกาศว่า อาร์เรย์มีขนาด ห้า แต่เรียกใช้อาร์เรย์ตัวที่หก ดังนั้นแล้ว ควรจะใช้เมธอด หรือพร็อปเพอร์ตี ตรวจสอบขนาดของอาร์เรย์ก่อนเสมอ ยกเว้นการใช้คำสั่ง foreach ถ้าอาร์เรย์มีหลายมิติ ต้องตรวจสอบมิติของอาร์เรย์ ด้วยพร็อปเพอร์ตี Range แล้วค่อยตัวตรวจสอบขนาดของอาร์เรย์แต่ละมิติ หากยุ่งยากมากไป คำสั่ง foreach ก็ยังใช้งานได้ดี C# Programming with Visual C# 2010 Express

11 การตรวจสอบขนาดอาร์เรย์
int[ ] x = new int[ 2 ]; Console.WriteLine(x.GetLength(0)); //print 2 Console.WriteLine(x.Length); // print 2 int[ , ] y = new int[ 2, 2 ]; Console.WriteLine(y.GetLength(0)); //print 2 Console.WriteLine(y.GetLength(1)); //print 2 Console.WriteLine(y.Length); // print 4 C# Programming with Visual C# 2010 Express

12 การกำหนดค่าให้อาร์เรย์
การกำหนดค่าเริ่มต้นให้สามารถทำได้ 2 วิธีคือ กำหนดให้เท่ากับ อาร์เรย์ที่กำหนดขนาดแล้ว ต่อมาให้ ใส่ค่าลงในปีกกา คล่อมค่าแต่ละค่า ของอาร์เรย์ เช่น int [ ] x = new int [ 3 ] { 0, 1, 2 }; กำหนดให้เท่ากับ ปีกกาพร้อมระบุค่าได้เลย โดยไม่ต้อง กำหนดขนาด และคีย์เวิร์ด “new” เพราะอาร์เรย์จะจอง หน่วยความจำเท่ากับที่กำหนดค่าเริ่มต้นให้ เช่น int [ ] x = { 0, 1, 2 }; C# Programming with Visual C# 2010 Express

13 การสร้างเริ่มต้นให้อโนนิมัสไทป์
ค่าอโนนิมัส (var) สร้างได้อีกวิธีจากการประกาศอาร์เรย์ แบบ อิมพลิสิทลี่ ไทป์ อาร์เรย์ (Implicitly Typed Array) การประกาศแบบนี้จะสร้างค่าเริ่มต้นให้กับอาร์เรย์ โดยไม่ ต้องระบุชนิดตัวแปรล่วงหน้า ตัวอย่างต่อไปนี้ จะเป็น ประกาศตัวแปรอโนนิมัส พร้อมๆ กับสร้างเริ่มต้น ใน รูปแบบต่างๆ var a = new[] { 1, 10, 100 }; //int[ ] var b = new[] { "hello", null, "world" }; // string[ ] var c = new[] { new[]{1,2,3,4}, new[]{5,6,7,8} }; Console.WriteLine(a[0]);//print 1 Console.WriteLine(b[0]);//print hello Console.WriteLine(c[0][3]);//print 4 คีย์เวิร์ด var เป็นการบอกว่าเป็นตัวแปรชนิด อะ – โน – นิ – มัส คือไม่รู้ชัดว่ามีตัวแปรชนิดอะไร จนกว่าจะถึงเวลาใช้งานจริง ลักษณะนี้เรียกอีกแบบว่า Implicitly type อาร์เรย์ก็สามารถไม่ระบุชนิดมุลชัดๆ ได้ ด้วยการประกาศ var นี้ เพียงแต่ว่าเมื่อต้องใช้งานจริงจะต้องทราบชนิดข้อมูลแน่ชัดแล้วว่าเป็นชนิดอะไร โดยการตัดสินใจของระบบเอง เช่น ประกาศว่า var a = new [ ] { 1, 10, 100 } ; ก็หมายว่าเป็นชนิดข้อมูล ตัวเลข int var b = new [ ] { “Hello”, “World” }; ก็หมายความว่าเป็นตัวอักษร เพราะอยู่ในเครื่องหมายคำพูด น่าสังเกตว่า ไม่มีชนิดตัวแปรทั้งสองด้าน ด้านเป็น var อีก ต้านหนึ่ง new ไม่ชนิดตัวแปรใดระบุ ส่วนแจ็กเกดอาร์เรย์ หรืออาร์เรย์สองมิติ ดังเขียนเป็นตัวอย่าง นี้ก็ไม่ได้ระบุชนิดตัวแปร พร้อมกับรประกาศตัวแปร แต่ต้องมี ชนิดตัวแปรเดียวกันหมด เพื่อให้ระบบตัดสินชนิดตัวแปร ไม่เช่นนั้นระบบจะตัดสินใจไม่ได้ แล้วจะคอมไพล์ไม่ผ่าน C# Programming with Visual C# 2010 Express

14 การคัดลอกอาร์เรย์ การทำสำเนาหรือคัดลอกอาร์เรย์หนึ่ง ทำได้โดยการ อ้างอิงถึงอาร์เรย์ที่ได้มีการสร้างมาก่อนแล้ว การปรับแต่งต่อเติมกับอาร์เรย์เดิมก็มีผลเช่นเดียวกับ อาร์เรย์ใหม่ที่คัดลอกมา เพราะการคัดลอกอาร์เรย์แบบ อ้างอิง(วัตถุใหม่ไม่เกิด) จะยังคงใช้อาร์เรย์เดิมร่วมกันอยู่ int[ ] x = { 1, 2, 3 }; int[ ] y = x; Console.WriteLine("x[0]={0}, y[0]={1}", x[0], y[0]); //print "x[0]=1, y[0]=1" x[0] = 4; //print "x[0]=4, y[0]=4" C# Programming with Visual C# 2010 Express

15 พร็อบเพอร์ตี้เมธอดของอาร์เรย์
อาร์เรย์มีใช้เพื่อเก็บข้อมูล การใช้งานอาร์เรย์ให้มี ประโยชน์มากขึ้น ก็ต่อเมื่อนำพร็อบเพอร์ตี้ และเมธอด ของอาร์เรย์มาให้เต็มที่ การใช้ประโยชน์จากอาร์เรย์สามารถใช้ได้เหมือนกันหมด เพราะทุกๆ อาร์เรย์มากจากชนิดข้อมูลเดียวกันคือ System.Array พร๊อบเพอร์ตี้ ที่ใช้ทั่วไป คือ การหาขนาดจำนวนหน่วย ในอาร์เรย์ ใช้ Length สำหรับเมธอดทั่วไป ที่น่านำไปใช้คือ GetValue( ) และ SetValue( ) ทั้งสองตัวนี้ใช้สำหรับการเรียกค่า และ กำหนดค่า Sort( ) ใช้สำหรับเรียงค่าของอาร์เรย์ที่มีหนึ่ง มิติ C# Programming with Visual C# 2010 Express

16 เมธอดของอาร์เรย์ ชื่อ ความหมาย Clear( )
เป็นการกำหนดค่าสู่การเริ่มต้นใหม่ ถ้าเป็นวาลูไทป์เป็นศูนย์ และถ้าเป็นอ๊อปเจ็คเป็น (null) Clone( ) เป็นการคัดลอกค่าอาร์เรย์ไปสู่วัตถุอาร์เรย์ใหม่ ซึ่งหลังจากคัดลอกแล้วอาร์เรย์ใหม่กับเก่ามีอิสระต่อกัน CopyTo( ) เป็นการคัดลอกอาร์เรย์ไปสู่วัตถุอาร์เรย์ใหม่ โดยการเลือกตำแหน่งข้อมูลที่จะเริ่มคัดลอกเป็นตัวแปรเข้าที่สอง GetLength( ) เป็นการเรียกค่าความยาวมิติของอาร์เรย์ IndexOf( ) เป็นการค่าหาตำแหน่งของอาร์เรย์ C# Programming with Visual C# 2010 Express

17 การเรียกข้อมูลภายในอาร์เรย์
การเรียกข้อมูลด้วย สแตทเม้นท์ for{ } ใช้คู่กับพร็อบเพอร์ตี้ Length การเรียกข้อมูลด้วย สแตทเม้นท์ foreach { } ใช้วนเรียก โดยไม่ต้องทราบทั้งชนิดข้อมูล และขนาด ข้อมูลในอาร์เรย์ int[ ] array = { 1, 2, 3, 4, 5 }; for (int i = 0; i < array.Length; i++) Console.WriteLine(array[ i ]); การเข้าถึงข้อมูลในอาร์เรย์ ทำได้สองแบบ แบบแรก ใช้คำสั่ง for แบบนี้จะต้องรู้ขนาดของอาร์เรย์ เพราะจะใช้จำนวนการวนลูบได้ถูกต้อง เช่น อาร์เรย์มีขนาด สี่ ก็จะวนซ้ำ สี่ครั้งด้วย พร็อปเพอร์ตีที่สำคัญ คือ Length ใช้หาขนาดอาร์เรย์ หรือจะใช้เมธอด GetLength( ) ก็ได้ แต่ไม่ต้องการหาขนาดให้เสียเวลา ใช้คำสั่ง foreach ก็สะดวกดี เพราะมันจะวนซ้ำไปจนหมด อาร์เรย์ ลักษณะนี้ นิยมใช้กันมาก ถ้า แจ็กเกดอาร์เรน ประกาศดังนี้ int[ ][ ] myArray1 = new int[2][ ]; myArray1[0] = new int[2]; myArray1[1] = new int[3]; myArray1[0][0] = 1; myArray1[0][1] = 2; myArray1[1][0] = 3; myArray1[1][1] = 4; myArray1[1][2] = 5; จะใช้คำสั่งวนรอบอย่างไรให้พิมพ์ ข้อมูล ให้ครบทุกข้อมูล ในอาร์เรย์แบบนี้ ข้อสังเกตคำถามนี้เป็นอาร์เรย์ของอาร์เรย์ คำตอบ คือ foreach (var item in myArray1 ) { foreach (var items in item) { Console.WriteLine(items); } int[ ] array = { 1, 2, 3, 4, 5 }; foreach (var item in array) Console.WriteLine(item); C# Programming with Visual C# 2010 Express

18 อาร์เรย์ในเมธอด Main( )
เมธอด Main( ) เป็นเมธอดหลักของ Console Application เมธอด Main( ) เป็นเหมือนจุดเริ่มต้นการทำงานของแอปพลิเคชัน เมธอด Main( ) มีตัวแปรเข้า เป็นอาร์เรย์ มีชนิดข้อมูลเป็น string และเป็นตัวแปรเข้าที่สามารถมีได้หลายตัว ดังจำนวนข้อมูลในอาร์เรย์ เมธอด Main( ) มีการเข้าถึงตัวแปร args ใช้การอ้างอิงแบบอาร์เรย์ ทั่วไป เช่น args[0] หมายถึงตัวแปรแรก args[1] เป็นตัวแปรที่สอง การกำหนดขนาดอาร์เรย์ถูกกำหนดขณะรันไทม์ ด้วยการเรียก โปรแกรมที่เป็นแอสแซมบลีแล้ว การเรียกให้แอปพลิเคชันนี้ทำงาน เรียกโดยใช้คำสั่ง “app.exe s1, s2” เคยสังเกตไหมว่า เมธอดเมน ของคอนโซลแอปฯ ซึ่งเป็นเมธอดหลัก ที่เป็นจุดเริ่มต้นให้โปรแกรมทำงาน มีข้อมูลเข้าเป็นอาร์เรย์ และทราบต่อไปหรือไม่ว่า อาร์เรย์นี้มีชนิดข้อมูลเป็นอะไร มีขนาดเริ่มต้นเท่าไหร่ ถ้าดูจากการประกาศ นี้ static void Main(string[ ] args) มีชนิดข้อมูลเป็น อักษร แต่ไม่บอกขนาดเริ่มต้น หากยังจำกันได้ อาร์เรย์ ที่ไม่บอกขนาด แต่บอก ค่าข้อมูลเริ่มต้นได้ เช่น String[ ] arrayString = {“x, ‘y”, “z”} ; ระบบมันจะทำงานโดยใช้อาร์เรย์ในลักษณะนี้ ขณะรันโปรแกรม การเข้าถึง ข้อมูลของอาร์เรย์อ้างอิง ชื่อตัวแปร args ได้เช่น args[0] หมายถึงสมาชิกตัวแรก และถ้าเขียนว่า Console.WriteLine(args[1]); แสดงว่า จะต้องนำสมาชิกตัวที่สอง มาแสดงผมที่หน้าจอ สมมุติ โปรแกรมนี้ชื่อ app1.exe เมื่อรันโปรแกรมผ่าน คอมมานไลน์ จะต้องพิมพ์ว่า app1.exe x y ผลการรันโปรแกรมนี้ จะได้ผลว่า y ที่หน้าจอ C# Programming with Visual C# 2010 Express

19 ตัวอย่างการใช้ เมธอด Main( )
class Program { static void Main(string[ ] args) if (args.Length==2) Console.WriteLine("Curency1:{0:C0} ",int.Parse(args[0])); Console.WriteLine("Curency2:{0:C2}", int.Parse(args[1])); } else Console.WriteLine("args must equal 2"); Console.Read(); ทดลองรันโปรแกรมนี้ดู Build Solution เสร็จแล้ว ต้อง รันโปรแกรม ผ่านคอมมานไลน์ แล้วดูผลลัพธ์ C# Programming with Visual C# 2010 Express

20 ข้อจำกัดของอาร์เรย์ มีขนาดจำกัด ต้องระบุขนาดอาร์เรย์ก่อนใช้งาน
การเพิ่มขนาดอาร์เรย์ไม่สามารถยืดหยุ่น หรือหดขนาดได้ เมื่อสร้างแล้ว อาร์เรย์สร้างขึ้นเพื่อเก็บข้อมูลชนิดเดียวเหมือนกันหมดทั้ง อาร์เรย์ ไม่สามารถป้องกันการเขียนทับได้ ข้อจำกัดเหล่านี้แก้ได้ด้วยการใช้ อาร์เรย์ลิสท์ (ArrayList) เป็นคลาสหนึ่งใน ห้อง System.Collection อาร์เรย์ มีข้อจำกัดหลายอย่าง อย่างแรกคือ ต้องระบุอาร์เรย์ ขนาดเริ่มต้นใช้งาน เมื่อสร้างเสร็จแล้ว อย่างจะเปลี่ยนขนาดอาร์เรย์ ทำไม่ได้ วิธีแก้คือ สร้างอาร์เรย์ใหม่แทนอาร์เรย์เก่า แล้วก๊อปปี้ข้อมูลเก่ามายังอาร์เรย์ใหม่ คิดว่ามิวิธีการอื่นๆ อีกหรือไม่? ย้ำกันอีกครั้งว่าอาร์เรย์เก็บข้อมูลชนิดเดียวกันเท่านั้น ซึ่งดูเป็นข้อดีก็ได้ เพราะสามารถใช้คำสั่ง foreach ได้ง่ายได้ ไม่ต้องกังวลเกี่ยวกับชนิดข้อมูลที่ไม่แน่นอน และทำให้โปรแกรมไม่แฮงได้ด้วย อีกอย่างอาร์เรย์ ป้องกันการเขียนทับข้อมูลได้ อันนี้ มีวิธีแก้อย่างอื่น เช่น การสร้างการเข้าถึง เป็น private การเข้าถึงโดยตรงให้ผ่าน เมธอดแทน ที่เป็น public ซึ่งเป็นวิธีการของ oop หรือจะใช้เทคนิคอื่นๆ ก็ได้มีมากมายสำหรับแต่ละคน ขอจำกัดเหล่า สามารถทำแทนได้ด้วยการใช้คลาส ArrayList C# Programming with Visual C# 2010 Express

21 อาร์เรย์ลิสท์ (ArrayList)
การใช้งานต้องอ้างอิง System.Collections หนึ่งใน Collections คือ ArrayList ArrayList al = new ArrayList(); al.Add("string"); al.Add(1); foreach (var item in al) { Console.WriteLine(item); } เนื่อจากอาร์เรย์แบบธรรดามีข้อจำกัด ของการต้องทราบขนาดข้อมูลก่อนใช้งาน ทำให้มีการคิดคลาส ประเภทเก็บข้อมูลที่คล้ายกับอาร์เรย์ ขึ้นมา คือ คลาส ArrayList คลานนี้มีการใช้งานคล้ายกับ อาร์เรย์มาก แต่ที่ต่างคือไม่ต้องประกาศขนาดเริ่มต้น นั้นมันจะขยายได้ไปเรื่อยๆ นั้นเอง แถวคลาสนี้จะเก็บข้อมูลอะไรก็ได้ ไม่จำเป็นต้องเป็นชนิดเดียวกัน ดังนั้นในการวนซ้ำเพื่อเข้าถึงข้อมูล มีกลายเป็นข้อจำกัด เพราะไม่ทราบชนิดข้อมูลแน่นอน การนำคลาสนี้ไปใช้งานจะต้อง ประกาศใช้เนมสเปส System.Collections ที่หัวโปรแกรมเสียก่อน using System.Collections; การใช้งานจะต้องประกาศคีย์เวิร์ด new เพื่อสร้างเป็นออปเจ็กต์ ให้ใช้งานได้ เมธอดที่จะใช้เพิ่มข้อมูลใช้เมธอด Add( ) C# Programming with Visual C# 2010 Express

22 สรุปท้ายบท การรู้จักอาร์เรย์ เครื่องมือเป็นพื้นฐานในการเก็บข้อมูล ที่ มีขนาดแน่นอน การสร้างจะต้องระบุขนาด และมิติ อาร์เรย์ การะบุขนาดสามารถทำได้ทั้งขณะคอมไพล์ไทม์ และรัน ไทม์ การใช้งานอาร์เรย์ มีพร็อบเพอร์ตี้และเมธอดของอาร์เรย์ ต่างๆ เช่น Length, Rank, GetValue( ), Clear( ) ทำให้ใช้ งานอาร์เรย์ได้เร็วขึ้น การนำสเตทเม้นท์ for, foreach เพื่อนำข้อมูลในอาร์เรย์มา ใช้งาน นอกจากการระบุอาร์เรย์โดยตรง ArrayList เป็นคลาสประเภท Collection ใช้เก็บข้อมูลได้ แบบอาร์เรย์แต่มีความยืดหยุ่นสูงกว่า C# Programming with Visual C# 2010 Express

23 ทำถามทบทวน อาร์เรย์มีไว้เพื่ออะไร
คำสั่งต่อไปนี้ผิดพลาดอะไร และควรแก้ไขอย่างไร int array[ ]; int [ ] array = new int[ ]; int[ ] array = new long[ 1 ]; int [ ] array = new int[ ]{1,2,3}; int [ ] array; array = {1, 2, 3}; int [ ] array; Console.WriteLine(array[ 0 ]); int [ ] array = new int[ ]; int [ ] array = new int[ 2 ]{0, 1, 2}; int[ , ] array = new int[ 2, 3] { { 1,2}, {1,2,3} }; int [ ] array = new int[ 2]; Console.WriteLine{array.Length( )}; C# Programming with Visual C# 2010 Express

24 คำถามทบทวน int[ , ] grid = new int [ 3,2 ] เมื่อทดสอบด้วย พร็อบเพอร์ตี้ Rank และ Length จะมี ค่าเท่ากับเท่าใด จงหา 2 วิธีคัดลอกอาร์เรย์ ใช้เมธอดอะไรเพื่อหาตำแหน่งดัชนีของอาร์เรย์ ใช้สเตทเม้นท์ใดเพื่อวนซ้ำอาร์เรย์ทุกค่าโดยไม่ต้องทราบ ขนาดของอาร์เรย์ อาร์เรย์ลิสท์ ต่างกับ อาร์เรย์ทั่วไปอย่างไร C# Programming with Visual C# 2010 Express


ดาวน์โหลด ppt โครงสร้างข้อมูลพื้นที่สุด ที่ไม่เคยเลย จะไม่ใช้อาร์เรย์

งานนำเสนอที่คล้ายกัน


Ads by Google