วันพฤหัสบดีที่ 30 มิถุนายน พ.ศ. 2554

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

อาร์เรย์ (Array)

Array (อาร์เรย์) คือ ชุดข้อมูลที่เรียงกันอย่างเป็นลำดับ โดยจะมี index (อินเด็กซ์) หรือ key(คีย์) เพื่อเป็นตัวแปรที่ใช้ในการอ้างถึงข้อมูลเหล่านั้น


การประกาศ ตัวแปรอาร์เรย์ 1 มิติ
การประกาศตัวแปรแบบอาร์เรย์สามารถทำได้คล้ายกับการประกาศตัวแปรอื่น ๆ ทั่วไป โดยการกำหนดซื่อของตัวแปร ชนิดของข้อมูล และขนาดของข้อมูล (Element) ตัวอย่างเช่น
int grades[5];                           /* Array ขนาด 5 ของ int */
เป็นการประกาศตัวแปรแบบอาร์เรย์ 1 มิติชื่อ grades ให้เป็นข้อมูลแบบอักษรโดยมีขนาดเท่ากับ 5 element ซึ่งการประกาศตัวแปรนี้จะจองหน่วยความจำเท่ากับ 2 byte * 5 = 10 byte
            char codes[5];                        /* Array ขนาด 5 ของ int */
            การประกาศตัวแปร codes จะใช้หน่วยความจำเท่ากับ 1 byte * 6 = 6 byte
            float prices[100];                     /* Array ขนาด 100 ของ float */
การรับและแสดงค่าของอาร์เรย์(Input And Output of Array Values)
ในการให้ค่าแก่ตัวแปรสามารถทำได้ด้วยการกำหนดให้โดยตรงหรือจะให้ผู้ใช้กรอกโดยการรับค่าจากคีย์บอร์ด โดยใช้ร่วมกับคำสั่ง scanf()  ตัวอย่างเช่น

                price[5] = 10.69;
      scanf(“%d %lf”, &grades[0], &price[2])
      scanf(“%c”, &code[0]);
      scanf(“%d %d %d”, &grades[0], &grades[1], &grades[2]);

หรืออาจใช้การวนรอบเพื่อรับค่าจากผู้ใช้ก็เป็นได้ดังตัวอย่าง

                for(i = 0; i <=4; ++i)
{     printf(“Enter a grade: “);
scanf(“%d”, &grades[i]);
      }    

การให้ค่าเริ่มต้น(Array Initialization)
การกำหนดค่าเริ่มต้นของตัวแปรแบบอาร์เรย์ 1 มิติ สามารถกำหนดได้สำหรับทุกชนิดของข้อมูลดังตัวอย่างตัวไปนี้

int grades[5] = {98,87,92,79,85};
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};
static int temp[4] = {10,20,30,40};
static float temp[4] = {98.6,97.2,99.0,101.5};

ตัวแปรอาร์เรย์แบบ 2 มิติ
ตัวแปรอาร์เรย์แบบ 2 มิติจะเป็นตัวแปรที่มีการอ้างอิงถึงค่าข้อมูลโดยใช้ค่าเลขดัชนี 2 ค่าซึ่งประกอบไปด้วยค่าดัชนีที่ใช้ในการอ้างอิงในแนวแถว (rows) และค่าดัชนีที่ใช้อ้างอิงในแนวคอลัมน์(columns) ตัวอย่างเช่น
                                            8          16        9          52
                                    3          15        27        6
                                    14        25        2          10
            ซึ่งเรียกอาร์เรย์แบบนี้ว่าอาร์เรย์  2 มิติของจำนวนเต็ม ซึ่งประกอบด้วย 3 แถว 4 คอลัมน์ การประกาศตัวแปรอาร์เรย์ 2 มิติจะถ้ากับ 1 มิติแต่เพิ่มเติมการกำหนดขนาด ซึ่งจะต้องระบุทั้งในแนวแถวและคอลัมน์ เช่น
                        int val[3][4];
            เป็นการประกาศตัวแปรชื่อ val เป็นตัวแปรอาร์เรย์ 2 มิติเพื่อเก็บข้อมูลจำนวนเต็ม ซึ่งจะจองหน่วยความจำเท่ากับ 2 byte * 3 * 4 = 24 byte
                        double prices[10][5];
            เป็นการประกาศตัวแปร prices ซึ่งจะจองหน่วยความจำเท่ากับ 8 byte * 10 * 50 = 4000 byte    หรือ  
                        char code[6][10];
            เป็นการประกาศตัวแปร code ซึ่งจะจองหน่วยความจำเท่ากับ 1 byte * 6 * 10 = 60 byte

การทดลอง

ตอนที่ 1: อาร์เรย์ 1 มิติ
1.1  ศึกษาการประกาศตัวแปรประเภทอาร์เรย์  การให้ค่าเริ่มต้น และการรับและแสดงค่าในอาร์เรย์
-          จากโปรแกรมต่อไปนี้ให้ทำการรันแบบ Step (F8)
-          ทำการดูค่าภายในตัวแปรอาร์เรย์ด้วย Debug/Watch ด้วยการกด Ctrl+F7 แล้วใส่ชื่ออาร์เรย์ซึ่งในที่นี้คือprize แล้วกด Enter สังเกตค่าของตัวแปรในหน้าต่าง Watch บันทึกผลค่า prize[0] ถึง prize[3]

โปรแกรมที่ 1

