วันอาทิตย์ที่ 8 มีนาคม พ.ศ. 2552

Array and Record

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

จุดประสงค์การเรียนรู้

1. เพื่อให้นักศึกษาทราบวิธีการของอะเรย์
2.เพื่อให้นักศึกษาทราบวิธีการส่งค่าของอะเรย์ในโปรแกรมและฟังก์ชั่น
3. เพื่อให้นักศึกษาทราบวิธีการดำเนินการที่เกี่ยวข้องกับเรคคอร์ดข้อมูล
4.เพื่อให้นักศึกษาทราบความสัมพันธ์ของข้อมูลที่เกิดขึ้นของเรคคอร์ดกับอะเรย์ข้อมูล

Array อะเรย์เป็นโครงสร้างข้อมูลที่เรียกว่า Linear List มีลักษณะคล้ายเซตในคณิตศาสตร์ คืออะเรย์จะประกอบด้วยสมาชิกที่มีจำนวนคงที่มีรูปแบบข้อมูลเป็นแบบเดียวกันสมาชิกแต่ละตัวใช้เนื้อที่จัดเก็บที่มีขนาดเท่ากันเรียงต่อเนื่องในหน่วยความจำหลักการกำหนดArray การกำหนดอะเรย์จะต้องกำหนดชื่ออะเรย์พร้อม subscript ซึ่งเป็นตัวกำหนดขอบเขตของอะเรย์มีได้มากกว่า 1 ตัวจำนวน subscript จะเป็นตัวบอกมิติของอะเรย์นั้นอะเรย์ที่มี subsc ript มากกว่า 1 ตัวขึ้นไปจะเรียกว่า อะเรย์หลายมิติ
คำ subscript ที่ใช้อ้างอิงถึงสมาชิก จะต้องมีค่ามากกว่าหรือเท่ากับขอบเขตล่างและน้อยกว่า หรอเท่ากับขอบเขตบน
lower bound ≤ subscript ≤ upper bound
ขนาดของ index แต่ละตัว ของ Array หาได้จากขนาดของ
subscript = upper bound - lower bound + 1
จำนวนสมาชิกหรือขนาดของอะเรย์ n มิติ หาได้จาก ขนาดของอะเรย์ = ผลคูณของขนาดของsubsc ript แต่ละตัวเช่น
ขนาดของอะเรย์ A = Upper bound - lower bound+1
ขนาดของอะเรย์ K = ผลคูณของขนาดของ
subscript แต่ละตัว

= (5-1+1) * (10-1+1)
= 5 * 10
= 50
= 10-1+1 = 10

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

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

EX. char a[4]; int num[10];

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


