thaiall logomy background

อาร์เรย์ (Array)

my town
datastructure | รหัสเทียม | เซต | คิว | สแตก | ลิงค์ลิสต์ | ทรี | จัดเรียง | กราฟ | งานมอบหมาย
อาร์เรย์ (Array)

อาร์เรย์ (Array) หรือแถวลำดับ คือ การรวมกลุ่มของตัวแปรที่สามารถใช้ตัวแปร ชื่อเดียวกันแทนข้อมูลสมาชิกได้หลายตัวในคราวเดียว ด้วยการใช้เลขดรรชนี (Index) หรือซับสคริปต์ (Subscipt) เป็นตัวอ้างอิงตำแหน่งสมาชิกบนแถวลำดับนั้น [3]p.80

แถวลำดับ หรือ อาร์เรย์ (Array) คือ ชุดของข้อมูลที่มีค่าเป็นแบบใดแบบหนึ่ง มีการจัดเรียงอย่างมีลำดับก่อนหลัง (Order Set) เหมือนตารางข้อมูล ประกอบด้วยช่องสำหรับเก็บข้อมูลที่เรียงต่อกัน และเรียกข้อมูลมาใช้ผ่านดัชนี (Index) ที่กำกับแต่ละช่องข้อมูล
ซึ่งการประกาศอาร์เรย์ใน javascript เช่น var ar=new Array(); คำว่า Array ต้องขึ้นต้นด้วย A
+ http://www.thaiall.com/class/java_array.ppt


ภาพที่ 1 : อาร์เรย์ 1 มิติ 2 มิติ 3 มิติ


Code : Data Structures

Array of Character

ไปอ่านโพสต์แนวข้อสอบ while กับ for เค้าถามว่าทำกี่รอบ แต่สิ่งที่คุมจำนวนรอบ คือ จำนวนตัวอักษรใน array of character และค่าของสมาชิก มีการใช้ function ดำเนินการกับ array อาทิ strlen, strcmp, strcat, strcpy เป็นต้น แต่เมื่อไปอ่านใน Webpage ของ Robert I. Pitts หรือ myers พบว่า มีการประกาศ Array แบบไม่กำหนด size แต่คำนวณอัตโนมัติคือเท่าขนาดข้อมูล (char label[] = "Single";) กับกำหนดขนาดชัดเจนและอาจเกินที่จำเป็นต้องใช้ (char label[10] = "Single";) ส่วนที่ marcuscode.com ก็อธิบายเรื่องอาร์เรย์ได้เรียบง่ายดีมาก ผ่านการใช้งานด้วยภาษา C

พอยน์เตอร์ (Pointer) คือ ตัวแปรชนิดหนึ่งที่เก็บตำแหน่ง (address) ของข้อมูลภายในหน่วยความจำ ซึ่งการเก็บตำแหน่ง จะเก็บเฉพาะตำแหน่งแรกของข้อมูลเท่านั้น และมักถูกกล่าวถึงว่าใช้อ้างอิงข้อมูลอาร์เรย์ จะใช้งานได้ดีกว่าอ้างอิงอาร์เรย์ตรง ๆ เพราะเวลาใช้งานอาร์เรย์ ต้องใช้ทั้งตัวแปรข้อมูล แต่ตัวแปรพอยเตอร์จะถูกเรียกใช้เฉพาะตำแหน่งในหน่วยความจำ

