บทความนี้ขออนุญาติเขียนและ publish ใหม่ครับ เพราะของเก่าเขียนไม่ครบ + พิมพ์ผิดค่อนข้างเยอะ ขออภัยทุกท่านด้วยครับ

ตอนนี้ผมทำสารบัญเรื่องภาษาซีไว้ใน page :  เขียนโปรแกรมด้วย"ภาษาซี"นะครับ

เมื่อเราประกาศ array เป็นแล้ว ทีนี้เราจะมาดูวิธีใช้กันนะครับ

วิธีการใช้งานนะครับ สมมติเราประกาศอาเรย์ไว้แล้ว เ่ช่น

int test[5];

เราประักาศตัวแปรอาเรย์ชนิด int ซึ่งใช้เพื่อเก็บตัวเลขจำนวนเต็ม และหากดูในวงเล็บ [ ] จะเห็นว่าเราใส่เลข 5 ลงไป นั่นหมายถึง เราได้ประกาศไว้ 5  ช่องครับ

เมื่อเราประกาศแล้ว หากเราต้องการเข้าถึง test ช่องที่เท่าไหร่เราก็ใส่เลขลงไป สมมติเราต้องการบอกว่า ให้testช่องที่ 3 เก็บค่า 241 เราก็ทำแบบนี้

test[3] = 245;

ทีนี้ จุดสำคัญของการใช้อาเรย์คือ ช่องแรกของอาเรย์เรานับเป็นช่องที่ศูนย์นะครับ ส่วนช่องสุดท้ายคือช่องที่ จำนวนช่อง-1 นั่นหมายถึง หากเราประกาศ test ไว้5 ช่อง เราก็สามารถใช้งานมันได้ตั้งแต่ช่องที่ 0 ถึงช่องที่ จำนวนช่อง-1 ซึ่งก็คือ 4 ครับ ถ้าเราประกาศและกำหนดค่าแบบนี้

int test[5] = {5,9,8,6,1};

เราก็จะได้ค่าใน test แบบนี้

ค่า      : | 5 | 9 | 8 | 6 | 1 |
ช่องที่ :    0   1   2    3   4

วิธีการกำหนดค่าเริ่มต้นผมเขียนไว้ด้านล่างของบทความครับ เลื่อนๆลงไปหน่อย

ถ้าเราประกาศขึ้นมาโดยที่ยังไม่กำหนดค่า โปรแกรมจะเอาค่ามั่วๆมาใส่ไว้ในตัวแปรเราครับ เรียกว่า "ค่าขยะ" เนื่องจากเป็นค่าที่ค้างอยู่ในหน่วยความจำจากการใช้งานโดยโปรแกรมก่อนๆ ซึ่งจะเห็นได้ชัดใน turbo c ครับ ลองประกาศตัวแปรขึ้นมา(ไม่ต้องเป็นอาเรย์ก็ได้)โดยไม่กำหนดค่า แล้วลอง printf ค่าในนั้นออกมาเลย จะเห็นว่ามันออกมาเป็นค่าอะไรก็ไม่รู้ แต่ใน devc  ผมไม่แน่ใจว่ามันจะเซ็ตค่าเริ่มต้นเป็น 0 โดยอัตโนมัติรึเปล่า

ตัวอย่าง คะแนนรายบุคคล ตอนที่ 1
หลังจากที่ท่านผู้บริหารได้ทำโครงการสำเร็จแล้ว เขาก็ต้องการพัฒนาต่อยอดขึ้นไปอีก เขาต้องการรู้คะแนนของนักเรียนที่อยู่ในกลุ่ม"แย่"3 คน โดยจะให้ครูประจำชั้นใส่คะแนนของนักเรียนทั้งสาม แล้วท่านผู้บริหารจะเป็นคนบอกว่าอยากดูคะแนนของนักเรียนคนไหน(คนแรกเป็นคน ที่ 0 คนสุดท้ายเป็นคนที่ 2) ให้โปรแกรมแสดงคะแนนของเด็กคนนั้น

#include  [stdio.h] // change [ , ] to < ,>

