[ภาษาซี] การใช้งาน Array 1 มิติ (เขียนใหม่)
posted on 24 May 2009 18:31 by mistertun in CProgramming
บทความนี้ขออนุญาติเขียนและ 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 : 75Student 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 ไม่รู้จะมีเวลามาอัพต่อรึเปล่า
ตอนนี้ผมทำสารบัญเรื่องภาษาซีไว้ใน 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 : 75Student 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 ไม่รู้จะมีเวลามาอัพต่อรึเปล่า


0 comments:
Post a Comment