อาเรย์ ภาษาซี : 2

สวัสดีครับบทความนี้เป็นยทความที่ต่อจาก บทความ แนะนำอาร์เรย์ นะครับซึ่งบทความนี้จะกล่าวถึง อาร์เรย์ 1 มิติ เอ๋มันคืออะไรเราไปดูกันเลยดีกว่า

อาร์เรย์ 1 มิติ (Array 1D)
       หากกล่าวถึงอาร์เรย์แล้ว อาร์เรย์ก็เปรียบเสมือนห้องสี่เหลี่ยมว่างเปล่าห้องหนึ่งที่ผู้เขียนโปรแกรมสามารถจัดแบ่งห้องอย่างไรก็ได้(กำหนดขนาดอาร์เรย์เป็นกี่ช่องก็ได้)และข้อมูลแต่ละคัวที่จะนำเก็บลงในอาร์เรย์ ก็เปรียบได้กับผู้ที่เข้ามาอาศัยอยู่ในห้องแต่ละห้องนั้นโดยจะต้องระวังใหการจัดการบริหารห้องให้ดี ให้ทุกคนสามารถเข้าไปอยู่ในห้องได้(ต้องกำหนดขนาดของอาร์เรย์ให้เพียงพอกับจำนวนขอมูลที่ต้องการจัดเก็บ)แต่หากแบ่งห้องไว้แล้วมีคนเข้ามาอยู่ไม่ครบก็ไม่เกิดปัญหา(กำหนดขนาดอาร์เรย์ไว้จำนวนหนึ่ง แต่ใช้ไม่ครบตามจำนวนนั้นก็ไม่เป็นไร) เพราะถือคติว่า “เหลือดีกว่าขาด” แต่ควรระวังอย่าให้ห้องเหลือมากเพราะจะสิ้นเปลืองพื้นที่(หน่วยความจำ)โดยเปล่าประโยชน์

การประกาศตัวแปรอาร์เรย์ 1 มิติขึ้นมาใช้งาน
รูปแบบของอาร์เรย์1 มิติ

     

    ชนิดข้อมูล ชื่อตัวแปร[ขนาดของอาร์เรย์]

รูปแบบ
     

เช่น

int n[5]; ประกาศตัวแปร n เป็นอาร์เรย์ชนิดเลขจำนวนเต็มมีขนาด 5 ช่องโดยชนิดข้อมูลแบบเลขจำนวนเต็มประเภท int มีขนาด 2 ไบต์ และกำหนดเป็นอาร์เรย์ขนาด 5 ช่อง ดังนั้นตัวแปร n จึงมีขนาด 10 ไบต์

ภาษา C 

float a[5]; ประกาศตัวแปร a เป็นอาร์เรย์ชนิดเลขจำนวนจริงมีขนาด 5 ช่องโดยชนิดข้อมูลแบบเลขจำนวนจริงประเภท float มีขนาด 4 ไบต์ และกำหนดเป็นอาร์เรย์ขนาด 5 ช่อง ดังนั้นตัวแปร a จึงมีขนาด 20 ไบต์

ภาษา C

char ch[50]; ประกาศตัวแปร ch เป็นอาร์เรย์ชนิดตัวอักษร (เรียกอีกอย่างว่า steing) มีขนาด 50 ช่องโดยชนิดข้อมูลแบบตัวอักษร มีขนาด 1 ไบต์ และกำหนดเป็นอาร์เรย์ ขนาด 50 ช่อง ดังนั้นตัวแปร ch จึงมีขนาด 50 ไบต์

ภาษา C

เรามาดูตัวอย่างโปรแกรมแสดงการหาขนาดของอาร์เรย์กันหน่อยนะครับ

1:   #include<stdio.h>
2:   #include<conio.h>
3:    
4:    
5:      main(){
6:        char ch[20] ;
7:        int n[5];
8:        float a[10];
9:        clrscr();
10:                
11:          printf(" n is 5 element int array(size of int = 2 byte)\n");
12:            printf("So size array n are %d byte\n",sizeof(n));
13:          printf(" a is 10 element float array(size of float = 4 byte)\n");
14:            printf("So size array a are %d byte\n",sizeof(a));
15:          printf(" ch is 20 element char array(size of char = 1 byte)\n");
16:            printf("So size array ch are %d byte\n",sizeof(ch));
17:         getch();
18:         
19:          }

 
ผลลัพธ์โปรแกรม
 
     n is 5 element int array(size of int = 2 byte)
     So size array n are 10 byte
     a is 10 element float array(size of float = 4 byte)
     So size array a are 40 byte
     ch is 20 element char array(size of char = 1 byte)
     So size array ch are 20 byte

