บทที่ 5
ตัวแปรชุดและสตริง
ตัวแปรชุดและสตริง
ในบทที่ผ่านมาหลายบทก่อนหน้านี้ได้พูดถึงตัวแปรชนิดต่าง ๆ หลายชนิด
สำหรับเนื้อหาในบทนี้
จะได้เรียนรู้เกี่ยวกับตัวแปรอีกชนิดหนึ่งนั่นคือตัวแปรชุด (arrays)
และเนื้อหาเกี่ยวกับสตริง (string)
ซึ่งเป็นพื้นฐานที่สำคัญในการจัดเก็บข้อมูลและโครงสร้างของข้อมูลโดยเฉพาะ
อย่างยิ่งตัวแปรชุดมีประโยชน์หลายประการดังนี้
1) ช่วยลดการตั้งชื่อซ้ำ ๆ กัน เช่น ต้องการเก็บค่าตัวเลขจำนวนเต็ม 100 ตัว ถ้าไม่มีการใช้ตัวแปรชุด เราจะต้องประกาศตัวแปรถึง 100 ตัว ดังนี้
int k1, k2, k3, …, k100; /* ประกาศตัวแปร k1, k2, k3, …, k100 จำนวน 100 ตัว */ แต่ถ้าเราใช้ตัวแปรชุดมาช่วยในการเก็บข้อมูลตัวเลขชุดนี้ เราสามารถเก็บตัวเลข 100 ตัวนี้ไว้ในชื่อเดียวกัน แต่มีตัวเลข subscript คอยกำกับเพื่อบ่งบอกถึงลำดับที่ของข้อมูลในตัวแปรได้
int k[100]; /* ประกาศตัวแปรชุด 1 ตัว คือชื่อตัวแปร k */
2) ช่วยในการจัดเก็บข้อมูลแบบตาราง (table) โดยสามารถใช้ตัวแปรชุด 2 มิติ มาเก็บข้อมูลได้
3) ช่วยในการเขียนโปรแกรมมีประสิทธิภาพมากขึ้น เนื่องจากในโปรแกรมที่มีการใช้ตัวแปรชุดจะมีตัวแปรน้อยลง ช่วยในการจัดเรียงข้อมูล และค้นหาข้อมูลได้สะดวกและรวดเร็ว
5.1 ตัวแปรชุด (arrays variables)1) ช่วยลดการตั้งชื่อซ้ำ ๆ กัน เช่น ต้องการเก็บค่าตัวเลขจำนวนเต็ม 100 ตัว ถ้าไม่มีการใช้ตัวแปรชุด เราจะต้องประกาศตัวแปรถึง 100 ตัว ดังนี้
int k1, k2, k3, …, k100; /* ประกาศตัวแปร k1, k2, k3, …, k100 จำนวน 100 ตัว */ แต่ถ้าเราใช้ตัวแปรชุดมาช่วยในการเก็บข้อมูลตัวเลขชุดนี้ เราสามารถเก็บตัวเลข 100 ตัวนี้ไว้ในชื่อเดียวกัน แต่มีตัวเลข subscript คอยกำกับเพื่อบ่งบอกถึงลำดับที่ของข้อมูลในตัวแปรได้
int k[100]; /* ประกาศตัวแปรชุด 1 ตัว คือชื่อตัวแปร k */
2) ช่วยในการจัดเก็บข้อมูลแบบตาราง (table) โดยสามารถใช้ตัวแปรชุด 2 มิติ มาเก็บข้อมูลได้
3) ช่วยในการเขียนโปรแกรมมีประสิทธิภาพมากขึ้น เนื่องจากในโปรแกรมที่มีการใช้ตัวแปรชุดจะมีตัวแปรน้อยลง ช่วยในการจัดเรียงข้อมูล และค้นหาข้อมูลได้สะดวกและรวดเร็ว
ตัวแปรชุด คือ ตัวแปรชนิดหนึ่งที่ใช้ชื่อเพียงชื่อเดียวแต่มีตัวเลขแสดงตำแหน่งกำกับไว้ (subscript) เพื่อเป็นการบอกว่าเป็นสมาชิกของตัวแปรชุดตัวที่เท่าไหร
5.1.1 ประเภทของตัวแปรชุด มีดังนี้
1) ตัวแปรชุด 1 มิติ (one dimension arrays หรือ single dimension arrays) ตัวแปรชุด 1 มิติ คือ ตัวแปรชุดที่มีตัวเลขกำกับ (subscript) เพียง 1 ตัว เช่น a[20], b[100], name[30] และ salary[20] เป็นต้น
2) ตัวแปรชุดหลายมิติ (multi-dimension arrays) ตัวแปรชุดหลายมิติ คือ ตัวแปรชุดที่มีตัวเลขกำกับ (subscript) ตั้งแต่ 2 ตัวขึ้นไป โดยมากจะสนใจศึกษาตัวแปรชุดที่มีตัวเลขกำกับ 2 ตัว และ 3 ตัว ดังนี้
- ตัวแปรชุด 2 มิติ (two dimension arrays) คือ ตัวแปรชุดที่มีตัวเลขกำกับ (subscript) เพียง 2 ตัว เช่น a[2][4], b[3][4], name[5][30] เป็นต้น
- ตัวแปรชุด 3 มิติ (three dimension arrays) คือ ตัวแปรชุดที่มีตัวเลขกำกับ (subscript) เพียง 3 ตัว เช่น a[2][3][4], b[3][4][5] เป็นต้น
1) การประกาศตัวแปรชุด 1 มิติ (declaration of one dimension arrays)
ตัวอย่างการประกาศตัวแปรชุด 1 มิติ
type คือ ชนิดของตัวแปรชุด เช่น int, float, char, double เป็นต้น
arrayname คือ ชื่อตัวแปรชุด ตั้งขึ้นตามหลักการตั้งชื่อตัวแปร
size คือ ขนาดของตัวแปรชุดเป็นตัวเลขจำนวนเต็ม
ตัวอย่างที่ 5.1 int s[20]; ภายในหน่วยความจำจะมีการจองเนื้อที่ไว้ดังนี้
การจองเนื้อที่ใช้ช่องละ 2 bytes 20 ช่อง รวมกันทั้งหมดใช้เนื้อที่ 40 bytes
ตัวอย่างที่ 5.2 char p[20]; ภายในหน่วยความจำจะมีการจองเนื้อที่ไว้ดังนี้
ตัวอย่างที่ 5.3 float t[20]; ภายในหน่วยความจำจะมีการจองเนื้อที่ไว้ดังนี้
การจองเนื้อที่ใช้ช่องละ 4 bytes 20 ช่อง รวมกันทั้งหมดใช้เนื้อที่ 80 bytes
2) การประกาศตัวแปรชุด 2 มิติ (declaration of two dimension arrays)
โดยที่
type คือ ชนิดของตัวแปรชุด เช่น int, float, char, double เป็นต้น
arrayname คือ ชื่อตัวแปรชุด ตั้งขึ้นตามหลักการตั้งชื่อตัวแปร
n คือ ตัวเลขที่ใช้แสดงตำแหน่งแถว (row) มีค่าตั้งแต่ 0, 1, 2, …, n-1
m คือ ตัวเลขที่ใช้แสดงตำแหน่งคอลัมน์ (column) มีค่าตั้งแต่ 0, 1, 2, …, m-1
ตัวอย่างการประกาศตัวแปรชุด 2 มิติ
ตัวอย่างที่ 5.4 int r[3][2]; ภายในหน่วยความจำจะมีการจองเนื้อที่ไว้ดังนี้
การจองเนื้อที่ของตัวแปรชุด 2 มิติ จะมีลักษณะเป็นตาราง (table) มีจำนวนแถว n = 0, 1, 2 และมีจำนวนคอลัมน์ m = 0, 1 โดยที่ในตารางจะมีลักษณะเป็นช่อง ๆ ซึ่งแต่ละช่องก็คือพื้นที่ของสมาชิกแต่ละตัว โดยใช้เนื้อที่ช่องละ 2 bytes มีสมาชิกทั้งหมด 6 ตัว ดังนั้นใช้เนื้อที่ทั้งหมด 12 bytes
วิธีการหาจำนวนสมาชิกทั้งหมดของตัวแปรชุด 1 มิติ และ 2 มิติ
การหาจำนวนสมาชิกทั้งหมดของตัวแปรชุด สามารถคำนวณได้จากสูตรดังนี้
กรณีตัวแปรชุด 1 มิติจากตัวอย่าง int r[3] [2]; จะได้ว่า n = 3, m = 2 ดังนั้น จำนวนสมาชิกของตัวแปรชุด = 3*2 = 6 แสดงว่าตัวแปรชุดนี้มีสมาชิกดังนี้ r[0][0], r[0][1], r[n-1][m-1] รวมทั้งหมด 6 สมาชิก
จำนวนสมาชิกทั้งหมดของตัวแปรชุด = ขนาดของตัวแปรชุด (size)
กรณีตัวแปรชุด 2 มิติ
จำนวนสมาชิกทั้งหมดของตัวแปรชุด = n*m
ตัวอย่างที่ 5.5 float X[5] [4]; ภายในหน่วยความจำจะมีการจองเนื้อที่ไว้ดังนี้
การจองเนื้อที่จะมีลักษณะเป็นตาราง (table) มีจำนวนแถว n = 0, 1, 2, 3, 4 และมีจำนวนคอลัมน์ m = 0, 1, 2, 3 โดยที่ในตารางใช้เนื้อที่ช่องละ 4 bytes มีจำนวนทั้งหมด 20 ตัว ดังนั้นใช้เนื้อทั้งหมด 80 bytes
type arrayname [n] [m] [p];
type คือ ชนิดของตัวแปรชุด เช่น int, float, char, double เป็นต้น
arrayname คือ ชื่อตัวแปรชุดตั้งขึ้นตามหลักการตั้งชื่อตัวแปร
n คือ ตัวเลขกำกับตัวที่ 1 มีค่าตั้งแต่ 0, 1, 2, …., n-1
m คือ ตัวเลขกำกับตัวที่ 2 มีค่าตั้งแต่ 0, 1, 2, …., m-1 p คือ ตัวเลขกำกับตัวที่ 3 มีค่าตั้งแต่ 0, 1, 2, …., p-1
วิธีการหาจำนวนสมาชิกทั้งหมดในตัวแปรชุด 3 มิติ หาได้จากสูตรดังนี้
จำนวนสมาชิกทั้งหมดของตัวแปรชุด = n*m*p
ตัวอย่างการประกาศตัวแปรชุด 3 มิติ float a[2][2][3]; ดังนั้น n = 2 , m = 2, p = 3 จะได้ว่าจำนวนสมาชิกทั้งหมดของตัวแปรชุด = 2*2*3 = 12 ตัว
ดังนั้นเราสามารถเขียนสมาชิกทั้งหมดของตัวแปรชุดนี้ได้ดังตาราง
Column 0
|
Column 1
|
|||||
ตัวที่ 1
|
ตัวที่ 2
|
ตัวที่ 3
|
ตัวที่ 1
|
ตัวที่ 2
|
ตัวที่ 3
|
|
Row 0
|
a[0][0][0]
|
a[0][0][1]
|
a[0][0][2]
|
a[0][1][0]
|
a[0][1][1]
|
a[0][1][2]
|
Row 1
|
a[1][0][0]
|
a[1][0][1]
|
a[1][0][2]
|
a[1][1][0]
|
a[1][1][1]
|
a[1][1][2]
|
โดยที่สมาชิกแต่ละตัวใช้เนื้อที่ตัวละ 4 bytes จำนวนสมาชิกทั้งหมดมี 12 ตัว ดังนั้นใช้เนื้อที่ทั้งหมดคือ 4*12 = 48 bytes
5.1.3 การกำหนดค่าเริ่มต้นให้กับตัวแปรชุด (initializing arrays)
1) การกำหนดค่าตัวเลขให้กับตัวแปรชุด
รูปแบบที่ 1 (กรณีตัวแปรชุด 1 มิติ)
type arrayname[size] = { value list };
รูปแบบที่ 2 (กรณีตัวแปรชุด 2 มิติ)
type arrayname[n][m] = { value list };
โดยที่
value list คือ ค่าคงที่ชนิดตัวเลขที่ต้องการกำหนดให้ตัวแปรชุด ถ้ามีหลายค่าให้ใช้เครื่องหมาย , (comma) คั่นระหว่างค่าคงที่แต่ละค่า
โดยค่าคงที่ทั้งหมดจะต้องอยู่ภายใต้เครื่องหมาย { }
ตัวอย่าง 5.6 int a[10] = {10, 20, 30, 40,50, 60, 70, 80, 90, 100};
ภายในหน่วยความจำจะเก็บตัวแปรชุดดังนี้
ตัวอย่างที่ 5.7 float p[5][3] = {
3.0, 4.5, 5.5,
4.6, 5.5, 6.5,
5.0, 6.2, 7.0,
6.3, 6.8, 7.4,
7.5, 8.0, 9.0
};
ภายในหน่วยความจำจะเก็บตัวแปรชุดเป็นลักษณะตาราง (table) ดังนี้
2) การกำหนดค่าคงที่ชนิดสตริงให้กับตัวแปรสตริง
รูปแบบที่ 1 (กรณีตัวแปรชุด 1 มิติ)
char arrayname[size] = “string constant”;
รูปแบบที่ 2 (กรณีตัวแปรชุด 2 มิติ)
char arrayname[n][m] = {“string constant”};
string constants คือ ค่าคงที่ชนิดสตริงที่ต้องการกำหนดให้ตัวแปรชุด ถ้ามีหลายค่าจะต้องใช้เครื่องหมาย , (comma) คั่นระหว่างค่าคงที่แต่ละค่า
ตัวอย่างที่ 5.8 char s[12] = “ASIAN GAME” ;
ภายในหน่วยความจำจะเก็บข้อมูลตัวแปรชุดมีลักษณะดังนี้
null character
ตัวอย่างที่ 5.9 char province[3][13] = {
“NAKHONPANOM” ,
“SAKON NAKHON” ,
“MOOKDAHAN” } ;
ภายในหน่วยความจำจะเก็บข้อมูลมีลักษณะดังนี้
ทั้งหมดใช้เนื้อที่ 3 x 13 = 39 bytes
การอ้างถึงสมาชิกในตัวแปรชุด 2 มิติเช่น
5.1.4 การนำข้อมูลเข้าไปเก็บและการแสดงผลลัพธ์ของข้อมูลในตัวแปรชุด
province [0] คือ สมาชิกแถวที่ 1 ทั้งแถว นั่นคือข้อมูล NAKHONPANOM
province [1] คือ สมาชิกแถวที่ 2 ทั้งแถว นั่นคือข้อมูล SAKON NAKHON province [2] คือ สมาชิกแถวที่ 3 ทั้งแถว นั่นคือข้อมูล MOOKDAHAN
province [0][0] คือ สมาชิกของ province [0] ตัวที่ 1 คือตัวอักษร N
province [1][2] คือ สมาชิกของ province [1] ตัวที่ 3 คือตัวอักษร K
โดยปกติเราจะใช้คำสั่ง for หรือ while หรือ do while คำสั่งใดคำสั่งหนึ่งมาช่วยในการนำข้อมูลเข้าเก็บและแสดงผลลัพธ์ข้อมูลในตัว แปรชุด ส่วนมากนิยมใช้คำสั่ง for มากกว่าคำสั่งอื่นทั้งนี้เนื่องจากตัวแปรชุดนั้นเราสามารถทราบขนาดที่แน่นอน ได้ ทำให้กำหนดจำนวนรอบการทำงานได้
เพื่อความเข้าใจเกี่ยวกับการนำข้อมูลเข้าไปเก็บและการแสดงผลลัพธ์ของตัวแปร ชุดมากยิ่งขึ้น ให้ศึกษาโปรแกรมตัวอย่างที่ 5.1, 5.2, 5.3 และ 5.4 ดังต่อไปนี้
โปรแกรมตัวอย่างที่ 5.1 แสดงการใช้ตัวแปรชุด 1 มิติ ชื่อ scores เก็บคะแนนนักเรียน
/* array1.C */ |
||||
จากโปรแกรมตัวอย่างที่ 5.1 สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
ข้อสังเกต ฟังก์ชัน main( ) ของโปรแกรมตัวอย่างที่ 5.1 เป็นฟังก์ชันที่ต้องการให้ส่งค่ากลับ ในการเขียนโปรแกรมจะต้องมีการใช้ฟังก์ชัน return( ) ซึ่งถ้าไม่ใช้เวลาที่เรา compile โปรแกรม จะมีคำเตือนให้เราทราบทุกครั้ง แต่โปรแกรมก็สามารถ run ได้
บรรทัดที่ 6 ประกาศตัวแปร index เป็นชนิดจำนวนเต็ม และ scores เป็นตัวแปรชุด 1 มิติ ชนิดจำนวนเต็มมีสมาชิก 5 ตัว
บรรทัดที่ 7 ถึง 11 กำหนค่าจำนวนเต็มให้กับตัวแปรชุด scores[0] ถึง scores[4]
บรรทัดที่ 13 คำสั่ง for ทำหน้าที่วนรอบทำงานซ้ำ 5 ครั้ง เพื่อช่วยพิมพ์คะแนนนักเรียนที่เก็บไว้ในตัวแปรชุด scores[0] ถึง scores[4]
บรรทัดที่ 14 และ 15 ฟังก์ชัน printf( ) เพื่อแสดงคะแนนของนักเรียนแต่ละคนออกที่จอภาพซึ่งเก็บไว้ในตัวแปรชุด scores[0] ถึง scores[4] หลังจากนั้นจะหยุดรอรับค่าใด ๆ จากคีย์บอร์ด ซึ่งถ้ากด enter ก็จะกลับสู่โปรแกรม
บรรทัดที่ 16 ส่งค่า 0 (ศูนย์) กลับให้กับฟังก์ชัน main( )
โปรแกรมตัวอย่างที่ 5.2 แสดงการใช้ตัวแปรชุด 1 มิติ สำหรับเก็บข้อมูลและนำข้อมูลในตัวแปรชุดมาคำนวณค่า พร้อมทั้งแสดงผลลัพธ์ที่ได้ออกจอภาพ
/* array2.c */ |
||||
คำอธิบายโปรแกรม
จากโปรแกรมตัวอย่างที่ 5.2 สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังน
ี้
บรรทัดที่ 3 คำสั่ง #include <stdlib.h> ให้การสนับสนุนฟังก์ชัน atoi( ) และฟังก์ชัน atof( ) สำหรับโปรแกรมนี้ ในบรรทัดที่ 10 และ 14 ตามลำดับ
บรรทัดที่ 5 ประกาศตัวแปร num เป็นตัวแปรชุด 1 มิติ ชนิด float มีสมาชิก 100 ตัว
บรรทัดที่ 7 ประกาศตัวแปร numstr เป็นตัวแปรชุด 1 ติ ชนิด char มีสมาชิก 20 ตัว
บรรทัดที่ 10 ฟังก์ชัน atoi( ) ใช้เปลี่ยน string เป็นตัวเลขจำนวนเต็ม จากฟังก์ชัน gets( ) รับตัวอักขระมาเก็บไว้ในตัวแปร numstr แล้วเปลี่ยนค่า string ของตัวแปร numstr ไปเก็บไว้ในตัวแปร n โดยใช้ฟังก์ชัน atoi( )
บรรทัดที่ 12 คำสั่ง for ช่วยในการเก็บข้อมูลไว้ในตัวแปรชุด num ซึ่งมีจำนวนรอบของการทำงานเท่ากับจำนวนสมาชิกของตัวแปรชุด คือ n รอบ
บรรทัดที่ 14 ฟังก์ชัน atof( ) ใช้เปลี่ยน string เป็นตัวเลขทศนิยม ซึ่งมีการทำงานคล้ายกับฟังก์ชัน atoi( ) ในบรรทัดที่ 10
บรรทัดที่ 15 คำสั่ง sum = sum + num[i]; เป็นการบวกสะสมค่าตัวแปรชุด
บรรทัดที่ 18 ถึง 21 คำ สั่ง average = sum/n; เป็นการคำนวณค่าเฉลี่ยของตัวแปรชุด แล้วแสดงผลค่าตัวแปร n ตัวแปร sum และตัวแปร average ออกจอภาพ
บรรทัดที่ 22 หยุดรอรับค่าใด ๆ จากคีย์บอร์ด ซึ่งถ้าเรากด enter ก็จะกลับสู่โปรแกรม
โปรแกรมตัวอย่างที่ 5.3 แสดงการใช้ตัวแปรชุด 2 มิติ สำหรับเก็บคะแนนและคำนวณค่าเฉลี่ยของคะแนนในแต่ละชุดแสดงผลออกจอภาพ
/* array3.C */ |
||||
ผลลัพธ์ที่ได้จากโปรแกรม
คำอธิบายโปรแกรม
จากโปรแกรมตัวอย่างที่ 5.3 สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
บรรทัดที่ 5 ถึง 9 ประกาศตัวแปรชุด 2 มิติ ชนิดจำนวนเต็มของตัวแปรชื่อ scores มีจำนวนสมาชิกทั้งหมด 15 ตัว
บรรทัดที่ 11 คำสั่ง for เพื่อตรวจสอบว่า loop เกินจำนวนรอบ คือ แถวของตัวแปรชุดหรือไม่
บรรทัดที่ 12 คำสั่ง for เพื่อนำคะแนนที่เก็บในตัวแปรชุดทั้ง 15 ตัวมารวมกัน ในคำสั่งบรรทัดที่ 13
บรรทัดที่ 14 พิมพ์ คะแนนเฉลี่ยของนักเรียนทั้ง 5 คน ในการสอบแต่ละครั้ง โดยที่ (float) sum/5 เป็นการทำให้ตัวแปร sum เป็นจำนวนทศนิยมชั่วคราว เพราะปกติเราประกาศตัวแปร sum เป็นชนิดจำนวนเต็ม
บรรทัดที่ 15 หยุดรอรับค่าใด ๆ จากคีย์บอร์ด ซึ่งถ้าเรากด enter ก็จะกลับสู่โปรแกรม
โปรแกรมตัวอย่างที่ 5.4 แสดงการใช้ตัวแปรชุด 2 มิติ สำหรับเก็บชื่อจังหวัด แล้วนำข้อมูลมาแสดงออกที่จอภาพ
/* array4.c */ |
||||
ผลลัพธ์ที่ได้จากโปรแกรม
คำอธิบายโปรแกรม
จากโปรแกรมตัวอย่างที่ 5.4 สามารถอธิบายการทำงานของโปรแกรมที่สำคัญ ๆ ได้ดังนี้
บรรทัดที่ 3 คำสั่ง #include <stdlib.h> ให้การสนับสนุนฟังก์ชัน atoi( ) เพื่อเปลี่ยนข้อมูลสตริงเป็นชนิดจำนวนเต็ม ซึ่งเรียกใช้ฟังก์ชันนี้ ในบรรทัดที่ 10
บรรทัดที่ 11 คำสั่ง for เพื่อนำค่าสตริงที่รับเข้ามาไปเก็บไว้ในตัวแปรชุด province[i] ในคำสั่งบรรทัดที่ 13
บรรทัดที่ 15 คำสั่ง for เพื่อนำค่าสตริงที่เก็บไว้ในตัวแปร province[i] ออกแสดงที่จอภาพ ตามคำสั่ง บรรทัดที่ 16
บรรทัดที่ 17 หยุดรอรับค่าใด ๆ จากคีย์บอร์ด ซึ่งถ้าเรากด enter ก็จะกลับสู่โปรแกรม
ไม่มีความคิดเห็น:
แสดงความคิดเห็น