#define N 5
int main(void) {
int i;
float score[N];
float total=0;
printf("Number of student [%d]\n",N);
for(i=0; i
คือการกำหนดค่าเริ่มต้นให้กับอะเรย์ การกำหนดค่าให้กับตัวแปรชุดที่มีค่าเป็นตัวเลขรูปแบบ
data-type array-name[n] = {value1, value2,..,value n};
EX. 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โดยอั9โนมัตเพื่อแสดงการสิ้นสุดของข้อความสามารถกำหนดอะเรย์เป็นพารามิเตอร์ส่งให้กับฟังกชั่นได้ 2 ลักษณะ
1. การกำหนด array element เป็น พารามิเตอร์ส่งค่าให้กับฟังกชั่นทำได้โดยอ้างถึงชื่ออะเรย์พร้อมระบุ subscript
EX. swap(num[2],num[3]);
draw_house(color[i],x[i],y[i]);

2. ส่งอะเรย์ทั้งชุดให้ฟังกชั่นทำได้โดยอ้างถึงชื่ออะเรย์โดยไม่มี subscript
EX. #define N 10
float 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
a[0][0] a[0][1] a[0][2]
row 2 a[1][0] a[1][1] a[1][2]

หมายถึง คอมพิวเตอร์จะจองเนื้อที่ในหน่วยความจำ จำนวน 6 ที่สำหรับตัวแปร a
กำหนดค่าเริ่มต้นได้หลายลักษณะ
EX.
กำหนดค่าเริ่มต้นให้ 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 ชื่อกลุ่ม structure
type ชนิดของตัวแปรที่อยู่ในกลุ่ม structure
name-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;
ถามหลายตัวแปรจะคั่นด้วยเครื่องหมายคอมมา ( ,)
Ex.
structemployee {
char name[30];
int
float salary;
};
struct employee emp1, emp2;
emp1 และ emp2 เป็นตัวแปรแบบ structure
ซึ่งมีการระบุ องค์ประกอบไว้ใน employee
เราสามารถที่จะประกาศ structureหนึ่งเป็นสมาชิกของอีก structureหนึ่งได้โดยจะต้องประกาศ structureที่จะนำไปฝั่งไว้ก่อนหน้า structure ตัวนอก
EX.
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-name
struct-variable ชื่อตัวแปรชนิดโครงสริาง
element-name ชื่อตัวแปรที่อยู่ภายใน structure

Ex
struct employee {
char name[30];
char address[20];
float salary;
} personel;

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

Ex.
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;

Ex..
struct employee {
char name[30];
int age;
float salary;
}input[5];

จากตัวอย่าง input เป็นอะเรย์ที่มีสมาชิกสูงสุดได้ 5 ตัว สมาชิกแต่ละตัวเป็น structure การอ้างถึงแต่ ละสมาชิกในอะเรย์ ทำได้โดยระบุ subscriptและระบุสมาชิกใน structure
รูปแบบ
struct-array-name[subscript].member-name
Ex..
ถ้าต้องการเรียกใช้เงินเดือนของสมาชิกของอะเรย์input ตัวที่ 2 สามารถอ้างถึงได้ดั้งนี้
input[1].salary

การกำหนดค่าเริ่มต้นให้กับตัวแปรชุดชนิดโครงสร้าง
Ex.
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
Ex.
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
ข้อสังเกต ที่ต้องใส่( )ที่ตัวแปรพอยนเตอร์เพราะเครื่องหมาย .จะมีลำดับการทำงานสูงกว่าเครื่องหมาย *
Ex.
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 และส่ง ตำแหน่งที่อยู่ของตัวแปรนั้น ๆ ไปยังฟังกชั่น
Ex. การส่งค่าของตัวแปรใน 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เป็นชื่อของตัวแปรที่ต้องการประกาศว่าเป็นชนิดพอยนเตอร์
Ex.
char *prt;
หมายความว่า ประกาศว่าตัวแปร prt เป็นตัวแปรพอยนเตอร์ที่ใช้เก็บตำแหน่งเริ่มต้นที่จะเก็บ character
int *a;
หมายความว่า ประกาศว่าตัวแปร a เป็นตัวแปรพอยนเตอร์ที่ใช้เก็บตำแหน่งเริ่มต้นที่จะใช้เก็บ
เครื่องหมายที่ใช้ทำงานกับตัวแปรพอยนเตอร์
1.เครื่องหมาย & เป็นเครื่องหมายที่ใช้เมื่อต้องการให้เอาคำตำแหน่งที่อยู่ของตัวแปรที่เก็บไว้ในหน่วยความจำออกมาใช้
หมายความว่ากำหนดให้ตัวแปร x ซึ่งอยู่ที่ตำแหน่ง1000 มีค่า 10 เก็บอยู่
Ex.
int *y , x=10;
y = &x;
หมายความว่าตัวแปร y ซึ่งประกาศเป็นตัวแปรพอยนเตอร์จะเก็บค่า 1000
ข้อสังเกต ตัวแปรที่มีเครื่องหมาย & นำหน้าจะไม่สามารถนำมาทำการคำนวณได้
เช่น &x = &x + 1; ไม่ได้
2.เครื่องหมาย * มีการใช้งาน 2 ลักษณะ คือใช้ในการประกาศ parameter ว่าเป็นตัวแปรแบบพอยนเตอร์ เช่น
void swap(int *p,int *q)




Ex.
int *ptr,count;
count = 100;
ptr = &count;
printf(“%d\n”,*ptr);
Ex.
int a, *ptr, b, c , *d;
a =25;
ptr = &a;
b = a;
c = *ptr;
d = ptr;

ลักษณะที่อยู่ในหน่วยความจำ ค่าส่งที่ 1เตรียมเนื้อที่ให้กับตัวแปรภายในหน่วยความจำ ตามตำแหน่งต่าง ๆ ดั้งนี้




















การใช้ตัวแปรพอยนเตอร์กับอะเรย์ตัวแปรพอยนเตอร์จะใช้อ้างถึงค่าที่เก็บไว้ในตัวแปรชุดได้ ดั้งนี้ Ex. char str[80], *pl;
pl = str;

บรรทัดที่ 1 เป็นการประกาศว่า str เป็นตัวแปรชุด ชนิดcharacter 1มิติ มีขนาดสมาชิก 80 สมาชิกและ pl เป็นตัว แปรพอยนเตอร์
บรรทัดที่ 2 เป็นการอ้างถึงข้อมูลที่เก็บในตัวแปรชุด strโดยการนำตำแหน่งที่อยู่ของตัวแปร str[0]ซึ่งเป็นสมาชิกตัวแรกไปเก็บไว้ใน ตัวแปรพอยนเตอร์ pl

เหมือนกับใช้คำสั่ง
pl = &str[0];
การอ้างถึงตัวแปรชุด สามารถอ้างถึงโดยการเพิ่มหรือ ลดตัวแปรพอยนเตอร์ได้ เช่น ต้องการอ้างถึงตัวแปร str[4] ทำได้โดย
*(pl+4)

Ex.
#include
#define N 3
int main(void) {
int num[N], *value;
num[0] = 100;
num[1] = 200;
num[2] = 300;
value = num;
print(“num[0] = %d\n”,*(value));
print(“num[1] = %d\n”,*(value+1));
print(“num[2] = %d\n”,*(value+2));
return 0;

แบบฝึกหัด


1. ให้นักศึกษากำหนดค่าของ Array 1 มิติ และ Array 2 มิติ
2. ให้นักศึกษาหาค่าของ A[2], A[6] จากค่า A={2,8,16,24,9,7,3,8}
3. จากค่าของ int a[2][3] = {{6,5,4},{3,2,1}};ให้นักศึกษา หาค่าของ a[1][0] และ a[0][2]
4. ให้นักศึกษากำหนด Structure ที่มีค่าของข้อมูลจากน้อย6 Records
5. ให้นักศึกษาบอกความแตกต่างของการกำหนดตัวชนิด Arrayกับตัวแปร Pointerในสภาพของการกำหนดที่อยู่ของ ข้อมูล

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

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