งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

งานนำเสนอกำลังจะดาวน์โหลด โปรดรอ

บทที่ 4 อาร์เรย์ (Array)

งานนำเสนอที่คล้ายกัน


งานนำเสนอเรื่อง: "บทที่ 4 อาร์เรย์ (Array)"— ใบสำเนางานนำเสนอ:

1 บทที่ 4 อาร์เรย์ (Array)

2 วัตถุประสงค์ สามารถใช้งานตัวแปรประเภทอาร์เรย์ 1 มิติ และ 2 มิติได้
เรียนรู้วิธีการเก็บข้อมูลสตริง และฟังก์ชันเกี่ยวกับสตริง

3 เนื้อหาในบทเรียน นิยามของอาร์เรย์ ตัวแปรอาร์เรย์ แบบ 1 มิติ
การเข้าถึงค่าในอาร์เรย์ การให้ค่าเริ่มต้นกับอาร์เรย์ การรับและแสดงค่าอาร์เรย์ สายตัวอักษร (String) ตัวแปรอาร์เรย์แบบหลายมิติ

4 1. นิยามของอาร์เรย์ ตัวแปรชุด หรือ อาร์เรย์ (Array) คือกลุ่มข้อมูลที่ประกอบไปด้วยข้อมูลชนิดเดียวกัน เรียงต่อเนื่องกันไปเป็นกลุ่ม โดยจัดอยู่ในบล็อกของหน่วยความจำเดียวกัน และใช้ชื่อตัวแปรร่วมกันในการอ้างอิงถึง ข้อมูลแต่ละบล็อกของหน่วยความจำ เรียกว่า อีลีเมนต์ (Element) อย่างเช่น ประกาศตัวแปรชนิดจำนวนเต็ม ชื่อว่า v มีขนาดเท่ากับ 5 int v[5]; v[0] v[1] v[2] v[3] v[4] 3000 3004 3008 3012 3016

5 2. อาร์เรย์แบบ 1 มิติ อาร์เรย์หนึ่งมิติ มีโครงสร้างเทียบเท่าเมตริกซ์ขนาด nx1 การประกาศตัวแปรอาร์เรย์ จะใช้เครื่องหมาย [ ] ล้อมค่าตัวเลขจำนวนเต็ม เพื่อบอกจำนวนหน่วยข้อมูลที่ต้องการได้ในรูป ชนิดของตัวแปร ชื่อตัวแปร [จำนวนสมาชิกที่ต้องการ] ; เช่น int a[5]; double x, y[10], z[3];

6 ขนาดของตัวแปรอาร์เรย์ (ในหน่วยไบต์)
เราสามารถหาขนาดของอาร์เรย์ที่ถูกจัดเก็บที่หน่วยความจำ (memory) ในหน่วยไบต์ได้โดยใช้ sizeof ตัวอย่างเช่น int numbers[10]; printf (“%d”, sizeof (numbers)); ขนาดของตัวแปรชนิดอาร์เรย์ชื่อ numbers คือ 10 * 4 = 40 ไบต์ ขนาดของอาร์เรย์ ขนาดของอาร์เรย์ ขนาดของตัวแปรแบบ int

7 ตัวอย่าง: การดูขนาดอาร์เรย์ 1 มิติในหน่วยไบต์
#include <stdio.h> void main() { int ages[10]; char name[50]; double scores[20]; printf("Size of ages = %d\n", sizeof(ages)); printf("Size of name = %d\n", sizeof(name)); printf("Size of scores = %d\n", sizeof(scores)); } Size of ages = 40 Size of name = 50 Size of scores = 160

8 3. การเข้าถึงตัวแปรอาร์เรย์
เมื่อมีการประกาศอาร์เรย์แล้ว ค่าตำแหน่งหมายเลขลำดับข้อมูลสำหรับใช้เข้าถึงตัวแปรย่อยต่างๆ ในอาร์เรย์ จะถูกกำหนดโดยอัตโนมัติ โดยหากกำหนดอาร์เรย์ด้วยขนาด n ข้อมูล หน่วยแรก จะมีค่าตำแหน่งลำดับเป็น 0 ไปจนถึงข้อมูลหน่วยสุดท้ายจะมีค่าตำแหน่งลำดับเป็น n-1 ถ้าต้องการอ่านหรือเขียนข้อมูลในหน่วยต่างๆ ของตัวแปรอาร์เรย์ จะต้องอ้างชื่อตัวแปรตามด้วยค่าลำดับของหน่วยในกลุ่มข้อมูลอาร์เรย์ ล้อมด้วยเครื่องหมาย [ ] ซึ่งเรียกว่า subscript ค่าหน่วยตัวเลขนี้ อาจป้อนในรูปของตัวแปร นิพจน์ หรือฟังก์ชันที่ให้ค่าเป็นค่าจำนวนเต็มก็ได้

