บทที่ 5ข้อมูลชนิดอาร์เรย์และสตริง
TRANSCRIPT
อารเรย (Array)
อารเรย (Array) เปนตวแปรชดใหส าหรบเกบขอมลทมความสมพนธกน โดยจะเกบไวในชอ
เดยวกน
สมาชกแตละตวของ Array จะเรยกวา Element หรอ Cell ตวเลขทใชระบต าแหนงสมาชกของ Array เรยกวา Index หรอ Subscript
อารเรยหนงมต มโครงสรางเทยบเทาเมตรกซขนาด nx1 การประกาศตวแปร
อารเรย จะใชเครองหมาย [ ] ลอมคาตวเลขจ านวนเตม เพอบอกจ านวนหนวยขอมลทตองการไดในรป
ชนดของตวแปร ชอตวแปร[จ านวนสมาชกทตองการ]
data_type variable_name [ number-of-elements ]
เชน int a[5];
double x, y[10], z[3];
อารเรยหลายมต (Multi-dimensional array) คอ อารเรยทมสมาชกเปนขอมลอารเรย นนคอ ในหนวยขอมลแตละหนวยของอารเรย
จะเปนอารเรยยอยๆ ซงอาจจะก าหนดซอนลงไปไดหลายช น
การก าหนดอารเรยหลายมต จะกระท าในรป
ชนดตวแปร ชอตวแปร[จ านวนสมาชก][จ านวนสมาชก]….; การประกาศอารเรยหลายตวท าไดดงน
int [] abc , xyz; abc = new int[500]; xyz = new int[10]; หรอเขยนรวมกนไดดงน
int[] abc = new int[500], xyz = new int[10];
™ สามารถประกาศตวแปร Array พรอมกบก าหนดคาเรมตนใหกบ
สมาชก Array ไดโดยมรปแบบ
ดงน
ชนดของตวแปรอารเรย ชออารเรย[จ านวนขอมล] = {คาคงท,คาคงท
,…};
เราสามารถใชค าส งวนรอบ for ในการวนรอบรบคาทปอนเขามาและใชใน
การค านวณโดยการใชตวแปรในการวนรอบ และใชตวแปรเดยวกน เพอก าหนด
ล าดบของขอมลทจะใชในอารเรย
int x,a[5]; for (x=0; x<5; x++) { printf(“Enter value for a[%d]:”,x); scanf(“%d”,&a[x]); } printf(“Show all values\n”); for (x=0; x<5; x++) { printf(“a[%d] = %d”, x, a[x]); }
สามารถแบงไดเปน 2 ลกษณะ
™ 1. การสงผานคาอลเมนตอารเรยใหกบฟงกชน เปนการเรยกใช ฟงกชนแบบ Call-by-value
™ 2. การสงอารเรยทกอลเมนตใหกบฟงกชน เปนการเรยกใช
ฟงกชนแบบ Call-by-reference
™ ใชวธการสงคาของตวแปร (value) ใหกบฟงกชน โดยผานพารามเตอร ™ ไมสามารถแกไขคาของอารกวเมนต(หรอพารามเตอร) ภายในฟงกชนได = การแกไขคา
ตางๆในฟงกชน ไมมผลตอตวแปรทสงคามา
™ ใชกบฟงกชนทรบคาเขาเปนตวแปรธรรมดา (int, float, char,...) ™ เชน void triple(int x)
{ x=x*3; printf(“x = %d”,x); }….
™ int x=5, y[2]={10,11};triple(x); triple(y[0]);
™ triple(x) สงคา 5 ใหกบฟงกชน ในฟงกชน x เรมตนเปน 5 ™ และถกท าใหกลายเปน 15 หลงจบฟงกชน คา x นอกฟงกชน
ไมเปลยนแปลง
™ triple(y[0]) สงคา 10 ใหกบฟงกชน ในฟงกชน x เรมตนเปน 10 ™ และถกท าใหกลายเปน 30 หลงจบฟงกชน คา y[0] ยงเหมอนเดม
™ ™ ใชวธการสงคา แอดเดรส (Address)*** ของตวแปรไปให
ฟงกชน
™ ใชกบฟงกชนทรบคาเขาเปนอารเรย
™ สามารถแกไขคาของอารกวเมนตภายในฟงกชนได = การแกไข
คาตวแปรอารเรย ภายในฟงกชน มผลการเปลยนแปลงตอตวแปรทสงคามา
เพราะ การมการจดการคาของหนวยความจ าในต าแหนงเดยวกน
™ ***แอดเดรส (Address) คอ คาทใชอางถงตวขอมลภายในหนวยความจ า เหมอนกบหมายเลขบานเลขท**
™ ™ อารเรยสามารถเกบ reference ของ Object ได โดยก าหนดใหอาเรย
เปน Class นน ๆ ในตอนประกาศอาเรย มรปแบบดงน
™ ™ className [] arrayName = new className[size]; ™ เชน
™ Student [] studentList = new Student[10];
™ ™ Student [] studentList = new Student[3]; ™ studentList[0] = new Student(); ™ studentList[1] = new Student(); ™ studentList[2] = new Student();
™ ™ โดยสรป ส าหรบอารเรยสองมต เมออางชออารเรย จะหมายถง
ต าแหนงเรมตนของอารเรยท งหมด (อารเรย 2 มต) ™ เมออางชออารเรยพรอมสมาชกหนงอนดบ จะหมายถงต าแหนง
เรมตนของอารเรยยอยภายใน (อารเรย 1 มต) ™ เมออางชออารเรยพรอมคาสองอนดบ จะหมายถง ขอมลภายใน
อารเรย
™ ใชลป for 2 ชน โดยลปช นนอกวนรอบตามจ านวนแถว สวนลปช นใน
วนรอบตามจ านวนหลก
™ ตองมตวนบ 2 ตว คอ ตวนบแถวและตวนบหลก
™ ตวอยางเชน
™ int i,j,x[2][3]; ™ for(i=0;i<2;i++) ™ for(j=0;j<3;j++) ™ x[i][j] = i+j; ™การใหคาเรมตน (Array Initialization) · เราจะใชกลมคาคงททมสมาชกเปนกลมคาคงทยอย ซงเปนชนดเดยว กน
และมขนาดเทากน รวมถงสอดคลองกบชนดของอารเรยดวย
· โดยใชเครองหมาย {} หรอ , ในการแบงแยกแตละแถว
ในภาษา Java มกลมคลาสทเรยกวา คอลเลกช น (Collection) ซงออบเจกตจากคลาสนสามารถใชสะสมออบเจกตตาง ๆ ไวได เชน Class ArrayList ดกวา Array ทสามารถเพมสมาชกได โดยไมตองประกาศไวลวงหนา
การใช Class ArrayList จะตอง import java.util.ArrayList
ตวอยางการสรางออบเจกต จาก Class ArrayList Method ทส าคญของ ArrayList ™ -add(int index,Object obj) ใชใสออบเจกตลงในอารเรยท
ต าแหนง index ™ -remove(int index) น าออบเจกตต าแหนง index ออกจากอารเรย
™ -get(int index) คนคาออบเจกตในต าแหนง index ™ -indexof(Object obj) คนคา index ของออบเจกตทระบ
™ -size ส าหรบหาขนาดของ ArrayList
String คอขอความ หรอ สายของอกขระ ในภาษา C++ ไมมตวแปร
ประเภท String แตจะมตวแปรประเภท char ใหใชแทน ซงตวแปร
ประเภทchar จะสามารถเกบอกขระได 1 อกขระ เทานนถาหากเราอยากให
ตวแปร char สามารถเกบขอความไดเรากสามารถ ท าใหตว
แปร char เปน array ได char Name[10];
ใชเครองหมาย == เปนการเปรยบเทยบวา String 2 ตวเปน Object เดยวกนหรอไม โดยจะ
เปรยบเทยบคาอางองหรอทอยในหนวยความจ าของตวแปรท งสอง ไมไดเปนการ
เปรยบเทยบถงขอมลท String ท ง 2 ตววาเกบขอมลเดยวกนหรอไม
รปแบบค าส ง
String1 == String2; equals() method เปนการเปรยบเทยบคาใน String Object ท ง 2 ตวเปนคาเดยวกนหรอไม
โดยทจะใหคาเปนจรง (True) กตอเมอตวอกษรทกตวใน String ท ง 2 คา
จะตองเหมอนกนหมด โดยสนใจตวอกษรพมพเลกและพมพใหญดวย หากตางกนก
จะ
ใหคาเปนเทจ (False)
™ คลาส StringBuffer จะมลกษณะคลายกบคลาส String เพยงแตเปน
ตวแปรสตรงทมการแกไขคาแบบถาวร คอนสตรกเตอรของคลาส StringBuffer ท
นาสนใจมดงตอไปน
v StringBuffer(String s) เกบสตรง s ไวในตวแปร StringBuffer v StringBuffer() เกบขอความวางเปลาไวในตวแปร StringBuffer และม
ขนาด 16 byte เหตทตวแปร StringBuffer มขนาดปกต 16 และจะเพมขนาด
เมอเกบขอความลงไป เปนเพราะถามการเปลยนขอความทเกบภายหลง ขอความใหมอาจม
ขนาดไมเทาเดม ดงนนจาวาจงวางไวอก 16 ทวางเพอจะไดไมตองกนทในหนวยความจ า
เพมเตมอก ในกรณทขอความใหมมขนาดใหญกวาเดมไมเกน 16 เพราะการกนทใน
หนวยความจ าเพมเตมภายหลงเปนเรองยงยากและอาจท าใหประสทธภาพในการเขาถงลดลง
v StringBuffer(int length) เกบขอความวางเปลาไวในตวแปร StringBuffer และมขนาดเทากบ length