การเขียนโปรแกรมภาษา C


     

ตารางอาเรย์ (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



ถ้าค่าดัชนีน้อยกว่า 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;

}

}

TOP