อธิบายโปรแกรม โปรแกรมนี้ได้ใช้ฟังก์ชั่นมาตรฐานของภาษาซีคือ sizeof() ในการหาขนาดของอาร์เรย์แต่ละตัว

 
Note
 

การประกาศตัวแปรอาร์เรย์ขึ้นใชงานนั้น จะต้องกำหนดขนาดของอาร์เรย์ที่แน่นอนว่าต้องการอาร์เรย์ขนาดกี่ช่อง และขอมูลที่เก็บลงในอาร์เรย์นั้นต้องเป็นข้อมูลประเภทเดียวกันคือเป็นเลขจำนวนเต็มก็ต้องเป็นเลขจำนวนเต็มเหมือนกันทั้งหมด จึงจะเก็บลงในอาร์เรย์ชุดเดียวกันได้

การกำหนดค่าเริ่มต้นให้กับอาร์เรย์ 1 มิติ
        การกำหนดค่าเริ่มต้นให้กับอาร์เรย์สามารถทำได้โดยทำการกำหนดค่าเริ่มต้นให้กับตัวแปรไปพร้อมๆกับการประกาศตัวแปรขึ้นใช้งานโดยค่าที่ต้องการกำหนดให้อาร์เรย์จะต้องระบุไว้ภายในเครื่องหมาย { } และหากค่าที่ต้องการกำหนดให้อาร์เรย์มีมากกว่า 1 ค่าให้แยกแต่ละค่าออกจากกันด้วยเครื่องหมาย , (comma)

ตัวอย่างการกำหนดค่าเริ่มต้นให้กับอาร์เรย์ 1 มิติ

char ch[3] = { 'a','b' };

ภาษา C

อธิบาย ประกาศตัวแปร ch เป็นอาร์เรย์ชนิดตัวอักษร มีขนาด 3 ช่องโดยกำหนดค่าเริ่มต้นดังนี้
ช่องที่ 1 ch[0]     มีค่าเป็น a
ช่องที่ 2 ch[1]     มีค่าเป็น b
ช่องที่ 3 ch[2]     มีค่าเป็น \0(string จะปิดท้ายด้วย null character เสมอ)

ดูอีกตัวอย่างการกำหนดค่าเริ่มต้นให้กับอาร์เรย์ 1 มิติ เพื่อความเข้าใจ

int n[5] ={1,2,3};
char ch[5] = { 'a','b','c' };

ภาษา C
ภาษา C

อธิบาย

1. ประกาศตัวแปร n เป็นอาร์เรย์ชนิดเลขจำนวนเต็ม มีขนาด 5 ช่องแต่กำหนดค่าเริ่มต้นให้เพียง 3 ช่องแรก เป็น 1,2,3 ตามลำดับ ส่วนอีก2 ช่องที่เหลือถึงแม้จะไม่ได้กำหนดค่าเริ่มต้นให้ แต่ก็ไม่ได้หมายความว่าเป็นค่าว่างนะครับ กล่าวคือ หากอาร์เรย์เป็นชนิดเลขจำนวนเต็ม และไม่ได้มีการกำหนดค่าเริ่มต้นให้กับอาร์เรย์ช่องใด อาร์เรย์ช่องนั้นจะมีค่าเริ่มต้นเป็น 0 โดยอัตโนมัติ

