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

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

เรื่อง Array and Record


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

การกำหนด subscript แต่ละตัวจะประกอบไปด้วยค่าสูงสุดและ ค่าต่ำสุดของ subscript นั้น การประกาศค่าตัวแปรอะเรย์ ในภาษาคอมพิวเตอร์ บางภาษา เช่น
ภาษาปาสคาล var A:array[1..10] of real;
var K:array[1..5,1..10] of integer;
ภาษาซี float A[10];
int K[5] [10];

ข้อกำหนดของการกำหนดค่าต่ำสุดและค่าสูงสุดของ subscript คือ
1.ค่าต่ำสุดต้องมีค่าน้อยกว่าหรือเท่ากับค่าสูงสุดเสมอ
2.ค่าต่ำสุด เรียกว่า ขอบเขตล่าง
3.ค่าสูงสุด เรียกว่า ขอบเขตบน

ค่า subscript ที่ใช้อ้างอิงถึงสมาชิก จะต้องมีค่ามากกว่าหรือเท่ากับขอบเขตล่างและน้อยกว่า หรอเท่ากับขอบเขตบน

lower bound ≤ subscript ≤ upper bound
ขนาดของ index แต่ละตัว ของ Array หาได้จากขนาดของsubscript = upper bound - lower bound + 1
จำนวนสมาชิกหรือขนาดของอะเรย์ n มิติ หาได้จาก
ขนาดของอะเรย์ = ผลคูณของขนาดของsubscript แต่ละตัวเช่น

ขนาดของอะเรย์ A = Upper bound - lower bound+1
ขนาดของอะเรย์ K = ผลคูณของขนาดของsubscript แต่ละตัว
= (5-1+1) * (10-1+1)
= 5 * 10
= 50

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

อะเรย์ 1 มิติ
รูปแบบ
data-type array-name[expression]

data-type คือ ประเภทของข้อมูลอะเรย์ เช่น int char float
array-name คือ ชื่อของอะเรย์
expression คือ นิพจน์จำนวนเต็มซึ่งระบุจำนวน สมาชิกของอะเรย์
ตัวอย่าง char a[4]; int num[10];

char a[4];

หมายถึง คอมพิวเตอร์จะจองเนื้อที่ในหน่วยความจำสำหรับตัวแปร a ให้เป็นตัวแปรชุดชนิด character ขนาดสมาชิก 4 สมาชิกโดยหน่วยความจำจะเตรียมเนื้อที่ให้ 1 byte สำหรับ 1 ชื่อตัวแปร






#include#define N 5int main(void) {int i;float score[N];float total=0;printf("Number of student [%d]\n",N);for(i=0; i <>(printf("input score student[%d]",i);scanf(%f",& score[i]);total = total + score[i]);)printf("Total is % f\n",total);printf("Average is % f\n",total/N);
return 0;



คือการกำหนดค่าเริ่มต้นให้กับอะเรย์ การกำหนดค่าให้กับตัวแปรชุดที่มีค่าเป็นตัวเลข รูปแบบ data-type array-name[n] = {value1, value2,..,value n}; ตัวอย่าง int num[5] = {1,2,3,4,5}; หรือ int num[] = {1,2,3,4,5}; float x[6] = {0,0.25,0,0.5,0,0};


การกำหนดค่าให้กับตัวแปรชุดชนิด Characterรูปแบบchar array-name[n] =“string”;EX.char ch[9] = “SAWASDEE”;หรือ char ch[9]={‘S’,‘A’,‘W’,‘A’,‘S’,‘D’,‘E’,‘E’,‘\0’}มีการกำหนดค่าให้ตัวแปรชุดch[0] จะเก็บค่า S ถึง ch[7] จะเก็บค่า E และ ch[8] จะเก็บค่า \0โดยอัตโนมัติเพื่อแสดงการสิ้นสุดของข้อความ