9 การเข้าถึงตัวแปรอาร์เรย์
ลักษณะของอาร์เรย์ 1 มิติ เกิดจากความต้องการนำข้อมูลที่เป็นข้อมูลชนิดเดียวกัน แล้วเก็บไว้ที่เดียวกัน โดยการเรียงข้อมูลนั้นต่อเนื่องกัน อย่างเช่น ประกาศตัวแปรชนิดจำนวนเต็ม เป็นการประกาศตัวแปรชื่อว่า X ที่เป็นชนิดจำนวนเต็ม และมีขนาดเท่ากับ 5 โดยที่ เลข 5 เป็นตัวเลข index เพื่อระบุขนาดของข้อมูลที่ต้องการ โดยสามารถเก็บข้อมูลได้ทั้งหมด 5 ตัวแปร และเริ่มจาก x[0] จนกระทั่งถึง x[4] int x[5]; X[0] X[1] X[2] X[3] X[4]

10 การเข้าถึงตัวแปรอาร์เรย์
2) ประกาศตัวแปรชนิดทศนิยม เป็นการประกาศตัวแปรชื่อว่า y เก็บข้อมูลชนิดทศนิยม และมีขนาดเท่ากับ 6 โดยสามารถเก็บข้อมูลได้ทั้งหมด 6 ตัวแปร และเริ่มจาก y[0] จนกระทั่งถึง y[5] ตัวอย่างข้อมูล เช่น ให้ตัวแปร y[0]=5.50; y[1]=4.0; y[2]=3.0; y[3]=2.0; y[4]=5; y[5]=6.05; จากค่าตัวเลขข้างต้น เป็นเพียงค่าสมมุติ และตัวแปรแต่ละตัวก็เก็บค่าที่เป็นค่าทศนิยม และสามารถเปลี่ยนแปลงค่าได้ตามความต้องการ หรือค่าที่เหมาะสม float y[6]; y[0] y[1] y[2] y[3] y[4] y[5]

11 การเข้าถึงตัวแปรอาร์เรย์
3) ประกาศตัวแปรชนิดตัวอักษร เป็นการประกาศตัวแปรชื่อว่า z เก็บข้อมูลแบบตัวอักษร โดยสามารถเก็บข้อมูลได้ทั้งหมด 3 ตัวแปร และเริ่มจาก z[0] จนกระทั่งถึง z[3] ตัวแปรแต่ละตัว จะเก็บข้อมูลเป็นตัวอักษรเพียง 1 ตัว อย่างเช่น z[0]= ‘A’; z[1]=‘b’; z[2]=‘c’; - หรือ z[2]=z[0]; เพราะฉะนั้น z[2]= ‘A’ ; char z[3]; Z[0] Z[1] Z[2]

12 ตัวอย่างการเข้าถึงตัวแปรอาร์เรย์
เช่น จากโจทย์ที่กำหนด ข้อมูลทำงานตามลำดับหมายเลขจากข้อที่1 ถึง 4 1. ประกาศตัวแปรชนิดจำนวนเต็มชื่อว่า A มีขนาดเท่ากับ 3 int A[3]; 2. ให้ตัวแปร A[0] มีค่าเท่ากับ 50 A[0]=50; 3. ตัวแปร A[1] มีค่าเท่ากับ A[0] บวกกับค่า 100 A[1]= A[0]+100; A[1]=150; 4. ตัวแปร A[2] มีค่าเท่ากับ A[0] บวกกับตัวแปร A[1]; A[2]= A[0]+A[1]; A[2]=200; #include<stdio.h> void main () { int A[3]; A[0]=50; A[1]=A[0]+100; A[2]=A[0]+A[1]; }

13 4. การให้ค่าเริ่มต้น (Array Initialization)
ในการกำหนดค่าเริ่มต้นให้กับตัวแปรอาร์เรย์นั้น สามารถกำหนดไปพร้อมกับการกำหนดตัวแปรได้เช่นเดียวกันกับตัวแปรเดี่ยว แต่จะใช้กลุ่มของค่าคงที่ในการกำหนดค่าเริ่มต้น ชนิดของตัวแปรอาร์เรย์ ชื่ออาร์เรย์[จำนวนข้อมูล] = {ค่าคงที่,ค่าคงที่,…};

