วันอาทิตย์ที่ 11 กันยายน พ.ศ. 2559

โครงสร้างข้อมูลแบบอาร์เรย์

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

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

อาร์เรย์หนึ่งมิติ
อาร์เรย์หนึ่งมิติ (One-dimension Array) มีลักษณะที่ง่ายที่สุดเป็นตารางที่มีเพียงแถวเดียว บางครั้งก็เรียกว่าเว็กเตอร์ ดังในรูปที่ 2.1 เป็นอาร์เรย์หนึ่งมิติชื่อ Vec ที่ประกอบด้วยสมาชิก N ตัว
Vec(1)
Vec(2)
Vec(I)
Vec(N)
ตัวอย่างเป็นอาร์เรย์หนึ่งมิติชื่อ Vec มีสมาชิก N ตัว
อาร์เรย์หนึ่งมิติจะมีดัชนีเพียงตัวเดียวใช้อ้างไปยังตำแหน่งของแต่ละสมาชิกในอาร์เรย์ซึ่งมีค่าเป็นลำดับ สมาชิกแต่ละตัวจะถูกแยกแยะตัวชื่ออาร์เรย์ตามด้วยดัชนีที่อยู่ในวงเล็บดังในรูป  ดังนั้น เมื่อต้องการใช้อาร์เรย์ก็เพียงแต่กำหนดชื่อและใช้ดัชนีอ้างไปยังแต่ละสมาชิก การเขียนอัลกอริทึมจึงใช้โครงสร้างควบคุมการทำงานแบบวนลูปเพื่อใช้ควบคุมสมาชิกแต่ละตัว
การกำหนดอาร์เรย์หนึ่งมิติ
การกำหนดอาร์เรย์หนึ่งมิติจะมีรูปแบบที่กำหนดไว้เป็นดังนี้
V(L:U) = { V(I) }
สำหรับ I = L,L+1,…,U-1,U ซึ่งสมาชิกแต่ละตัว V(I) จะมีโครงสร้างข้อมูล T หมายความว่าอาร์เรย์ V มีสมาชิกที่มีโครงสร้างข้อมูล T และมีดัชนีมีค่าเริ่มจาก L ไปสิ้นสุดที่ U จะได้ช่วงดัชนีจาก L ไป U เท่ากับ U-L+1 ถ้าหากให้อาร์เรย์ V(1:N) จะได้ช่วงดัชนีเท่ากับ N ในการกำหนดค่าให้กับ L อาจเป็น 0 หรือเป็นค่าติดลบได้ เช่น V(-5:5) และมีช่วงดัชนีเท่ากับ 5-(-5)+1 = 11

ตัวอย่างการใช้อาร์เรย์หนึ่งมิติ
การนอาร์เรย์หนึ่งมิติมาใช้งานทำได้หลายหลายและมักนำไปใช้ร่วมกับโครงสร้างข้อมูลชนิดอื่น ๆ ดังตัวอย่างต่อไปนี้เป็นการบันทึกอุณหภูมิแต่ละชั่วโมงภายในหนึ่งวันหรือ 24 ชั่วโมง จะเห็นว่าสมาชิกถูกจัดลำดับตามช่วงระยะเวลาของวันสมาชิกเหล่านี้เป็นชนิดเดียวกัน คือ อุณหภูมิ ดังในตารางที่ 2.1 เป็นตัวอย่างโปรแกรม Temp1.c ที่ทำการบันทึกอุณหภูมิและแสดงผล
จากโปรแกรมในตาราง
ผลลัพธ์ที่ได้
 อาร์เรย์ที่สร้างขึ้นมาบันทึกอุณหภูมิมีชื่อว่าTemp โดยดัชนีจะมีค่าที่ขอบเขตล่างเท่ากับ 1 มีค่าที่ขอบเขตบนเท่ากับ 24 จะได้ว่า Temp(I) เป็นอุณหภูมิในช่วงโมงที่ Iโดย 1≤ I ≥ 24 และการประกาศตัวแปร Tempดังนี้
int Temp [24];
เนื่องจากต้องมีดัชนีใช้กับอาร์เรย์จึงประกาศป็นตัวแปร I ดังนี้
Int i;
การทำงานกับสมาชิกในอาร์เรย์จะใช้การวนลูปเพื่อเก็บค่า ดังนี้
rand ( time(NULL) );
for ( i = 0; i < 24; i++ )
Temp[i] = rand( ) %20+20;
เป็นการกำหนดค่าให้แต่ละสมาชิกโดยการสุ่มค่าให้ หลังจากนั้นทำการแสดงผลบนหน้าจอ ดังนี้
for ( i = 0; i < 24; i++ )
printf ( “%d”, Temp [i] );
การสร้างอาร์เรย์มาใช้งานจะมีโครงสร้างข้อมูลที่มาเกี่ยวข้อง 2 ชนิด เพื่อกำหนดให้สมาชิกในอาร์เรย์และกำหนดให้กับดัชนี นอกจากนี้การใช้ดัชนีอ้างไปยังสมาชิกเพียงบางตัวในอาร์เรย์อาจไม่จำเป็นต้องใช้การวนลูปมาช่วย

