ข้อมูลชนิด อาเรย์ ARRAY
นิยาม/ความหมาย (Definition)
อาร์เรย์ เป็นโครงสร้างข้อมูลที่ใช้เก็บข้อมูลชนิดเดียวกัน เป็นกลุ่มหรือชุดที่เรียงติดต่อกันเป็นแถว มีขอบเขตจำกัดและมีขนาดคงที่
ข้อมูลชนิดเดียวกัน คือ ข้อมูลทุกตัวที่อยู่ในอาร์เรย์จะต้องเป็นข้อมูลชนิดเดียวกันเท่านั้น เช่น ถ้าเป็นอาร์เรย์ชนิดจำนวนเต็ม ข้อมูลทุกตัวในอาร์เรย์ก็ต้องเป็นชนิดจำนวนเต็ม ไม่สามารถเก็บข้อมูลต่างชนิดกันได้
อาร์เรย์ เป็นโครงสร้างข้อมูลที่ใช้เก็บข้อมูลชนิดเดียวกัน เป็นกลุ่มหรือชุดที่เรียงติดต่อกันเป็นแถว มีขอบเขตจำกัดและมีขนาดคงที่
ข้อมูลชนิดเดียวกัน คือ ข้อมูลทุกตัวที่อยู่ในอาร์เรย์จะต้องเป็นข้อมูลชนิดเดียวกันเท่านั้น เช่น ถ้าเป็นอาร์เรย์ชนิดจำนวนเต็ม ข้อมูลทุกตัวในอาร์เรย์ก็ต้องเป็นชนิดจำนวนเต็ม ไม่สามารถเก็บข้อมูลต่างชนิดกันได้
อาร์เรย์ 1 มิติ (One-Dimension Array)
รูปแบบการประกาศตัวแปร
รูปแบบการประกาศตัวแปร
การกำหนดค่าเริ่มต้นให้กับอาร์เรย์ 1 มิติ
1. สามารถกำหนดค่าเริ่มต้นให้กับ array ได้ตั้งแต่ตอนประกาศตัวแปร
2. ค่าที่กำหนดต้องอยู่ในเครื่องหมาย { } และถ้ามีมากกว่า 1 ค่า ต้องแยกจากกันด้วยเครื่องหมาย , (comma)
1. สามารถกำหนดค่าเริ่มต้นให้กับ array ได้ตั้งแต่ตอนประกาศตัวแปร
2. ค่าที่กำหนดต้องอยู่ในเครื่องหมาย { } และถ้ามีมากกว่า 1 ค่า ต้องแยกจากกันด้วยเครื่องหมาย , (comma)
3. ถ้าในตอนประกาศตัวแปรอาร์เรย์ไม่กำหนดค่าเริ่มต้นให้กับมันแล้ว ค่าที่อยู่ในตัวแปรจะเป็นค่าที่ค้างอยู่ในหน่วยความจำช่วงที่เราจองไว้เป็นอาร์เรย์นั้น
4. ถ้ากำหนดค่าเริ่มต้นตั้งแต่ตอนประกาศตัวแปรแต่กำหนดไม่ครบ ในกรณีที่เป็นอาร์เรย์แบบตัวเลขทั้งจำนวนเต็มและจำนวนจริง ค่าที่เหลือจะถูกกำหนดเป็น 0 โดยอัตโนมัติ
เช่น float price[5] = {50.5,2.25,10.0} ;
4. ถ้ากำหนดค่าเริ่มต้นตั้งแต่ตอนประกาศตัวแปรแต่กำหนดไม่ครบ ในกรณีที่เป็นอาร์เรย์แบบตัวเลขทั้งจำนวนเต็มและจำนวนจริง ค่าที่เหลือจะถูกกำหนดเป็น 0 โดยอัตโนมัติ
เช่น float price[5] = {50.5,2.25,10.0} ;
5. บางครั้งถ้ากำหนดค่าเริ่มต้นให้แก่อาร์เรย์เลย เราไม่จำเป็นต้องใส่ขนาดของอาร์เรย์ก็ได
เช่น float a[ ] = {1,2,3,4,5} ;
ความหมายคือเป็นการกำหนดตัวแปรอาร์เรย์ของจำนวนจริงแบบ float ขนาด 5 ช่อง
6. แต่ถ้าเรากำหนดตัวแปรอาร์เรย์โดยไม่ใส่ขนาดของอาร์เรย์ และไม่ได้กำหนดค่าเริ่มต้นให้กับมัน
เช่น int a[ ] ; ประกาศผิด!!!
นั่นคือ เราไม่สามารถประกาศตัวแปรอาร์เรย์โดยไม่ใส่ขนาดของอาร์เรย์ได้ ยกเว้นมีการกำหนดค่าเริ่มต้นให้กับมันตั้งแต่แรก
เช่น float a[ ] = {1,2,3,4,5} ;
ความหมายคือเป็นการกำหนดตัวแปรอาร์เรย์ของจำนวนจริงแบบ float ขนาด 5 ช่อง
6. แต่ถ้าเรากำหนดตัวแปรอาร์เรย์โดยไม่ใส่ขนาดของอาร์เรย์ และไม่ได้กำหนดค่าเริ่มต้นให้กับมัน
เช่น int a[ ] ; ประกาศผิด!!!
นั่นคือ เราไม่สามารถประกาศตัวแปรอาร์เรย์โดยไม่ใส่ขนาดของอาร์เรย์ได้ ยกเว้นมีการกำหนดค่าเริ่มต้นให้กับมันตั้งแต่แรก
การอ้างถึงข้อมูลย่อยแต่ละตัว
ใช้เลขจำนวนเต็มทำหน้าที่เป็นดัชนี (index)เพื่อระบุถึงข้อมูลนั้น โดยระบุชื่อตัวแปรอาร์เรย์ แล้วตามด้วยค่าตำแหน่งที่อยู่ของสมาชิก
1. ในภาษาซี ดัชนีเริ่มตั้งแต่ [0] จนถึง [n-1] ( n= จำนวนของสมาชิกในอาร์เรย์ )
2. ตัวอย่าง ให้ aเป็นอาร์เรย์ของ int ขนาด 5 ช่อง โดยแต่ละช่องมีข้อมูล 1, 2, 3, 4, 5 ตามลำดับ
ใช้เลขจำนวนเต็มทำหน้าที่เป็นดัชนี (index)เพื่อระบุถึงข้อมูลนั้น โดยระบุชื่อตัวแปรอาร์เรย์ แล้วตามด้วยค่าตำแหน่งที่อยู่ของสมาชิก
1. ในภาษาซี ดัชนีเริ่มตั้งแต่ [0] จนถึง [n-1] ( n= จำนวนของสมาชิกในอาร์เรย์ )
2. ตัวอย่าง ให้ aเป็นอาร์เรย์ของ int ขนาด 5 ช่อง โดยแต่ละช่องมีข้อมูล 1, 2, 3, 4, 5 ตามลำดับ
เขียนได้เป็น
int a[5];
a[0] = 1;
a[1] = 2;
a[2] = 3;
a[3] = 4;
a[4] = 5;
int a[5];
a[0] = 1;
a[1] = 2;
a[2] = 3;
a[3] = 4;
a[4] = 5;
ข้อสังเกต
1. a[0] , ... , a[4] เปรียบเสมือนตัวแปร int ธรรมดา 5 ตัว นั่นคือสามารถนำมากระทำการต่างๆ ได้เหมือนตัวแปรธรรมดาเช่น
รับข้อมูลเข้าไปเก็บไว้ในอาร์เรย์ a ตำแหน่งที่ 3 สามารถเขียนเป็นคำสั่งได้ดังนี้
scanf ( “%d” , &a[3] ) ;
· i = 3;
a[i] = a[i+1] + a[4] ;
จะหมายถึง
1) กำหนดค่าให้ตัวแปร i เท่ากับ 3
2) นำข้อมูลในอาร์เรย์ a ตำแหน่งที่ i+1 มาบวกกับข้อมูลในอาร์เรย์ a ตำแหน่งที่ 4 แล้วเก็บผลลัพธ์ที่ได้ไว้ในอาร์เรย์ a ตำแหน่งที่ i (นั่นคือ นำ a[4] + a[4] แล้วเก็บผลลัพธ์นี้ไว้ใน a[3] นั่นเอง)
1. a[0] , ... , a[4] เปรียบเสมือนตัวแปร int ธรรมดา 5 ตัว นั่นคือสามารถนำมากระทำการต่างๆ ได้เหมือนตัวแปรธรรมดาเช่น
รับข้อมูลเข้าไปเก็บไว้ในอาร์เรย์ a ตำแหน่งที่ 3 สามารถเขียนเป็นคำสั่งได้ดังนี้
scanf ( “%d” , &a[3] ) ;
· i = 3;
a[i] = a[i+1] + a[4] ;
จะหมายถึง
1) กำหนดค่าให้ตัวแปร i เท่ากับ 3
2) นำข้อมูลในอาร์เรย์ a ตำแหน่งที่ i+1 มาบวกกับข้อมูลในอาร์เรย์ a ตำแหน่งที่ 4 แล้วเก็บผลลัพธ์ที่ได้ไว้ในอาร์เรย์ a ตำแหน่งที่ i (นั่นคือ นำ a[4] + a[4] แล้วเก็บผลลัพธ์นี้ไว้ใน a[3] นั่นเอง)
1. ขนาดของอาร์เรย์จะคงที่ เช่น กำหนดให้อาร์เรย์ N เก็บเลขจำนวนเต็มโดยมีขนาด 50 ช่อง ก็หมายความว่า อาร์เรย์ N จะไปจองเนื้อที่ในหน่วยความจำขนาดที่เก็บจำนวนเต็มได้ 50 จำนวน โดยที่จะเรียงกันไป 50 ช่องติดต่อกัน และจะเก็บมากกว่า 50 ช่องไม่ได้
ตัวอย่าง จากส่วนของโปรแกรม เมื่อ run เสร็จแล้วมีข้อความใดปรากฏบนหน้าจอ
ตัวอย่าง จากส่วนของโปรแกรม เมื่อ run เสร็จแล้วมีข้อความใดปรากฏบนหน้าจอ
ตัวอย่าง จากส่วนของโปรแกรม เมื่อ run เสร็จแล้วอาร์เรย์ a มีค่าเท่าไร
ตัวอย่าง
#include <stdio.h>
#include <conio.h>
void main()
{
int number[5] , i ;
clrscr() ;
for ( i = 0 ; i < 5 ; i++)
{
printf( “input number %d : ” , i+1) ;
scanf( “%d” , &number[i]) ;
}
printf(“Show number descending from your input : ”);
for ( i = 4 ; i >= 0 ; i--)
{
printf(“ %d\t” , number[i]) ;
}
}
#include <stdio.h>
#include <conio.h>
void main()
{
int number[5] , i ;
clrscr() ;
for ( i = 0 ; i < 5 ; i++)
{
printf( “input number %d : ” , i+1) ;
scanf( “%d” , &number[i]) ;
}
printf(“Show number descending from your input : ”);
for ( i = 4 ; i >= 0 ; i--)
{
printf(“ %d\t” , number[i]) ;
}
}
อาร์เรย์ 2 มิติ (Two-Dimension Array)
โครงสร้างอาร์เรย์ 2 มิติจะเป็นอาร์เรย์ของอาร์เรย์ 1 มิติโดยสามารถอธิบายได้ในรูปแบบของตารางที่ประกอบด้วยแถว (row) และคอลัมน์ (column)
รูปแบบ
โครงสร้างอาร์เรย์ 2 มิติจะเป็นอาร์เรย์ของอาร์เรย์ 1 มิติโดยสามารถอธิบายได้ในรูปแบบของตารางที่ประกอบด้วยแถว (row) และคอลัมน์ (column)
รูปแบบ
การกำหนดค่าเริ่มต้นให้กับอาร์เรย์ 2 มิติ
ตัวอย่างรูปแบบที่ 1 int num[2][3] ={11,12,13,21,22,23};
ตัวอย่างรูปแบบที่ 2 int num[2][3] ={{11,12,13},{21,22,23}};
ตัวอย่างรูปแบบที่3 int num[ ][3] = {{11,12,13},{21,22,23}};
โดยที่การประกาศตัวแปรทั้ง 3 รูปแบบให้ผลลัพธ์เหมือนกัน คือ
ตัวอย่างรูปแบบที่ 1 int num[2][3] ={11,12,13,21,22,23};
ตัวอย่างรูปแบบที่ 2 int num[2][3] ={{11,12,13},{21,22,23}};
ตัวอย่างรูปแบบที่3 int num[ ][3] = {{11,12,13},{21,22,23}};
โดยที่การประกาศตัวแปรทั้ง 3 รูปแบบให้ผลลัพธ์เหมือนกัน คือ
ข้อสังเกต อาร์เรย์ขนาด 2 มิติขึ้นไปจะไม่ระบุขนาดได้เฉพาะมิติที่ 1 เท่านั้น ส่วนมิติอื่นๆ ต้องมีการระบุขนาดด้วยทุกครั้ง
ตัวอย่าง จากส่วนของโปรแกรม เมื่อ run เสร็จแล้วมีข้อความใดปรากฏบนหน้าจอ
ข้อควรระวังในการจัดการกับอาร์เรย์
- ภาษาซีไม่มีการตรวจสอบขอบเขตของอาร์เรย์
เช่น int x[3] = {1,2,3} , i;
for ( i=1 ; i<=3 ; i++)
printf( “ %d\t ” , x[i] ) ;
สามารถทำได้ แต่ค่า x[3] ไม่มีจริง
- การกำหนดค่าให้อาร์เรย์แบบเป็นกลุ่ม (เช่นx[]={1,2,3} ) สามารถทำได้เฉพาะตอนประกาศตัวแปรเท่านั้น ในส่วนอื่นของโปรแกรม ไม่สามารถกำหนดค่าแบบนี้ได้
- ภาษาซีไม่มีการตรวจสอบขอบเขตของอาร์เรย์
เช่น int x[3] = {1,2,3} , i;
for ( i=1 ; i<=3 ; i++)
printf( “ %d\t ” , x[i] ) ;
สามารถทำได้ แต่ค่า x[3] ไม่มีจริง
- การกำหนดค่าให้อาร์เรย์แบบเป็นกลุ่ม (เช่นx[]={1,2,3} ) สามารถทำได้เฉพาะตอนประกาศตัวแปรเท่านั้น ในส่วนอื่นของโปรแกรม ไม่สามารถกำหนดค่าแบบนี้ได้
อาร์เรย์หลายมิติ (Multi-Dimension Array)
สมมติประกาศให้ k เป็นตัวแปรอาร์เรย์ 2 มิติ ขนาด 3x2 (หมายถึง 3 แถวและ 2 คอลัมน์)เก็บข้อมูลประเภทจำนวนเต็ม
ดังนั้น จะได้ int k[3][2]; นั่นคือ
สมมติประกาศให้ k เป็นตัวแปรอาร์เรย์ 2 มิติ ขนาด 3x2 (หมายถึง 3 แถวและ 2 คอลัมน์)เก็บข้อมูลประเภทจำนวนเต็ม
ดังนั้น จะได้ int k[3][2]; นั่นคือ
ซึ่งตัวแปร k ที่จัดเก็บอยู่ในหน่วยความจำหลักจริงๆนั้นจะเรียงติดต่อกันไปเป็นแถวยาว (ไม่ได้จัดเก็บอยู่ในรูปแบบตารางจริงๆ) ดังนี้
ดังนั้น เราสามารถสร้างอาร์เรย์ซึ่งมีหลายมิติได้ ไม่ว่าจะเป็นอาร์เรย์ 3 มิติ อาร์เรย์ 4 มิติหรือ 5 มิติ แต่ทั้งนี้ การที่เราประกาศอาร์เรย์ที่มีจำนวนมิติมากๆ ก็จะเป็นผลให้โปรแกรมมีความซับซ้อนมากยิ่งขึ้น ส่งผลให้การแก้ไขต่างๆ เป็นไปได้อย่างลำบาก
ตัวอย่าง การประกาศอาร์เรย์ 3 มิติ
ตัวอย่าง การประกาศอาร์เรย์ 3 มิติ
การอ้างถึงข้อมูลย่อยแต่ละตัว
การอ้างถึงข้อมูลย่อยแต่ละตัวจะคล้ายกับอาร์เรย์ 1 มิติและ 2 มิติ นั่นคือ ใช้ดัชนีในการอ้างถึงโดยในที่นี้จะมีทั้งสิ้น 3 ตัวคือ แถว คอลัมน์
และชั้น
เช่น G[0][1][2] = 50; หมายถึง ให้เก็บ 50 ไว้ในอาร์เรย์ G ตำแหน่งแถว ที่ 0 คอลัมน์ที่ 1 และชั้นที่ 2
การอ้างถึงข้อมูลย่อยแต่ละตัวจะคล้ายกับอาร์เรย์ 1 มิติและ 2 มิติ นั่นคือ ใช้ดัชนีในการอ้างถึงโดยในที่นี้จะมีทั้งสิ้น 3 ตัวคือ แถว คอลัมน์
และชั้น
เช่น G[0][1][2] = 50; หมายถึง ให้เก็บ 50 ไว้ในอาร์เรย์ G ตำแหน่งแถว ที่ 0 คอลัมน์ที่ 1 และชั้นที่ 2