Python : เขียน และทดสอบแบบ online
การเขียนโปรแกรม และทดสอบ ผ่านระบบจำลองการแปลคำสั่งแบบ Interpreter แล้วแสดง output โดยไม่ติดตั้งตัวแปลภาษาในเครื่องคอมพิวเตอร์ของเราก็มีหลายทางเลือก เช่น นำ code ที่เขียนขึ้น ส่งไปทดสอบในเว็บไซต์ของผู้ให้บริการ tutorialspoint.com ซึ่งนักเรียน นิสิต นักศึกษา ที่ยังไม่ได้พัฒนาโปรแกรมเพื่อใช้งานจริง แต่ต้องการทดสอบ code ก็เข้าไปใช้บริการได้ เช่น print("hello world")
แหล่งบริการ online (ใช้ a = input("a")) tutorialspoint.com (STDIN)
onlinegdb.com (Interactive)
pythontutor.com (visualize step by step)
mathcs.holycross.edu (step by step)
python.org/shell (interactive)
trinket.io/python (***)
learnpython.org (no input)
App: programminghub.io
App: qpython.com
VSCode: thaiall.com/vscode
Python : การทำงานของอาร์เรย์กับเลขคู่เลขคี่
numbers = [12, 37, 5, 42, 8, 3]
even = []
odd = []
while len(numbers) > :
  number = numbers.pop()
  if(number % 2 == 0):
    even.append(number)
  else:
    odd.append(number)
Python : อาร์เรย์ def และ numpy
import numpy as np # module required
def prt(ax,x):
  for a in ax :
    if type(a) is int: x+=a
    if type(a) is np.string_ : x+=int(a)
  return x
