ไม่ได้มาซะนาน ช่วงนี้เปิดเทอมแล้วง่ะ.. งานชักเริ่มเข้ามา แถมยังมี FarCry2 ให้ติดอีกต่างหาก เฮ่อ - -"
การใช้งานอาเรย์สองมิติ
อาเรย์ที่เราได้เรียนๆไปแล้วคืออาเรย์มิติเดียวครับ สังเกตว่าพอเราประกาศขึ้นมาแล้ว มันจะมีค่าเท่ากับการประกาศตัวแปรหลายๆตัว ซึ่งบางทีเราก็จะมองมันเป็นแถวของตัวแปรครับ ลองเปรียบเทียบตัวแปรเป็นเก้าอี้ว่างๆ และเปรียบข้อมูลเป็นคนนั่ง ถ้าเราประกาศตัวแปรธรรมดา (int n;) เราก็จะไำด้เก้าอี้มา 1 ตัวและมีใครก็ไม่รู้นั่งอยู่แต่ถ้าเราประกาศเป็นอาเรย์ สมมติ int arr[10]; เราก็จะได้เก้าอี้ต่อกันเป็นแถวยาวๆ 10 ตัว แต่ละตัวมีหมายเลขกำกับอยู่ ถ้าเราอยากจะคุยกับคนที่นั่งเก้าอี้ตัวไหน เราก็ใช้หมายเลขของเก้าอี้เวลาเรียกเค้ามา แบบนี้คือมิติเดียวครับ สังเกตว่าเก้าอี้จะเรียงกันเป็นแถวเดียว แต่จะยาวเท่าไหร่ไม่รู้
ตัวอย่างอาเรย์มิติเดียว |5|6|9|7|12|26|100|...
ส่วนอาเรย์สองมิติจะคล้ายๆกันครับ แต่จากเก้าอี้ที่มีแถวเดียวย มันจะมีหลายแถวครับ แต่ละแถวจะยาวท่าๆกัน เหมือนเวลาจัดที่นั่งในห้องสอบ พอประกาศขึ้นมาแล้ว เราจะได้แบบนี้
ตัวอย่างอาเรย์สองมิติ
|5|9|1|2|
|2|4|7|4|
|5|5|5|4|
เวลาเราจะเรัยกตัวไหน จากที่เราเคยใช้หายเลขตัวเดียวเช่น อาเรย์ช่องที่ 3 , อาเรย์ช่องที่ 7 เราก็ต้องใช้ 2 ตัวครับ คือ ต้องบอกว่าแถวที่เท่าไหร่ และตัวที่เท่าไหร่ในแถวนั้น เหมือนเวลาไปสอบแล้วเค้าบอกให้คุณนั่งที่โต๊ะแถวที่ 7 ตัวที่ 5 อะไรประมาณนั้น
วิธีการประักาศ
ชนิดข้อมูล ชื่อตัวแปร[จำนวนแถว][จำนวนตัวในแถว];
เช่น
int arr[10][8];
เราก็จะไำด้อาเรย์ชื่อ arr มี 10 แถว แถวละ 8 ตัว(เรีียกว่า"แถวละ 8 คอลัมน์")
เวลาเราอ้างอิงถึงข้อมูล เราก็ใช้วิธีเดียวกับอาเรย์มิติเดียวครับ เช่นต้องการกำหนดค่าในแถวที่ 5 คอลัมน์ที่ 0 ให้มีค่าเท่ากับ 12 เราก็ทำแบบนี้
arr[5][0] = 12;
โดยมากเราจะใช้อาเรย์มิติเดียวในการเก็บข้อมูลที่เป็นแถวยาวๆ เช่น เก็บเซตของตัวเลข เก็บชื่อคน(เป็นตัวอักษรเรียงต่อกัน) และใช้อาเรย์สอมิติในการเก็บตาราง เพราะสังเกตว่าตารางจะมีแถวและคอลัมน์ เช่น อาจจะใช้เก็บตารางสูตรคูณ โดยใช้อิเด็กซ์เป็นตัวตั้งและตัวคูณ เช่น 2*5เท่ากับ 10 เราก็เก็บค่าในแถวที่ 2 คอลัมน์ที่ 5 เป็น 10 ดูในตัวอย่างครับ ให้สีน้ำเงินเป็นอินเด็กซ์(แนวนอนคือแถว แนวตั้งคือคอลัมน์)และสีน้ำเงินอ่อนเป็นค่าในตัวแปร
| 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|
0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0|
1| 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|
2| 0| 2| 4| 6| 8|10|12|14|16|18|20|22|24|
3| 0| 3| 6| 9|12|15|18|21|24|27|30|33|36|
4| 0| 4| 8|12|16|20|24|28|32|36|40|44|48|
5| 0| 5|10|15|20|25|30|35|40|45|50|55|60|
6| 0| 6|12|18|24|30|36|42|48|54|60|66|72|
7| 0| 7|14|21|28|35|42|49|56|63|70|77|84|
8| 0| 8|16|24|32|40|48|56|64|72|80|88|96|
9| 0| 9|18|27|36|45|54|63|72|81|90|99|108|
10| 0|10|20|30|40|50|60|70|80|90|100|110|120|
11| 0|11|22|33|44|55|66|77|88|99|110|121|132|
12| 0|12|24|36|48|60|72|84|96|108|120|132|144|
นี่คือลักษณะการเก็บข้อมูลของอาเรย์สองมิติครับ ถ้าเราอยากรู้ว่า 2*5 คือเท่าไหร่ ก็เข้าไปในอาเรย[2][5]ก็จะพบกับค่า 10 ส่วนวิธีการจะทำยังไงที่จะสร้างตารางสูตรคูณแบบนี้ เดี๋ยวจะมาดูตัวอย่างกันครับ
อาเรย์สองมิตินิยมใช้กับลูป 2 ชั้นครับ
ตัวอย่างการสร้างตารางสูตรคูณอย่างง่าย(ผมไม่เขียน include นะ แต่เวลาทำจริงให้เขียนด้วย)
int main()
{
int table[4][4];
table[0][0] = 0;
table[0][1] = 0;
table[0][2] = 0;
table[0][3] = 0;
table[1][0] = 0;
table[1][1] = 1;
table[1][2] = 2;
table[1][3] = 3;
table[2][0] = 0;
table[2][1] = 2;
table[2][2] = 4;
table[2][3] = 6;
table[3][0] = 0;
table[3][1] = 3;
table[3][2] = 6;
table[3][3] = 8;
return 0;
}
นี่คือตัวอย่างการสร้างครับ ไม่ต้องตกใจถ้าเอาไปรันแล้วมันขึ้นมาแว็บนึงแล้วหายไปเลย เพราะเราไม่ได้ใส่ sscanf(" "); เอาไว้ก่อนจะ return 0; ทีนี้ ถ้าเราอยากดูว่า 3*2 เท่ากับเท่าไหร่ เราก็ใส่ printf("%d",table[3][2]); เข้าไปก็เท่านั้นเองครับ แต่ถ้าเราต้องทำตารางสูตรคูณหลายๆแม่ เช่นทำถึงแม่ 12 ขืนมานั่งเขียนกำหนดค่าทีละบรรทัดคงเหนื่อยแย่
ตัวอย่างการสร้างตารางสูตรคูณด้วยลูปสองชั้นและัอาเรย์สองมิติ
ถ้าเราต้องการสร้างตารางขนาดใหญ่ๆ เราสามารถใช้ลูปเข้ามาช่วยครับ ให้โปรแกรมสร้างตารางสูตรคูณขึ้นมา จากนั้นผู้ใช้จะใส่เลข 1 ตัวมาให้ ให้โปรแกรมแสดงสูตรคูณแม่นั้นๆ
เช่นใส่เลข 5 ก็ให้แสดงสูตรคูณแม่ 5
#include [stdio.h] // change [ , ] to < , >
int main()
{
int table[13][13]; // ประกาศ 13 เพราะต้องเก็บตั้งแต่แม่ 0 ถึงแม่ 12
int i,j; // อันนี้เป็นตัวนับรอบ
int a; // เก็บว่าอยากดูแม่อะไร
for(i=0;i<=12;i++) // ลูปนี้สร้างตาราง อธิบายลูปทีหลัง
for(j=0;j<=12;j++)
table[i][j] = i*j;
scanf("%d",&a); //
for(i=0;i<=12;i++) // ลูปนี้แสดงผล เดี๋ยวอธิบาย
printf("%d\n",table[a][i]);
scanf(" ");
return 0;
}
ก่อนอื่นลองเอาโปรแกรมนี้ไปรันดูก่อนครับ วิธีการคือ พอเปิดโปรแกรมขึ้นมา โปรแกรมมันจะสร้างตารางขึ้นเองโดยไม่บอกอะไรเราทั้งสิ้น ให้เราใส่เลขอะไรก็ได้ระหว่าง 0 ถึง 12 สิ่งมหัศจรรย์จะปรากฏขึ้น แล้วจะตกใจ(อิอิ)
อธิบายกันหน่อย
เก็นลูปที่เป็นลูป 2 ชันมั้ยครับ ตรงที่บอกว่าเป็นลูปสร้างตารางอ่ะ จะเห็นว่ามันมี for ซ้อนกัน 2 ชั้น หลักการของลูปสองชั้น คืองี้ครับ สมมติว่าเราสร้างลูปแบบนี้
loopA(ให้ทำ 3 รอบ) {
loopB(ทำ5รอบ) {
...
}
}
จากตัวอย่าง จะเห็นว่ามี loopB ซ้อนอยู่ภายใน loopA ซึ่งหลักการคือ เรากำหนดในลูปเอทำ 3 รอบใช่มั้ยครับ มันก็จะทำลูปเอสามรอบนั่นแหละ แต่ว่าในแต่ละรอบจะทำลูปบี 5 รอบ รวมแล้ว ลูปบีจะถูกทำทั้งหมด 15 รอบ
ไม่รู้จะอธิบายยังไงดี - -" ลองไล่โปรแกรมกันละเอียดๆนะครับ แล้วจะเข้าใจเอง ต้องใช้ความพยายามหน่อยล่ะงานนี้ แต่พอเสร็จแล้ว เราจะได้ตารางขึ้นมาอยู่ในตัวแปร table (แต่ยังไม่ได้แสดงผล)
จากนั้นผู้ใช้จะใส่ค่าเข้ามาว่าอยากดูแม่ไหน(เก็บไว้ในตัวแปร a) เราก็จะเข้าไปในลูปแสดงผลครับ ซึ่งเราต้องการแสดงผลค่าในแม่ a ดังนั้นเราจึงต้องแสดงผลค่าตั้งแต่ a x 0 ถึง a x12 เราจึงเซ็ท i เริ่มต้นที่ 0 และทำจนถึง i<=12ซึ่งการทำแต่ละรอบ มันจะไปดึงค่าจาก table[a][i] มาแสดงผล สมมติว่า aเป็น 5 ในลูปรอบแรก i เป็น 0 มันก็จะแสดงผลค่าของ table[5][0] ซึ่งก็คือ 0ทำไปเรื่อยๆ สมมติทำไปจน i เป็น 7 มันก็จะแสดงผล table[5][7] ซึ่งก็คือ 35 ไปเรื่อยๆจน i เป็น 12
ตัวอย่างการรัน
5
0
5
10
15
20
25
30
35
40
45
50
55
60
คิดว่าหลายๆคนคงจะงงกันไม่น้อย เพราะเรื่องนี้เขียนอธิบายยากครับ แหะๆ เอาเป็นว่าพยายามไล่โปรกรมดูดีๆ ละเอียดๆ หรือลองถามจากผู้รู้(แนะนำให้ถามด้วยปาก คือไม่ใช่เมลไปถาม หรือไปโพสตามบอร์ด เพราะอธิบายยาก แต่ลองดูก็ได้ครับ คิดว่ามีหลายๆคนที่อธิบายดีกว่าผม)
พยายามเข้านะครับ ^ ^