อาร์เรย์สองมิติ
อาร์เรย์สองมิติ (Tow-dimension Array) เป็นอาร์เรย์ที่สมาชิกมีโครงสร้างข้อมูลอาร์เรย์ ลักษณะเป็นตารางที่มีทั้งแถว และคอลัมน์ หรือเรียกว่าแมตทริก ดังในรูปที่ 2.1 เป็นอาร์เรย์สองมิติชื่อ Matrix ที่ประกอบด้วยสมาชิกใยแถว M ตัว แต่ละสมาชิกจะมีสมาชิกในคอลัมน์ N ตัว ก็จะได้เป็นตารางขนาด M ต่อ N
ตัวอย่างอาร์เรย์สองมิติชื่อMatrix มีสมาชิก M*N ตัว
                อาร์เรย์สองมิติจะใช้ดัชนีสองตัวเพื่ออ้างไปยังตำแหน่งของแต่ละสมาชิกแยกกัน โดยดัชนีตัวแรกใช้กับสมาชิกในแถว ส่วนตัวที่สองใช้กับสมาชิกในคอลัมน์ ดังนั้นสมาชิกอาร์เรย์ Matrix(I,J) จึงอยู่ในตำแหน่งแถวที่ I ตำแหน่งคอลัมน์ที่ J อาร์เรย์ Matrix จะเรียกว่าอาร์เรย์มิติ M ต่อ N แต่ละแถวมีสมาชิกเท่ากับ N แต่ละคอลัมน์มีสมาชิกเท่ากับ M จะได้สมาชิกทั้งหมดเท่ากับ M*N
การเขียนอัลกอริทึมเพื่อใช้อาร์เรย์สองมิติจะนำโครงสร้างควบคุมการทำงานแบบวนลูปมาใช้ 2 ลูป โดยส่วนใหญ่จะให้ลูปแรกอยู่ด้านนอกใช้ควบคุมสมาชิกในแถว ส่วนลูปที่สองซ้อนอยู่ภายในลูปแรกใช้ควบคุมสมาชิกในคอลัมน์

การกำหนดอาร์เรย์สองมิติ
การกำหนดอาร์เรย์สองมิติจะมีรูปแบบคล้ายกับอาร์เรย์หนึ่งมิติ ซึ่งการกำหนดจะเป็นดังนี้
M(L1:U1,L2:U2) = { M(I,J) }
สำหรับ L1 ≤ I ≤ U1 และ L2 ≤ I ≤ U2 ซึ่งสมาชิกแต่ละตัว M(I,J) จะมีโครงสร้างข้อมูล T
อาร์เรย์ M มีสมาชิกที่มีโครงสร้างข้อมูล T มีสมาชิกในแถวเท่ากับ U2 – L2 + 1 และมีสมาชิกในคอลัมน์เท่ากับ U1 – L1 + 1ดังนั้นสมาชิกทั้งหมดจะเท่ากับ (U2 – L2 +1)*(U1 – L1 +1)

ตัวอย่างการใช้อาร์เรย์สองมิติ
ตัวอย่างที่จะกล่าวถึงเป็นการบันทึกอุณหภูมิแต่ละชั่วโมงภายในหนึ่งวันเช่นเดียวกับตัวอย่างอาร์เรย์หนึ่งมิติ แต่ต้องการจะเก็บอุณหภูมิทุกวันในหนึ่งสัปดาห์ จะเห็นว่าสมาชิกจะถูกจัดลำดับตามช่วงระยะเวลาชั่วโมงของวันและตามช่วงแต่ละวันในหนึ่งสัปดาห์ สำหรับตัวอย่างโปรแกรม คือ Temp2.C ดังในตารางที่ 2.2

 ตัวอย่างโปรแกรม Temp2.c
 จากโปรแกรมในตาราง
ผลลัพธ์ที่ได้
 อาร์เรย์ที่สร้างขึ้นมาชื่อ Temp มีดัชนีตัวแรกมีค่าที่ขอบเขตล่างเท่ากับ 1 มีค่าที่ขอบเขตบนเท่ากับ 7 ส่วนดัชนีตัวที่สองมีค่าที่ขอบเขตล่างเท่ากับ 1 มีค่าที่ขอบเขตบนเท่ากับ 24 จะได้ว่า Temp(I,J) เป็นอุณหภูมิในชั่วโมงที่ J ของวันที่ I โดย 1 ≤ I ≤ 7, 1 ≤ J ≤ 24และการประกาศตัวแปร Temp ดังนี้
