หน้าที่ 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;
}
}

 

This entry was posted in การเขียนโปรแกรมภาษา C เบื้องต้น. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s