สามารถกำหนดอะเรย์เป็นพารามิเตอร์ส่งให้กับฟังกชั่นได้ 2 ลักษณะ 1. การกำหนด array element เป็น พารามิเตอร์ส่งค่าให้กับฟังกชั่นทำได้โดยอ้างถึงชื่ออะเรย์พร้อมระบุ subscript ตัวอย่าง swap(num[2],num[3]);draw_house(color[i],x[i],y[i]);
2. ส่งอะเรย์ทั้งชุดให้ฟังกชั่นทำได้โดยอ้างถึงชื่ออะเรย์โดยไม่มี subscript ตัวอย่าง #define N 10float a[N]; float avg;avg = average(N,a); 



ถ้าเป็นอะเรย์มิติเดียวสามารถทำได้ทั้งหมด 3วิธี
1.มีการประกาศขนาดของอะเรย์ที่ทำหน้าที่ในการรับค่า
2.ไม่ต้องมีการประกาศขนาดของอะเรย์ที่ทำ หน้าที่ในการรับค่า
3. ตัวแปรที่ทำหน้าที่รับค่าถูกกำหนดเป็นพอยนเตอร์ 



การส่งผ่านอะเรย์ให้กับฟังกชั่นเป็นการส่งผ่านโดยการอ้างอิง เรียกว่า Pass by reference คือ ค่าของสมาชิกแต่ละตัวจะไม่ได้ถูกส่งไปให้ฟังกชั่น แต่ชื่อของอะเรย์จะถูกมองเป็นตำแหน่งในหน่วยความจำที่ใช้เก็บสมาชิกตัวแรกซึ่ง addressนี้จะถูกส่งให้กับอารกิวเมนต์ที่ตรงกัน ดั้งนั้น อารกิวเมนต์จึงเป็นpointer ชี้ไปยังสมาชิกตัวแรกของอะเรย์


รูปแบบtype array-name[n] [m];
type หมายถึง ชนิดของตัวแปรที่ต้องการประกาศเป็นอะเรย์ array-name หมายถึง ชื่อของตัวแปรที่ต้องการประกาศเป็น อะเรย์n หมายถึง ตัวเลขที่แสดงตำแหน่งของแถว m หมายถึง ตัวเลขที่แสดงตำแหน่งของคอลัมน์
ตัวอย่าง
char a[2][3];

col1 col2 col3
row 1 a[0][0] a[0][1] a[0][2]
row 2 a[1][0] a[1][1] a[1][2]


หมายถึง คอมพิวเตอร์จะจองเนื้อที่ในหน่วยความจำ จำนวน 6 ที่สำหรับตัวแปร aกำหนดค่าเริ่มต้นได้หลายลักษณะ


ตัวอย่าง 
กำหนดค่าเริ่มต้นให้ int a[2][3]
int a[2][3] = {1,2,3,4,5,6}; หรือ
int a[2][3] = {{1,2,3},{4,5,6}}; หรือ
int a[][3] = {{1,2,3},{4,5,6}};

#include 
int main(void)
int a[3][4],r,c;
for(r=0; r<=2; r++)
for(c=0;c<=3;c++)
{
printf(" Entry Number ");
scanf("%d",&a[r][c]);
}
for(r=0; r<=2; r++)
for(c=0;c<=3;c++)
{
printf("\n Display");
printf("%4d",a[r][c]);
}
return 0;

Record or Structure
เป็นโครงสร้างข้อมูลที่ประกอบขึ้นมาจากข้อมูลพื้นฐานต่างประเภทกันรวมเป็น 1ชุดข้อมูลคือ จะประกอบด้วย data element หรือ field ต่างประเภทกันอยู่รวมกันในภาษา C ก็คือการ กำหนดข้อมูลเป็นรูปแบบของ Structure


Structure คือ โครงสร้างที่สมาชิกแต่ละตัวมี ประเภทข้อมูลแตกต่างกันได้ โดยที่ใน structure อาจมีสมาชิกเป็นจำนวนเต็ม ทศนิยม อักขระ อะเรย์ หรือพอยเตอร์ หรือแม้แต่ structure ด้วยกันก็ได้ 
การนิยาม structure รูปแบบ struct struc-name { type name-1; type name-2; ……… type name-n; }struc-variable;