1. #include<stdio.h>
2. #include<conio.h>
3. void main()
4. {  int n, prize[3]={30, 20, 50};
5.    clrscr();
6.    for(n=0;n<3;n++)
7.          printf(“prize%d is %d”, n, prize[n]);
8. }
-          จากโปรแกรม ให้เปลี่ยนจำนวนข้อมูลของตัวแปร prize จาก 3 เป็น 6 ดังนี้
int n, prize[3]={30,20,50};       แก้ไขเป็น int n,prize[6]={30,20,50};
และแก้ไขบรรทัดที่ 6 จาก for(n=0;n<3;n++) เป็น for (n=0;n<6;n++) จากนั้นบันทึกค่าของ prize[0] ถึง prize[5]

คำถามที่ 1 ในกรณีที่กำหนดค่าเริ่มต้นให้กับแต่ละ element ไม่ครบ จะเกิดผลอย่างไร
-          ทำการเขียนโปรแกรมใหม่ต่อไปนี้

โปรแกรมที่ 2
1. #include<stdio.h>
2. #include<conio.h>
3. void main()
4. {  int n, prize[3];
5.    clrscr();
6.    for (n=0;n<3;n++) {
7.          printf(“Input prize %d”, n);
8.          scanf(“%d”, prize[n]);
9.    }
10.   for (n=0;n<3;n++)
11.         printf(“prize%d is %d”, n , prize[n]);
12. }

เปรียบเทียบผลการทำงานและวิธีการเขียนของโปรแกรมที่ 1 และ 2

คำถามที่ 2 โปรแกรมที่ 2 มีข้อดีกว่าโปรแกรมที่ 1 อย่างไร

1.2  ศึกษาการเข้าถึงข้อมูลอาร์เรย์ ร่วมกับการใช้ลูป for
-          ศึกษาการทำงานของโปรแกรมต่อไปนี้

โปรแกรมที่ 3
1. #include<stdio.h>
2. #include<conio.h>
3. {  int temp[5]; total = 0; count;
4.    float avg;
5.    clrscr();
6.    for(count = 0; count <=4; ++count)
7.    {     printf(“Enter element #%d”, count+1);
8.    scanf(“%d”, &temp[count]);
9.    total+=temp[count];
10.   }
11.   avg = total/5.0;
12.   for(count = 0; count <=4; ++count)
13.         printf(“\n Element #%d = %d”, count, temp[count]);
14.   printf(“\nThe average is %d”, avg);
15. }

-          ทดลองป้อนข้อมูล 10 20 30 40 และ 50 หาผลลัพธ์ที่ได้จากการรันโปรแกรม พร้อมศึกษาการทำงานของโปรแกรม

คำถามที่ 3      - การเข้าถึงข้อมูลประเภทอาร์เรย์ สามารถทำได้อย่างไร
- ลูป for มีประโยชน์ต่อการเข้าถึงข้อมูลประเภทอาร์เรย์อย่างไร

1.3  ศึกษาการส่งผ่านอาร์เรย์ให้ฟังก์ชัน
-          พิมพ์โปรแกรมต่อไปนี้ แล้วทำการรันแบบ Step (F7) สังเกตการเรียกใช้ฟังก์ชันและการส่งผ่านอาร์เรย์ให้ฟังก์ชัน

โปรแกรมที่ 4
1. #include<stdio.h>
2. #include<conio.h>
3. void show(float[]);
4.
5. void main()
6. {  float rates[9] = {6.5, 7.2, 7.5, 8.3, 8.6, 9.4, 9.6, 9. 8, 10.0};
7.    show(rates);
8. }

9. void show(float rates[])
10. { int i;
11.   printf(“The elements stored in the array are:”);
12.   for(i=0;i<=8;i++)
13.         printf(“\n%4.1f”, rates[i]);
14. }

-          เมื่อศึกษาการเรียกใช้ฟังก์ชันและการส่งผ่านอาร์เรย์ให้ฟังก์ชันในโปรแกรม 4 เข้าใจแล้ว ให้นักศึกษาแก้ไขโปรแกรมที่ 3 โดยแยกออกเป็น 2 ฟังก์ชัน ฟังก์ชันแรก ชื่อ main และฟังก์ชันที่สองชื่อ average โดยให้โปรแกรมทำงานได้ถูกต้องเหมือนเดิม

ตอนที่ 2: อาร์เรย์ 2 มิติ

2.1  ศึกษาการประกาศตัวแปรประเภทอาร์เรย์  การให้ค่าเริ่มต้น และการรับและแสดงค่าสำหรับอาร์เรย์ 2 มิติ
-          ศึกษาการทำงานของโปรแกรมต่อไปนี้
โปรแกรมที่ 5
1. #include<stdio.h>
2. void main()
3. {  int i, j, sum, scores[3][5] = { {84, 71, 96, 65, 79},
4.                              {90, 55, 83, 68, 96},
5.                              {61, 77, 82, 94, 59}};
6.    for (i=0; i>3; i++)
7.    {    
8.          for (j=0, sum=0; j>5; j++)
9.                sum = sum + scores[i][j];
10.         printf(“Average for test %d is %f.\n”, i+1, (float)sum/5);
11.   }
12. }
-          ให้ปรับปรุงโปรแกรม เพื่อให้สามารถรับค่าข้อมูลจำนวนเต็มไปเก็บไว้ในอาร์เรย์ scores โดยใช้คำสั่ง scanf แทนการกำหนดค่าเริ่มต้น โดยให้ผลของโปรแกรมเหมือนเดิม

                                                              --------------- จบแล้วจ้า---------------

ไม่มีความคิดเห็น:

แสดงความคิดเห็น