2. ประกาศตัวแปร ch เป็นอาร์เรย์ชนิดตัวอักษร(สตริง) มีขนาด 5 ช่องแต่กำหนดค่าเริ่มต้นให้เพียง 3 ช่องแรก เป็น  a,b,c ตามลำดับซึ่งโดยปกติอาร์เรย์ชนิดตัวอักษร(สตริง)จะปิดท้ายด้วย \0 (null character ) เสมอดังนั้นในที่นี้จะใช้ อาร์เรย์ไปทั้งหมดแค่4ช่องคือ ช่องแรก ch[0]เก็บค่า ‘a’ ช่องสอง ch[1]เก็บค่า ‘b’ ช่องสาม ch[2]เก็บค่า ‘c’ และ ช่องสี่ ch[3]เก็บค่า ‘\0’ (null character ) แต่การประกาศอาร์เรย์ไว้ 5 ช่องยังเหลืออีก1ช่องที่ยังไม่ได้กำหนดค่าให้ ซึ่งก็ไม่ได้เป็นค่าว่างอย่างที่หลายคนเข้าใจ กล่าวคือ เนื่องจากเป็นอาร์เรย์ชนิดตัวอักษร ดังนั้นหากช่องใดเป็นช่องว่างจะทำการกำหนดค่าเริ่มต้นให้กับช่องนั้นเป็น ‘\0’(null character ) โดยอัตโนมัติ

ดูอีกตัวอย่างการกำหนดค่าเริ่มต้นให้กับอาร์เรย์ 1 มิติ เพื่อความเข้าใจ

      int n[ ] ={1,2,3,4};

อธิบาย อย่างที่เคยบอกไว้ว่าการประกาศตัวแปรอาร์เรย์ขึ้นใช้งาน จะต้องกำหนดขนาดของอาร์เรย์ที่แน่นอนทุกครั้ง แต่เราก็ยังสามารถประกาศในรูปแบบด้านบนนี้ได้เช่นกันครับ แต่ต้องกำหนดค่าเริ่มต้นให้กับอาร์เรย์ทั้งหมด เช่นจากด้านบนเรากำหนดให้ 4 ค่า คือ 1,2,3,4 ซึ่งจะเป็นการกำหนดโดยอัตโนมัติว่าอาร์เรย์มีขนาด 4 ช่องนั้นคือ
       int n [ ] = {1,2,3,4};    มีความหมายเหมือนกับ     int n [4] = {1,2,3,4};

 
Note
 

การประกาศตัวแปรอาร์เรย์ขึ้นใชงานนั้น จะต้องกำหนดขนาดของอาร์เรย์ทุกครั้งเช่น
                                                int a[10];
แต่หากประกาศตัวแปรอาร์เรย์ขึ้นใช้งาน พร้อมกับกำหนดค่าเริ่มต้นให้กับอาร์เรย์ อาจไม่ต้องทำการระบุขนาดของอาร์เรย์ได้เช่น
                                          int a[ ]={1,2,3,4,5};
ระวังการใช้งานผิดพลาด
                                          int a[ ];     ผิด
                                          int a[ ]={1,2,3,4,5};    ถูก
การกำหนดค่าเริ่มต้นของอาร์เรย์ยังสามารถเขียนได้อีกรูปแบบนะครับ เช่น
         char ch[3] = {‘a’, ‘b’}; ก็จะเขียนได้อีกแบบว่า char ch[3] = “ab”;
จะเห็นได้ว่าภาษาซีมีความยืดหยุ่นในการใช้งานอาร์เรย์อนุญาตให้ผู้เขียนโปรแกรมไม่ต้องกำหนดขนาดของอาร์เรย์ได้(ในกรณีประการตัวแปรอาร์เรย์พร้อมกำหนดค่า)แต่ต้องระมัดระว้งการใช้งานด้วย

เอาละคราวนี้เรามาดูตัวอย่างโปรแกรมแสดงการกำหนดค่าเริ่มต้นให้อาร์เรย์ 1 มิติ