a1= [1,'2',3]; a1.append(4)
print(a1)
a2=a1; a3=np.copy(a2)
a3[0] = 5
a2.remove(1)
print(str(a1) + str(a2) + str(a3));
print(len(a1)+ len(a2) + len(a3)) # 10
print(prt(a2,0)) #7
print(prt(a3,0)) #14
ตัวอย่างนี้เล่า 3 เรื่อง คือ อาร์เรย์ def และ numpy
1. ประกาศอาร์เรย์แบบกำหนดค่าและเพิ่มสมาชิกใหม่อีกค่า
2. สั่งพิมพ์อาร์เรย์ ผลลัพธ์คือ [1,'2',3,4]
3. สั่ง copy อารย์ 2 แบบ คือแบบปกติ และแบบใช้ numpy
4. เปลี่ยนค่าในสมาชิก และสั่งลบสมาชิก
5. แสดงผลอาร์เรย์โดย casting เป็น str ก่อน
6. เรียก function โดยส่งค่า 2 ค่าเข้าไปทำงาน
7. ระหว่างทำงาน ให้ตรวจสอบประเภทข้อมูลก่อน
8. ผลลัพธ์ที่น่าสนใจคือ 10, 7 และ 14
GitHub ระบบการควบคุมรุ่นรหัสต้นฉบับ # Git คือ ระบบควบคุมรุ่นของรหัสต้นฉบับ (Source code) มีหน้าที่จัดเก็บการเปลี่ยนแปลงของรหัสต้นฉบับในโครงการ (Project) ของเรา มีการสำรอง (Backup code) และเรียกดูย้อนไปดูรุ่นต่าง ๆ ของโครงการได้ (Previous version) และดูว่าผู้พัฒนา (Developer) แต่ละท่าน ได้เพิ่ม ลบ แก้ไขบรรทัดใด เมื่อใด ผู้พัฒนาสามารถดาวน์โหลดไปติดตั้งในเครื่อง เพื่อใช้พัฒนาโครงการของตนเองได้ โดย Github คือ เครื่องบริการฝากแฟ้ม Git สำหรับการใช้งานบน Linux ติดตั้งด้วย #sudo apt-get install git หรือจะใช้งานบนวินโดว์ สามารถดาวน์โหลดได้ที่ git-scm.com
ต.ย. รับค่าจาก prompt เก็บลงอาร์เรย์ แล้วประมวลผลเลือกมาใช้งาน
choose_even_in_array.htm
ตัวอย่าง : การประกาศ และเรียกใช้อาร์เรย์ด้วย Javascript
1. การกำหนดค่าให้ตัวแปรแถวลำดับ ตัวใดที่ไม่กำหนดจะมีค่าเป็น undefined
<script>
var ar=new Array();
ar[0]="A";
ar[1]="B";
ar[3]="C";
alert(ar[0] + ar[1] + ar[2] + ar[3] + ar.length); // ABundefinedC4
</script>
2. จำนวนสมาชิกของอาร์เรย์ ประกาศเท่าใดก็จองเท่านั้น เปลี่ยนขนาดได้ขณะประมวลผล
<script>
var ar1=new Array(); 
var ar2=new Array(10); 
alert(ar1.length + ar2.length); // 10
ar1=[];
ar2=["A","B","C"];
alert(ar1.length + ar2.length); // 3
</script>
3. การกำหนดจำนวนสมาชิกใหม่ มีผลให้ข้อมูลสมาชิกที่ไม่อยู่ในขอบเขตหายไป
<script>
var ar=new Array("A","B","C");
ar.length=1;
alert(ar[0] + ar[1]); // Aundefined
</script>
4. การใช้ for .. in จะเลือกเฉพาะมีค่า และข้าม undefined ไป
<script>
var ar=new Array("A","B","C");
ar[5]="E";
alert(ar.length); // 6
for (x in ar) { alert(ar[x]); } // 4 times
</script>
5. ฟังก์ชัน splice() ใช้ลบ และย้าย และแทนที่ สมาชิกในอาร์เรย์
<script>
// array.splice(index,howmany,item1,.....,itemX)
var a = ["a","b","c","d","e","f"];
var b = a.splice(3,2); // d,e = what are removed from a
for (x in b) { alert(b[x]); } // d,e
for (x in a) { alert(a[x]); } // a,b,c,f
a.splice(0,2,"1","2");
for (x in a) { alert(a[x]); } // 1,2,c,f
</script>
6. การจัดเรียงตัวเลข แต่ javascript มองเป็นตัวอักษร
<script>
// var ar = ["1","20","10","2"]; // same result with 1,20,10,2
var ar = [1,20,10,2]; // same result with 1,20,10,2
ar.reverse();
for (x in ar) { alert(ar[x]); } // 2,10,20,1
ar.sort();
for (x in ar) { alert(ar[x]); } // 1,10,2,20
ar.sort(function(a,b){ return (a - b); }); // ascending
for (x in ar) { alert(ar[x]); } // 1,2,10,20
ar.sort(function(a,b){ return (b - a); }); // descending
for (x in ar) { alert(ar[x]); } // 20,10,2,1
</script>
7. การจัดการอาร์เรย์ 2 มิติ
<script>
var ar = [
[1, 2],
[3, 4],
[5, 6]
];
alert(ar.length); // 3
for (x in ar) { alert(ar[x]); } // 1,2 - 3,4 - 5,6
alert(ar[0]); // 1,2
for (x in ar) { 
  for (y in ar[x]) alert(ar[x][y]); // 1,2,3,4,5,6
} 
</script>
8. การจัดการอาร์เรย์ 3 มิติ และการใช้ for .. in ซ้อนกันสำหรับวนลูปในอาร์เรย์ จะไม่ทำงานกับค่าที่ไม่ใช่อาร์เรย์
<script>
var ar = [
[0, ["tom", 2000],["jack", 1000]],
[1, ["jojo", 3500]],
[2, ["boy",2500],["girl", 500]]
];
alert(ar.length); // 3
alert(ar[2][0]); // 2
alert(ar[2][1]); // boy,2500
alert(ar[2][1][0]); // boy
alert(ar[2][1][1]); // 2500
alert(ar[2][2][0]); // girl
alert(ar[2][2][1]); // 500
for (x in ar) 
  for (y in ar[x]) 
    for (z in ar[x][y]) 
       alert(ar[x][y][z]); 
