วันเสาร์ที่ 1 ธันวาคม พ.ศ. 2555

บทที่ 6 - อาเรย์ (Arrays)


หน้าที่ 6 - อาเรย์ (Arrays)
5. ตารางอาเรย์ (Arrays) 


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

Type ArrayName[size];    // Format of Blank array 

Type ArrayNameInitialized[size] = {…};  // Format of initialized array 

int a[5] = {0,0,0,0,0};

double air[5];

char vowel[] = {’A’,’E’,’I’,’O’,’U’};




ในกรณีใช้ตัวแปรดัชนี้ชี้ตำแหน่งข้อมูลในตาราง ค่าของตัวแปรที่จะชี้จะต้องอยู่ในช่วงระหว่าง 0 กับ N-1 โดยที่ N คือขนาดตารางอาเรย์ ดังตัวอย่างที่แสดงในภาพที่ 5.1

5531


ถ้าค่าดัชนีน้อยกว่า 0 หรือมากกว่า N – 1 แล้วโปรแกรมจะทำงานผิดพลาดหรือหยุดทำงาน

การแยกแยะช่องตาราง (Array subscription) ทำได้โดย การใช้ชื่อตัวแปรอาเรย์ ตามด้วย วงเล็บเหลี่ยมที่มีค่าดัชนี (เช่น Data[i], i = 0, 1, 2, … N-1 ) 

การประกาศค่าตั้งต้นให้ตัวแปรอาเรย์สามารถทำได้โดยใช้เครื่องหมายปีกกา ( { } ) หรือจะยกประกาศค่าตั้งต้นที่ละช่องตารางก็ได้ตามความต้องการของผู้ใช้ โดยส่วนที่ ไม่ได้ใส่ค่าตั้งต้นจะมีค่าเป็นศูนย์ (กรณีตารางอาเรย์แบบ int, double, หรือ float) หรือเป็นค่าว่าง ดังตัวอย่างต่อไปนี้

int a[4] = {9, 8, 7}; ซึ่งจะได้ค่าออกมาตรงกัย a[0] = 9; a[1] = 8; a[2] = 7; และ a[3] = 0;



 กรณีที่ตารางมีหลายมิติ จะมีการเรียกใช้ตามรูปแบบตารางมิติเดียวต่อไปนี้ 

ตาราง 2 มิติ: type arrayname2D[size1][size2];

ตาราง 3 มิติ: type arrayname3D[size01][size02][size03];



 การค้นข้อมูลในตารางอาเรย์นั้น สามารถเข้าถึงได้อย่างรวดเร็วไม่ว่าตารางจะใหญ่เพียงไหน เช่น



 const int SIZE = 100; // #define SIZE 100 for C

 float A[SIZE],B[SIZE],C[SIZE];

for(i = 0; i <= SIZE-1; i++)

 {

  C[i] = B[i] – A[i];

}


ในการใช้ตัวแปรอาเรย์เป็นอาร์กิวเมนต์ให้ฟังก์ชันนั้น แบ่งได้หลายกรณีได้แก่


1) กรณีที่จะเอาข้อมูลเฉพาะช่องตาราง จะมีการส่งผ่านข้อมูลในตารางอาเรย์ดังนี้

void main()

{

float X[10], X[0] = 123.23, X[1] = 24.56, X[2] = 45.67; 

float total = sum_element(X[0],X[1],X[2]);

 … 

}

float sum_element(float A, float B, float C)

{

 return (A+B+C);

}


2) กรณีที่ใช้ข้อมูลทั้งตารางอาเรย์ การส่งผ่านข้อมูลในตารางลงในฟังก์ชันจะเป็นดังนี้
void main()

{

float X[10], X[0] = 123.23, X[1] = 24.56, X[2] = 45.67; 

float total = sum_element_array(X)

 … 

}

float sum_element_array(float A[])

{

 int index; float Sum = 0;

 for(index =0; index <= 3-1; index++)

{

  Sum +=A[index];

}

return Sum;

}


3) กรณีที่ใช้ข้อมูลทั้งตารางเพื่อให้ได้ผลลัพธ์ออกมาเป็นตารางอาเรย์ให้ทำดังนี้

void add_arrays(float ar1[],  // input array 1

  float ar2[],  // input array 2

  float ar_sum[],  // Output array

  int N)  // Array Size

{

 for(int i = 0; i <= N-1; i++)

 {

  ar_sum[i] = ar1[i] + ar[2];

}

}


การค้นหาข้อมูลในตาราง (Array searching)
ในการค้นข้อมูลนั้นมักใช้ linear search หาข้อมูลในตารางตามที่ต้องการ โดยกำหนดเงื่อนไขว่า
1) ถ้าหาข้อมูลพบ ให้แสดงดัชนีของค่าที่ค้นพบ ก่อนออกจากวงรอบการค้นหา
2) ถ้าหาข้อมูลไม่พบ ให้ออกจากโปรแกรมแล้วคืนค่า ที่อยู่นอก ขอบเขต 0 – N-1, N คือ ขนาดตารางอาเรย์ (โดยมากให้คืนค่า -1)

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

void BubbleSort(float list[], int N)

{

 int i,j;

 float temp;

 for(i = N-1; i>=0; i--)

 {

  for(j = 1; j <=i; j++)

  {

   if(list[j-1] > list[j])

   {

    temp = list[j-1];

    list[j-1] = list[j];

    list[j] = temp;

}

}



}

}


2) Selection Sort ซึ่งจะเลือกค่าที่ยังไม่ได้สับเปลี่ยนที่น้อยที่สุดเป็นหลัก ในการสลับที่
void SelectSort(float list[], int N)

{

 int i,j, MinIndex;

 float temp;

 for(i = 0; i<=N-2; i--)

 {

  MinIndex = I;

  

for(j = i+1; j <=N-1; j++)

  {

  

   if(list[j] < list[MinIndex])

   {

    minIndex = j 

} 

   

   temp = list[j-1];

   list[j-1] = list[j];

   list[j] = temp;

}

}

}


3) Insertion Sort ซึ่งจะเติมข้อมูลลงในตำแหน่งที่เหมาะสมในขั้นสุดท้าย ซึ่งจะต้องมีตัวแปรอาเรย์ อย่างน้อย 2 ตัว โดยที่อาเรย์ตัวแรกทำหน้าที่ เป็น List เก็บข้อมูล ต้นฉบับ (Source List) และอาเรย์ตัวหลังทำหน้าที่รับข้อมูลที่ผ่านการสับตำแหน่งแล้ว (Sorted List) ในการสับที่กันนั้น จะให้ข้อมูลปัจจุบันเคลื่อนผ่านข้อมูลที่ผ่านการสับตำแหน่งแล้ว จากนั้นจึงลงมือสลับข้อมูลอีกครั้งจนกว่าข้อมูลทั้งหมดจะเข้าที่ 
void insert_sort(float data[], int Size)

{

 int i,j;

 float DatElement;

 for(i=1;i<=Size-1;i++)

 {

  DatElement = data[i];

  j = i;

  while((j >= 1) && data[j-1] >DatElement)

  {

   data[j-1] = data[j];

   j = j-1;

}

data[j] = DatElement;

}

}

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

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

แนะนำ ภาษา C++ เบื้องต้น

แนะนำ ภาษา C++ เบื้องต้น   ประวัติภาษา C , C++ ค . ศ . 1970 มีการพัฒนาภาษา B โดย Ken Thompson ซึ่งทำ งานบนเครื่อง DEC PDP-7 ซึ่ง ...