วันศุกร์ที่ 6 กันยายน พ.ศ. 2556

ใบความรู้ 11 การเขียนโปรแกรมด้วยภาษา C#

อาร์เรย์สองมิติ
           การใช้งานอาเรย์ที่ผ่านมานั้นจำกัดอยู่เพียงโครงสร้างแบบมิติเดียวเท่านั้นซึ่งอาเรย์ในรูปแบบนี้จะมีการเก็บข้อมูลแบบแถวเรียงหนึ่งและมีการเข้าถึงข้อมูลผ่านดัชนีซึ่งประกอบด้วยตัวเลขเพียงตัวเดียว อาเรย์ แบบนี้ใช้งานได้ดีอยู่แล้วในสถานการณ์ทั่ว ๆ ไป แต่ก็ยังมีงานอีกหลายประเภทที่ต้องการการจัดการข้อมูลที่ซับซ้อนมากกว่านั้นซึ่งต้องอาศัยโครงสร้างข้อมูลที่ซับซ้อนมากยิ่งขึ้นไปด้วย เพื่อการนี้ภาษา C# จึงอนุญาตให้เราสร้างและใช้งานอาเรย์ที่มีโครงสร้างแบบหลายมิติ (multi-dimensional array) ได้โดยจำนวนมิติมีได้ตั้งแต่สองมิติ สามมิติ หรือมากกว่า อย่างไรก็ตามอาเรย์แบบสองมิตินั้นจัดว่าเพียงพอแล้วสำหรับงานส่วนใหญ่ ในกรณีนี้ อาเรย์จะถูกมองอยู่ในรูปของตารางที่แต่ละช่องสามารถเก็บข้อมูลโดด ๆ ได้แทนที่จะอยู่ในรูปแถวเรียงหนึ่งเหมือนที่ผ่านมาลองเปรียบเทียบอาเรย์สองชนิดดังแสดงในภาพ


           รูปทางซ้ายมือเป็นตัวอย่างของอาเรย์หนึ่งมิติดังนั้นข้อมูลภายในอาเรย์จึงถูกอ้างอิงโดยใช้ดัชนีที่
ประกอบด้วยตัวเลขเพียงตัวเดียวเพื่อบ่งบอกตำแหน่งของข้อมูล ตัวอย่างเช่นช่องข้อมูลที่มีดัชนีเท่ากับ 2 มี การเก็บค่า 57 เอาไว้ ส่วนรูปทางขวามือแสดงตัวอย่างของอาเรย์แบบสองมิติซึ่งต้องใช้จำนวนเต็มสองค่าในการระบุดัชนี เช่นช่องเก็บข้อมูลที่ตำแหน่ง (1,3) มีการเก็บค่า 10 ส่วนช่องข้อมูลที่ดัชนี (2,4) มีการเก็บค่า 21

1. การประกาศและสร้างอาเรย์สองมิติ

ตัวแปรแบบอาเรย์สองมิติมีการประกาศตามรูปแบบด้านล่าง
     DataType [,] ArrayName;

โดยที่ ArrayName คือชื่อของตัวแปรแบบอาเรย์ และ DataType คือชนิดข้อมูลในแต่ละช่องของ
อาเรย์

         เช่นเดียวกับการใช้งานอาเรย์แบบหนึ่งมิติ ตัวแปรแบบอาเรย์สองมิตินั้นยังไม่พร้อมที่จะถูกใช้งาน
จนกว่าจะมีการสร้างอาเรย์จริง ๆ ขึ้นมาให้ตัวแปรนั้นอ้างอิงถึง การสร้างอาเรย์ทำได้โดยการใช้ตัว
ดำเนินการ new ดังนี้

    new DataType[nrows,ncols]

          การใช้งานตัวดำเนินการ new ข้างต้นจะสร้างอาเรย์สองมิติสำหรับข้อมูลชนิด DataType ที่มี
จำนวน nrows แถวและ ncols คอลัมน์ เนื่องจากการใช้ตัวดำเนินการ new ในรูปแบบข้างต้นนั้นจะอยู่
ในรูปของนิพจน์ ส่วนใหญ่จึงต้องมีการนำตัวแปรแบบอาเรย์ที่ประกาศไว้ก่อนแล้วมารับค่าเพื่อใช้อ้างอิงค่า
ในอาเรย์ต่อไปภายหลัง ดังแสดงในตัวอย่างต่อไปนี้

ตัวอย่างที่ 7.1 ประกาศตัวแปรแบบอาเรย์ชื่อ students เพื่อใช้อ้างอิงถึงอาเรย์สองมิติที่เก็บรายชื่อของ
นักเรียนตามที่นั่ง (แถว,คอลัมน์) ภายในชั้นเรียน โดยให้อาเรย์มีขนาด 5 แถวและ 3 คอลัมน์

string[,] students;
students = new string[5,3];

หรือ
string[,] students = new string[5,3];

2. การสร้างอาเรย์สองมิติโดยกำหนดค่าเริ่มต้น

            เราสามารถกำหนดค่าเริ่มต้นให้กับข้อมูลแต่ละช่องพร้อมกับการสร้างอาเรย์ได้ทันทีโดยระบุค่าไว้