14 ตัวอย่างการให้ค่าเริ่มต้น (Array Initialization)
int a[5] = {12,7,0,5,-10} char codes[6] = {‘s’, ‘a’, ‘m’, ‘p’, ‘l’, ‘e’}; double width[7] = {10.96, 6.43, 2.58, 0.86, 5.89, 7.56, 8.22}; float temp[4] = {98.6, 97.2, 99.0 , 101.5}; int gallons[20] = { 19, 16, 14, 19, 20, 18, 12, 10, 22, 15, 18, 17, 16, 24, 23, 19, 15, 18, 21, 5 };

15 การให้ค่าเริ่มต้น (Array Initialization)
ค่าคงที่ที่ใช้ในการกำหนดค่าเริ่มต้น จะต้องมีชนิดสอดคล้องกับชนิดอาร์เรย์ ค่าคงที่แต่ละค่าจะถูกนำไปกำหนดให้กับสมาชิกแต่ละตัวตามลำดับ หากเราใช้ค่าคงที่จำนวนน้อยกว่าสมาชิกของอาร์เรย์ ตำแหน่งที่เหลือจะถูกกำหนดให้เป็น 0 เช่น int a[5] = {12 , 7 }; มีค่าเท่ากับ int a[5] = {12 , 7 , 0 , 0 , 0 };

16 การให้ค่าเริ่มต้น (Array Initialization)
การประกาศตัวแปรแบบอาร์เรย์พร้อมทั้งกำหนดค่าเริ่มต้น สามารถทำได้โดยไม่จำเป็นต้องกำหนดขนาดของอาร์เรย์ก็ได้ คอมไพเลอร์จะหาจำนวนสมาชิกในกลุ่มค่าคงที่เอง เช่น char codes[6] = {‘s’, ‘a’, ‘m’, ‘p’, ‘l’, ‘e’}; char codes[] = {‘s’, ‘a’, ‘m’, ‘p’, ‘l’, ‘e’}; ทั้งสองบรรทัดทำงานเหมือนกัน โดยคอมไพล์เลอร์จะรู้ได้เองว่าขนาดของอาร์เรย์จะมีขนาดเป็น 6 แต่ char codes[ ];

17 การให้ค่าเริ่มต้น (Array Initialization)
ในกรณีให้ค่าเริ่มต้นแก่ตัวแปร char สามารถกระทำได้ดังนี้ด้วย คือ char code[] = “sample”; คอมไพล์เลอร์จะใส่ ‘ \0 ’ หรือเรียกว่า null character ไว้ท้ายข้อความเสมอ

18 ตัวอย่างที่ 1 #include <stdio.h> void main() { int array_A[3] = {1, 2, 3}; int array_B[3] = {8, 9, 10}; printf("Initial value of array_A[0]: %d\n", array_A[0]); printf("Initial value of array_A[2]: %d\n", array_A[2]); printf("Final value of array_B[0]: %d\n", array_B[0]); printf("Final value of array_B[1]: %d\n", array_B[1]); } Initial value of array_A[0]: 1 Initial value of array_A[2]: 3 Final value of array_B[0]: 8 Final value of array_B[1]: 9

19 ตัวอย่างที่ 2 #include <stdio.h> void main() { int array_A[3] = {1, 2, 3}; int array_B[3] = {8, 9, 10}; array_A[2]=5; printf("Initial value of array_A[0]: %d\n", array_A[0]); printf("Initial value of array_A[2]: %d\n", array_A[2]); array_A[2]=10; printf("Final value of array_A[2]: %d\n", array_A[2]); array_A[2]=20; printf("Final value of array_B[1]: %d\n", array_B[1]); } Initial value of array_A[0]: 1 Initial value of array_A[2]: 5 Final value of array_A[2]: 10 Final value of array_B[1]: 9

20 5. การแสดงค่าหรือรับค่าอาร์เรย์ (Input and Output)
ตัวอย่างการรับค่า int grades[3]; double price[3]; char code[2]; scanf(“%d %d %d”, &grades[0], &grades[1], &grade[2]); scanf(“%lf, %lf, %lf”, &price[0], &price[1]), &price[2]); scanf(“%c,%c”, &code[0], &code[1]); scanf(“%d %lf”, &grades[0], &price[2]);

21 การแสดงค่าหรือรับค่าอาร์เรย์ (Input and Output)
ตัวอย่างการแสดงค่า printf(“%d %d %d”, grades[0], grades[1], grade[2]); printf(“%lf, %lf, %lf”, price[0], price[1]), price[2]); printf(“%c,%c”, code[0], code[1]); printf(“%d %lf”, grades[0], price[2]); printf(“%lf”, price[6]); printf(“The value of element is %d”, grades[0]);