int Temp[4] [7] [24];
ดัชนีที่นำมาใช้มีตัวแปร i ใช้กับแถวละตัวแปร j ใช้กับคอลัมน์ ดังนี้
int i,j;
การทำงานกับสมาชิกในอาร์เรย์จะใช้การวนลูป 2 ลูปเพื่อเก็บค่า ดังนี้
srand ( time(NULL) );
for ( i = 0; i < 7; i++ )
for( j = 0; j < 24; j++ )
Temp[i] [j]= rand( ) %20+20;
กำหนดค่าให้สมาชิกโดยการสุ่มค่าให้ จากนั้นแสดงผลบนหน้าจอ ดังนี้
for ( i = 0; i < 7; i++ ){
printf ( “%d”, Temp [i] [j] );
printf( “\n” );
}

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

อาร์เรย์หลายมิติ
การสร้างอาร์เรย์อาจเป็น สามมิติ สี่มิติ หรือมากกว่านั้นเรียกว่าอาร์เรย์หลายมิติหรือ N- มิติ ดัชนีและช่วงจำนวนสมาชิกก็จะเพิ่มมากขึ้นตามจำนวนมิติ อาร์เรย์ N-มิติจะใช้ค่าดัชนี N ตัวอ้างไปยังตำแหน่งสมาชิกแต่ละตัว การกำหนดอาร์เรย์ N-มิติจะเป็นดังนี้
M (L1:U1,L2:U2, …,Ln :Un)
แต่ละสมาชิกของอาร์เรย์จะถูกอ้างถึงโดยกำหนดเป็น M(I1,I2,…,In) ซึ่งแต่ละดัชนีที่
Ik ≤ Ik ≤ Uk สำหรับ k = 1,2,…,N จำนวนสมาชิกทั้งในอาร์เรย์ M เท่ากับ
(U1 – L1 +1) * (U2 – L2 +1) * … * (Un – Ln +1)

ตัวอย่างการใช้อาร์เรย์หลายมิติ
ตัวอย่างที่จะกล่าวถึงจะใช้อาร์เรย์สามมิติเพื่อบันทึกอุณหภูมิแต่ละชั่วโมงภายในแต่ละวันของสัปดาห์ และแต่ละสัปดาห์ภายในหนึ่งเดือน ดังนั้น สมาชิกของอาร์เรย์จะถูกจัดลำดับตามชั่วระยะเวลาชั่วโมงของวันและตามช่วงแต่ละวันในหนึ่งสัปดาห์ ช่วงแต่ละสัปดาห์ในหนึ่งเดือนได้เป็นตัวอย่างโปรแกรม คือ Temp3.c ดังในตาราง
 ตัวอย่างโปรแกรม Temp3.c
จากโปรแกรมในตาราง
ผลลัพธ์ที่ได้
 อาร์เรย์ Temp มีดัชนีตัวแรกอยู่ในช่วง 1 ถึง 4 ตัวที่สองอยู่ในช่วง 1 ถึง 7 และตัวที่สามอยู่ในช่วง 1 ถึง 24 ซึ่งเป็นจำนวนสัปดาห์ วัน และชั่วโมงตามลำดับ จะได้ว่า Temp(I,J,K) เป็นอุณหภูมิในชั่วโมงที่ K ของวันที่ J ในสัปดาห์ที่ I การประกาศตัวแปรTemp ได้เป็นดังนี้
int Temp [7] [24];
เนื่องจากดัชนีหลายตัวอาจสับสนได้ง่าย จึงตั้งชื่อที่มีความหมายให้เข้าใจง่ายดังนี้
int week,day,hour;
และเป็นอาร์เรย์สามมิติการทำงานกับสมาชิกจึงต้องใช้การวนลูป 3 ลูปเพื่อเก็บค่าดังนี้
srand (time(NULL) );
for(week=0;week<4;week++)
for(day=0;day<7; day++)
for (hour=0;hour<24;hour++)
Temp[week] [day] [hour] = rand( ) %20+20;