int main()
{
    int score[3]; // ประกาศอาเรย์เก๋บคะแนนของนักเรียน 3 คนต้องใช้ 3 ช่อง
    int number; 
    printf("Student No.#0 : ");
    scanf("%d",&score[0]); // เก็บคะแนนนักเรียนคนที่ 0
    printf("Student No.#1 : ");
    scanf("%d",&score[1]); // เก็บคะแนนนักเรียนคนที่ 1
    printf("Student No.#2 : ");
    scanf("%d",&score[2]); // เก็บคะแนนนักเรียนคนที่ 2
    printf("Enter number : "); // ถามผู้บริการว่าอยากดูคะแนนเด็กคนไหน
    scanf("%d",&number);     // ผบ.ใส่หมายเลขนักเรียน
    printf("Student no.%d = %d point",number,score[number]); /*พอเราได้หมายเลขนร.มาแล้ว เราก็เอาหมายเลขนร.ไปอ้างเป็น index ให้กับอาเรย์ score*/
    scanf(" ");
    return 0;
}

ตัวอย่างการรัน

Student No.#0 : 10
Student No.#1 : 5
Student No.#2 : 9
Enter Number : 2
Student No.2  = 9

*** จุดสำคัญนะครับ ถ้าเราประกาศอาเรย์ไว้ 3 ช่อง (สมมติ int arr[3];)  เวลาเราใช้งาน เราสามารถใช้ได้ตั้งแต่ช่องที่ 0 จนถึงช่ิองที่ 2 (arr[0]  - arr[2]) ครับ ก็คือ ถ้าประกาศไว้เท่าไหร่ เวลาใช้ จะใช้ได้ตั้งแต่ช่องที่ 0 ถึงช่องที่ จำนวนช่อง-1 ***

นอกจากนี้ เรายังสามารถเขียนนิพจน์ทางคณิตศาสตร์ลงไปใน index ได้ด้วยนะ เช่น array[(x+2*5) -32)]เป็นต้น

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

ตัวอย่าง คะแนนรายบุคคล ตอนที่ 2
ผบ.ของเรายังไม่พอใขกับโปรแกรมครับ เขาต้องการติดตามคะแนนของนักเรียนทุกๆคน โดยให้อาจารย์ประจำชั้นใส่คะแนนของนักเรียน N คน แล้วผบ.จะใส่หมายเลขนักเรียนและให้โปรแกรมแสดงผลคะแนนของเด็กคนนั้นออกมา

#include  [stdio.h] // change [ , ] to < ,>

int main()
{
    int score[100]; // ประกาศอาเรย์เก๋บคะแนนของนักเรียน สมมติว่ามีไม่เกิน100คน
    int number;
    int n,i;
    printf("How many students in class : "); // ถามจำนวนนักเรียน
    scanf("%d",&n); // เก็บจำนวนนักเรียนไว้ในตัวแปร n
    for( i=0 ; i// ดูคำอธิบายด้านล่าง
        printf("Student No.#%d : ",i);     // บอกผู้ใช้ให้ใส่คะแนนนักเรียนคนที่ i
        scanf("%d",&score[i]); // เก็บคะแนนนักเรียนคนที่ i ไว้ใน score ช่องที่ i
    }
    printf("Enter number : "); // ถามผู้บริการว่าอยากดูคะแนนเด็กคนไหน
    scanf("%d",&number);     // ผบ.ใส่หมายเลขนักเรียน
    printf("Student no.%d = %d point",number,score[number]); /*พอเราได้หมายเลขนร.มาแล้ว เราก็เอาหมายเลขนร.ไปอ้างเป็น index ให้กับอาเรย์ score*/
    scanf(" ");
    return 0;
}