22 การใช้คำสั่งวนรอบ for ในการเข้าถึงค่าในอาร์เรย์
1. int grades[3]; scanf(“%d %d %d”, &grades[0], &grades[1], &grade[2]); int grades[3], i; for(i=0;i<3;i++) scanf(“%d”,grades[i]);

23 ตัวอย่างการใช้คำสั่งวนรอบ for กับอาร์เรย์
2. int x[3]={5,10,15}; printf(“%d,%d,%d”, x[0], x[1], x[2]); int i, x[3]={5,10,15}; for ( i = 0 ; i < 3 ; i++) printf(“%d”,x[i]);

24 ตัวอย่างการใช้คำสั่งวนรอบ for กับอาร์เรย์
3. ถ้าต้องการหาผลรวมของตัวแปร grade ทั้ง 3 อีลีเมนต์ ทำดังนี้ int total, grades[3]={10,20,30); total = grades[0] + grades[1] + grades[2]; int i, grades[3]={10,20,30); total = 0; for ( i = 0 ; i <3 ; i++) total += grades[i];

25 ตัวอย่างที่ 1 : การรับค่าและแสดงค่าของอาร์เรย์
ไฟล์ arrayex1.c #include <stdio.h> int main() { int num[4],i; for(i=0;i<4;i++) printf("Enter num[%d]: ",i); scanf("%d",&num[i]); } num[i] = 2*num[i]; printf("num[%d] = %d\n",i,num[i]); return 0; Enter num[0]: 1 Enter num[1]: 2 Enter num[2]: 3 Enter num[3]: 4 num[0] = 2 num[1] = 4 num[2] = 6 num[3] = 8

26 ตัวอย่างที่ 2 : โปรแกรมสำหรับหาค่าสูงสุดในอาร์เรย์
ไฟล์ arrayex2.c #include <stdio.h> int main() { int a[4] = {-1,6,9,2}; int i,max = a[0]; for(i=1;i<4;i++) { if(a[i] > max) max = a[i]; } printf("Maximum value is %d\n" ,max); return 0; Maximum value is 9

27 ตัวอย่างที่ 3 : โปรแกรมสำหรับหาค่าผลบวกในอาร์เรย์
ไฟล์ arrayex3.c #include <stdio.h> #define SIZE 4 int main() { int num[SIZE] = {1,4,5,7}; int i,total = 0; for(i=0;i<SIZE;i++) total = total + num[i]; printf("Sum of all elements = %d\n",total); return 0; } Sum of all elements = 17

28 6. สายตัวอักษร (String) สตริง หรือ สายตัวอักษร คือ ข้อมูลที่ประกอบไปด้วยค่าคงที่ชนิดตัวอักษรเรียงต่อเนื่องกันไป โดยมีจุดสิ้นสุดที่ตัวอักษร Null Character มีรหัสเป็น 0 เสมอ การเก็บข้อมูลสตริง จะใช้ตัวแปรชนิด อาร์เรย์ของตัวอักษร จึงจัดเป็นโครงสร้างของอาร์เรย์ 1 มิติ

29 การประกาศตัวแปรชนิดสตริง
ทำได้เช่นเดียวกับการประกาศตัวแปรอาร์เรย์ 1 มิติ ในการ กำหนดตัวสตริงและมีการกำหนดค่าเริ่มต้นไปพร้อมกันนั้น อาจ ไม่ต้องใส่จำนวนข้อมูลภายในวงเล็บบอกจำนวนสมาชิกก็ได้ เช่น char str1[] ={‘A’, ‘B’, ‘C’, ‘D’, ‘\0’}; char str2[10]={‘A’, ‘B’, ‘C’, ‘D’, ‘\0’}; char str3[] = “ABCD”; ตัวอย่างการประกาศที่ผิด char str4[2] ={‘A’, ‘B’, ‘C’, ‘D’, ‘\0’};

30 จากตัวอย่าง “Hello!” คือ ค่าคงที่สตริง ซึ่งจะเขียนล้อมไว้ด้วย
ตัวอย่างของสตริง char a[7] = “Hello!”; จากตัวอย่าง “Hello!” คือ ค่าคงที่สตริง ซึ่งจะเขียนล้อมไว้ด้วย เครื่องหมาย “ “ ค่าคงที่ “Hello!” ถูกกำหนดให้เป็นค่าเริ่มต้นแก่ตัวแปร a ซึ่งเป็นอาร์เรย์ขนาด 7 หน่วย หลังจากการกำหนดค่าแล้ว ในตัวแปร a จะ มีลักษณะ ดังนี้ ‘H’ ‘e’ ‘l’ ‘o’ ‘!’ ‘\0’ a[0] a[1] a[2] a[3] a[5] a[4] a[6]