struct เป็นค่าหลักที่ต้องมีเสมอ struc-name ชื่อกลุ่ม structuretype ชนิดของตัวแปรที่อยู่ในกลุ่ม structurename-n ชื่อของตัวแปรที่อยู่ในกลุ่ม structure struc-variable ชื่อตัวแปรชนิดโครงสร้างคือ ตัวแปรที่มีโครงสร้าง เหมือนกับที่ประกาศไว้ในชื่อของกลุ่ม structureอาจมีหรือไม่มีก็ได้ถามมากกวา 1 ชื่อ แยกกันด้วยเครื่องหมายคอมมา (,)


การประกาศสมาชิกแต่ละตัวของ structureสมาชิกแต่ละตัวของ structure จะเป็นตัวแปรธรรมดาพอยนเตอร์อะเรย์หรือ structure ตัวอื่นก็ได้โดยชื่อของสมาชิกแต่ละตัวต้องแตกต่างกัน


struct employee {
char name[30];
int age;
float salary;
} personel;


จากตัวอย่าง เป็นการกำหนดให้ตัวแปร employeeเป็นชื่อของกลุ่ม structureที่ประกอบไปด้วย ตัวแปร name[30],age และ salary โดยมีตัวแปร personel เป็นตัวแปรชนิดโครงสร้างที่มีข้อมูลแบบเดียวกับตัวแปร employee


การกำหนดให้ตัวแปรมีโครงสร้างข้อมูลเหมือนกับ structure ที่ประกาศไว้แล้วสามารถกำหนดให้ตัวแปรอื่น ๆ มีโครงสร้างข้อมูลเหมือนกับ structure ที่ประกาศไว้ได้โดยใช้คำสั่งstruct struct struc-name struc-variable;ถามหลายตัวแปรจะคั่นด้วยเครื่องหมายคอมมา ( ,)


ตัวอย่าง
structemployee {
char name[30];
int
float salary;
};
struct employee emp1, emp2;
emp1 และ emp2 เป็นตัวแปรแบบ structure
ซึ่งมีการระบุ องค์ประกอบไว้ใน employeeเราสามารถที่จะประกาศ structureหนึ่งเป็นสมาชิกของอีก structureหนึ่งได้โดยจะต้องประกาศ structureที่จะนำไปฝั่งไว้ก่อนหน้า structure ตัวนอก


