บทที่ 6 Arrays - PSU



บทที่ 6 อาร์เรย์

Arrays

Objectives (จุดประสงค์)

1. เพื่อให้สามารถใช้งานตัวแปรประเภทอาร์เรย์ได้

Outline (โครงร่าง)

1. ตัวแปรอาร์เรย์ แบบ 1 มิติ

2. การให้ค่าเริ่มต้น

3. การส่งผ่านอาร์เรย์

4. ตัวแปรอาร์เรย์แบบ 2 มิติ

5. ความผิดพลาดของโปรแกรมทั่วไปเกี่ยวกับอาร์เรย์

6. บทสรุป

การเขียนโปรแกรมสำหรับบางกรณี เราจำเป็นที่จะต้องประกาศตัวแปรที่เป็นข้อมูลชนิดเดียวกันหลายๆ ตัวเพื่อใช้ในการเก็บกลุ่มของข้อมูลที่เหมือนกัน เช่น การเก็บข้อมูลอายุ และข้อมูลความสูงของนักศึกษา เป็นต้น

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

ลักษณะสำคัญของอาร์เรย์คือการรวบรวมข้อมูลแบบเดียวกันไว้ด้วยกัน โดยข้อมูลแต่ละตัวของอาร์เรย์จะเรียกว่า อีลีเมนต์ (Element) ข้อมูลแต่ละอีลีเมนต์จะมีหมายเลขเพื่อใช้ในการอ้างอิงถึงเรียกตัวเลขนี้ว่า เลขดัชนี (Index) ดังนั้นในการอ้างอิงถึงข้อมูลแบบอาร์เรย์จึงทำได้โดยการระบุชื่อของอาร์เรย์นั้นๆ ประกอบกับค่าเลขดัชนี เพื่อให้สามารถเข้าถึงอีลีเมนต์ที่เก็บข้อมูลภายในอาร์เรย์นั้นๆ ได้

1 ตัวแปรอาร์เรย์แบบ 1 มิติ

ตัวแปรแบบอาร์เรย์ ที่ใช้ในการเก็บข้อมูลโดยมีการอ้างอิงที่ใช้เลขดัชนีเพียงหนึ่งค่าจะเรียกว่า ตัวแปรแบบอาร์เรย์ 1 มิติ เช่น การเก็บข้อมูลคะแนน ที่อ้างอิงด้วยรหัสนักศึกษา

ตัวอย่าง

int age[10];

เป็นการประกาศตัวแปรแบบอาร์เรย์เพื่อเก็บข้อมูลอายุ เมื่อต้องการเก็บข้อมูลอายุของนักศึกษาคนที่ 1 สามารถทำได้ดังนี้

age[1] = 18;

การประกาศ ตัวแปรอาร์เรย์

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

int grades[5]; /* Array ขนาด 5 ของ int */

เป็นการประกาศตัวแปรแบบอาร์เรย์ 1 มิติชื่อ grades ให้เป็นข้อมูลแบบอักษรโดยมีขนาดเท่ากับ 5 อีลีเมนต์ ซึ่งการประกาศตัวแปรนี้จะจองหน่วยความจำเท่ากับ 2 byte * 5 = 10 byte

char codes[5]; /* Array ขนาด 5 ของ char */

การประกาศตัวแปร codes จะใช้หน่วยความจำเท่ากับ 1 byte * 5 = 5 byte

float prices[100]; /* Array ขนาด 100 ของ float */

การประกาศตัวแปร price จะใช้หน่วยความจำเท่ากับ 4 byte * 100 = 400 byte

ตัวอย่าง

แสดงค่าข้อมูลที่เก็บในตัวแปรอาร์เรย์ 3 ตัว คือ grade code และ price

|อีลีเมนต์ที่ |grades |sex |prices |

|0 |A |Male |10.96 |

|1 |B |Female |6.43 |

|2 |C | |58 |

|3 |D | |0.86 |

|4 |E | |45.00 |

ในการเข้าถึงแต่ละอีลีเมนต์สามารถกระทำได้โดยการระบุค่าดัชนี (Index)

grades[0] อ้างถึงค่า grades แรกที่เก็บใน grades array

grades[1] อ้างถึงค่า grades ลำดับที่สองที่เก็บใน grades array

grades[2] อ้างถึงค่า grades ลำดับที่สามที่เก็บใน grades array

grades[3] อ้างถึงค่า grades ลำดับที่สี่ที่เก็บใน grades array

grades[4] อ้างถึงค่า grades ลำดับที่ห้าที่เก็บใน grades array

[pic]

รูปที่ 6.1 แสดงการเก็บข้อมูล grades ในหน่วยความจำ

ในการอ้างอิงข้อมูลในอาร์เรย์ ค่าดัชนีที่ใช้ในการอ้างอิงจะเริ่มต้นที่ 0 เสมอทั้งนี้เพื่อให้การเข้าถึงข้อมูลมีความรวดเร็วขึ้น จากรูปที่ 6.3 จะเห็นว่าค่าดัชนีจะเป็นตัวอ้างอิงถึงข้อมูลแต่ละอีลีเมนต์การเข้าถึงข้อมูลสามารถทำได้โดยการเลื่อนตำแหน่งของค่าดัชนีเพื่อไปยังอีลีเมนต์ต่างๆ ที่ต้องการ โดยเริ่มต้องจากตำแหน่งแรก จากตัวอย่างจะเป็นการเลื่อนตำแหน่งไปที่อีลีเมนต์ตัวที่ 3 นั่นเอง

[pic]รูปที่ 6.2 แสดงการเข้าถึงข้อมูลของอาร์เรย์ อีลีเมนต์ที่ 3

ตัวแปรอาร์เรย์สามารถใช้งานได้เหมือนกับตัวแปรทั่วไป ตัวอย่างการใช้งานตัวแปร grades ที่เป็นอาร์เรย์ของจำนวนเต็ม 5 ตัว

grades[0] = 98;

grades[1] = grades[0] – 11;

grades[2] = 2 * (grades[0] – 6);

grades[3] = 79;

grades[4] = (grades[2] + grades[3] – 3) / 2;

total = grades[0] + grades[1] + grades[2] + grades[3] + grades[4];

ค่าตัวเลขอีลีเมนต์ไม่จำเป็นต้องเป็นตัวเลขโดยตรง อาจเป็นตัวแปร หรือพจน์ของการกระทำที่ได้เป็นจำนวนเต็มก็ได้เช่น

grades[i]

grades[2*i]

grades[j-i]

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

total = grades[1] + grades[2] + grades[3] + grades[4] + grades[5];

เปลี่ยนเป็น

total = 0;

for ( i = 0; i ................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download