31 มีการเก็บข้อมูล ดังรูป
ตัวอย่างของสตริง คอมไพเลอร์จะกำหนดจำนวนพื้นที่ตัวอักษรจากจำนวนตัวอักษรในค่าคงที่ของสตริงรวมกับ ‘\0’ หรืออาจกำหนดพื้นที่ตัวอักษรให้มากกว่าความยาวของสตริงที่ใช้กำหนดเป็นค่าเริ่มต้นได้ เช่น char a[10] = “Hello!”; มีการเก็บข้อมูล ดังรูป ‘H’ ‘e’ ‘l’ ‘o’ ‘!’ ‘\0’ a[0] a[1] a[2] a[3] a[5] a[4] a[6] a[7] a[8] a[9]

32 ตัวอย่าง: การแสดงค่าของสตริง
John F #include <stdio.h> int main() { char name[5] = {'J','o','h','n','\0'} ; char surname[8] = {'F','\0','K','E','N'}; printf("%s\n",name); printf("%s\n",surname); return 0; }

33 ตัวอย่าง: การรับค่าของสตริง
Enter name: John Enter surname: Smith Hello John Smith #include <stdio.h> int main( ) { char n[10],s[10]; printf("Enter name: "); scanf("%s",n); printf("Enter surname: "); scanf("%s",s); printf("Hello %s %s\n" ,n,s); return 0; }

34 การกำหนดค่าให้กับตัวแปรชนิดสตริง
การกำหนดค่าของอาร์เรย์ให้เป็นข้อความ จะไม่สามารถใช้ โอเปอร์เรเตอร์ = ได้โดยตรง เช่น char a[20]; a = “Hello World!”; ถ้าต้องการเก็บข้อความใดๆ ลงในอาร์เรย์ ต้องใช้วิธีการเรียกใช้ฟังก์ชัน เช่น ฟังก์ชันมาตรฐาน strcpy( ) ที่นิยามไว้ใน <string.h>

35 ตัวอย่าง: การกำหนดค่าของสตริงโดยใช้ฟังก์ชัน strcpy()
#include <stdio.h> #include <string.h> int main() { char a[20] = "XXXXXXXXXX"; printf("%s\n", a); strcpy(a, "ABCD"); strcpy(a, " "); return 0; } XXXXXXXXXX ABCD

36 ฟังก์ชันมาตรฐานที่นิยามใน <string.h>
strcpy (char str2[ ], char str1[ ] ) คัดลอกข้อความจาก str1 ไปใส่ใน str2 strlen (char str[ ]) หาความยาวสายอักขระ strcat(char str2[ ], char str1[ ] ) นำข้อมูลจากสายอักขระ str1 ไปใส่ต่อท้ายสายอักขระ str2

37 ฟังก์ชันมาตรฐานที่นิยามใน <string.h>
strcmp (char str1[ ], char str2[ ] ) เทียบค่าสตริงทั้งสอง โดยค่าที่ได้จะมีค่า น้อยกว่า 0 เมื่อ str1[ ] น้อยกว่า str2[ ] เท่ากับ 0 เมื่อ str1[ ] เท่ากับ str2[ ] มากกว่า 0 เมื่อ str1[ ] มากกว่า str2[ ]

38 ตัวอย่าง: การใช้ฟังก์ชันเกี่ยวกับสตริง
#include <stdio.h> #include <string.h> int main() { char name[20]; int len; strcpy(name,"David"); len = strlen(name); printf("Length of %s is %d\n",name,len); return 0; } Length of David is 5

39 ตัวอย่าง: การใช้ฟังก์ชันเกี่ยวกับสตริง
#include <stdio.h> #include <string.h> int main() { char str[] = "CAN"; int i,len = strlen(str); for(i=0;i<len;i++) str[i] = str[i] + 1; printf("%s\n",str); return 0; } DBO

40 ตัวอย่าง: การใช้ฟังก์ชันเกี่ยวกับสตริง
#include <stdio.h> #include <string.h> int main() { char s1[ ] = “abc”; char s2[ ] = “XYZ”; if (strcmp(s1,s2)!=0) printf(“Not equal”); else printf(“Equal”); return 0; } Not equal