// tom,2000,jack,1000,jojo,3500,boy,2500,girl,500
for (x in ar) {
  for (y in ar[x]) 
    if (!Array.isArray(ar[x][y])) alert(ar[x][y]); // 0,1,2  
}
</script>
9. ตัวอย่างอาร์เรย์ 3 มิติที่สมบูรณ์ แต่ไม่สมดุล ดังนั้นสมาชิกมีอะไรบ้าง
var ar = [
[[101,"tom", 2000],[102,"jack", 1000],[103,"mama", 700]],
[[201,"jojo", 3500]],
[[301,"boy",2500],[302,"girl", 500]]
];
10. สร้างอาร์เรย์ 2 มิติ และสุ่มค่าลงไปในทุกช่อง
<script>
// Math.random() 0.000 - 0.999
var iMax = 2;
var jMax = 3;
var f = new Array();
alert(f.length);
for (i=0;i<iMax;i++) {
 f[i] = new Array();
 for (j=0;j<jMax;j++) {
  f[i][j] = Math.random() * 10;
 }
}
alert(f[1][2]); // 7.234567
</script>
กรณีศึกษา การแยกข้อมูลเป็นอาร์เรย์จากภาพต้นไม้ของพ่อ

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

มีนักศึกษาที่เรียนเรื่องโครงสร้างข้อมูล เข้าร่วมกิจกรรมนี้ เพื่อนำเรื่องใกล้ตัวมาเปรียบเทียบกับการจัดการข้อมูล เรื่องการแบ่งช่องแบบแถวลำดับ (อาร์เรย์ = Array) จึงขอใช้ "ภาพต้นไม้ของพ่อ" มาอธิบายเรื่องอาร์เรย์ เริ่มจากการนำไป split ในเว็บไซต์ imagesplitter.net แบ่งเป็น 5 แถว (row) 5 คอลัมน์ (column) จะได้ภาพย่อย 25 ภาพ แต่ละภาพจะมีจำนวนชาวลำปางแตกต่างกัน เมื่อนำมาบันทึกในอาร์เรย์ก็จะได้อาร์เรย์มิติเดียวมี 25 สมาชิก และเรียงภาพจาก 00.jpg ไปถึง 44.jpg ค่าแต่ละสมาชิกก็จะได้จากการนับจำนวนชาวลำปางในภาพ นับโดยประมาณได้ 100,080 คน
+ อัลบั้มในเฟสบุ๊ค https://www.facebook.com/pg/thaiall/photos/
+ ภาพจากโดรน https://www.facebook.com/notelampang/posts/1268703739838067

แหล่งอ้างอิง (Reference)
+ http://www.javascripter.net/faq/twodimensional.htm
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray
+ http://www.webtoolkitonline.com/javascript-tester.html
+ http://www.w3schools.com/html/tryit.asp?filename=tryhtml_basic
+ http://www.i-programmer.info/programming/javascript/
เอกสารฉบับเต็ม (Full Text)

รศ.ดร.สมชาย ประสิทธิ์จูตระกูล

Mark Allen Weiss

A Byte of Python
เอกสารอ้างอิง (Reference)
[1] โอภาส เอี่ยมสิริวงศ์, "โครงสร้างข้อมูล (Data Structures) เพื่อการออกแบบโปรแกรมคอมพิวเตอร์", บริษัท ซีเอ็ดยูเคชั่น จำกัด., กรุงเทพฯ, 2549.
[2] วิวัฒน์ อภิสิทธิ์ภิญโญ, อมร มุสิกสาร, "โครงสร้างข้อมูล (Data Structures)", บริษัท เอ-บุ๊ค ดิสทริบิวชั่น จำกัด., กรุงเทพฯ, 2548.
[3] เนรมิต ชุมสาย ณ อยุธยา, "เรียนรู้โครงสร้างข้อมูลและอัลกอริทึมด้วย Java", บริษัท ซีเอ็ดยูเคชั่น จำกัด., กรุงเทพฯ, 2550.
[4] Michael McMillan, "Data Structures and Algorithms with JavaScript", O’Reilly Media, Inc., USA., 2014.
[5] Loiane Groner, "Learning JavaScript Data Structures and Algorithms", Packt Publishing, 2014.
Thaiall.com