ตัวอย่าง
struct date {
int month;
int day;int year;
};
struct account {
int acct_no;
char name[30];
struct date lastpayment;
oldcustomer;


การกำหนดค่าเริ่มต้นให้กับสมาชิกของ structureสามารถกำหนดค่าเริ่มต้นให้กับสมาชิกของ structureได้โดยค่าเริ่มต้นที่กำหนดให้กับสมาชิกตัวใด จะต้องอยู่ในตำแหน่งที่ตรงกับสมาชิกตัวนั้นค่าเริ่มต้นจะต้องอยู่ในวงเล็บปีกกาและข้อมูลค่าเริ่มต้นแต่ละตัวแยกกันด้วยเครื่องหมาย ,
structure account ประกอบด้วยสมาชิก ดั้งนี้
- เลขจำนวนเต็ม (int acct_no)
- อะเรย์ของอีกขระจำนวน 30 ตัว (char name[30]);
- structure date

struct date {
int month;
int day;
int year;
};
struct account
{
int acct_no;
char name[30];
struct date lastpayment;
};
struct account customer = {1234, “John Smith”, 5,24,46};

จะได้วา customer เป็นตัวแปรแบบstructure ประเภท accountมีการกำหนดค่าเริ่มต้นให้สมาชิกแต่ละตัว ดั้งนี้
acct_no มีค่าเป็นจำนวนเต็ม 1234
name[30]มีค่าเป็น string “John Smith”
month มีค่าเป็นจำนวนเต็ม 5
มีค่าเป็นจำนวนเต็ม 24
มีค่าเป็นจำนวนเต็ม 46
การอ้างถึงตัวแปรที่อยู่ในตัวแปรชนืดโครงสร้างสามารถอ้างถึงตัวแปรที่อยู่ในตัวแปรชนิด โครงสร้างได้ รูปแบบ
struct-variable.element-namestruct-variable ชื่อตัวแปรชนิดโครงสร้าง
element-name ชื่อตัวแปรที่อยู่ภายใน structure



ตัวอย่าง
struct employee {
char name[30];
char address[20];
float salary;
} personel;



จากตัวอย่าง ถ้าต้องการนำตัวแปร salary มาใช้งานก็จะอ้างถึงตัวแปร salary ได้โดย
personel.salary



ตัวอย่าง
int main(void) {
struct account {
char name[30];
char addr[30];
float salary;int age;}
new;strcpy(new.name, “somsri”);
strcpy(new.addr, “jantaburi”);
new.salary = 7500;new.age= 35;
printf(“Name: %s\n Address: %s\n Salary : %.2f\n Age : %d\n”,new.name,new.addr,new.salary,new.age);
return 0;
}



อะเรย์ชนิดโครงสร้าง
รูปแบบ struct struc-name {
type name-1;
type name-2;
………
type name-n;
} struct-array variable;



ตัวอย่าง
struct employee {
char name[30];
int age;
float salary;
}input[5];



จากตัวอย่าง input เป็นอะเรย์ที่มีสมาชิกสูงสุดได้ 5 ตัว สมาชิกแต่ละตัวเป็น structure การอ้างถึงแต่ ละสมาชิกในอะเรย์ ทำได้โดยระบุ subscriptและระบุสมาชิกใน structure


รูปแบบ
struct-array-name[subscript].member-name



ตัวอย่าง
ถ้าต้องการเรียกใช้เงินเดือนของสมาชิกของอะเรย์input ตัวที่ 2 สามารถอ้างถึงได้ดั้งนี้
input[1].salary



การกำหนดค่าเริ่มต้นให้กับตัวแปรชุดชนิดโครงสร้าง
ตัวอย่าง



struct account {
int acct_no;
char name[30];
int age;
}customer[2] = {
{123, “Bill”, 23},
{125, “John”, 25}
};



Structure กับ pointer
เราสามารถที่จะอ้างถึงที่อยู่เริ่มต้นของ structureได้เหมือนกับตัวแปรอื่น ๆโดยใช้ตัวดำเนินการ &ดั้งนั้นถ้า variableเป็นตัวแปรประเภท structure&variable จะเป็นเลขที่อยู่เริ่มต้นของตัวแปร นอกจากนี้ยัง สามารถประกาศตัวแปรพอยนเตอร์สาหรับ structure ดั้งนี้
type *ptvar
type คือ ประเภทข้อมูลที่เป็น structure
ptvar คือ ชื่อของตัวแปรพอยนเตอร์
ดั้งนั้น สามารถกำหนดเลขที่อยู่เริ่มต้นของตัวแปรstructure ให้กับตัวแปรพอยนเตอร์ได้ดั้งนี้ ptvar = &variable



ตัวอย่าง
structaccount {
int acct_no;
char name[20];
int age;
}customer;
struct account *p;



จากตัวอย่าง ตัวแปรพอยเตอร์ p จะเป็นตัวแปรที่ทำหน้าที่ชี้ตำแหน่งที่อยู่ของตัวแปรชนิดโครงสร้างที่ชื่อ accountจะกำหนดเลขที่อยู่เริ่มต้นของ customerให้กับ pได้ คือp = &customer;เราสามารถที่จะเรียกใช้สมาชิกแต่ละตัวใน structure ได้จากตัวแปรพอยนเตอร์ ดั้งนี้


รูปแบบptvar -> member-name
ptvar คือ ตัวแปรพอยนเตอร์ที่ชี้ไปยัง structure
-> คือ ตัวดำเนินการที่เทียบได้กับตัว ดำเนินการ
member-name คือ สมาชิกของ structure(*ptvar).member-name

ข้อสังเกต ที่ต้องใส่( )ที่ตัวแปรพอยนเตอร์เพราะเครื่องหมาย .จะมีลำดับการทำงานสูงกว่าเครื่องหมาย *
ตัวอย่าง
struct account {
int acct_no;
char name[30];
int age;
}customer;
struct account *p = &customer;



ถ้าต้องการเรียกใช้ acct_no ของตัวแปรstructure ชื่อ customer จะเขียนได้ ดั้งนี้
customer.acct_no
หรือ p->acct_no
หรือ (*p).acct_no



การผ่าน structure ให้ฟังกชั่น ประเภทของการส่งผ่าน structure ให้ฟังกชั่นนั้น มี 2ประเภท คือ
1. ส่งสมาชิกแต่ละตัวของ structure
2. ส่งทั้ง structure
1.ส่งสมาชิกแต่ละตัวของ structureสมาชิกแต่ละตัวของ structureสามารถส่งเป็นอาร์กิวเมนต์ ของฟังกชั่นและส่งกลับจากฟั่งกชั่นได้โดยใช้คำสั่ง returnซึ่งมีทั้งการส่ง ค่าของตัวแปรที่อยู่ในตัวแปรstructure และส่ง ตำแหน่งที่อยู่ของตัวแปรนั้น ๆ ไปยังฟังกชั่น



ตัวอย่าง
การส่งค่าของตัวแปรใน structure ไปยังฟังกชั่น
float cal_annual(float);
int main(void) {
struct employee{
}emp1= {“somporn”,26,6500.50};
float annual;
annual = cal_annual(emp1.salary);
return 0;
}
float cal_annual(float sal) {
return(sal*12);
}



ถ้าส่งเป็นตำแหน่งที่อยู่ของตัวแปรใน structure ไปยังฟังกชั่น จะทำได้โดยใส่เครื่องหมาย & หน้าตัวแปรแบบstructure ดั้งนี้
struct sample{
char x[10];
int y;
float z;
};
สามารถส่งตำแหน่งที่อยู่ของตัวแปรใน structure ดั้งกล่าวไปยังฟังกชั่นได้ ดังนี้
f1(sample.x);
f2(&sample.y);
f3(&sample.z);
ข้อสงเกต
ถ้าเป็นตัวแปรชนิดอะเรย์ไม่ต้องใส่เครื่องหมาย & เพราะเป็นการส่งคำ ตำแหน่งที่อยู่ไปทั้งชุดอยู่แล้ว
2.ส่งผ่านทั้ง structure ให้กับฟังกชั่น จะส่งผ่านในลักษณะของพอยนเตอร์ไปยัง structureโดยหลักการจะเหมือนกับการส่งผ่านอะเรย์ไปให้ ฟังกชั่น ซึ่งเป็นลักษณะที่เรียกว่า Pass by reference

Pointer เป็นตัวแปรชนิดหนึ่งที่ทำหน้าที่เก็บตำแหน่งที่อยู่ (Address)ของตัวแปรที่อยู่ในหน่วยความจำการประกาศชนิดของตัวแปรพอยนเตอร์


type *variable-name
หมายถึง ชนิดของตัวแปร
หมายถึง เป็นเครื่องหมายที่แสดงว่า ตัวแปรที
ตามหลังเครื่องหมายนี้เป็นตัวแปรพอยนเตอร์ variable-nameเป็นชื่อของตัวแปรที่ต้องการประกาศว่าเป็นชนิดพอยนเตอร์


ตัวอย่าง
char *prt;
หมายความว่า ประกาศว่าตัวแปร prt เป็นตัวแปรพอยนเตอร์ที่ใช้เก็บตำแหน่งเริ่มต้นที่จะเก็บ character
int *a;หมายความว่า ประกาศว่าตัวแปร a เป็นตัวแปรพอยนเตอร์ที่ใช้เก็บตำแหน่งเริ่มต้นที่จะใช้เก็บ
ข้อที่ 1)
ขนาดของตัวแปรอาร์เรย์ขึ้นอยู่กับอะไร
   จำนวนเซลล์ของอาร์เรย์ที่ใช้จริง
   ประเภทข้อมูลของอาร์เรย์
   ชื่อตัวแปรอาร์เรย์
   ถูกทุกข้อ