41 อาร์เรย์ของสตริง เนื่องจาก String จัดเป็นอาร์เรย์ 1 มิติ
char name[6] = "Nesta"; ดังนั้นอาร์เรย์ของ String จึงต้องมีรูปแบบเป็นอาร์เรย์ 2 มิติ เช่น char names[2][8] ={ "Nesta","Maldini" }; N e s t a \0 M l d i n names[0] names[1]

42 7. อาร์เรย์หลายมิติ อาร์เรย์หลายมิติ (Multi-dimensional array) คือ อาร์เรย์ที่มีสมาชิกเป็นข้อมูลอาร์เรย์ นั่นคือ ในหน่วยข้อมูลแต่ละหน่วยของอาร์เรย์ จะเป็นอาร์เรย์ย่อยๆ ซึ่งอาจจะกำหนดซ้อนลงไปได้หลายชั้น การกำหนดอาร์เรย์หลายมิติ จะกระทำในรูป ชนิดตัวแปร ชื่อตัวแปร[จำนวนสมาชิก][จำนวนสมาชิก]….;

43 ตัวอย่างอาร์เรย์หลายมิติ
เช่น อาร์เรย์ที่มีสมาชิกอยู่ 3 ตัว และสมาชิกแต่ละตัวก็เป็นอาร์เรย์เก็บข้อมูลชนิด int มีจำนวนสมาชิก 2 ตัว จะกำหนดได้ดังนี้ int a[3][2]; a[0][0] a[0][1] a[1][1] a[1][0] a[2][1] a[2][0] a a[0] a[1] a[2]

44 ตัวอย่างอาร์เรย์หลายมิติ
การจัดวางภายในหน่วยความจำ สามารถแสดงได้ดังรูป a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1] a a[0] a[1] a[2]

45 อาร์เรย์แบบ 2 มิติ อาร์เรย์แบบ 2 มิติ มีโครงสร้างคล้ายคลึงกับเมตริกซ์สองมิติ จะเป็นตัวแปรที่มีการอ้างอิงถึงค่าข้อมูลโดยใช้ค่าเลขดัชนี 2 ค่า ซึ่งประกอบไปด้วยค่าดัชนีที่ใช้ในการอ้างอิงในแนวแถว (rows) และค่าดัชนีที่ใช้อ้างอิงในแนวคอลัมน์ (columns) ตัวอย่างข้อมูลอาร์เรย์ 2 มิติ เช่น int val[3][4]; //(4 bytes * 3 * 4 = 48 bytes)

46 ตัวอย่าง: การดูขนาดอาร์เรย์ 2 มิติในหน่วยไบต์
ไฟล์ arrayex11.c #include <stdio.h> int main() { int x[2][5]; char names[3][4]; float nums[2][2]; printf("Size of x = %d\n",sizeof(x)); printf("Size of names = %d\n",sizeof(names)); printf("Size of nums = %d\n",sizeof(nums)); return 0; } Size of x = 40 Size of names = 12 Size of nums = 16

47 อาร์เรย์แบบ 2 มิติ โดยสรุป สำหรับอาร์เรย์สองมิติ เมื่ออ้างชื่ออาร์เรย์ จะหมายถึงตำแหน่งเริ่มต้นของอาร์เรย์ทั้งหมด เมื่ออ้างชื่ออาร์เรย์พร้อมสมาชิกหนึ่งอันดับ จะหมายถึงตำแหน่งเริ่มต้นของอาร์เรย์ย่อยภายใน เมื่ออ้างชื่ออาร์เรย์พร้อมค่าสองอันดับ จะหมายถึง ข้อมูลภายในอาร์เรย์

48 การประกาศตัวแปรอาร์เรย์ 2 มิติ
int val[3][4]; double prices[10][5]; char code[6][4]; code[0][1] code[0][2] code[0][0] code[0][3] code[1][0] code[1][1] code[5][0] . code[5][3]

49 ตัวอย่างการเข้าถึงตัวแปรอาร์เรย์ 2 มิติ
num = val[2][3]; val[0][0] = 62; new_nu = 4 * ( val[1][0] – 5); sum_row0 = val[0][0] + val[0][1] + val[0][2] + val[0][3];

50 การใช้คำสั่ง for ในการเข้าถึงอาร์เรย์ 2 มิติ
ต้องมีตัวนับ 2 ตัว คือ ตัวนับแถวและตัวนับหลัก ตัวอย่างเช่น 1 2 3 int i,j,x[2][3]; for(i=0;i<2;i++) for(j=0;j<3;j++) x[i][j] = i+j;

