240 likes | 376 Views
Computer Programming for Engineers. อาเรย์ (Arrays). Arrays of Numbers. ความหมายของอาเรย์ (Definition of Arrays). อาเรย์คือกลุ่มของตำแหน่งในหน่วยความจำที่เกี่ยวข้องกันโดย มีชื่อร่วมกันและมีชนิดเหมือนกัน
E N D
Computer Programming for Engineers อาเรย์ (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 มีค่าเป็นดัง • นอกจากนั้นผลที่เกิดขึ้นสำหรับชุดคำสั่งในแต่ละชุดด้านล่างเป็นดังนี้ intbilly [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 มีค่าเป็น 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 เป็น 10 เมื่อมีความจำเป็นต้องเปลี่ยนขนาด เราจะเปลี่ยนเพียง 1 ที่ ด้านบน
การใช้ค่าต่างๆในอาเรย์การใช้ค่าต่างๆในอาเรย์ • รูปแบบการใช้ค่าต่างๆในอาเรย์คือ name [index]ตัวอย่างเช่น billy[2] = 75; • กำหนดให้ สมาชิกที่ 3 ใน billy มีค่าเป็น 75 และ เป็นการผ่านค่าดังกล่าวไปยังตัวแปร a a= billy[2]; ข้อควรระวังเมื่อใช้อาเรย์ เนื่องจากอาเรย์ในภาษา C นั้นไม่มีการตรวจสอบขอบเขตของอาเรย์ ดังนั้นเราสามารถทำข้อผิดพลาดโดยการอ้างเกินขอบเขตที่กำหนดไว้ได้อาทิ เช่น billy[6] เป็นต้น
ตัวอย่างการใช้อาเรย์เพื่อหาผลรวมตัวอย่างการใช้อาเรย์เพื่อหาผลรวม Output # include <stdio.h> intbilly [] = {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; }
การรับค่าของอาร์เรย์(InputofArrayValues)การรับค่าของอาร์เรย์(InputofArrayValues) ในกรณีที่กำหนดค่าตัวแปรอาเรย์จากผู้ใช้ผ่านคีย์บอร์ดสามารถทำได้โดยใช้ร่วมกับคำสั่ง 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
#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) char string1[] = “first”; หรือ char string1[] = { ‘f’, ‘i’, ‘r’, ‘s’, ‘t’,‘/0’}; • การใช้อาเรย์นั้นไม่ได้ถูกจำกัดอยู่เพียงข้อมูลที่เป็นตัวเลขเท่านั้น ยังสามารถนำมาใช้ได้กับตัวอักษร หรือ string อาทิเช่น โดยที่ 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 ที่มีขนาด 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}; หรือสามารถเขียนได้เป็น • 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 ]; }