ข้อที่ 2)
ถ้าหากประกาศตัวแปรอาร์เรย์เป็น int x[9] ข้อใดไม่ถูกต้อง
   มีตัวแปรย่อยทั้งหมด 9 ตัว
   แต่ละเซลล์เก็บเลขจำนวนเต็ม
   ตัวแปรตัวสุดท้ายคือ x[9]
   ใช้หน่วยความจำทั้งหมด 18 ไบต์

ข้อที่ 3)
ตัวแปรอาร์เรย์แบบ 2 มิติต่างจากอาร์เรย์แบบ 1 มิติอย่างไร
   การอ้างถึงข้อมูล
   การเก็บข้อมูล
   ขนาดของข้อมูล
   ถูกทุกข้อ

ข้อที่ 4)
ถ้าหากตัวแปร M เป็นอาร์เรย์ 2 มิติ ที่ประกาศเป็น int M[2][2] การอ้างถึงเซลล์ในอาร์เรย์ข้อใดผิด
   M[1][0]
   M[2][2]
   M[0][0]
   M[1][1]

ข้อที่ 5)
ถ้าหากประกาศตัวแปรเป็น char name[8] ข้อใดไม่ถูกต้อง
   เป็นตัวแปรอาร์เรย์ของอักขระ
   เก็บข้อความสตริงได้ 8 ตัวอักษร
   ใช้หน่วยความจำ 8 ไบต์
   ใช้เก็บตัวเลขได้