หลังจากกำหนดค่าให้แต่ละสมาชิกจะแสดงผลบนหน้าจอดังนี้
for (week =0;week<4;week++){
printf (“Temperator of week %d \n”, week+1);
for (day = 0; day<7; day++){
printf(“Day %d \n”, day+1);
for (hour =0; hour <24;hour++)
printf(“%d”,Temp[week] [day] [hour] );
printf(“\n”);
}
ตัวอย่างการเก็บอุณหภูมินี้อาจสร้างอาร์เรย์สี่มิติได้โดยเพิ่มการเก็บข้อมูลในช่วงระยะเวลาหนึ่งปี การสร้างอาร์เรย์หลายมิติเริ่มมีความซับซ้อนมากขึ้นและทำความเข้าใจยากจึงนำมาใช้งานน้อย จะมีที่ใช้คือ อาร์เรย์สามมิติดังในตัวอย่างซึ่งมีลักษณะเป็นกล่อง หรือลูกบาศก์ ดังแสดงในรูป 2.3 ที่ยังทำความเข้าใจได้ เป็นอาร์เรย์สามมิติชื่อ Triangle โดยมิติแรกมีช่วงระยะเท่ากับ 2 มิติที่สองมีช่วงระยะเท่ากับ 3 และมิติที่สามมีช่วงระยะเท่ากับ 5 จะมีสมาชิกทั้งหมดเท่ากับ 30 (M*N*P)


 ตัวอย่างการใช้อาร์เรย์สามมิติชื่อ Triangle มีสมาชิก 30 ตัว (M*N*P)
อาร์เรย์ในหน่วยความจำ
เช่นเดียวกับโครงสร้างข้อมูลอื่น ๆ ที่ต้องมีแนวทางในการเก็บลงในหน่วยความจำ ซึ่งอาร์เรย์มีได้หลายแนวทาง แบบแผนที่ต้องนำมาพิจารณาประกอบด้วย 4 ลักษณะพื้นฐาน คือ
1.       การเข้าถึงเรียกใช้สมาชิกต้องมีความเรียบง่าย
2.       ง่ายต่อการเข้าไปหาแต่ละสมาชิกที่มีหลายเส้นทาง
3.       ประสิทธิภาพของการจัดเก็บที่ง่ายต่อการเข้าถึงแต่ละสมาชิก
4.       ง่ายต่อการเพิ่มขนาดอาร์เรย์ให้มากขึ้น

การเก็บอาร์เรย์หนึ่งมิติในหน่วยความจำ
เมื่อพิจารณาพื้นที่ในหน่วยความจำที่จะเก็บอาร์เรย์หนึ่งมิติ เช่น อาร์เรย์ Vec ในรูปที่ 2.1 ซึ่งมีดัชนีที่ขอบเขตล่างเท่ากับ 1 ส่วนขอบเขตบนเท่ากับ N วิธีที่จะเก็บอาร์เรย์หนึ่งมิติในหน่วยความจำก็คือ ลำดับของสมาชิกในทางกายภาพ เรียงเป็นแบบเดียวกับลำดับของสมาชิกในทางตรรกะ ดังนั้น พื้นที่จัดเก็บสมาชิก Vec(I+1) จะอยู่ต่อเนื่องจากพื้นที่ จัดเก็บสมาชิก Vec(I) สำหรับ
I = 1,…,N-1 ในการคำนวณหาแอดเดรสเริ่มต้นของสมาชิก Vec(I) จำเป็นต้องทราบในเรื่องต่อไปนี้
1. ตำแหน่งแอดเดรสเริ่มต้นของพื้นที่หน่วยความจำที่จะเก็บอาร์เรย์ เรียกว่าตำแหน่งเริ่มต้น (Base Location)
2. ขนาดพื้นที่เก็บแต่ละสมาชิกของอาร์เรย์ กำหนดให้มีขนาด S ไบต์
การหาตำแหน่งแอดเดรสของสมาชิกอาร์เรย์ Vec ตัวที่ I จะได้ ดังนี้
B + (I – 1)*S
หรือกรณีที่ใช้ขอบเขตล่าง L เป็นดังนี้
B + (I – L)*S
เช่น มีอาร์เรย์ Vec(4:10) และต้องการหาตำแหน่งแอดเดรสของสมาชิก Ves(6) โดยตำแหน่งเริ่มต้นอยู่ที่แอดเดรส 2500 และแต่ละสมาชิกมีขนาด 80 ไบต์ ก็จะได้ตำแหน่งแอดเดรสอยู่ที่ 250 + (6 – 4) * 80 = 2660

การเก็บอาร์เรย์หลายมิติในหน่วยความจำ
เนื่องจากหน่วยความจำของเครื่องคอมพิวเตอร์มีลักษณะเป็นเชิงเส้น ดังนั้น อาร์เรย์หลายมิติ ตั้งแต่สองมิติขึ้นไป เมื่อนำไปจัดเก็บลงในหน่วยความจำจะต้องมีลักษณะแบบเชิงเส้นเช่นกัน
ลำดับแถวสำคัญ   (Row-Major Order) ทางเลือกหนึ่งที่นำมาใช้คือเก็บสมาชิกทุกตัวของแถวแรกก่อน จากนั้นเก็บแถวที่สอง และสามไปเรื่อย ๆ ดังในรูปที่ 2.4 คือ อาร์เรย์ Mem(1:4,1:6) ซึ่งมีลักษณะรูปแบบตารางในทางตรรกะ
 อาร์เรย์ Mem (4,6) แสดงเป็นตารางในทางตรรกะ
เมื่อนำไปเก็บไว้ในหน่วยความจำซึ่งมีลักษณะเชิงเส้น ลักษณะอาร์เรย์ทางกายภาพก็จะเป็นเชิงเส้นเหมือนกัน ดังในรูปที่ 2.5
 ลักษณะอาร์เรย์ Mem (1:4,1:6) ในลักษณะแบบลำดับแถวสำคัญ
แบบแผนการจัดเก็บแบบลำดับแถวสำคัญนำมาใช้กับอาร์เรย์ในภาษาเขียนโปรแกรมหลายภาษา เช่น ภาษาโคบอล  ภาษาปาสคาล และภาษาซี ถ้าต้องการทราบแอดเดรสเริ่มต้นของแต่ละสมาชิกในอาร์เรย์สองมิติจะมีวิธีการคำนวณ เช่นหาแอดเดรสเริ่มต้นของสมาชิก Mem(I,J) ในอาร์เรย์ Mem(L1:U1,L2:U2) จะได้ดังนี้
B + (I – L1) * (U2 – L2 + 1) *S + (J – L2) *S
สมมุติต้องการทราบแอดเดรสสมาชิก Mem(2,5) โดยตำแหน่งเริ่มต้นอาร์เรย์คือแอดเดรส 1000 และแต่ละสมาชิกในอาร์เรย์มีขนาด 8 ไบต์ ก็จะได้ 1000+(2-1)*(6-1+1)*8+(5-1)*8 = 1080
ลำดับคอลัมน์สำคัญ (Column – Major Order) เป็นอีกทางเลือกหนึ่งที่เก็บสมาชิกอาร์เรย์ในแนวเชิงเส้นโดยเก็บสมาชิกทุกตัวของคอลัมน์แรกก่อน จากนั้นเก็บคอลัมน์ที่สองและสามไปเรื่อย ๆ อาร์เรย์ Mem ในรูปที่ 2.4 เมื่อเก็บไว้ในหน่วยความจำแบบเชิงเส้นได้เป็นในรูปที่ 2.6
 ลักษณะอาร์เรย์ Men(4,6) ในลักษณะแบบลำดับคอลัมน์สำคัญ
                แบบแผนการจัดเก็บแบบลำดับคอลัมน์สำคัญมีการใช้ภาษาเขียนโปรแกรม  เช่น
ภาษาฟอร์แทรน ถ้าต้องการทราบแอดเดรสเริ่มต้นของแต่ละสมาชิกในอาร์เรย์สองมอตอจะมีวิธี การคำนวณหาของสมาชิก Men(I,J)จะได้ดังนี้
B + (J – L2) * (U1 – L1 + 1) *S + (I – L1) *S
ถ้าต้องการทราบแอดเดรสสมาชิก Men(2,5) แบบลำดับคอลัมน์ก็จะได้
1000+(5-1)*(4-1+1)*8+(2-1)*8 = 1136

แบบทดสอบ
1.ข้อใดไม่ใช่คุณสมบัติของอาเรย์
ก. เป็นตัวแทนกลุ่มข้อมูลที่มีความสัมพันธ์กัน
ข. มีขนาดคงที่
ค. สามารถใช้หน่วยความจำได้เต็มประสิทธิ์ภาพ
ง. เป็นโครงสร้างที่ผู้ใช้สามารถอ้างอิงเพือเข้าถึงข้อมูลได้ทันที
 2.จาก อาเรย์ A จงเลือกค่าที่ได้จากการทำงานของคำสั่งต่อไปนี้
                       คำสั่ง  A(3-1) = ?
ก. เท่ากับ 3
ข. เท่ากับ 4
ค. เท่ากับ 5
ง. เท่ากับ 6
 3.จาก อาเรย์ A จงเลือกค่าที่ได้จากการทำงานของคำสั่งต่อไปนี้
คำสั่ง  A(3)-A(1) = ?
ก. เท่ากับ 3
ข. เท่ากับ 4
ค. เท่ากับ 5
ง. เท่ากับ 6
 4.ข้อใดคือสูตรการคำนวนหาตำแหน่งของข้อมูลในหน่วยความจำสำหรับอาเรย์ 2 มิติ
ก. LOC (a[i, j]) = B + w [ R (i – L1)+(j – L2)]
ข. LOC (a[i, j]) = B + C [ w (i – L1)+(j – L2)] 
ค. LOC (a[i, j]) = B + w [ C (i – L1)+(j – L2)]
ง. LOC (a[i, j]) = B + R [ w (i – L1)+(j – L2)]
 5.ขนาดหน่วยความจำที่ใช้เก็บข้อมูลสมาชิก 1 ตัวของแต่ละช่องเท่ากับ กี่ไบต์ หรือเท่ากับกี่บิต
.1 ไบต์ (32 บิต)
ข. 2 ไบต์ (32 บิต)
ค. 3 ไบต์ (32 บิต)
ง. 4 ไบต์ (32 บิต)
 6. ข้อใดคือความหมายของโครงสร้างข้อมูลแบบอาร์เรย์
  กกลุ่มข้อมูลที่มีค่าชนิดเดียวกัน
  ขกลุ่มข้อมูลที่เป็นตัวเลขเท่านั้น
  คกลุ่มข้อมูลที่มีความสัมพันธ์กัน
  ง. กลุ่มข้อมูลที่มีการลดความซ้ำซ้อน
7. ถ้าตัวแปร เป็นตัวแปรแบบอาร์เรย์แล้ว กลุ่มข้อมูลใดสามารถจัดเก็บตัวแปร ได้
  ก. 25 ,    60  ,    boy ,    T
  . A ,   B ,   C ,    D
  . Dog ,   cat  2.50
  . True ,   Somsri ,   10.25
8.โปรแกรมใดที่จำเป็นต้องใช้ตัวแปรอาร์เรย์
  กโปรแกรมคำนวณหาพื้นที่รูปวงกลม
  ข. โปรแกรมคำนวณหาพื้นที่รูปวงกลม 20 วง
  คโปรแกรมคำนวณหาพื้นที่และเส้นรอบวงของวงกลม
  ง. โปรแกรมหาพื้นที่วงกลมใดที่มีค่ามากที่สุดจาก 20 วง
9. จากโปรแกรมต่อไปนี้  Data  มีผลลัพธ์เป็นเท่าไร
         Program  Test  1
         Var Data : integer
         Begin
            Data : = 60;
            Data : = 20;
            Writeln (Data);
          End
  ก. 60
  . 20
  . 80
  . 40
10. การประกาศตัวแปรอาร์เรย์เพื่อใช้งานต้องประกอบด้วยอะไรบ้าง
  ชื่ออาร์เรย์    ชนิดข้อมูล
  ขชื่ออาร์เรย์    ค่าสูงสุดและค่าต่ำสุด     ชนิดข้อมูล
  คชื่ออาร์เรย์    ค่าสูงสุดและค่าต่ำสุด     มิติของอาร์เรย์     ชนิดข้อมูล
  งชื่ออาร์เรย์    ค่าสูงสุดและค่าต่ำสุด     มิติของอาร์เรย์     ชนิดข้อมูล     จำนวนสมาชิก
เฉลย
1. ค
2. ข
3. ข
4. ก
5. ก
6. ก
7. ข
8. ค
9. ค
10. ค


ผังงาน Flowchart

ความหมายของผังงาน 
ผังงาน (Flowchart) คือ รูปภาพ (Image) หรือสัญลักษณ์(Symbol) ที่ใช้เขียนแทนขั้นตอน คำอธิบาย ข้อความ หรือคำพูด ที่ใช้ในอัลกอริทึม (Algorithm)เพราะการนำเสนอขั้นตอนของงานให้เข้าใจตรงกัน ระหว่างผู้เกี่ยวข้อง ด้วยคำพูด หรือข้อความทำได้ยากกว่าการใช้ผังงาน 
ผังงาน เป็นเครื่องมือแสดงขั้นตอน หรือกระบวนการทำงาน โดยใช้สัญลักษณ์ที่เป็นมาตรฐานเดียวกัน ซึ่งในสัญลักษณ์จะมีข้อความสั้น ๆ อธิบายข้อมูลที่ต้องใช้ ผลลัพธ์ หรือคำสั่งประมวลผลของขั้นตอนนั้น ๆ และเชื่อมโยงขั้นตอนเหล่านั้นด้วยเส้นที่มีลูกศรชี้ทิศทางการทำงานตั้งแต่เริ่มต้นจนจบกระบวนการ [1]p.208 
ผังงานแบ่งได้ 2 ประเภท 
1. ผังงานระบบ (System Flowchart) 
คือ ผังงานที่แสดงขั้นตอนการทำงานในระบบอย่างกว้าง ๆ แต่ไม่เจาะลงในระบบงานย่อย 
2. ผังงานโปรแกรม (Program Flowchart) 
คือ ผังงานที่แสดงถึงขั้นตอนในการทำงานของโปรแกรม ตั้งแต่รับข้อมูล คำนวณ จนถึงแสดงผลลัพธ์ 

การโปรแกรมแบบมีโครงสร้าง หรือ การโปรแกรมโครงสร้าง คือ การโปรแกรมที่ประกอบด้วยกระบวนการ 3 รูปแบบ ได้แก่ การทำงานแบบตามลำดับ(Sequence) การเลือกกระทำตามเงื่อนไข(Decision) และ การทำซ้ำ(Loop) มีตำราหลายเล่มแยกการเลือกตามเงื่อนไขเป็น if กับ select case หรือ การทำซ้ำแยกได้เป็น do while กับ do until แต่ก็ยังนับได้ว่าการเขียนโปรแกรมโครงสร้างมีกระบวนการเพียง 3 รูปแบบ และมีแนวคิดใหม่ว่าการโปรแกรมไม่จำเป็นต้องใช้ Structure Programming หากศึกษาในรายละเอียดก็พบว่าทุกภาษายังจำเป็นต้องมีกระบวนการ 3 รูปแบบนี้อยู่เป็นพื้นฐาน เช่น Microsoft Access ที่มีการใช้งาน Tool หรือ wizard ให้ใช้ แต่ก็ยังต้องมีการลง code ใน module ซึ่งต้องมีประสบการณ์ในการโปรแกรมแบบ Structure Programming เพื่อควบคุม Object ให้ทำงานประสานกันได้



1. การทำงานแบบตามลำดับ
(Sequence)
รูปแบบการเขียนโปรแกรมที่ง่ายที่สุดคือ เขียนให้ทำงานจากบนลงล่าง เขียนคำสั่งเป็นบรรทัด และทำทีละบรรทัดจากบรรทัดบนสุดลงไปจนถึงบรรทัดล่างสุด สมมติให้มีการทำงาน 3 กระบวนการคือ อ่านข้อมูล คำนวณ และพิมพ์





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




3. การทำซ้ำ
(Repeation or Loop)
การทำกระบวนการหนึ่งหลายครั้ง โดยมีเงื่อนไขในการควบคุม หมายถึงการทำซ้ำเป็นหลักการที่ทำความเข้าใจได้ยากกว่า 2 รูปแบบแรก เพราะการเขียนโปรแกรมแต่ละภาษา จะไม่แสดงภาพอย่างชัดเจนเหมือนการเขียนผังงาน ผู้เขียนโปรแกรมต้องจินตนาการด้วยตนเอง

การเขียนผังงานเพื่ออธิบายขั้นตอนการทำงาน 
+ ผังงาน เป็นเครื่องมือสำหรับวาดภาพ 2 มิติ นำเสนอขั้นตอนการทำงาน มักใช้ในการแสดงแบบโปรแกรมที่ไม่ซับซ้อนมากนัก ต่อมาก็มีการประยุกต์ใช้แสดงขั้นตอนการทำงานของส่วนงานต่าง ๆ เพราะสัญลักษณ์ในแผนภาพช่วยในการอธิบายการทำงานแบบมีเงื่อนไขได้ดีกว่าการเขียนเชิงพรรณา 
ประโยชน์ของการใช้ผังงาน 
1. ทำให้เข้าใจ และแยกแยะปัญหาได้ง่าย (Problem Define) 
2. แสดงลำดับการทำงาน (Step Flowing) 
3. หาข้อผิดพลาดได้ง่าย (Easy to Debug) 
4. ทำความเข้าใจโปรแกรมได้ง่าย (Easy to Read) 
5. ไม่ขึ้นกับภาษาใดภาษาหนึ่ง (Flexible Language) 


สัญลักษณ์ผังงาน


การเขียนผังงาน
โจทย์ที่ 1
- พิมพ์เลข 0 ถึง 4 ทางจอภาพ 
ตัวอย่างผังงาน

โจทย์ที่ 2 
- รับค่าจากแป้นพิมพ์เก็บลงตัวแปรอาร์เรย์ 5 ตัว 
- แล้วทำซ้ำอีกครั้ง เพื่อหาค่าสูงสุด 
ตัวอย่างผังงาน

อัลกอริทึม 
1. กำหนดค่าเริ่มต้นให้ max, i และ ar 
2. ทำซ้ำเพื่อรับค่าเก็บใน ar ให้ครบ 5 ครั้ง 
3. กำหนดค่าเริ่มต้นให้ i อีกครั้ง 
4. ทำซ้ำเพื่อนำค่าที่เก็บไว้ใน ar มาหาค่า max 
5. พิมพ์ค่าสูงสุด ที่หาได้ 


โจทย์ที่ 3 
- พิมพ์พีระมิดของตัวเลขดังตัวอย่าง 


Result
1
12
123
1234
12345
Source Code
<?
$i = 1;
while ($i <= 5){
  $j = 1;
  while ($j <= $i) {
    echo $j;
    $j++;
  }
  echo "<br>";
  $i++;
}
?>
Source Code
#include <iostream.h>
#include <conio.h>
void main() {
  for(int i=1;i<=5;i++) {
    for(int j=1;j<=i;j++) {
      cout << j;
    }
    cout << "end" << '\n';
  }
  getch();
}
แบบทอสอบ
1. ข้อใดอธิบายความหมายของผังงานถูกต้อง 
     ก. อธิบายขั้นตอนวิธีการทำงานในลักษณะข้อความ 
     ข. อธิบายลำดับขั้นตอนในลักษณะรูปภาพ 
     ค. อธิบายลำดับขั้นตอนการแก้ปัญหา 
     ง. อธิบายขั้นตอนการทำงานของโปรแกรม ทั่ว ๆ ไป 
2. ข้อใดคือความหมายของค าว่า “Algorithm” 
     ก. อธิบายลำดับขั้นตอนการทำงานตั้งแต่ ขั้นตอนแรกถึงขั้นตอนสุดท้าย 
     ข. อธิบายวิธีการแก้ไขปัญหา 
     ค. ทดสอบลำดับขั้นตอนการแก้ปัญหา
     ง. ถูกทุกข้อ
 3. ข้อใดคือประโยชน์ที่ได้จากผังงาน
     ก. ทำให้เข้าใจและแยกแยะปัญหาต่าง ๆ ได้ง่าย 
     ข. ผู้เขียนสามารถมองเห็นลำดับขั้นตอนวิธีการทำงานได้ชัดเจน 
     ค. การเขียนโปรแกรมทำได้สะดวกรวดเร็วง่าย 
     ง. ถูกทุกข้อ
4. สัญลักษณ์ข้อใดมีได้เพียงสัญลักษณ์เดียวเท่านั้นในผังงาน 
     ก. จุดเริ่มต้น               
     ข. จุดสิ้นสุด 
     ค. แสดงผลทางจอภาพ 
     ง. ถูกทั้งก. และข.
5. ทิศทางของลำดับขั้นตอนการทำงานในผังงาน นิยมเขียนอย่างไร 
     ก. ล่างขึ้นบน 
     ข. ขวาไปซ้าย
     ค. บนลงล่าง 
     ง. ทิศทางใดก็ได้ 
6. สัญลักษณ์การตัดสินใจมีทิศทางการไหลออกได้ กี่ทิศทาง 
ก. 2     ข. 3       ค. 4      ง. 5
7. สัญลักษณ์ในข้อใดมีเฉพาะทิศทางออกเท่านั้น 
     ก. จุดเริ่มต้น 
     ข. จุดสิ้นสุด 
     ค. การแสดงผลลัพธ์ทางจอภาพ 
     ง. ถูกทั้งก. และข.
8.จงอธิบายความหมายของผังงานหรือโฟลว์ชาร์ต 
ตอบ 
9.ผังงานโปรแกรม (Program Flowchart) เป็นอย่างไร 
ตอบ 
10.จงบอกประโยชน์ของผังงาน 
ตอบ     
เฉลย
1. ก
2.ค
3.ง
4.ก
5.ค
6.ก
7.ก
8.   การเขียนอธิบายขั้นตอนการทำงานในลักษณะของรูปภาพ ตั้งแต่ขั้นตอนแรกถึงขั้นตอน สุดท้าย
9.   แสดงถึงขั้นตอนการทำงานของโปรแกรมในส่วนการรับข้อมูลการคำนวณ การ แสดงผล ว่าในแต่ละขั้นตอน ใช้คำสั่งอย่างไร ซึ่งผู้ออกแบบสามารถใช้สำหรับดูเปรียบเทียบและ ลำดับของขั้นตอนต่าง ๆ ในการประมวลผล ทดลองวิธีการเขียนโปรแกรมต่าง ๆ และติดตาม ขั้นตอนการประมวลผลทั้งหมด
10.     1. ทำให้เข้าใจและแยกแยะปัญหาต่าง ๆ ได้ง่ายขึ้น 
            2. ผู้เขียนโปรแกรมสามารถมองเห็นลำดับขั้นตอนวิธีการทำงานได้ชัดเจน
            3. สามารถหาข้อผิดพลาดของโปรแกรมได้ง่าย 
            4. ทำให้ผู้อื่นเข้าใจการทำงานได้ง่ายกว่าการดูจากซอร์สโคด (Source Code) 
            5. ไม่ขึ้นกับภาษาคอมพิวเตอร์ภาษาใดภาษาหนึ่ง ผู้อื่นสามารถเรียนรู้และเข้าใจได้ง่าย