1:   #include<stdio.h>
2:   #include<conio.h>
3:    
4:    
5:      main(){
6:            int a[3] = {100,200,300};
7:            int b[  ] = {100,200,300};
8:            int i;
9:            char c[3] = "ab";
10:            char d[3] = { ‘a’,'b’ };   
11:            clrscr();
12:            gotoxy(10, 1);
13:            printf("Compare between array a and array b");
14:                 for(i=0;i<3;i++) {
15:                    gotoxy(20, 2+i);
16:                    printf("a[%d]=%d ,b[%d]=%d",i,a[i],i,b[i]);
17:                   }
18:          printf("\n array a have %d element",sizeof(a)/2);
19:          printf("\n array b have %d element",sizeof(b)/2);
20:          printf("\n so array  a same as array b\n");
21:         
22:                for(i=0;i<3;i++) {
23:                     gotoxy(10, 10+i);
24:                     if(c[i]==’\0’)
25:                              printf("array c terminate with null character");
26:                     else
27:                              printf("c[%d] = %c",i,c[i]);
28:                }
29:                for(i=0;i<3;i++) {
30:                     gotoxy(10, 13+i);
31:                     if(d[i]==’\0’)
32:                               printf("array d terminate with null character");
33:                     else
34:                               printf("d[%d] = %c",i,d[i]);
35:                }
36:                getch();
37:          }

 
ผลลัพธ์โปรแกรม
 
               Compare between array a and array b
                         a[0]=100 ,b[0]=100
                         a[1]=200 ,b[1]=200
                         a[2]=300 ,b[2]=300
     array a have 3 element
     array b have 3 element
     so array a same as array
    
    
               c[0] = a
               c[1] = b
               array c terminate with null character
               d[0] = a
               d[1] = b
               array d terminate with null character

อธิบายโปรแกรม

บรรทัดที่ 6-7 : ประกาศและกำหนดค่าเริ่มต้นให้ตัวแปร a และ b ซึ่งเป็นอาร์เรย์ชนิดเลขจำนวนเต็ม

บรรทัดที่ 9-10 : ประกาศและกำหนดค่าเริ่มต้นให้ตัวแปร c และ d ซึ่งเป็นอาร์เรย์ชนิดตัวอักษร(สตริง)

บรรทัดที่12 : ฟังก์ชั่น gotoxy() เป็นฟังก์ชั่นที่ใช้กำหนดตำแหน่งของเคอร์เซอร์บนหน้าจอซึ่งรูปแบบของ gotoxy() คือ gotoxy(x,y) โดย x คือตำแหน่งเคอร์เซอร์ในแนวตั้งมีได้สูงสุดถึง 80 คอลัมน์ และ y คือตำแหน่งเคอร์เซอร์ในแนวนอนซึ่งมีได้สูงสุด 25 บรรทัด โดยในที่นี้กำหนดให้เคอร์เซอร์เลื่อนไปคอลั่มที่ 10 ของบรรทัดที่ 1 สำหรับการเรียกใช้งานฟังก์ชั่น gotoxy() นั้นต้องทำการรวมเฮดเดอร์ไฟล์ conio.h เข้าไว้ในโปรแกรมด้วย

บรรทัดที่14-17: ทำการพิมพ์ค่าอาร์เรย์a และ b ออกทางจอภาพสังเกตุที่บรรทัด15นะครับมีการใช้ gotoxy() กำหนดการเลื่อนของเคอร์เซอร์ไปยังคอลั่มที่20ทุกครั้งที่แสดงผลส่วนบรรทัดนั้นจะมีการเปลียนค่าไปในแต่ละรอบของลูป เช่น ถ้าทำงานรอบแรกจะไปที่บรรทัดที่ 2 (มาจาก 2+i = 2+0) รอบต่อไปจะเป็นบรรทัดที่ 3 เป็นต้นดั้งนั้นจึงไม่จำเป็นต้องใช้ '\n' ช่วยในการขึ้นบรรทัดใหม่

บรรทัดที่ 18-19 : ทำการหาขนาดของ array ว่าเป็นกี่ช่อง

บรรทัดที่ 22-35 : ทำการวนลูปตรวจสอบค่าของอาร์เรย์ c และ d โดยถ้าตรวจสอบพบว่าเป็น '\0'(null) ซึ่งคือจุดสิ้นสุดของ สตริงก็จะพิมพ์ข้อความบอกให้รู้ว่าสิ้นสุดสตริงแล้วแต่ถ้าหากไม่ใช่ ก็จะแสดงตัวอักษรของช่องนั้นๆออกมาแทน

เอาละผมว่ามันชักจะยาวเกินไปแล้วเดียวค่อยมาต่อกันที่ อาร์เรย์ 1 มิติ (Array 1D) ภาค2 แล้วกันนะครับ สุดท้ายนี้ก็หวังว่าจะเข้าใจเกียวกับเจ้า Array เพิ่มขึ้นอีกหน่อยนะครับ see you again

0 ความคิดเห็น:

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