Transcript อาเรย์
อาเรย์ (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 จะเป็ นค่าคงที่เท่านั้น
ตัวอย่าง
int billy [5];
float c [12], x[27];
การกาหนดค่าเริ่ มต้นในอาเรย์ (Array Initialization)
ค่าของแต่ละสมาชิกในอาเรย์หลังจากการประกาศใช้ นัน้ มักจะไม่ใช่คา่ ทีเ่ ราต้องการ
ดังนัน้ เราควรจะมีการใส่คา่ เริม่ ต้นไปในอาเรย์ โดยมีอยูส่ องวิธหี ลักๆคือ
วิธีแรก การกาหนดค่าเริม่ ต้นพร้อมกับการประกาศ อาทิเช่น การกาหนดให้ อาเรย์
billy มีคา่ เป็ นดัง
int billy [5] = {16, 2, 77, 40, 12071 };
นอกจากนัน้ ผลทีเ่ กิดขึน้ สาหรับชุดคาสังในแต่
่
ละชุดด้านล่างเป็ นดังนี้
n มีสมาชิก 5 ตัว
int n[10] = { 1 };
int n[] = {1, 2, 3, 4, 5};
int n[5] = { 32, 27, 64, 18, 95, 14 };
{1,0,0,….,0}
Error!
การกาหนดค่าเริ่ มต้นในอาเรย์ (Array Initialization)
วิธีการทีส่ อง คือทาการเริ่ มต้นค่าในโปรแกรมอาทิเช่น
การกาหนดให้ค่าเริ่ มต้นของสมาชิกทั้ง 10 ใน อาเรย์ n มีค่าเป็ น 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) เพื่อประหยัดเวลา
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 */
โปรแกรมนี้ ซึ่งมีผลลัพธ์ ด้านขวา
มีการใช้ SIZE ทั้งหมด 3 ที่
ผลลัพธ์
Element
0
1
2
3
4
5
6
7
8
9
Value
2
4
6
8
10
12
14
16
18
20
เมื่อเรากาหนดให้ ค่าคงที่ SIZE เป็ น 10 เมื่อมีความจาเป็ นต้อง
เปลี่ยนขนาด เราจะเปลี่ยนเพียง 1 ที่ ด้านบน
การใช้ คา่ ต่างๆในอาเรย์
รู ปแบบการใช้ค่าต่างๆในอาเรย์คือ name [index]
ตัวอย่างเช่น billy[2] = 75;
กาหนดให้ สมาชิกที่ 3 ใน billy มีค่าเป็ น 75
และ
a= billy[2];
เป็ นการผ่านค่าดังกล่าวไปยังตัวแปร a
ข้ อควรระวังเมื่อใช้ อาเรย์
เนื่องจากอาเรย์ใน ภาษา C นั้นไม่มีการตรวจสอบขอบเขตของอาเรย์ ดังนั้นเราสามารถ
ทาข้อผิดพลาดโดยการอ้างเกินขอบเขตที่กาหนดไว้ได้อาทิ เช่น billy[6] เป็ นต้น
ตัวอย่างการใช้ อาเรย์เพื่อหาผลรวม
# 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() เช่นกัน
price[5] = 10.69;
scanf(“%d %lf”, &grades[0], &price[2])
scanf(“%d”, &code[0]);
scanf(“%d %d %d”, &grades[0],
&grades[1], &grades[2]);
หรือการวนรอบเพือ่ รับค่าจากผูใ้ ช้กเ็ ป็นได้
ดังตัวอย่าง
for(i = 0; i <5; ++i)
{
printf(“Enter a grade: ” );
scanf(“%d”, &grades[i]);
}
จะเป็ นการวนรอบรับค่า grade จากผูใ้ ช้
จานวน 5 ค่าและเก็บไว้ในอาเรย์ grades
แบบฝึ กหัดในชันเรี
้ ยน
จงสร้ าง ตัวเลขสุ่ มระหว่าง 0 ถึง 1 ขึ้นมาทั้งหมด 10,000 ตัว และแบ่งช่วง [0,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
บางส่วนของโปรแกรม
การนับจานวนตัวเลขสุม่
ในช่วง [0,1]
#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;
}
การใช้ งานอาเรย์ของตัวอักษร (Strings)
การใช้อาเรย์นนั ้ ไม่ได้ถกู จากัดอยูเ่ พียงข้อมูลทีเ่ ป็ นตัวเลขเท่านัน้ ยังสามารถนามาใช้ได้กบั
ตัวอักษร หรือ 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 อัตโนมัติ
การใช้ String สาหรับ อินพุต
•เราสามารถทีจ่ ะรับค่าอินพุตสตริงจากคียบ์ อร์ดแล้วเก็บในอาเรย์ของตัวอักษร
ได้โดยใช้ scanf และการใช้การกาหนดรูปแบบ %s ตัวอย่างเช่น
ประกาศอาเรย์ตวั อักษร
char string2[10]
และรับข้อมูล
scanf( “%s”, string2 );
จะใช้เพือ่ เก็บตัวอักษร ไม่เกิน 9 ตัวจากคียบ์ อร์ด และเก็บไว้ในตัวแปร
string2
• ในกรณีทอ่ี นิ พุตมีขนาดเกินกว่าทีก่ าหนดไว้ ข้อมูลทีอ่ ยู่ในตาแหน่งต่อไป
string2[10], string2[11],… ทีเ่ กินมาจะถูกลบไปอย่างไม่ตงั ้ ใจได้
การใช้ String สาหรับ อินพุต
char string2[10]
scanf( “%s”, string2 );
นอกจากนัน้ จะสังเกตได้วา่ string2 นัน้ ถูกใช้โดยไม่ตอ้ งมีเครื่องหมาย &
นาหน้า ดังเช่นในอินพุตประเภทอื่นๆ เพราะ string2 นัน้ ระบุตาแหน่งของ
ข้อมูลไว้เรียบร้อยแล้ว
แบบฝึ กหัด
จงเขียนโปรแกรมทีอ่ ่านข้อมูลจากคียบ์ อร์ด และพิมพ์ขอ้ มูลนัน้ กลับออกไปแบบ
ย้อนกลับ อาทิเช่น เมือ่ อินพุตคือ
Test data
เอาท์พุตควรเป็ น
atad tseT
สมมุตฐิ านคือ ข้อมูลมีความยาวไม่เกิน 19 ตัวอักษร
อาเรย์ หลายมิติ
อาเรย์ในภาษาซีสามารถมีได้หลายมิติ โดยในที่น้ ีเราจะศึกษาอาเรย์แบบ 2 มิติ ซึ่ง
int jimmy [3][5]
การประกาศ
หมายถึง อาเรย์ ประเภท int ที่มีขนาด 3แถว x 5ตอน ดังรู ป
ดังนั้นข้อมูล jimmy [1][3] หมายถึงข้อมูลแถวที่สองจากด้านบนและแถวที่สี่จากซ้ายมือดังรู ป
การกาหนดค่าในอาเรย์สองมิติ
การกาหนดค่าเริม่ ต้นในตัวแปรอาร์เรย์ 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};
หรือสามารถเขียนได้เป็ น
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 ];
}