240 likes | 376 Views
5. Array. โครงสร้างข้อมูลพื้นฐานที่สุด ที่ไม่เคยเลย จะไม่ใช้อาร์เรย์. เป้าหมายการเรียนรู้. เป้าหมายการใช้อาร์เรย์ การสร้างค่าเริ่มต้นของอาร์เรย์ และอโนนิมัสไทป์ การสร้างอาร์เรย์หลายมิติ พร็อบเพอร์ตี้พื้นฐาน และเมธอดพื้นฐานในการใช้อาร์เรย์ การนำอาร์เรย์ไปใช้งาน กับสเตทเม้นท์ต่างๆ
E N D
5. Array โครงสร้างข้อมูลพื้นฐานที่สุด ที่ไม่เคยเลย จะไม่ใช้อาร์เรย์ C# Programming with Visual C# 2010 Express
เป้าหมายการเรียนรู้ • เป้าหมายการใช้อาร์เรย์ • การสร้างค่าเริ่มต้นของอาร์เรย์ และอโนนิมัสไทป์ • การสร้างอาร์เรย์หลายมิติ • พร็อบเพอร์ตี้พื้นฐาน และเมธอดพื้นฐานในการใช้อาร์เรย์ • การนำอาร์เรย์ไปใช้งาน กับสเตทเม้นท์ต่างๆ • อาร์เรย์ลิสท์ C# Programming with Visual C# 2010 Express
อาร์เรย์คืออะไร • อาร์เรย์คือชุดของลำดับที่ใช้เก็บข้อมูล ทุกๆ ข้อมูลที่เก็บข้อมูลมีชนิดข้อมูลเดียวกัน • การสร้างอาร์เรย์อย่างง่ายทำได้โดยการสร้างเป็นอาร์เรย์มิติเดียว เช่น รายชื่อลูกค้า มองเป็นรายการๆ แถวยาวแถวเดียว • อาร์เรย์สองมิติมีลักษณะเป็นเหมือนตาราง ที่มีคอลัมน์ และแถว อาร์เรย์สามมิติมีลักษณะเป็นเหมือนก้อนลูกบาศก์ ที่มีทั้งกว้าง ยาว และลึก • สำหรับอาร์เรย์ที่มากกว่า 3 มิติ จะจิตนาการยากขึ้นไป • หากจะเก็บข้อมูลต่างชนิดในอาร์เรย์จะทำอย่างไร ? ตอบว่าทำได้ก็ถูก ตอบว่าทำไม่ได้ก็ถูก ณ ตอนนี้คิดเพียงทำไมได้ไปก่อน C# Programming with Visual C# 2010 Express
Index 0 Index 6 ลักษณะของอาร์เรย์ มีลักษณะทั่วไปคือ • การเก็บข้อมูลในอาร์เรย์มีลักษณะเป็นลำดับ ตามเลขดัชนีที่เริ่มต้นค่าแรกที่ศูนย์ • ความยาวของอาร์เรย์มีจำกัด และเก็บได้ไม่เกินค่าสูงสุดของอาร์เรย์ที่เก็บได้ • อาร์เรย์มีมิติได้หลายมิติ และจำนวนมิติก็คือขนาดของ แร็งค์ (rank) • การเข้าถึงอาร์เรย์ได้โดยการระบุเลขดัชนีของอาร์เรย์ • การเก็บอาร์เรย์ในหน่วยความจำ จะเก็บเรียงติดกัน ทำให้การเข้าถึงอาร์เรย์ทำได้รวดเร็ว C# Programming with Visual C# 2010 Express
การประกาศอาร์เรย์ • การประกาศอาร์เรย์ทำได้เหมือนการประกาศตัวแปรเพียงแต่ ต้องมีเครื่องหมายวงเล็บฉาก “[ ]” หลังชนิดข้อมูล เช่นint [ ] x; • แต่ยังไม่มีค่าในหน่วยความจำ การให้มีค่าในหน่วยความจำจะต้องระบุค่าขนาดอาร์เรย์เริ่มต้นและใช้คีย์เวิร์ด “new” ดังตัวอย่างเช่น int[ ] x = new int[4]; • CLR จะจองหน่วยความจำพร้อมทั้งกำหนดค่าเริ่มต้นให้อัตโนมัติ • ค่าเริ่มของของ int จะเป็น 0 ส่วนค่าเริ่มต้นของ string เป็น null ขึ้นอยู่กับชนิดข้อมูล ชนิดข้อมูลที่เป็น อ๊อปเจ็ค มีค่าเริ่มต้นเป็น null ชนิดข้อมูลเป็นวาลูไทป์ มีค่าเป็นตามชนิดวาลูไปท์ C# Programming with Visual C# 2010 Express
การประกาศอาร์เรย์ dataType[ ] name0; dataType[ ] name1 = new dataType[ size] √ประกาศได้ type[ ]name; type name[ ]; type[4] name; X ประกาศไม่ถูกต้อง X ประกาศไม่ถูกต้อง C# Programming with Visual C# 2010 Express
การประกาศอาร์เรย์หลายมิติการประกาศอาร์เรย์หลายมิติ • การประกาศอาร์เรย์หลายมิติหรือมีแร็งค์มากกว่าหนึ่ง เราใช้การจิตนาการมิติของอาร์เรย์ ทำได้ดีเพียง 3 มิติ ถ้าให้หนึ่งมิติคือ แถว สองมิติคือตาราง และสามมิติคือลูกบาศก์ การกำหนดขนาดมิติทำได้ถึง 32 มิติ • การประกาศให้มีมิติทำได้โดยการเพิ่มเครื่องหมายจุลภาค ขั้นระหว่างช่องว่าง แต่ละช่องว่างคือมิติ เช่น มีหนึ่งจุลภาคหมายถึงมีหนึ่งมิติ เพราะมีสองช่องว่าง ([ , ]) สองจุดภาคมีสามมิติ เพราะมีสามช่องว่าง ([ , , ]) dataType[ , , . . . ] array1 = new dataType[ Size1, Size2 , . . . ]; C# Programming with Visual C# 2010 Express
Jagged array • การประกาศอาร์เรย์หลายมิติ ที่กำหนดขนาดเริ่มต้นบางส่วน สามารถทำได้ เช่นการประกาศให้มีอาร์เรย์มีขนาดแถว 3 และไม่ระบุขนาดหลัก การกำหนดอย่างนี้มีประโยชน์ในกรณีที่ไม่ต้องการกำหนดการจองหน่วยความจำเพราะยังไม่ทราบขนาดที่แน่ชัด อาร์เรย์แบบนี้เรียกว่า แจ็กด์อาร์เรย์ • ตัวอย่าง แจ็กด์อาร์เรย์สองมิติdataType [ ][ ] JaggedArray = new dataType[10][ ]; C# Programming with Visual C# 2010 Express
การกำหนดขนาดอาร์เรย์ขณะรันไทม์การกำหนดขนาดอาร์เรย์ขณะรันไทม์ • การกำหนดขนาดอาร์เรย์ไม่จำเป็นตัองกำหนดได้ขณะคอมไพล์เท่านั้น เราสามารถกำหนดขณะรันไทม์ได้ โดยมีความเร็วเท่ากันทุกกรณีกับการกำหนดขนาดคอมไพล์ (หรือขณะออกแบบโปรแกรม) การกำหนดขนาดอาร์เรย์ขณะรันไทม์ 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
การตรวจสอบขอบเขตอาร์เรย์การตรวจสอบขอบเขตอาร์เรย์ • การเข้าถึงอาร์เรย์ในแต่ละหน่วย ระบุได้ด้วยเลขดัชนี แต่การระบุหน่วยดัชนีที่เกิดขอบเขตของอาร์เรย์จะทำให้เกิดความผิดพลาด IndexOutOfRangeException • ทางที่ดีควรจะแน่ใจในขนาดของอาร์เรย์ โดยการใช้พร๊อบเพอร์ตี้ Length หรือจะใช้เมธอด GetLength( ) • ความแตกต่างของทั้งสอง คือ Length จะให้ขนาดทั้งหน่วย หรือนับทุกหน่วยของอาร์เรย์ แต่ GetLength( ) จะนับขนาดในมิติหนึ่งๆ เท่านั้น • สมมุติให้อาร์เรย์มีมิติ เท่ากับ 2 แต่ละแถวและหลักมีขนาด 2 แต่ละแถวและหลักวัดด้วย GetLength( ) = 2 และมีขนาดทั้งหมดวัด Length = 4 (มาจาก ขนาดแถว x ขนาดหลัก) C# Programming with Visual C# 2010 Express
การตรวจสอบขนาดอาร์เรย์การตรวจสอบขนาดอาร์เรย์ • 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
การกำหนดค่าให้อาร์เรย์การกำหนดค่าให้อาร์เรย์ • การกำหนดค่าเริ่มต้นให้สามารถทำได้ 2 วิธีคือ • กำหนดให้เท่ากับ อาร์เรย์ที่กำหนดขนาดแล้ว ต่อมาให้ใส่ค่าลงในปีกกา คล่อมค่าแต่ละค่า ของอาร์เรย์ เช่นint [ ] x = new int [ 3 ] { 0, 1, 2 }; • กำหนดให้เท่ากับ ปีกกาพร้อมระบุค่าได้เลย โดยไม่ต้องกำหนดขนาด และคีย์เวิร์ด “new” เพราะอาร์เรย์จะจองหน่วยความจำเท่ากับที่กำหนดค่าเริ่มต้นให้ เช่นint [ ] x = { 0, 1, 2 }; C# Programming with Visual C# 2010 Express
การสร้างเริ่มต้นให้อโนนิมัสไทป์การสร้างเริ่มต้นให้อโนนิมัสไทป์ • ค่าอโนนิมัส (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 C# Programming with Visual C# 2010 Express
การคัดลอกอาร์เรย์ • การทำสำเนาหรือคัดลอกอาร์เรย์หนึ่ง ทำได้โดยการอ้างอิงถึงอาร์เรย์ที่ได้มีการสร้างมาก่อนแล้ว • การปรับแต่งต่อเติมกับอาร์เรย์เดิมก็มีผลเช่นเดียวกับ อาร์เรย์ใหม่ที่คัดลอกมา เพราะการคัดลอกอาร์เรย์แบบอ้างอิง(วัตถุใหม่ไม่เกิด) จะยังคงใช้อาร์เรย์เดิมร่วมกันอยู่ 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; Console.WriteLine("x[0]={0}, y[0]={1}", x[0], y[0]); //print "x[0]=4, y[0]=4" C# Programming with Visual C# 2010 Express
พร็อบเพอร์ตี้เมธอดของอาร์เรย์พร็อบเพอร์ตี้เมธอดของอาร์เรย์ • อาร์เรย์มีใช้เพื่อเก็บข้อมูล การใช้งานอาร์เรย์ให้มีประโยชน์มากขึ้น ก็ต่อเมื่อนำพร็อบเพอร์ตี้ และเมธอดของอาร์เรย์มาให้เต็มที่ • การใช้ประโยชน์จากอาร์เรย์สามารถใช้ได้เหมือนกันหมด เพราะทุกๆ อาร์เรย์มากจากชนิดข้อมูลเดียวกันคือ System.Array • พร๊อบเพอร์ตี้ ที่ใช้ทั่วไป คือ การหาขนาดจำนวนหน่วยในอาร์เรย์ ใช้ Length • สำหรับเมธอดทั่วไป ที่น่านำไปใช้คือ GetValue( ) และ SetValue( ) ทั้งสองตัวนี้ใช้สำหรับการเรียกค่า และกำหนดค่า Sort( ) ใช้สำหรับเรียงค่าของอาร์เรย์ที่มีหนึ่งมิติ C# Programming with Visual C# 2010 Express
เมธอดของอาร์เรย์ C# Programming with Visual C# 2010 Express
การเรียกข้อมูลภายในอาร์เรย์การเรียกข้อมูลภายในอาร์เรย์ • การเรียกข้อมูลด้วย สแตทเม้นท์ for{ } ใช้คู่กับพร็อบเพอร์ตี้ Length • การเรียกข้อมูลด้วย สแตทเม้นท์ foreach { } ใช้วนเรียก โดยไม่ต้องทราบทั้งชนิดข้อมูล และขนาดข้อมูลในอาร์เรย์ int[] array = { 1, 2, 3, 4, 5 }; for (int i = 0; i < array.Length; i++) Console.WriteLine(array[i]); int[] array = { 1, 2, 3, 4, 5 }; foreach (var item in array) Console.WriteLine(item); C# Programming with Visual C# 2010 Express
อาร์เรย์ในเมธอด Main( ) • เมธอด Main( ) เป็นเมธอดหลักของ Console Application • เมธอด Main( ) เป็นเหมือนจุดเริ่มต้นการทำงานของแอปพลิเคชัน • เมธอด Main( ) มีตัวแปรเข้า เป็นอาร์เรย์ มีชนิดข้อมูลเป็น string และเป็นตัวแปรเข้าที่สามารถมีได้หลายตัว ดังจำนวนข้อมูลในอาร์เรย์ • เมธอด Main( ) มีการเข้าถึงตัวแปร args ใช้การอ้างอิงแบบอาร์เรย์ทั่วไป เช่น args[0] หมายถึงตัวแปรแรก args[1] เป็นตัวแปรที่สอง • การกำหนดขนาดอาร์เรย์ถูกกำหนดขณะรันไทม์ ด้วยการเรียกโปรแกรมที่เป็นแอสแซมบลีแล้ว • การเรียกให้แอปพลิเคชันนี้ทำงาน เรียกโดยใช้คำสั่ง “app.exe s1, s2” C# Programming with Visual C# 2010 Express
ตัวอย่างการใช้ เมธอด 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(); • } • } C# Programming with Visual C# 2010 Express
ข้อจำกัดของอาร์เรย์ • มีขนาดจำกัด ต้องระบุขนาดอาร์เรย์ก่อนใช้งาน • การเพิ่มขนาดอาร์เรย์ไม่สามารถยืดหยุ่น หรือหดขนาดได้ เมื่อสร้างแล้ว • อาร์เรย์สร้างขึ้นเพื่อเก็บข้อมูลชนิดเดียวเหมือนกันหมดทั้งอาร์เรย์ • ไม่สามารถป้องกันการเขียนทับได้ ข้อจำกัดเหล่านี้แก้ได้ด้วยการใช้ อาร์เรย์ลิสท์ (ArrayList) เป็นคลาสหนึ่งใน ห้อง System.Collection C# Programming with Visual C# 2010 Express
อาร์เรย์ลิสท์ (ArrayList) • ArrayList ที่มีลักษณะยืดหยุ่นสูงกว่า เพราะอาร์เรย์ลิสท์ ใช้งานได้โดยไม่ต้องระบุขนาด หรือจะระบุขนาดก็ได้ สามารถเก็บข้อมูลภายในอาร์เรย์ต่างชนิดกันได้ • การใช้งานต้องอ้างอิง System.Collections หนึ่งใน Collections คือ ArrayList ArrayList al = new ArrayList(); al.Add("string"); al.Add(1); foreach (var item in al) { Console.WriteLine(item); } C# Programming with Visual C# 2010 Express
สรุปท้ายบท • การรู้จักอาร์เรย์ เครื่องมือเป็นพื้นฐานในการเก็บข้อมูล ที่มีขนาดแน่นอน การสร้างจะต้องระบุขนาด และมิติอาร์เรย์ • การะบุขนาดสามารถทำได้ทั้งขณะคอมไพล์ไทม์ และรันไทม์ • การใช้งานอาร์เรย์ มีพร็อบเพอร์ตี้และเมธอดของอาร์เรย์ ต่างๆ เช่น Length, Rank, GetValue( ), Clear( ) ทำให้ใช้งานอาร์เรย์ได้เร็วขึ้น • การนำสเตทเม้นท์ for, foreach เพื่อนำข้อมูลในอาร์เรย์มาใช้งาน นอกจากการระบุอาร์เรย์โดยตรง • ArrayList เป็นคลาสประเภท Collection ใช้เก็บข้อมูลได้แบบอาร์เรย์แต่มีความยืดหยุ่นสูงกว่า C# Programming with Visual C# 2010 Express
ทำถามทบทวน • อาร์เรย์มีไว้เพื่ออะไร • คำสั่งต่อไปนี้ผิดพลาดอะไร และควรแก้ไขอย่างไร • 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
คำถามทบทวน • int[ , ] grid = new int [ 3,2 ] เมื่อทดสอบด้วย พร็อบเพอร์ตี้ Rank และ Length จะมีค่าเท่ากับเท่าใด • จงหา 2 วิธีคัดลอกอาร์เรย์ • ใช้เมธอดอะไรเพื่อหาตำแหน่งดัชนีของอาร์เรย์ • ใช้สเตทเม้นท์ใดเพื่อวนซ้ำอาร์เรย์ทุกค่าโดยไม่ต้องทราบขนาดของอาร์เรย์ • อาร์เรย์ลิสท์ ต่างกับ อาร์เรย์ทั่วไปอย่างไร C# Programming with Visual C# 2010 Express