ข้อที่ 6)
ข้อความแบบสตริงใช้รหัสใดเป็นตัวสิ้นสุดสตริง
   %c
   %s
   /0
   \0

ข้อที่ 7)
ฟังก์ชั่นใดใช้สำหรับหาความยาวสตริง
   strcpy()
   strlen()
   strcmp()
   strleng()

ข้อที่ 8)
ข้อมูลที่อยู่ในตัวแปรพอยน์เตอร์คืออะไร
   ข้อมูลในหน่วยความจำ
   ค่าแอดเดรสหน่วยความจำ
   อินเด็กซ์ของอาร์เรย์
   ถูกทุกข้อ

ข้อที่ 9)
ถ้าหากประกาศตัวแปรเป็น int *x ข้อใดไม่ถูกต้อง
   ตัวแปร x ชี้ไปที่หน่วยความจำที่เก็บตัวเลข
   x เป็นค่าข้อมูลในหน่วยความจำ
   ตัวแปร x เป็นตัวแปรแบบพอยน์เตอร์
   *(x+1) ใช้อ้างข้อมูลได้

ข้อที่ 10)
ถ้าหากตัวแปร p เป็นตัวแปรพอยน์เตอร์ จากนั้นเขียนนิพจน์ p + = 5; ข้อใดถูกต้อง
   นำค่าในตำแหน่งที่ตัวแปร p ชี้อยู่มาบวกด้วย 5
   เลื่อนแอดเดรสที่ตัวแปร p ชี้อยู่ไปอีก 5 ไบต์
   เลื่อนพอยน์เตอร์ p ไปอีก 5 ตำแหน่ง
   นำค่าในแอดเดรส p บวกด้วย 5 แล้วนำไปเก็บไว้ที่เดิม

เฉลย 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.ง



ไม่มีความคิดเห็น:

แสดงความคิดเห็น