51 ตัวอย่างที่: การแสดงค่าของอาร์เรย์ 2 มิติ
Display of val array by explicit element ไฟล์ arrayex12.c #include<stdio.h> void main(void) { int i, j, val[3][4] = {8,16,9,52,3,15,27,6,14,25,2,10}; printf("\n Display of val array by explicit element"); printf("\n%2d %2d %2d %2d",val[0][0],val[0][1],val[0][2],val[0][3]); printf("\n%2d %2d %2d %2d",val[1][0],val[1][1],val[1][2],val[1][3]); printf("\n%2d %2d %2d %2d\n",val[2][0],val[2][1],val[2][2],val[2][3]); for ( i = 0; i < 3; ++i) { printf("\n"); /* start a new line for each row */ for ( j = 0; j < 4; ++j) printf("%2d ", val[i][j]); }

52 ตัวอย่าง: การแสดงค่าของอาร์เรย์ 2 มิติ
Display of multiplied elements ไฟล์ arrayex13.c #include <stdio.h> void main() { int i, j, val[3][4] = {8,16,9,52,3,15,27,6,14,25,2,10}; /* multiply each element by 10 and display it */ printf("\n\nDisplay of multiplied elements\n"); for(i =0 ; i < 3 ; ++ i ){ printf("\n"); /* start a new line */ for(j = 0; j < 4; ++j){ val[i][j] = val[i][j] * 10; printf("%3d ", val[i][j]); } /* End for j */ } /* End for i */ } /* End main */

53 ตัวอย่าง: การรับและแสดงค่าของอาร์เรย์ 2 มิติ
ไฟล์ arrayex15.c #include <stdio.h> int main() { int i,j,a[2][3]; for(i=0;i<2;i++) { for(j=0;j<3;j++) { printf("Enter a[%d][%d] : ",i,j); scanf("%d", &a[i][j]); } for(j=0;j<3;j++) printf("%d",a[i][j]); printf("\n"); return 0; Enter a[0][0] : 1 Enter a[0][1] : 2 Enter a[0][2] : 3 Enter a[1][0] : 4 Enter a[1][1] : 5 Enter a[1][2] : 6 123 456

54 การให้ค่าเริ่มต้น (Array Initialization)
เราจะใช้กลุ่มค่าคงที่ที่มีสมาชิกเป็นกลุ่มค่าคงที่ย่อย ซึ่งเป็นชนิดเดียว กันและมีขนาดเท่ากัน รวมถึงสอดคล้องกับชนิดของอาร์เรย์ด้วย โดยใช้เครื่องหมาย {} หรือ , ในการแบ่งแยกแต่ละแถว

55 ตัวอย่างการให้ค่าเริ่มต้น (Array Initialization)
int val[3][4] ={ {8,16,9,52}, {3,15,27,6}, {14,25,2,10} }; int val[3][4] = {8,16,9,52, 3,15,27,6, 14,25,2,10};

56 หากไม่มีการกำหนดจำนวนแถว คอมไพเลอร์จะกำหนดจำนวนแถวโดยนับจากที่กำหนดในค่าเริ่มต้น แต่จะต้องมีการกำหนดจำนวนหลักเสมอ เช่น int a[][2] = {{5,8},{9},{-1}}; 5 8 9 1 -1 2

57 ในการกำหนดค่าเริ่มต้นของอาร์เรย์ 2 มิติ สามารถละเครื่องหมายปีกกาที่ใช้แบ่งแถวได้ โดยใช้จำนวนหลักในการจัดว่าอีลีเมนต์ใดอยู่แถวใด เช่น float x[2][3] = {2.5,1.25,8.6,4.1,6.9,7.2}; 2.5 1.25 4.1 8.6 1 7.2 6.9 2

58 โจทย์ฝึกสมอง: ไฟล์ arrayprac3.c
จงเขียนโปรแกรมสำหรับรับเมตริกซ์ของเลขจำนวนเต็มขนาด 2*2 จำนวน 2 เมตริกซ์ จากนั้นแสดงผลบวกของเมตริกซ์ทั้งสอง ตัวอย่างผลการรันเป็นดังนี้ (ข้อความสีแดงคือค่าที่รับจากผู้ใช้) Enter matrix A: 2 -1 15 9 Enter matrix B: 10 8 3 -7 Matrix A+B: 12 7 18 2

59 #include <stdio.h>
int main() { int A[2][2],B[2][2],i,j; printf("Enter matrix A:\n"); for(i=0;i<2;i++) { for(j=0;j<2;j++) scanf("%d",&A[i][j]); } printf("Enter matrix B:\n" ); scanf("%d",&B[i][j]); printf("Matrix A+B:\n"); printf("%d ",A[i][j] + B[i][j]); printf("\n"); return 0; } // end of main Enter matrix A: 1 2 3 4 Enter matrix B: 5 6 7 8 Matrix A+B: 6 8 10 12

