อาเรย์� อาเรย์� (Arrays)(Arrays)
ความหมายของอาเรย� (Definition of Arrays)
อาเรย�ค�อกลุ่��มของตำ�าแหน่�งใน่หน่�วยความจำ�าที่��เก��ยวข�องก�น่โดยมีชื่��อร วมีกั�นและมีชื่น�ดเหมี�อนกั�น
ตำ�วอย�างเช่�น่ ประกาศให�ตำ�วแปรช่��อว�า billy ม�สมาช่%กประเภที่ int 5 ตำ�วสามารถที่�าให�เราสามารถเก(บข�อม*ลุ่ที่�+ง 5 ตำ�วได�โดยใชื่�ชื่��อเพีย์งชื่��อเดย์ว
แตำ�ลุ่ะช่�องว�างใน่ร*ปแสดงถ-งสมาช่%กใน่อาเรย� โดยลุ่�าด�บของสมาช่%กม�ตำ�+งแตำ� 0 ถ-ง 4 ลุ่�าด�บแรกของสมาช่%กอาเรย�น่�+น่ ค�อ 0 เสมอ การที่��จำะอ�างถ-งตำ�าแหน่�งของสมาช่%ก (index) ตำ�วใดใน่อาเรย� ใช่�ช่��ออาเรย�แลุ่ะหมายเลุ่ขระบ�
ตำ�าแหน่�งหร�อลุ่�าด�บของสมาช่%กใน่อาเรย� อาที่%เช่�น่
billy [2]
การประกาศอาเรย� (Declaration of Arrays)การจำะใช่�อาเรย�น่�+น่ตำ�องม�การประกาศก�อน่ใช่�ด�งเช่�น่ ตำ�วแปร
ธรรมดา โดยปรกตำ%อย*�ใน่ร*ปแบบtype name [elements];
ซึ่-�ง name ค�อ ช่��ออาเรย�type หมายถ-งช่น่%ด อาที่%เช่�น่ int, float, ฯลุ่ฯ แลุ่ะ
elements ระบ�จำ�าน่วน่สมาช่%กใน่อาเรย� โดยใน่บที่เร�ยน่น่�+ elements จำะเป1น่ค�าคงที่��เที่�าน่�+น่ตั�วอย์ าง
int billy [5]; float c [12], x[27];
การก�าหน่ดค�าเร%�มตำ�น่ใน่อาเรย� (Array Initialization)ค�าของแตำ�ลุ่ะสมาช่%กใน่อาเรย�หลุ่�งจำากการประกาศใช่� น่� +น่ม�กจำะ
ไม�ใช่�ค�าที่��เราตำ�องการ ด�งน่�+น่เราควรจำะม�การใส�ค�าเร%�มตำ�น่ไปใน่อาเรย� โดยม�อย*�สองว%ธ�หลุ่�กๆค�อ
ว�ธีแรกั การก�าหน่ดค�าเร%�มตำ�น่พร�อมก�บการประกาศ อาที่%เช่�น่ การก�าหน่ดให� อาเรย� billy ม�ค�าเป1น่ด�ง
น่อกจำากน่�+น่ผลุ่ที่��เก%ดข-+น่ส�าหร�บช่�ดค�าส��งใน่แตำ�ลุ่ะช่�ดด�าน่ลุ่�างเป1น่ด�งน่�+
int billy [5] = {16, 2, 77, 40, 12071 };
int n[10] = { 1 };int n[] = {1, 2, 3, 4, 5};int n[5] = { 32, 27, 64,
18, 95, 14 };
{1,0,0,….,0}
n ม�สมาช่%ก 5 ตำ�ว
Error!
การก�าหน่ดค�าเร%�มตำ�น่ใน่อาเรย� (Array Initialization)
ว�ธีกัารที่�สอง ค�อที่�าการเร%�มตำ�น่ค�าใน่โปรแกรมอาที่%เช่�น่การก�าหน่ดให�ค�าเร%�มตำ�น่ของสมาช่%กที่�+ง 10 ใน่ อาเรย� n ม�ค�า
เป1น่ 0
/* initialize elements of array n to 0 */ for ( i = 0; i < 10; i++ ) {
n[ i ] = 0; /* set element at location i to 0 */
/* end for */
การก�าหน่ดขน่าดของอาเรย�ได�ด�วยค�าคงที่��ส�ญลุ่�กษณ์�
(Symbolic Constant) เพ��อประหย�ดเวลุ่าโปรแกัรมีน" ซึ่$�งมีผลล�พีธี�ด�านขวา มีกัารใชื่� SIZE ที่�"งหมีด 3 ที่� ผลล�พีธี�
1 /* Example */ 2 Initialize the elements of array s to the even
integers from 2 to 20 */ 3 #include <stdio.h> 4 #define SIZE 10 5
6 /* function main begins program execution */ 7 int main() 8 { 9 /* symbolic constant SIZE can be used to specify
array size */ 10 int s[ SIZE ]; /* array s has 10 elements */ 11 int j; /* counter */ 12
13 for ( j = 0; j < SIZE; j++ ) { /* set the values */ 14 s[ j ] = 2 + 2 * j; 15 } /* end for */ 16
17 printf( "%s%13s\n", "Element", "Value" ); 18
19 /* output contents of array s in tabular format */ 20 for ( j = 0; j < SIZE; j++ ) { 21 printf( "%7d%13d\n", j, s[ j ] ); 22 } /* end for */ 23
24 return 0; /* indicates successful termination */ 25
26 } /* end main */
Element Value 0 2
1 4
2 6
3 8
4 10
5 12
6 14
7 16
8 18
9 20
เม��อเราก�าหน่ดให� ค�าคงที่�� SIZE เป1น่ 10 เม��อม�ความจำ�าเป1น่ตำ�องเปลุ่��ยน่ขน่าด เราจำะเปลุ่��ยน่เพ�ยง 1 ที่�� ด�าน่บน่
การใช่�ค�าตำ�างๆใน่อาเรย�ร*ปแบบการใช่�ค�าตำ�างๆใน่อาเรย�ค�อ name [index]
ตำ�วอย�างเช่�น่ billy[2] = 75;
ก�าหน่ดให� สมาช่%กที่�� 3 ใน่ billy ม�ค�าเป1น่ 75แลุ่ะ เป1น่การผ�าน่ค�าด�งกลุ่�าวไปย�งตำ�วแปร a
a= billy[2];
ข�อควรระว�งเมี��อใชื่�อาเรย์� เน่��องจำากอาเรย�ใน่ ภาษา C น่�+น่ไม�ม�การตำรวจำสอบขอบเขตำของอาเรย� ด�งน่�+น่เราสามารถที่�าข�อผ%ดพลุ่าดโดยการอ�างเก%น่ขอบเขตำที่��ก�าหน่ดไว�ได�อาที่% เช่�น่ billy[6] เป1น่ตำ�น่
# include <stdio.h>
int billy [] = {16, 2, 77, 40, 12071};int n, result=0;
int main (){ for ( n=0 ; n<5 ; n++ ) { result += billy[n]; } printf("%d \n",result); return 0;}
Output
กัารร�บค าของอาร�เรย์� (Input of Array Values)
ใน่กรณ์�ที่��ก�าหน่ดค�าตำ�วแปรอาเรย�จำากผ*�ใช่�ผ�าน่ค�ย�บอร�ดสามารถที่�าได�โดยใช่�ร�วมก�บค�าส��ง scanf() เช่�น่ก�น่
5 1069price[ ] = . ; (“% %”, &[0], &[2])
scanf(“%d ”, &[0]); scanf(“%d %d %d”,
0&grades[ ], 1&grades[ ],
2&grades[ ]);
หร�อการวน่รอบเพ��อร�บค�าจำากผ*�ใช่�ก(เป1น่ได�ด�งตำ�วอย�าง d d d d d0 5 ; ++){
d (“ drade: ” ); scanf(“%d”,
&grades[i]);}จำะเป1น่การวน่รอบร�บค�า grade จำากผ*�ใช่�จำ�าน่วน่ 5 ค�าแลุ่ะเก(บไว�ใน่อาเรย� grades
แบบฝึ:กห�ดใน่ช่�+น่เร�ยน่จงสร�าง ตำ�วเลุ่ขส��มระหว�าง 0 ถ-ง 1 ข-+น่มาที่�+งหมด 10,000 ตำ�ว
แลุ่ะแบ�งช่�วง [0,1] ออกเป1น่ 20 ช่�วง ความกว�างช่�วงลุ่ะ 0.05. ด�งน่�+น่ช่�วงแรกค�อ [0,0.05] แลุ่ะช่�วงส�ดที่�ายค�อ [0.95,1.00]. จำงน่�บจำ�าน่วน่ตำ�วเลุ่ขส��มที่��อย*�ใน่แตำ�ลุ่ะช่�วงแลุ่ะแสดงผลุ่ด�งด�าน่ลุ่�าง
0.000000-0.050000: 501 0.050000-0.100000: 463 0.100000-0.150000: 476 ... 0.900000-0.950000: 466 0.950000-1.000000: 493
#include <stdio.h> #include <stdlib.h> #include <time.h>
int main() { float r; srand(time(NULL));
int a[20]; /* number of visits for each interval */
/* initialize the array */
/* do a loop from 1 to 10000 here */ { r=1.0*rand()/RAND_MAX;
/* find out which interval r belongs to, then increment the corresponding element in the array */
} /* print out the array */
return 0; }
บางส�วน่ของโปรแกรมการน่�บจำ�าน่วน่ตำ�วเลุ่ขส��มใน่ช่�วง [0,1]
การใช่�งาน่อาเรย�ของตำ�วอ�กษร (Strings)การใช่�อาเรย�น่�+น่ไม�ได�ถ*กจำ�าก�ดอย*�เพ�ยงข�อม*ลุ่ที่��เป1น่ตำ�วเลุ่ขเที่�าน่�+น่ ย�ง
สามารถน่�ามาใช่�ได�ก�บตำ�วอ�กษร หร�อ string อาที่%เช่�น่
char string1[] = “first”;หร�อchar string1[] = { ‘f’, ‘i’, ‘r’, ‘s’, ‘t’,‘/0’};
โดยที่�� string1 ประกอบไปด�วยตำ�วอ�กษร 5 ตำ�วแลุ่ะ ตำ�วอ�กษรพ%เศษที่��ใช่�ใน่การส%+น่ส�ดสตำร%งเร�ยกว�า ตำ�วอ�กษรน่�ลุ่ (Null Character) ด�งน่�+น่อาเรย� string1 จำ-งประกอบด�วยสมาช่%กจำ�าน่วน่หกตำ�ว โดยใช่� ‘ 0\ ’ ส�าหร�บตำ�วอ�กษรน่�ลุ่ สตำร%งที่�กตำ�วใน่ภาษาซึ่�จำะตำ�องป;ดที่�ายด�วยตำ�วอ�กษรน่�ลุ่เสมอ ด�งน่�+น่ string1[0] = ‘f’ แลุ่ะ string1[2] = ‘r’ใน่กรณ์�ที่��เราลุ่�ม อาที่%เช่�น่ใน่ char string1[] = { ‘f’, ‘i’, ‘r’, ‘s’, ‘t’}; ตำ�วอ�กษรน่�ลุ่จำะถ*กน่�าไปตำ�อที่�ายใน่ string1 อ�ตำโน่ม�ตำ%
•เราสามารถที่��จำะร�บค�าอ%น่พ�ตำสตำร%งจำากค�ย�บอร�ดแลุ่�วเก(บใน่อาเรย�ของตำ�วอ�กษรได�โดยใช่� scanf แลุ่ะการใช่�การก�าหน่ดร*ปแบบ %s ตำ�วอย�างเช่�น่ประกาศอาเรย�ตำ�วอ�กษร
char string2[10]แลุ่ะร�บข�อม*ลุ่ scanf( “%s”, string2 );จำะใช่�เพ��อเก(บตำ�วอ�กษร ไม�เก%น่ 9 ตำ�วจำากค�ย�บอร�ด แลุ่ะเก(บไว�ใน่ตำ�วแปร string2
• ใน่กรณ์�ที่��อ%น่พ�ตำม�ขน่าดเก%น่กว�าที่��ก�าหน่ดไว� ข�อม*ลุ่ที่��อย*�ใน่ตำ�าแหน่�งตำ�อไป string2[10], string2[11],… ที่��เก%น่มาจำะถ*กลุ่บไปอย�างไม�ตำ�+งใจำได�
char string2[10]scanf( “%s”, string2 );
น่อกจำากน่�+น่จำะส�งเกตำได�ว�า string2 น่�+น่ถ*กใช่�โดยไม�ตำ�องม�เคร��องหมาย & น่�าหน่�า ด�งเช่�น่ใน่อ%น่พ�ตำประเภที่อ��น่ๆ เพราะ string2 น่�+น่ระบ�ตำ�าแหน่�งของข�อม*ลุ่ไว�เร�ยบร�อยแลุ่�ว
แบบฝึ:กห�ดจำงเข�ยน่โปรแกรมที่��อ�าน่ข�อม*ลุ่จำากค�ย�บอร�ด แลุ่ะพ%มพ�ข�อม*ลุ่
น่�+น่กลุ่�บออกไปแบบย�อน่กลุ่�บ อาที่%เช่�น่ เม��ออ%น่พ�ตำค�อ Test data เอาที่�พ�ตำควรเป1น่ atad tseTสมม�ตำ%ฐาน่ค�อ ข�อม*ลุ่ม�ความยาวไม�เก%น่ 19 ตำ�วอ�กษร
อาเรย์�หลาย์มี�ตั�อาเรย�ใน่ภาษาซึ่�สามารถม�ได�หลุ่ายม%ตำ% โดยใน่ที่��น่�+เราจำะศ-กษาอา
เรย�แบบ 2 ม%ตำ% ซึ่-�งการประกาศหมายถ-ง อาเรย� ประเภที่ int ที่��ม�ขน่าด 3แถว x 5ตำอน่ ด�งร*ป
ด�งน่�+น่ข�อม*ลุ่ jimmy [1][3] หมายถ-งข�อม*ลุ่แถวที่��สองจำากด�าน่บน่แลุ่ะแถวที่��ส��จำากซึ่�ายม�อด�งร*ป
int jimmy [3][5]
การก�าหน่ดค�าใน่อาเรย�สองม%ตำ%การก�าหน่ดค�าเร%�มตำ�น่ใน่ตำ�วแปรอาร�เรย� 2 ม%ตำ%สามารถกระที่�าได�โดยจำะ
เพ%�มส�วน่การแบ�งแยกใน่แตำ�ลุ่ะแถวด�วยเคร��องหมาย “ { }” แลุ่ะ “ ,”เช่�น่
int jimmy 3[ ][5 ] = {{1,2,3,4,5}, {2,4,6,8,10}, {3,6,9,12,15}};
การให�ค�าเร%�มตำ�น่แก�ตำ�วแปรอาร�เรย� 2 ม%ตำ%ย�งสามารถที่��จำะลุ่ะเคร��องหมายป=กกาใน่แตำ�ลุ่ะแถวได�โดยให�ใช่�เคร��องหมายจำ�ลุ่ภาคแที่น่เช่�น่
int jimmy 3[ ][5 ] = {1,2,3,4,5, 2,4,6,8,10, 3,6,9,12,15};
หร�อสามารถเข�ยน่ได�เป1น่ int jimmy[3][5] =
{1,2,3,4,5,2,4,6,8,10,3,6,9,12,15};
#define WIDTH 5 #define HEIGHT 3 int jimmy [HEIGHT][WIDTH]; int n,m; int main () { for (n=0;n<HEIGHT;n++) for (m=0;m<WIDTH;m++) { jimmy[n][m]=(n+1)*(m+1); } return 0; }
ตำารางแสดงค�าที่��เก(บไว�ใน่แตำ�ลุ่ะ
ตำ�าแหน่�งใน่อาเรย� jimmy
โปรแกรมหาผลุ่รวมของสมาช่%กใน่อาเรย�
total = 0;for ( row = 0; row <= HEIGHT; row++ )
for ( column = 0; column <= WIDTH; column++ )
{total += jimmy[ row ][ column ];
}