อธิบายเรื่องลูป ถามว่า for(i=0;i

สมมติว่ามีนักเรียน 3 คน(nเป็น3) เราก็ต้องเก็บตั้งแต่นักเรียนหมายเลข 0 ถึง 2 ถูกมั้ย นั่นคือเราต้อเก็บคะแนนนักเรียนใส่ลงอาเรย์ในช่องที่ 0 ถึงช่องที่ n-1 เข้าใจมั้ยครับ ทีนี้ พอเรารู้แล้วว่าต้องวิ่งตั้งแต่รอบที่ 0 ถึง n-1 เราจึงต้องเซ็ตตัวแปร i ซึ่งเป็นตัวนับให้เริ่มที่ 0 และให้เงื่อนไขไว้ว่า i

ตัวอย่างการรัน

How many students in class : 5
Student No.#0 : 7
Student No.#1 : 100
Student No.#2 : 75
Student No.#3 : 80
Student No.#4 : 20

Enter Number : 3
Student No.2  = 80

เวลาเราสร้างอาเรย์ เราสามารถกำหนดค่าเริ่มต้นให้มันได้ครับ ทำอย่างนี้

int arr[5] = {1,2,3,6,9};

คือ เติม = {...} โดยใส่ค่าลงไปในปีกกาครับ ประกาศไว้กี่ช่อง ก็ใส่ค่าเข้าๆไปเท่านั้นตัว คั่นแต่ละตัวด้วยลูกน้ำครับแต่ถ้าเป็นอาเรย์ char เราสามารถกำหนดได้สองแบบ

1.แบบเมื่อกี๊

char text[5] = {'a','g','h','i','x'}; แบบนี้เราถือเป็นอาเรย์ char ธรรมดา เราประกาศขนาด(จำนวนช่อง)ของอาเรย์ไว้เท่าไหร่ เราก็กำหนดค่าเข้าไปเท่านั้นตัวเสร็จแล้วค่าในอาเรย์จะเป็นแบบนี้

text[0] = 'a';
text[1] = 'g';
text[2] = 'h';
text[3] = 'i';
text[4] = 'x';

แต่ถ้าแบบที่สองที่เราเคยใช้กันแล้ว นั่นคือแบบ String คือกำหนดเป็นข้อความ ซึ่งเราจะกำหนดกี่ตัวก็ได้ แต่ต้องน้อยกว่าจำนวนช่องที่ประกาศไว้ เช่นประกาศไว้ 5 ชอง จะใส่ค่าได้ 4 ตัวเท่านั้ เพราะช่องสุดท้ายจะเก็บไว้เพื่อเก็บรหัสจบข้อความ \0ครับ

2.String

char message[5] = "dogs";

พอกำหนดแบบนี้ เราก็จะได้ว่า

message[0] = 'd';
message[1] = 'o';
message[2] = 'g';
message[3] = 's';
message[4] = '\0'; (รหัสจบข้อความ)

จำไว้ว่า string จำเป็นต้องมีรหัสจบข้อความ เพราะไม่อย่างนั้นมันจะไม่รู้ว่าข้อความของเรานั้นจบที่ index ไหนครับ ซึ่งรหัสปิดข้อความจะอยู่ช่องที่ถัดจากตัวอักษรตัวสุดท้ายของข้อความ เช่นถ้าเราทำแบบนี้

int message [5] = "man";

สังเกตว่าข้อความนี้มี 3 ตัว แสดงว่าอักษรตัวสุดท้ายอยู่ในช่องที่ 2 (อย่าลืมนะครับ ภาษาซีเริ่มต้นที่ช่องที่ 0 ) เพราะฉะนั้นรหัสปิดข้อความก็จะอยู่ในช่องที่ 3(คือต่อจากตัวอักษรสุดท้าย)

บทต่อไปจะเป็นอาเรย์ 2 มิติครับ เป็นยังไงเดี๋ยวดูกันขอให้ทุกคนลองเอาตัวอย่างโปรแกรมเก็บคะแนนไปเขียนเอง โดยไม่ก๊อปไปนะครับ จะได้ฝึกการใช้ลูปและอาเรย์ แต่ว่าผมจะเปิดเทอมแล้วนี่สิ 555 ไม่รู้จะมีเวลามาอัพต่อรึเปล่า

 

Comment



smilebig smileopen-mounthed smileconfused smilesad smileangry smiletonguequestionembarrassedsurprised smilewinkdouble winkcry

Tweet

สุด ยอด จิง พี่ บ่าว เหอ

#1 By basza246 (203.158.176.200) on 2009-09-14 10:22