60 อาร์เรย์ที่มากกว่า 2 มิติ
เช่น อาร์เรย์ 3 มิติ int volume[3][4][2]; int i,j,k; for(i=0;i<3;i++) for(j=0;j<4;j++) for(k=0;k<2;k++) val[i][j][k] = 0; อีลีเมนต์แรกคือ val[0][0][0] อีลีเมนต์สุดท้าย val[2][3][1] 4 2 3

61 ความผิดพลาดของโปรแกรมทั่วไปเกี่ยวกับอาร์เรย์
ลืมประกาศตัวแปร ใช้งานตัวแปรอาร์เรย์ นอกเหนือจากขอบเขตที่ประกาศไว้ int error[3] , i; for ( i = 0 ; i <=3 ; i++ ) error[i] = i;

62 ความผิดพลาดของโปรแกรมทั่วไปเกี่ยวกับอาร์เรย์ (ต่อ)
ลืมให้ค่าเริ่มต้นกับตัวแปรอาร์เรย์ แล้วนำตัวแปรนั้นไปใช้งาน int a1 = 5, a2 = 8; int total[2]; total[1] = total[0] + a1 + a2; กำหนดค่าให้กับตัวแปรอาร์เรย์โดยตรง int x[10]; x = 11;

63 ข้อควรระวังการใช้งานอาร์เรย์
เมื่อประกาศตัวแปรอาร์เรย์และกำหนดขนาดของอาร์เรย์แล้ว เราอาจจะเขียนหรืออ่านเกินกว่าสมาชิกของอาร์เรย์ได้ โดยคอมไพเลอร์จะไม่แจ้งเตือนแต่อย่างใด แต่ การเขียนข้อมูลเกินกว่าขนาดของอาร์เรย์ที่จองไว้ จะทำให้ข้อมูลที่เขียนลงไปนั้น จะไปทับข้อมูลอื่น หรือไปทับส่วนของโปรแกรม อันจะทำให้ระบบเสียหายได้

64 โจทย์ฝึกสมอง: ไฟล์ arrayprac4.c
จงเขียนโปรแกรมสำหรับรับข้อความจากผู้ใช้ 4 ข้อความ โดยแต่ละข้อความมีความยาวไม่ถึง 20 ตัวอักษร จากนั้นพิมพ์ค่าความยาวของแต่ละข้อความออกทางหน้าจอ (ฟังก์ชันที่ใช้ในการหาความยาวของข้อความคือ strlen ) ตัวอย่างผลการรันเป็นดังนี้ Enter text 1: Maths Enter text 2: Physics Enter text 3: Chemistry Enter text 4: Biology Maths: 5 Physics: 7 Chemistry: 9 Biology: 7

65 #include <stdio.h> #include <string.h> int main() {
//arrayprac4.c #include <stdio.h> #include <string.h> int main() { char texts[4][20]; int i; for(i=0;i<4;i++) { printf("Enter text %d : ",i+1); scanf("%s",&texts[i]); } for(i=0;i<4;i++) printf("%s : %d\n",texts[i],strlen (texts[i])); return 0; Enter text 1 : Welcome Enter text 2 : Hello Enter text 3 : Bye Enter text 4 : Hi Welcome : 7 Hello : 5 Bye : 3 Hi : 2

66 คำถามท้ายบท (ไฟล์ arrayprob2.c)
จงเขียนโปรแกรมสำหรับรับเมตริกซ์จากผู้ใช้ 1 เมตริกซ์ (ให้ชื่อว่าเมตริกซ์ A) โดยผู้ใช้สามารถกำหนดจำนวนหลักและแถวของเมตริกซ์ได้ (แต่สมมุติว่าผู้ใช้ใส่ค่าจำนวนแถวและจำนวนหลักไม่เกิน 10 ) จากนั้นให้แสดงผลลัพธ์ของเมตริกซ์ 2A ตัวอย่างผลการรันโปรแกรมเป็นดังนี้ (ข้อความสีแดงคือค่าที่รับจากผู้ใช้) Enter number of rows: 2 Enter number of columns: 3 Enter matrix A: 4 3 5 2 9 7 Matrix 2A:


ดาวน์โหลด ppt บทที่ 4 อาร์เรย์ (Array)

งานนำเสนอที่คล้ายกัน


Ads by Google