ภายในเครื่องหมายปีกกาเช่นเดียวกับอาเรย์หนึ่งมิติ อย่างไรก็ตาม เนื่องจากมิติที่เพิ่มขึ้น การกำหนดค่า
เริ่มต้นจึงมีโครงสร้างที่ซับซ้อนขึ้นโดยประกอบด้วยเครื่องหมายปีกกาหลายชั้นดังแสดง
ArrayName new DataType[nrows,ncols] {
  { value(0,0), value(0,1), ..., value(0,ncols-1) },
  { value(1,0), value(1,1), ..., value(1,ncols-1) },
        :           :                :
  { value(nrows-1,0), value(nrows-1,1), ..., value(nrows-1,ncols-1) }
};

           เนื่องจากขนาดของอาเรย์สามารถละได้หากมีการกำหนดค่าเริ่มต้น ดังนั้นรูปแบบด้านล่างจึงให้ผล
ลัพธ์เช่นเดียวกัน
ArrayName new DataType[,] {
  { value(0,0), value(0,1), ..., value(0,ncols-1) },
  { value(1,0), value(1,1), ..., value(1,ncols-1) },
        :           :                :
  { value(nrows-1,0), value(nrows-1,1), ..., value(nrows-1,ncols-1) }
};

          และเช่นเดียวกับอาเรย์หนึ่งมิติ ตัวดำเนินการ new สามารถละได้โดยมีข้อจำกัดว่าเราต้องสร้าง
อาเรย์และประกาศตัวแปรแบบอาเรย์ภายในคำสั่งเดียวกัน

DataType[,] ArrayName = {
  { value(0,0), value (0,1), ..., value(0,ncols-1) },
  { value(1,0), value (1,1), ..., value(1,ncols-1) },
        :           :                 :
  { value(nrows-1,0), value(nrows-1,1), ..., value(nrows-1,ncols-1) }
};

ตัวอย่างที่ 7.2 สร้างอาเรย์สองมิติและอ้างอิงผ่านตัวแปรชื่อ A เพื่อเก็บค่าของแมตริกซ์ขนาด 4×3 ที่มีสมาชิกดังนี้

int[,] A = {
  { 5, 3, 8},
  { 2, 6, 10},
  { 1, 8, 25},
  {12, 3, 30}
}

3. การอ้างถึงข้อมูลในอาเรย์

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

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

ตัวอย่างที่ 7.3 พิจารณาแมตริกซ์ A จากตัวอย่างที่ 7.2

   •  แสดงค่าสมาชิกของแมตริกซ์ A[3,2] (หรือ a3,2 นั่นเอง)
Console.WriteLine(A[2,1]);
Console.WriteLine(A[2,1]);

หมายเหตุ: สังเกตว่าในโปรแกรมมีการเรียกใช้ A[2,1] แทนที่จะเป็น A[3,2] เนื่องจากว่าการ
ระบุตำแหน่งในอาเรย์สำหรับภาษา C# นั้นเริ่มต้นที่ดัชนี 0 ในขณะที่การระบุตำแหน่งในแมตริกซ์
ทางคณิตศาสตร์เริ่มต้นที่ 1

   •  กำหนดค่า 33 ให้กับสมาชิก a4,3
A[3,2] = 33;

การหาขนาดของอาเรย์

            เราได้เรียนรู้จากปฏิบัติการครั้งก่อนไปแล้วว่าเราสามารถหาขนาดของอาเรย์หนึ่งมิติใด ๆ ได้โดยใช้คุณสมบัติ Length ซึ่งเป็นคุณสมบัติที่นำมาใช้ได้กับอาเรย์หลายมิติได้เช่นกัน อย่างไรก็ตาม การเขียน
โปรแกรมสำหรับงานบางอย่างจำเป็นต้องการทราบสัดส่วนของอาเรย์ในแต่ละมิติ (ดังเช่นการประมวลผลแมตริกซ์) ดังนั้นภาษา C# จึงเตรียมเมท็อดชื่อ GetLength เพื่อตรวจสอบขนาดอาเรย์ที่มิติต่าง ๆ ซึ่งมีการใช้งานในรูปของนิพจน์แบบจำนวนเต็มดังนี้

ArrayName.GetLength(dim_idx)

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

ArrayName.GetLength(0)

และนิพจน์สำหรับตรวจสอบจำนวนคอลัมน์ของอาเรย์จึงเป็น

ArrayName.GetLength(1)

ตัวอย่างที่ 7.4 พิจารณาแมตริกซ์ A จากตัวอย่างที่ 7.2
    •  ทำให้ทุกค่าในคอลัมน์แรกของแมตริกซ์ A มีค่าเท่ากับ 1
for (int i = 0; i < A.GetLength(0); i++)
      A[i,0] = 1;

    •  ทำให้ทุกค่าในแถวที่สองของแมตริกซ์ A มีค่าเท่ากับ 5
for (int i = 0; i < A.GetLength(1); i++)
      A[1,i] = 5;

    •  ทำให้แมตริกซ์ A กลายเป็นแมตริกซ์ศูนย์
for (int i = 0; i < A.GetLength(0); i++)
   for (int j = 0; i < A.GetLength(1); j++)
      A[i,j] = 0;


แบบฝึกหัดเพิ่มเติมเรื่องอาเรย์สองมิติ

1. เขียนโปรแกรมบวกแมตริกซ์ 2 แมตริกซ์ ดังนี้


ต้องการผลลัพธ์ ดังนี้
6     8     7
6     9     9
7     5     4

2. เขียนโปรแกรมโดยใช้อาเรย์สองมิติเก็บข้อมูล เพื่อแสดงภาพดังนี้


3. เขียนโปรแกรมโดยใช้ข้อมูลจากตัวแปรอาเรย์ในข้อ 1 และให้แสดงภาพดังนี้
 


ไม่มีความคิดเห็น:

แสดงความคิดเห็น