The words you are searching are inside this book. To get more targeted content, please make full-text search by clicking here.
Discover the best professional documents and content resources in AnyFlip Document Base.
Search
Published by chaowalert, 2019-12-23 22:39:21

Programming 2

3. ให้นักเรียนพิจารณาส่วนของโปรแกรมต่อไปนี้

ก าหนดให้ 0022ff74 คือเลขที่ต าแหน่งของตัวแปร num
ก าหนดให้ 0022ff75 คือเลขที่ต าแหน่งของตัวแปร *data

main()
{ float *data,num=50.00;
data=#
*data =30.00;

num=(*data)+num;
printf(“ *data = %.2f\n”,*data); ข้อ 3.1
printf(“ num = %.1f\n”,num+5); ข้อ 3.2
printf(“ data = %p\n”,data);ข้อ 3.3

printf(“ num = %p\n”,&num);ข้อ 3.4
printf(“data = %p\n”,&data);ข้อ 3.5
printf(“ num = %.2f\n”,*data);ข้อ 3.6
}
Programming 2 3.2 ผลลัพธ์ที่ได้คือ ……………………………………………………………………..

3.1 ผลลัพธ์ที่ได้คือ ……………………………………………………………………..


3.3 ผลลัพธ์ที่ได้คือ ……………………………………………………………………..
3.4 ผลลัพธ์ที่ได้คือ ……………………………………………………………………..

3.5 ผลลัพธ์ที่ได้คือ ……………………………………………………………………..

3.6 ผลลัพธ์ที่ได้คือ ……………………………………………………………………..
3.7 เมื่อมีการท างานของโปรแกรมเสร็จสิ้นแล้ว ให้นักเรียนเติมข้อมูลในแผนภาพต่อไปนี้ให้

ถูกต้อง


num data

*data
………………………………………. ……………………………………….


4. Address  …………………………………… ……………………………………………..


50

ใบความรู้ที่ 8

การอ้างถึงต าแหน่งในหน่วยความจ าของตัวแปรแบบพอยเตอร์

เนื้อหา
1. การอ้างอิงต าแหน่งในหน่วยความจ า
ผลการเรียนรู้ที่คาดหวัง
1. อธิบายการอ้างอิงต าแหน่งในหน่วยความจ าของตัวแปรเก็บข้อมูลชนิดพื้นฐานได้แก่
จ านวนเต็ม จ านวนทศนิยมและอักขระได้

2. อธิบายการอ้างอิงต าแหน่งในหน่วยความจ าของตัวแปรโดยใช้ตัวแปรแบบพอยเตอร์ได้


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

ไว้ นั่นคือ
เครื่องหมาย &(ampersand) และเครื่องหมาย * (asterisk)


1. การอ้างถึงต าแหน่งของข้อมูลด้วย & (Address Operator) Programming 2
เครื่องหมาย & ใช้น าหน้าชื่อตัวแปรเพื่อหาต าแหน่งในหน่วยความจ าของตัวแปรนั้น
จากหัวข้อที่ 2 เมื่อสร้างตัวแปรแบบพอยเตอร์ขึ้นมาแล้ว วิธีการน าต าแหน่งในหน่วยความจ าของตัว

แปรใดๆ มาเก็บไว้ในตัวแปรแบบพอยเตอร์ได้นั้น ต้องใช้เครื่องหมาย & น าหน้าชื่อตัวแปรนั้น
แล้วก าหนดค่าให้กับตัวแปรแบบพอยเตอร์ ดังรูปแบบต่อไปนี้


ptr_name = &variable_name;



ptr_name = ชื่อตัวแปรแบบพอยเตอร์
variable_name = ชื่อตัวแปรที่ต้องการก าหนดค่า address ให้กับตัวแปรแบบ
พอยเตอร์และจะต้องน าหน้าด้วยเครื่องหมาย & (ampersand) ยกเว้นกรณีที่เป็นตัวแปร

ชุด (array) หรือตัวแปรสตริง (string) ไม่ต้องใส่เครื่องหมาย & (ampersand)ต่อไปจะเป็น
ตัวอย่างการใช้เครื่องหมาย & เพื่อก าหนดต าแหน่งในหน่วยความจ าให้กับตัวแปรแบบพอย
เตอร์

51

ตัวอย่างที่ 1



int x = 17; x ptr
int *ptr; 17 11FF

ptr = &x; 11FF F001

หรือวาดอธิบายได้อีกอย่างดังนี้

x


17 ptr



ตัวอย่างที่ 2


float score; score ptr
Programming 2 ptr = &score; FF22 F001
FF22

float *ptr;
score = 90.5; 90.5

หรือวาดอธิบายได้อีกอย่างดังนี้


score
90.5
ptr


ตัวอย่างที่ 3


char gender; gender ptr
‘F’ FF00
char *ptr;
FF00 F005
gender = ‘F’;
หรือวาดอธิบายได้อีกอย่างดังนี้
ptr = &gender;
‘F’
gender ptr

52

5.

2. การอ้างถึงค่าข้อมูลด้วย * (Indirect Operator)
ส าหรับเครื่องหมาย * จะใช้เพื่อหาค่าข้อมูลในต าแหน่งที่ตัวแปรแบบพอยเตอร์ชี้อยู่ โดยให้

เขียนเครื่องหมาย * น าหน้าชื่อตัวแปรแบบพอยเตอร์
ต่อไปจะเป็นตัวอย่างการใช้เครื่องหมาย * เพื่อหาค่าข้อมูลในต าแหน่งที่ตัวแปรแบบพอย

เตอร์ชี้อยู่


ตัวอย่างที่ 4

int x = 17; x ผลลัพธ์ที่ได้คือ

17
int *ptr; ptr

ptr = &x; FF00 20


20
*ptr = 20;
20 25

printf(“%d \n”, *ptr); Programming 2
x
printf(“%d \n”, x);
ptr

printf(“%d \n”, (*ptr) + 5);




จากตัวอย่างที่ 4 จะเห็นว่าเราสามารถอ้างถึงค่าข้อมูลในต าแหน่งที่ตัวแปรแบบพอยเตอร์ ptr
ชี้อยู่ได้ โดยใส่เครื่องหมาย * น าหน้าชื่อตัวแปรแบบพอยเตอร์ ptr คือ *ptr และจะเห็นว่า *ptr

หมายถึงข้อมูลที่เก็บอยู่ในตัวแปร x เช่นเดียวกัน และจากค าสั่ง

printf(“%d \n”, (*ptr) + 5); หมายถึงให้น าค่าข้อมูลในต าแหน่งที่ตัวแปรแบบพอยเตอร์ pt

ชี้อยู่ไปบวก

อีก 5 ดังนั้นจึงได้ว่า (*ptr) + 5 จึงมีค่าเท่ากับ 20+5 = 25 นั่นเอง

53

ตัวอย่างที่ 5


float score, *ptr; score ผลลัพธ์ที่ได้คือ
score = 90.5; ptr

ptr = &score; 90.5
score = 30;

printf(“%.1f \n”, *ptr); ?
*ptr = score + (*ptr);

printf(“%.1f \n”, *ptr);
?
printf(“%.1f \n”, score);



ตัวอย่างที่ 6

main() ผลลัพธ์ที่ได้คือ ?
Programming 2 p = &a;

a = 1; b = 2; c = 3;
{ int a, b, c, *p, *q;
printf("p = %p\n",p);
printf("*p = %d\n",*p);
q = &b;
printf("q = %p\n",q);
printf("*q = %d\n",*q);
c = *p;
printf("c = %d\n",c);
p = q;
printf("*p = %d\n",*p);
printf("*q = %d\n",*q);
printf("p = %p\n",p);

printf("q = %p\n",q);

*p = 13;
printf("*p = %d\n",*p);

printf("*q = %d\n",*q);

}


54

ตัวอย่างที่ 7



main() ผลลัพธ์ที่ได้คือ ?
{ int *px, x;

px = &x;
*px = 50;

printf("before increasing\n");
printf("px = %p\n", px);

printf("x = %d\n", x);
(*px)++;
printf("after increasing\n");

printf("px = %p\n", px);

printf("x = %d\n", x);
}


Programming 2
























55

ใบงานประจ าหน่วยที่ 8

เรื่อง การอ้างถึงต าแหน่งในหน่วยความจ าของตัวแปรแบบพอยเตอร์
-----------------------------------------------------------------------------------------------------------------------

ผลการเรียนรู้ที่คาดหวัง
1. อธิบายการอ้างถึงต าแหน่งในหน่วยความจ าของตัวแปรเก็บข้อมูลชนิดพื้นฐานได้แก่
จ านวนเต็ม จ านวนทศนิยม และอักขระได้
2. อธิบายการอ้างอิงต าแหน่งในหน่วยความจ าของตัวแปรโดยใช้ตัวแปรแบบพอยเตอร์ได้
-----------------------------------------------------------------------------------------------------------------------

1. จงตอบค าถามต่อไปนี้
1.1 ถ้าหาก pt เป็นตัวแปรพอยน์เตอร์ เราสามารถแสดงค่าแอดเดรสที่ p ชี้อยู่ได้อย่างไร

1.2 จงยกตัวอย่างการเขียนพอยน์เตอร์ให้ชี้ไปที่ตัวแปรสตริง
1.3 ในเรื่องพอยน์เตอร์ เครื่องหมาย & และ * ต่างกันอย่างไร
1.4 ถ้าหากประกาศพอยน์เตอร์ float *pt; การเลื่อนตัวแปร pt ไปหนึ่งต าแหน่ง จะท า
ให้เลื่อนหน่วยความจ าไปกี่ไบต์

2. ให้นักเรียนประกาศตัวแปร stเป็นอาร์เรย์ 1 มิติ และก าหนดค่าเริ่มต้นให้กับ stดังนี้
Programming 2 ……………………………………………………………………………………………………………..
2.1 ก าหนดให้ 11,22,33,44,55,66,77,88,99 และ 101 ให้กับ st


2.2 ค าสั่งแสดงค่า stต าแหน่งที่ 1 – 4
……………………………………………………………………………………………………………..

2.3 ค าสั่งแสดงค่า stต าแหน่งที่ 1 – 4 ในลักษณะพอยน์เตอร์
……………………………………………………………………………………………………………..
2.4 แสดงค่า 44 ผ่านทางตัวแปรพอยน์เตอร์ st

……………………………………………………………………………………………………………..

3. ให้นักเรียนเขียนโปรแกรมแสดงค่าทุกค่าที่อยู่ในตัวแปร stให้อยู่ในรูปพอยน์เตอร์โดยการวน

ลูป








56

4. จากโปรแกรมข้อที่ 2 ถ้ามีการใช้ค าสั่งเพิ่มเติมให้พิจารณาผลลัพธ์ต่อไปนี้

4.1 printf(“%d”,*st); ผลลัพธ์ที่ได้คือ ……………………………………
4.2 printf(“%d”,*st+1); ผลลัพธ์ที่ได้คือ ……………………………………

4.3 printf(“%d”,*(st+1));ผลลัพธ์ที่ได้คือ …………………………………
4.4 printf(“%d”,*st+5);ผลลัพธ์ที่ได้คือ ……………………………………
4.5 printf(“%d”,*(st+5));ผลลัพธ์ที่ได้คือ ……………………………………


5. ให้นักเรียนประกาศตัวแปร st[2][5]เป็นอาร์เรย์ 2มิติ และก าหนดค่าเริ่มต้นให้กับ stดังนี้
5.1 ก าหนดให้ 11,22,33,44,55,66,77,88,99 และ 101 ให้กับ st

…………………………………………………………………………………………………………..
5.2 แสดงค่า 55 ใช้ค าสั่งใด

………………………………………………………………………………………………………….
5.3 แสดงค่า 55 ในลักษณะการเข้าถึงแบบพอยน์เตอร์

……………………………………………………………………………………………………….
5.4 printf(“%d”,*(*(st)+1));ผลลัพธ์ที่ได้คือ ………………………………………………..
5.5 printf(“%d”,*(*(st+1)+3));ผลลัพธ์ที่ได้คือ …………………………………………… Programming 2

5.6 printf(“%d”,*(*(st+1)+3)+5);ผลลัพธ์ที่ได้คือ …………………………………..

5.7 printf(“%d”,*(*(st+0)+3));ผลลัพธ์ที่ได้คือ ……………………………………….
5.8 printf(“%d”,*(*(st+0)+0));ผลลัพธ์ที่ได้คือ ………….……………………………

5.9 ให้นักเรียนเขียนโปรแกรมในการแสดงค่าที่อยู่ในตัวแปรทั้งหมดโดยการเข้าถึงแบบ
พอยน์เตอร์ ในลักษณะดังนี้

11 22 33 44 55
66 77 88 99 101











57

ใบความรู้ที่ 9 การประมวลผลทางคณิตศาสตร์


เนื้อหา
การบวกและลบตัวแปรแบบพอยเตอร์

ผลการเรียนรู้ที่คาดหวัง
เข้าใจหลักการประมวลผลทางคณิตศาสตร์ของพอยเตอร์แบบพื้นฐาน ได้แก่ การบวกและ
การลบ ได้



1. การบวกและลบตัวแปรแบบพอยเตอร์

พิจารณาตัวอย่างที่ 1


main()

{ int i;
float *ptr, data[]={1, 2, 3.5}; // ก าหนดค่าเริ่มต้นให้ตัวแปรชุด data
Programming 2 { printf("%.1f ", *ptr); //แสดงข้อมูลในต าแหน่งที่ ptr ชี้อยู่

for(i=0;i<3;i++)
ptr = data; //ให้ตัวแปรแบบพอยเตอร์ ptr ชี้ไปยังต าแหน่งแรกของ data


ptr++; //เพิ่มค่า ptr ขึ้นเท่ากับขนาดของ float 1 ตัว (4 bytes)
} //กล่าวอีกนัยหนึ่งคือ เลื่อน ptr ไปยังช่องถัดไป


}

จากตัวอย่างที่ 1 มีการประกาศตัวแปรชุดชื่อ data และก าหนดค่าเริ่มต้นให้เท่ากับ 1, 2

และ3.5 ตามล าดับ ส่งผลให้ตัวแปรชุด data มีขนาดเท่ากับ 3 ช่อง หลังจากนั้นจึงใช้ค าสั่ง
ptr = data; เพื่อให้ตัวแปรแบบพอยเตอร์ ptr ชี้ไปยังต าแหน่งแรกของ data ซึ่งเทียบเท่ากับการใช้
ค าสั่ง ptr = &data[0]; นั่นเอง
พิจารณาค าสั่งในลูป for ซึ่งจะท าการแสดงข้อมูลในตัวแปรชุด data ออกทางจอภาพ โดยใช้

ตัวแปรแบบพอยเตอร์ ptr ในการแสดงผลข้อมูลในแต่ละช่องของตัวแปรชุด data

for(i=0;i<6;i++)

{ printf("%d ", *ptr);
ptr++;
58
}

การสั่ง ptr++; หมายถึง ptr = ptr+1; ซึ่งก็คือเพิ่มค่า ptr ขึ้นเท่ากับขนาดของ float 1 ตัว(4 bytes)

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

การประกาศ ชนิดข้อมูล ขนาด ตัวอย่างค าสั่ง ความหมาย
ตัวแปล (byte(


char *cpt; character 1 cpt = cpt+1; เพิ่มค่าใน cpt อีก 1

float *fpt; float 4 fpt = fpt+2; เพิ่มค่าใน fpt อีก 8


int *ipt; integer 2 หรือ 4 ipt--; ลดค่าใน ipt อีก 2 หรือ 4

(ขึ้นอยู่กับชนิดของ compiler)




ตัวอย่างที่ 2


main() ผลลัพธ์ที่ได้คือ ? Programming 2

{ int i, data[5];
for(i=0;i<5;i++)

*(data+i) = 10 * i;

for(i=0;i<5;i++)

printf("%d ",

*(data+i));
}


ตัวอย่างที่ 3



main() ผลลัพธ์ที่ได้คือ ?
{ int i, *ptr, data[6]={1,2,3,4,5,6};

ptr = data; 59
for(i=0;i<6;i++)

{ if ((*ptr)%2 == 0)

printf("%d ",
*ptr);

ptr++;

}

}





ตัวอย่างที่ 4


main() ผลลัพธ์ที่ได้คือ ?

{ char *name = "Environment";
int i;
Programming 2 { printf("%c", name[i]);

for(i=0; name[i] != '\0' ; i++)


}

}


















60

ใบงานประจ าหน่วยที่ 9

เรื่อง การประมวลผลทางคณิตศาสตร์ของพอยน์เตอร์
-----------------------------------------------------------------------------------------------------------------------

ผลการเรียนรู้ที่คาดหวัง
1. เข้าใจหลักการประมวลผลทางคณิตศาสตร์ของพอยน์เตอร์แบบพื้นฐาน ได้แก่ การบวก
และการลบได้
---------------------------------------------------------------------------------------------------------------------------
1. ถ้าประกาศตัวแปรเป็น

char str[10] = "MICROCOM";
char *pt;
pt = str;

จงหาค่าของ
str[5] = ..................
str[1] = ..................
*(pt + 1) = ..................

*pt + 5 = ................
Programming 2

2. จงเขียนโปรแกรมโดยประกาศตัวแปรอาร์เรย์ A และอาร์เรย์ B ให้เก็บตัวอักขระ จากนั้นใช้

พอยน์เตอร์สลับค่าข้อมูลในตัวแปรอาร์เรย์ทั้งสอง โดยเรียงจากน้อยไปหามาก(A-Z) หรือ
( a - z)
Ex
A = CAT

B = DOG
Ans
A = ACT

B = DGO

3. จากข้อ 2 จงเขียนโปรแกรมน าค่าในอาร์เรย์ทั้งสองออกมาแสดงผล โดยใช้พอยน์เตอร์
4. ถ้าอาร์เรย์ A เป็นตัวแปรที่มี 20 เซลล์ ที่รับข้อมูลเลขจ านวนเต็มเข้าไป จงเขียนโปรแกรม
โดยใช้พอยน์เตอร์เพื่อหาค่าตัวเลขสูงสุด และต่ าสุด พร้อมทั้งแสดงผลทางจอภาพ

61

ใบความรู้ที่ 10 ความสัมพันธ์ระหว่างพอยเตอร์กับตัวแปรชุด


เนื้อหา
1. ตัวแปรแบบพอยเตอร์กับตัวแปรชุด

2. ตัวแปรแบบพอยเตอร์กับสตริง
ผลการเรียนรู้ที่คาดหวัง
1. อธิบายการอ้างอิงต าแหน่งในหน่วยความจ าของตัวแปรชุดและสมาชิกของตัวแปรชุดได้

2. อธิบายความสัมพันธ์ระหว่างพอยเตอร์กับตัวแปรชุดและสตริงได้

1. ตัวแปรแบบพอยเตอร์กับตัวแปรชุด
จากบทที่ 1 เรื่องตัวแปรชุด เราทราบว่าตัวแปรชุดเป็นโครงสร้างข้อมูลที่ใช้เก็บข้อมูลชนิด

เดียวกัน เป็นกลุ่มหรือชุดที่เรียงติดต่อกันเป็นแถว มีขอบเขตจ ากัดและมีขนาดคงที่
พิจารณาตัวอย่างการประกาศให้ score เป็นตัวแปรชุดมีขนาดเท่ากับ 3 ช่อง (มีสมาชิก 3 ตัว)
จะได้ว่า
float score[3];

Programming 2 score

score[0] score[1] score[2]



4 bytes 4 bytes 4 bytes

จากตัวอย่างด้านบน score เป็นชื่อตัวแปรชุด ซึ่งอันที่จริงแล้ว ชื่อตัวแปรชุดก็คือพอยเตอร์ที่ชี้ไป

ยังต าแหน่งของสมาชิกตัวแรกของตัวแปรชุดนั่นเอง จึงวาดภาพอธิบายได้ดังนี้

score FF60 FF64 FF68



4 bytes 4 bytes 4 bytes


หรือวาดอธิบายได้อีกอย่างดังนี้

Score


4 bytes 4 bytes 4 bytes

ดังนั้น ค าสั่งสองค าสั่งด้านล่างนี้จะแสดงผลลัพธ์เหมือนกัน คือแสดงต าแหน่งของสมาชิกตัว

62 แรกของตัวแปรชุด score ออกทางจอภาพ
printf(“The array starts at address %p”, score);

printf(“The array starts at address %p”, &score[0]);

ต่อไปให้พิจารณาตัวอย่างที่ 1.1

main()

{ float score[3];
printf("%p %p %p\n", &score[0], &score[1], &score[2]);

printf("%p %p %p", score, score+1, score+2);
}

จากตัวอย่างที่ 1.1 ค าสั่ง printf("%p %p %p\n", &score[0], &score[1], &score[2]); จะ
แสดงต าแหน่งของตัวแปรชุด score แต่ละช่องออกทางจอภาพ ซึ่งจะให้ผลลัพธ์เช่นเดียวกันกับค าสั่ง
printf("%p %p %p", score, score+1, score+2); และจากตัวอย่างที่ 1.1 score+1 ไม่ได้เป็น

การบวกเลข 1 กับค่าที่อยู่ใน score แต่เป็นการเพิ่มค่า score ขึ้นเท่ากับขนาดของ float 1 ตัว(4
bytes) นั่นคือ หาก score มีค่าเท่ากับ FF60 นั่นหมายความว่า score+1 จะมีค่าเท่ากับ FF60+4 =
FF64 ซึ่งก็คือต าแหน่งถัดไปของตัวแปรชุด score
นั่นเอง

score FF60 FF64 FF68 Programming 2
FF60


4 bytes 4 bytes 4 bytes

หรือวาดได้อีกอย่างดังนี้ score+1 score+2




Score


4 bytes 4 bytes 4 bytes


ดังนั้น หากเราต้องการเก็บข้อมูลไว้ในตัวแปรชุด score ต าแหน่งที่หนึ่ง เช่น

score[1] = 20;
เราอาจแทนด้วยค าสั่ง
*(score+1) = 20; ก็ได้
63

ตัวอย่างที่ 1.2




main() ผลลัพธ์ที่ได้คือ ?
{ int data[6], i;

for(i=0;i<6;i++)
data[i] = i*2;

for(i=0;i<6;i++)
printf("%d ", *(data+i) );

getch();
}

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

ตัวอย่างที่ 1.3
Programming 2 main() ผลลัพธ์ที่ได้คือ
ตัวอย่างที่ 1.3



{ char code[]="s05123";
char *name_ptr = "Somsri";

int len; s05123 Somsri
printf("%s %s \n", code, name_ptr); 6

len = strlen(name_ptr);
printf("len = %d", len);

}
พิจารณาการประกาศตัวแปร

char *name_ptr = "Somsri";
เป็นการประกาศให้ name_ptr เป็นตัวแปรแบบพอยเตอร์ที่ชี้ไปยังชนิดข้อมูล char ซึ่งได้
ก าหนดค่าเริ่มต้นเท่ากับ “Somsri” ดังนั้นตัวแปร name_ptr จึงเป็นตัวแปรแบบพอยเตอร์ที่ชี้ไปยัง
ต าแหน่งแรกของข้อความ “Somsri” นั่นคือตัว ‘S’ นั่นเอง


64 name_ptr 3007 3008 3009 300A 300B 300 C300D
3007
‘S’ ‘o’ ‘m’ ‘s’ ‘r’ ‘i’ ‘\0’
[0] [1] [2] [3] [4] [5] [6]

ใบงานประจ าหน่วยที่ 10

เรื่อง ความสัมพันธ์ระหว่างพอยน์เตอร์กับตัวแปรชุด

-----------------------------------------------------------------------------------------------------------------------
ผลการเรียนรู้ที่คาดหวัง
1. อธิบายการอ้างอิงต าแหน่งในหน่วยความจ าของตัวแปรชุดและสมาชิกของตัวแปรชุดได้
2. อธิบายความสัมพันธ์ระหว่างพอยเตอร์กับตัวแปรชุดและสตริงได้
---------------------------------------------------------------------------------------------------------------------------

1. จงพิจารณาส่วนของโปรแกรมต่อไปนี้


main()
{………………………….. ข้อ 1.1
char name[] =”PROGRAM”;
st=name;

printf(“%c”,*(st+2));
}


1.1 เพื่อให้โปรแกรมท างานได้อย่างถูกต้อง ควรประกาศตัวแปรดังนี้ Programming 2
………………………………………….

1.2 เมื่อท างานเสร็จสิ้นแล้ว ผลลัพธ์ที่ได้
คือ……………………………………..……………………………………….

2. จงพิจารณาส่วนของโปรแกรมต่อไปนี้


main()
{int data[4]={10,20,30,40},*pt;
pt=data;

printf(“%d”,*(pt)+2);
}

จากส่วนของโปรแกรม ผลลัพธ์ที่ได้คือ …………………………………..


65

3. จงพิจารณาส่วนของโปรแกรมต่อไปนี้


main()
{int data[6]={2,4,6,8,10,12};
int *pn,i;
…………………..ข้อ 3.1 ผลการรันโปรแกรม คือ

for(i=0;i<6;i++) 2 4 6 8 10 12
{ printf(“%d”,*pn);
……………………..ข้อ 3.2
}


จากส่วนของโปรแกรมข้างบน จงเติมค าสั่งลงในช่องว่าง เพื่อท าให้ส่วนของโปรแกรมท างานได้
อย่างถูกต้อง
3.1 …………………………………………………………………….
Programming 2 4. จงพิจารณาส่วนของโปรแกรมต่อไปนี้

3.2 ……………………………………………………………………




main()
{ char w[]=”DEKDEE”;
char *p;
inti;
p=w;

for(…i=0;i<6;i++…………………………….) ข้อ 4.1

printf(“%c”,*(p+i));………………………………….. ข้อ 4.2
}


4.1 ค าสั่งในการวนซ้ าเพื่อแสดงค่าที่อยู่ใน w โดยผ่านทางตัวแปรพอยน์เตอร์ p คือ
…………………………………………………………………………………………………………………….

4.2 ค าสั่งให้แสดงค่าที่อยู่ใน w โดยผ่านทางตัวแปรพอยน์เตอร์ p คือ

………………………………………………………….................................................................
66

ใบความรู้หน่วยที่ 11

เรื่อง โครงสร้างของฟังก์ชัน


เนื้อหา
1. ความหมายของฟงกชันและฟงกชันมาตรฐานของภาษาซี

2. โครงสรางของฟงกชัน
3. ประเภทของฟงกชัน
4. การประกาศรูปแบบฟงกชัน (Functions prototype)
5. การเรียกใชฟังกชันในโปรแกรม


ผลการเรียนรูที่คาดหวัง
1. อธิบายความหมายของฟงกชันได

2. อธิบายความหมายของฟงกชันมาตรฐานของภาษาซีได
3. เขียนโปรแกรมประกาศฟงกชันแบบไมมีการสงคาพารามิเตอรและเรียกใชงานได
4. เขียนโปรแกรมประกาศฟงกชันแบบมีการสงคาพารามิเตอรกลับและเรียกใชงานได


Programming 2
4.1 ความหมายของฟงกชันและฟงกชันมาตรฐานของภาษาซี


ฟงกชันหรือโปรแกรมยอย (Function)ในการเขียนโปรแกรมคอมพิวเตอรบอยครั้งจะตองมี
ชุดค าสั่ง บางชุดที่จะตองถูกท างานบอยๆ ถาหากโปรแกรมตองท าชุดค าสั่งเหลานั้นอีกครั้งผูเขียน

โปรแกรมจะตองเขียนชุดค าสั่งชุดเดิมใหมอีกครั้งท าใหโปรแกรมมีขนาดใหญขึ้น แตเราสามารถน า
ชุดค าสั่งที่จะตองถูกใชงานบอย ๆมารวมเปนฟงกชันได แลวจึงเรียกใชชื่อฟงกชันแทนการที่จะตอง
เขียนชุดค าสั่งนั้นใหมอีกครั้ง


ฟงกชันในภาษาซีแบงตามที่มาของฟงกชันแบงไดเปน 2 ประเภทคือ
1) ฟงกชันมาตรฐาน (Standard Function) เปนฟงกชันที่ถูกสรางขึ้นและเก็บไวในไลบรารี
ในการใชงานเราตองเรียกใช include directives เพื่อเรียก header file ขึ้นมากอนจึงจะสามารถใช
งาน ฟงกชันนั้นได

2) ฟงกชันที่ผูเขียนโปรแกรมสรางขึ้นเอง (User-defined Function) เปนฟงกชันหรือ
โปรแกรมยอยที่ผูใชสรางขึ้นมาใชในการเขียนโปรแกรมเพื่อท างานอยางใดอยางหนึ่ง
ประโยชนของฟงกชัน 67
1) ไมตองเขียนซ้ าหากตองการใชหลาย ๆ ที่

2) คนหาหรือแกที่ผิดไดเร็ว เนื่องจากทราบหนาที่และที่อยู่ของฟงกชัน

3) โปรแกรมกะทัดรัด เขาใจไดงาย

4) ฟงกชันที่ดีและเก็บเปนระบบ สามารถท าใหเขียนโปรแกรมไดรวดเร็วโดยการ
เรียกใชฟงกชัน


ฟงกชันมาตรฐาน
เปนฟงกชันที่ผู้ผลิตคอมไพลเลอรเขียนขึ้น เพื่อใหผูใชน าไปใชในการเขียนโปรแกรมเพื่อให
เขียนโปรแกรมไดสะดวกและงายขึ้น บางครั้งอาจเรียกวา library functions ปกติฟงกชันเหล่านี้จะ
จัดเก็บไวใน header files ดังนั้นผูใชจะตองรูวาฟงกชนั นั้นอยูใน header file ใด จึงจะน าไปเรียก
ใชในส่วนตน ของโปรแกรมดวย #include <header file.h> ได เชน #include <stdio.h> ฟงกชัน

มีมากมาย เชน
1) ฟงกชันทางคณิตศาสตร เปนฟงกชันที่ใชทางการค านวณ ทางคณิตศาสตรปกติอยูใน
math.h ผลลัพธ ที่ไดจากฟงกชันกลุมนี้เปนขอมูลประเภท double ดังนั้นตัวแปรที่ใชจึงเปนพวกที่มี

ชนิดเปน double เชน
o ฟงกชัน sin(x) เปนฟงกชนั ใชค านวณหาคาของ sine โดย x มีคาของมุมในหนวย เรเดียน
o ฟงกชัน cos(x) ใชหาคา cosine โดย x มีหนวยเปนเรเดียน(radian)
Programming 2 1 #include <stdio.h>

ตัวอยางที่ 4.1 การใชฟงกชันทางคณิตศาสตร คือ sin(), cos(), tan()

2
#include <math.h>
3 main()
4 {

5 float deg , angle, pi = 3.141592654;
6 printf("\n\tPlease enter value of angle in degree \n\tthat

you want to find tan cos sin :");
7 scanf("%f",&deg);

8 angle = deg * pi / 180; /* เปลี่ยนคา องศา ใหเปนเรเดียน */

9 printf("\n\tvalue of tangent %4.0f degree is %4.2f ",deg,tan(angle));
10 printf("\n\tvalue of sine %4.0f degree is %4.2f ",deg,sin(angle));

11 printf("\n\tvalue of cosine %4.0f degree is %4.2f ",deg,cos(angle));
12 }


68

ผลลัพธของโปรแกรม










ตัวอยางที่ 4.2 การใชฟงกชันทางคณิตศาสตร
1 #include <stdio.h>

2 #include <math.h>
3 main()
4 {

5 double x = 10.0 , y = 2.0 ,z = 16.0,a = 2.718282 ,
b = -2.718282 , m=1.0;
6 printf("\n\tpow(x,y) = %4.2f when x=10.0 y=2.0", pow(x,y));

7 printf("\n\tsqrt(z) = %4.2f when z=16.0", sqrt(z));
8 printf("\n\texp(m) = %4.6f when m=1.0",exp(m));
9 printf("\n\tlog(a) = %4.2f when a=2.718282",log(a)); Programming 2

10 printf("\n\tlog10(x) = %4.2f when x=10.0",log10(x));
11 printf("\n\tceil(a) = %4.2f when a=2.718282",ceil(a));
12 printf("\n\tceil(b) = %4.2f when b=-2.718282",ceil(b));

13 printf("\n\tfloor(a) = %4.2f when a=2.718282",floor(a));
14 printf("\n\tfloor(b) = %4.2f when b=-2.718282",floor(b));
15 printf("\n\tfabs(a) = %4.6f when a=2.718282" ,fabs(a));
16 printf("\n\tfabs(b) = %4.6f when b=-2.718282" ,fabs(b));

17 }

ผลลัพธของโปรแกรม












69

4.2 โครงสรางของฟงกชัน

การสรางฟงกชัน ทั้งฟงกชันมาตรฐานและฟงกชันที่น ามาใช้สรางขึ้นมีรูปแบบโครงสร้างดังนี้

type function_name(type parameter [,type parameter])

{
local varilabel declarations;
statement_1;
statement_2;
...
statement_N;
return(value)

}
ค าอธิบาย
type คือ ชนิดของฟงกชัน หรือ ชนิดของขอมูล เชน int , float , char , double , void ที่

สงไปใหต าแหนงที่เรียกใช ถาไมมีการสงคากลับไปใหต าแหนงที่เรียกใช จะใช void ถาไมมีการ
ก าหนดจะไดขอมูลที่สงกลับมาเป็น int เสมอ
function_name คือ ชื่อของฟงกชัน ควรตั้งชื่อใหสื่อความหมายถึงการท างานของฟงกชัน
Programming 2 parameter คาที่ 1 , 2 ถึง N ที่จะรับมาจากผูเรียกใชฟงกชัน ถาเปนฟงกชันที่ไม่มีการรับและสงคา

และตองเปนไปตามกฏเกณฑการตั้งชื่อตัวแปรในภาษาซี type parameter คือ ชนิดและชื่อของ

parameter จะใชค าวา void
{ คือ จุดเริ่มตนของฟงกชัน
location variable declaration คือ สวนที่มีการประกาศชนิดและชื่อของตัวแปรที่จะใช

เฉพาะในฟงกชัน โดยสวนที่อยูนอกฟงกชัน จะไมสามารถเรียกใชตัวแปรเหลานี้ได
statement_1; statement_2; ... statement_N คือ ค าส่งั ที่ใชงานในฟงกชัน
ตัวอยางที่ 4.5 ฟงกชันที่ไมมีการรับและสงคา
1 void sum()

2 { int num1,num2,result;
3 printf("input no.1 = "(;

4 scanf(" %d ",&num1(;
5 printf("input no.2 = "(;

6 scanf(" %d ",&num2(;

7 result = num1+num2;
8 printf(" sum = %d ",result);
70
9 } /* end function */

4.3.2 ฟงกชันที่มีการรับคาแตไมมีการสงคากลับ

เปนฟงกชันที่เมื่อถูกเรียกใชจะตองไดรับคาพารามิเตอรจากอารกูเมนต argument) ที่มาพร
อมกับการเรียกใช โดยคาอารกูเมนต ที่ไดรับมาจะตองมีชนิดของขอมูลเปนชนิดเดียวกับพารามิเตอร
ที่ก าหนดไวในฟงกชัน ในการสงคาอารกูเมนต ใหฟงกชันนอกจากจะตองค านึงถึงชนิดของขอมูลแล

วกรณีที่มีพารามิเตอรหลายตัวจะตองค านึงถึงล าดับของพารามิเตอรแตละคาดวย โดยฟงกชัน
ประเภทนี้เมื่อมีการประมวลผลแลวจะไมมีการสงคาใดกลับไปยังต าแหนงที่เรียกใชฟงกชัน
1( โครงสรางของฟงกชัน

void function_name(type parameter [,type parameter])

{local variable declaration;
statements;
} /* end function */



ฟงกชันประเภทนี้จะไมฟงกชัน return () อยูภายใน
ตัวอยางที่ 4.6 ฟงกชันที่มีการรับคาแตไมมีการสงคากลับ
1 void sum( int x , int y )
2 { int result; Programming 2

3 result = x+y;

4 printf(“%d”,result);
5 } /* end function */



4.3.3 ฟงกชันที่ไม่มีการรับคาแตมีการสงคากลับ
ฟงกชันประเภทนี้ตองมีชนิดของฟงกชัน แตไมมีพารามิเตอร และในโครงสรางตองมีค าสั่ง
return (value) เพื่อสงคากลับ

1) โครงสรางของฟงกชัน
type function_name(void)
{
local variable declaration;

statements;
return(value);
} 71
หรือ type function_name()

{

local variable declaration;
statements;

return(value);
}

ตัวอยางที่ 4.7 ฟงกชันที่ไมมีการรับคาแตมีการสงคากลับ

1 float func1()

2 {
3 int x = 5, y = 2, z;

4 z = x / y;
5 return (z);

6 } /* end function */



Programming 2 return (value) เพื่อสงคากลับ ยกเวนกรณีที่ใชตัวแปรพอยนเตอร มาเปนตัวรับสงคาไมตองมีค าสั่ง

ฟงกชันประเภทนี้ตองมีทั้งชนิดของฟงกชัน และพารามิเตอร และในโครงสรางตองมีค าสั่ง
4.3.4 ฟงกชันที่มีการรับคาและสงคากลับ


return
1) โครงสรางของฟงกชัน

type function_name(type parameter [,type parameter])

{
local variable declaration;
statements;
return(value);

}



ตัวอยางที่ 4.8 ฟงกชันที่มีการรับคาและสงคากลับ
1 int sqr(int x)
2 {
72
3 return (x * x);

4 } /* end function */

4.4 การประกาศรูปแบบฟงก์ชัน (Functions prototype)

ฟงกชันที่ผูใชสรางขึ้นโดยเฉพาะฟงกชันที่มีการคืนคากลับนั้นจะตองเขียนไวกอนฟงกชัน
main() โปรแกรมจึงจะใชงานฟงกชันนั้นได แตถาไมเขียนไวกอนฟงกชัน main() จะตองมีการ
ประกาศรูปแบบหรือ ตนแบบของฟงกชันนั้นไวกอนมีการเรียกใชฟงกชันในฟงกชัน main() ต าแหน

งที่จะใชในการประกาศรูปแบบของฟงกชัน ประกาศได 2 ต าแหนง ประกาศไวในต าแหนงเริ่มตนของ
โปรแกรม คือ ต าแหนงที่ตอจาก ค าสั่งpreprocessor directive หรือ ต าแหนงแรกในฟงกชัน
main() แตควรประกาศไวในต าแหนงเริ่มตนของโปรแกรมคือต าแหนงที่ตอจาก ค าสั่ง preprocessor
directive เพื่อจะไดเรียกใชไดในทุกต าแหนงของโปรแกรมท านองเดียวกับตัวแปรที่ประกาศไวในต า
แหนงนี้ การประกาศรูปแบบของฟงกชัน หรือ ตนแบบของฟงกชัน(function prototype) มีรูปแบบ

โดยทั่วไป ดังนี้

type function_name(type parameter [,type parameter])

หรือ
type function_name(type [,type])



โดย Programming 2
type คือ ชนิดของฟงกชัน หรือ ชนิดของขอมูล เชน int , float , char , double , void ที่
สงไปใหต าแหนงที่เรียกใช ถาไมมีการสงคากลับไปใหต าแหนงที่เรียกใช จะใช void ถาไมมีการ
ก าหนด จะไดขอมูลที่สงกลับมาเป็น int เสมอ

function_name คือ ชื่อของฟงกชัน ควรตั้งชื่อใหสื่อความหมายถึงการท างานของฟงกชัน
และตองเปนไปตามกฏเกณฑการตั้งชื่อตัวแปรในภาษาซี
type parameter คือ ชนิดและชื่อของ parameter คาที่ 1 , 2 ถึง N ที่จะรับมาจากผู
เรียกใช ฟงกชัน ถาเปนฟงกชันที่ไม่มีการรับและสงคา parameter จะใชค าวา void


การประกาศรูป แบบนี้อาจพิจารณาตามประเภทของฟงกชัน ดังนี้
o ฟงกชันแบบไมมีพารามิเตอร อาจประกาศรูปแบบ หรือตนแบบของฟงกชัน ดังนี้

void functionname(void) หรือ void functionname()
type functionname(void) หรือ type functionname()
o ฟงกชันแบบมีพารามิเตอร อาจประกาศรูปแบบของฟงกชัน ดังนี้
void functionname(type parameter [,type parameter]) หรือ
void functionname(type [,type]) 73

type functionname(type parameter [,type parameter])) หรือ
type functionname(type [,type])

4.5 การเรียกใช้ฟังกชันในโปรแกรม

การเรียกใชฟ้งกชัน ขึ้นกับประเภทของฟงกชัน แตมีโครงสรางหลักดังนี้
1) ฟงกชันที่ไมมีการรับสงคาพารามิเตอร์ ท าดังนี้
function_name();

2) ฟงกชันที่มีการรับคาพารามิเตอรแตไมมีการสงคืนคา มีการเรียกใช ดังนี้
function_name(argument list);
โดย argument list คือ ตัวแปร หรือนิพจนที่สงไปให้ฟังกชัน ถามีมากกวา 1 คา ใหคั่นดวย
เครื่องหมาย คอมมา (,)
3) ฟงกชันที่มีการรับคาพารามิเตอรและสงคืนคา มีการเรียกใช ดังนี้

variable_name = function_name(argument list);
4) ฟงกชันที่ไมมีการรับคาพารามิเตอรแตมีการสงคืนคา มีการเรียกใช ดังนี้
variable_name = function_name();

โดย variable_name คือ ชื่อของตัวแปรที่จะมารับคาของฟงกชันที่สงคืนมา
ตัวอยางที่ 4.9 การเรียกใชฟงกชันประเภทที่มีการรับและสงคืนค่าพารามิเตอร
1 #include<stdio.h>
Programming 2 3 int sum( int x , int y );

2 #include<conio.h>


4
{ int num1,num2,net;
5 void main()
6 printf("input no.1 = "(; การเรียกใช้
ฟังก์ชัน SUM
7 scanf("%d",&num1(;

8 printf("input no.2 = "(;
9 scanf("%d",&num2(;

10 net = sum(num1,num2);

11 printf("sum = %d",net);
12 }

13 int sum( int x , int y )
14 { int s_sum;

15 s_sum = x+y;
16 return s_sum;
74
17 }

ใบงานประจ าหน่วยที่ 11
เรื่อง ความหมายและการประกาศฟังก์ชัน
-----------------------------------------------------------------------------------------------------------------------

ผลการเรียนรู้ที่คาดหวัง
3. อธิบายความหมายของฟังก์ชันได้
4. อธิบายความหมายของฟังก์ชันมาตรฐานของภาษาซีได้
5. เขียนโปรแกรมประกาศฟังก์ชันแบบไม่มีการส่งค่าพารามิเตอร์และเรียกใช้งานได้
-----------------------------------------------------------------------------------------------------------------------

--
ให้นักเรียนตอบค าถามต่อไปนี้ ให้ถูกต้อง
1. จงบอกที่ผิดจากการประกาศโปรโตไทป์ต่อไปนี้

1.1 int sum(int x,y); ……ผิด………… แก้ไขเป็น ………int sum(int x, int y);.
1.2 int sum(int x, int y); ……ถูก………… แก้ไขเป็น ………………………………………
1.3 void sum(void , void); ……ถูก………… แก้ไขเป็น ………………………………………
1.4 void sum(x int,y float); ……ผิด………… แก้ไขเป็น ………void sum(int x, int

y); Programming 2
2. จงหาค่าของฟังก์ชันต่อไปนี้
#include<stdio.h>
#include<math.h>

#include<conio.h>
void main(void)
{ double x=2,y=3,z=4;
printf("%.4f\n",pow(x,y)); 2.1

printf("%.4f\n",sqrt(z)); 2.2
printf("%.4f\n",exp(y)); 2.3
printf("\nPress any key back to program ...");

getch();
}

2.1 ผลลัพธ์คือ …………………………………
2.2 ผลลัพธ์คือ ………………………………… 75

2.3 ผลลัพธ์คือ …………………………………

3. จงเติมเครื่องหมายถูก (√) และเติมเครื่องหมายผิด (X) หน้าข้อที่ไม่ถูกต้อง
3.1 ………… การสร้างฟังก์ชันต้องมีการประกาศโปรโตไทป์ทุกครั้งจึงใช้งานได้
3.2 …… … ตัวแปรที่ทุกส่วนของโปรแกรมสามารถใช้งานได้ เรียกว่าตัวแปรแบบโลคอล

3.3 ………… ถ้าหากฟังก์ชันไม่มีการคืนค่า จะต้องใช้ค าว่า void น าหน้า
3.4 …… … ถ้าหากข้างหน้า main( ) ไม่มีค าว่า void โปรแกรมจะรันไม่ได้
3.5 …… … ทุกฟังก์ชันที่สร้างขึ้นจะต้องมีค าว่า return
3.6 ………… ฟังก์ชันที่สร้างขึ้นสามารถอยู่ก่อน main หรือหลัง main ก็ได้


4. จงเขียนฟังก์ชันในการหาผล การบวก(Positive) การลบ(Deletion) การคูณ(Multiply)
และการหาร(Divide) ของตัวเลข 2 จ านวน และมีการเรียกใช้ฟังก์ชัน ดังตัวอย่าง
Number 4 and 5 Number 4 and 5

1. Prositive 1. Prositive
2. Deletion 2. Deletion
3. Multiply 3. Multiply
Programming 2 Input Choice : 1 Input Choice : 3

4. Divide 4. Divide



4 + 5 =9 4 * 5 = 20
Do you want to continue (y/n) Do you want to continue (y/n)
















76

ใบความรู้หน่วยที่ 12

เรื่อง การส่งค่าผ่านของฟังก์ชัน



เนื้อหา

1. วิธีการสงคาอารกูเมนตไปยังฟงกชัน

2. ฟงกชันเรียกตัวเอง
ผลการเรียนรูที่คาดหวัง
1. เขียนโปรแกรมประกาศฟงกชันแบบมีการสงคาพารามิเตอรไปยังฟงกชันดวยวิธีการสงคา
แบบก าหนดคา(pass by value) และการสงคาแบบอางอิง(pass by reference) ได
2. เขียนโปรแกรมแกปญหาโจทยที่ก าหนดใหโดยใชฟงกชันเรียกตัวเอง(recursive) ได

3. เปรียบเทียบหลักการเขียนโปรแกรมเพื่อแกปญหาโดยใชการวนซ้ าและฟงกชันเรียกตัวเอง
ได


1. วิธีการสงคาอารกูเมนตไปยังฟงกชัน
ในภาษาโปรแกรมโดยทั่วไป การสงผานอารกูเมนตไปใหฟงกชันสามารถท าได วิธี วิธีแรก Programming 2
คือ การสงผานโดยคา (pass by value) ส าหรับวิธีนี้ พารามิเตอรที่ฟงกชันผูเรียกสงไปจะถูก
คัดลอกไปไวในพื้นที่หนวยความจ าของฟงกชันที่ถูกเรียก ถาฟงกชันที่ถูกเรียกมีการเปลี่ยนแปลงคา

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

เรียกใชฟงกชัน และสงคาไปใหกับฟงกชันแบบการสงผานโดยการอางอิงนี้ คาตัวแปรที่ฟงกชันผู
เรียกสงไปเปนพารามิเตอรจะถูกเปลี่ยนคาไปได ตามค าสั่งในฟงกชันที่ถูกเรียก รายละเอียดมีดังนี้

2. ส่งผานค่าแบบ (pass by value)

การสงคาไปยังฟงกชันที่ถูกเรียกใชโดยส่งคาของตัวแปรหรือคาคงที่ไปโดยตรง
ตัวอยางที่ 1
1 #include<stdio.h>

2 #include<conio.h>
3 void markline(int y); // prototype 77

4 void main()

5 { int x=20;

6 markline(10); /*การเรียกฟงกชันโดยวิธี 4.6.1 แบบก าหนดคาคงที่ไปท างาน*/

7 printf(“Function Main \n”);

8 markline(x); /*การเรียกฟงกชันโดยวิธี 4.6.1 แบบก าหนดสงตัวแปร x ไปท างาน */
9 }

10 /*Function call by value */
11 void markline(int y)

12 { int i;
13 for(i=0; i<=y; i++)

14 printf(“-”);
15 printf(“\n”);

16 }


ตัวอยางที่ 2
Programming 2 3 main(){
1
#include <stdio.h>
2 void divide(float , int );


5
6 float x; int y;
printf("\n\tPlease type 1st number that you want to know the division : ");
7 scanf("%f",&x);
8 printf("\n\tPlease type 2nd number that you want to know the division : ");

9 scanf("%d",&y);
10 printf("\n\tBefore the function work x = %f y = %d ",x,y);
11 divide(x,y); /* สงคา x,y ไปให ฟงกชัน divide(float p, int q) */

12 printf("\n\tAfter the function work x = %f y = %d ",x,y);
13 getch();
14 }
16 void divide(float p, int q)

17 {
18 float k;
19 k = p/q;

78 20 printf("\n\tInside function p=%4.2f q=%d p/q =%4.2f \n",p,q,k);
21 }

2. แบบการส่งโดยอ้างอิง (pass by reference)
การส่งค่าไปยังฟังก์ชันที่ถูกเรียกใช้โดยส่งเป็นค่าต าแหน่งที่อยู่ของตัวแปรไป


ตัวอย่างที่ 3
1 #include <stdio.h>
2 void getpointer(int * , char *);
3 main()
4 {
5 int i = 20;
6 char a ='w';
7 printf("\n\tValue before calling function i = %d a = %c ",i,a);
8 getpointer(&i,&a); /*การสงคาอารกูเมนตแบบอางต าแหนง ใหแกตัวแปรพอยนเตอร ในฟงกชัน */
9 printf("\n\tValue after calling function i = %d a = %c ",i,a);
10 getch();
11 }
12
13 void getpointer(int *pti, char *ptc)
14 {
15 int x;
16 char y; Programming 2
17 y = 'A';
18 *pti = *pti + 35;
19 x = *pti;
20 *ptc = y;
21 printf("\n\tInside function value of *pti = %d x = %d y = *ptc = %c ", *pti, x,y);
22 }
ผลลัพธ์ของโปรแกรม







ตัวอย่างที่ 4
1 #include <stdio.h>
2 void addr(int *);
3 main()
4 {
5 int arr[6] = {10,25,45,65,75,95};
6 int j = 0;
7 printf("\n\n\tBefore calling function."); 79
8 while (j <=5 )
9 { printf("\n\tValue of j %d arr[%d] = %d ",j,j,arr[j]);

10 j++;
11 }
12 addr(arr); */ สงคาเปนต าแหนงหรือ address ของตัวแปร ใหพารามิเตอร */
13 printf("\n\n\tAfter calling function.");
14 j = 0;
15 while (j <=5)
16 { printf("\n\tValue of j %d arr[%d] = %d ",j,j,arr[j]);
17 j++;
18 }
19 getch();
20 }
21
22 void addr(int *pti)
23 { int i=0;
24 printf("\n\n\tInside function. *(pti + i) = *(pti + i) + 100");
25 while (i <=5)
27 {
28 *(pti + i) = *(pti+i) + 100;
29 printf("\n\tValue of i %d *(pti + %d) or arr[%d] = %d ",i,i,i,*(pti+i));
30 } i++;
Programming 2 ผลลัพธ์ของโปรแกรม
31
32 }

































80

ตัวอย่างที่ 5

1 #include <stdio.h>
2 #include <string.h>
3 void upper_string(char str[ ],int leng);
4 main()
5 {
6 char word[50] ;
7 printf(“\n\tInput String in lowercase : “);
8 gets(word);
9 printf(“\n\tThe received strings are : %s”, word);
10 upper_string(word , strlen(word));
11 printf(“\n\tThe new strings are : %s “,word);
12 getch();
13 }
14
15 void upper_string(char str[ ] , int leng)
16 {
17 int counter;
18 for ( counter = 0; counter < leng ; counter++)
19 str[counter] = toupper(str[counter]);
20 }
Programming 2


ผลลัพธ์ของโปรแกรม









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

พารามิเตอร์เป็นพอยน์เตอร์ คือตัวแปรที่เริ่มต้นชื่อด้วยเครื่องหมาย * โดยในกรณีนี้ฟังกชันนั้นอาจ
เป็นฟังก์ชันที่ไม่มีการส่งค่ากลับ(ฟังก์ชันที่ขึ้นต้นด้วย void) ก็สามารถใช้ส่งค่ากลับได

81

ตัวอย่างที่ 6 การส่งค่ากลับจากฟังก์ชันเมื่อฟังก์ชันได้รับค่าแบบส่งค่า(ข้อมูล)ตรงฟังก์ชันจะ

คืนเพียงค่าเดียว
1 #include <stdio.h>
2 int num1(int ,int );
3 main()
4 {
5 int a,b,c;
6 a= 10; b=500;c=0;
7 printf("\n\t\n\tBefore function using c = num1(a,b) a=%d b=%d c=%d ",a,b,c);
8 c= num1(a,b);
9 printf("\n\tAfter function using c = num1(a,b) a = %d b = %d c = %d ",a,b,c);
10 printf("\n\tValue of num1(a,b) = %d ",num1(a,b));
11 printf("\n\tValue of num1(a,b) = %d ",num1(a,b));
12 getch();
13 }
14 int num1(int x,int y)
15 {
16 int z;
17 z = x +y;
return (z);
18
Programming 2 ผลลัพธของโปรแกรม
19 }











ตัวอย่างที่ 7 การคืนค่าหลายค่าจากฟังก์ชันโดยใช้ตัวแปรพอยน์เตอร์เป็นพารามิเตอร์ในฟังก์ชัน
ที่มีการคืนค่า
1 #include <stdio.h>
2 int num1(int * ,int * );
3 main()
4 {
5 int a,b,c;
6 a= 10; b=500;c=0;
7 printf("\n\tBefore function using c = num1(&a,&b) a=%d b=%d c=%d ",a,b,c);
8 c= num1(&a,&b);
9 printf("\n\tAfter function using c = num1(&a,&b) a = %d b = %d c = %d ",a,b,c);
10 printf("\n\tValue of a = %d b = %d num1(&a,&b) = %d ",a,b,num1(&a,&b));
82 11 c= num1(&a,&b);
12 printf("\n\tAfter function using c = num1(&a,&b) a=%d b=%d c=%d ",a,b,c);
13 printf("\n\tValue of a = %d b = %d num1(&a,&b) = %d ",a,b,num1(&a,&b));

14 getch();
15 }
16
17 int num1(int *x , int *y)
18 {
19 int z;
20 *y = *x + *y;
21 *x = *x + 65;
22 z = *x + *y;
23 return (z);
24 }
ผลลัพธของโปรแกรม











3. ฟังก์ชันเรียกตัวเอง
Programming 2
การท างานแบบเรียกซ้ าหรือเวียนเกิด คือการแก้ปัญหาที่สามารถแบ่งเป็นปัญหาที่ย่อยลงไป

อีกแต่มีวิธีการแก้ในลักษณะเดิมจนถึงปัญหาที่เล็กที่สุดซึ่งแบ่งต่อไปอีกไม่ได้แต่มีค าตอบที่แน่นอน
การแก้ปัญหาแบบนี้นิยมใช้ฟังก์ชันซึ่งอาจเรียกว่าฟังก์ชันเรียกซ้ า หรือฟังก์ชันแบบเวียนเกิด ดังเช่น

การหาค่า factorial ซึ่งคือการหาผลคูณตั้งแต จนถึงเลขจ านวนเต็มบวกที่ก าหนด เช่น n! ซึ่ง

สามารถพิจารณาได้เป็น n! = n * (n-1)!
= n * (n-1) * … * 2 * 1!

โดย 1! = 1



โดยปกติการท างานของฟังก์ชันแบบเวียนเกิดจะมีลักษณะ คือ ขั้นตอนการเรียกใช้จะเรียกใช้
จากใหญ่ไปหาเล็ก ในขั้นตอนการคืนค่าของฟังก์ชันจะคืนค่าจากระดับเล็กไปหาใหญ เช่น ฟังก์ชันการ
หาค่า factorial (ตัวอย่างในที่นี้ คือ !5)






83

Programming 2






ตัวอย่างที่ 8. แสดงการใช้ฟังก์ชันเวียนเกิดในการหาค่า factorial

#include <stdio.h>
int num ;

long result;
long fac(long n);

main()

{
printf("\n\tInput the number that you want to find factorial : ");

scanf("%d",&num);
result = fac(num);

printf("\n\tFactorial of %d is %ld ", num , result);
84
getch();
}

long fac(long n)

{
if ( n <= 1 )
return n;

else
return ( n * fac(n-1)) ;
}


/* เรียกซ้ า */








อนุกรมตัวเลข Fibonacci ซึ่งมีค่า ดังนี้
Programming 2
0 , 1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , …

โดยมีนิยามของการหาคาตัวเลข Fibonacci ดังนี้
Fibonacci(0) = 0

Fibonacci(1) = 1
Fibonacci(n) = Fibonacci(n-1) + Fibonacci(n-2) เมื่อ n >= 2


ตัวอย่างที่ 9 แสดงโปรแกรมการหาค่า Fibonacci number โดยใช้ฟังก์ชันแบบเวียนเกิด

#include <stdio.h>
long fibo (long);
main()
{

long num , answer;
printf("\n\tEnter a number that you want to find fibonacci : ");
scanf("%ld" ,&num);

answer = fibo(num); 85
printf("\n\tAnswer of Finbonacci function of (%ld) = %ld \n",

num ,answer);

getch();
}



long fibo (long n)
{
if(n == 0 )
return 0;

else if ( n == 1)
return 1;
else

return fibo(n-1) + fibo(n-2);
}

Programming 2
























86

ใบงานประจ าหน่วยที่ 12

เรื่อง การก าหนดการส่งค่าของฟังก์ชัน
-----------------------------------------------------------------------------------------------------------------------
ผลการเรียนรู้ที่คาดหวัง

6. เขียนโปรแกรมประกาศฟังก์ชันแบบมีการส่งค่าพารามิเตอร์กลับและการเรียกใช้งานได้
7. เขียนโปรแกรมประกาศฟังก์ชันแบบมีการส่งค่าพารามิเตอร์ไปยังฟังก์ชันด้วยวิธีการส่ง
ค่าแบบอ้างอิง(pass by value) และการส่งค่าแบบอ้างอิง(pass by reference) ได้
-----------------------------------------------------------------------------------------------------------------------
-

ให้นักเรียนสร้างฟังก์ชันที่มีการท างานและเรียกใช้ ดังนี้
1. ให้นักเรียนเติมส่วนของโปรแกรมต่อไปนี้ให้ท างานได้สมบูรณ์
#include<conio.h>

#include<stdio.h>
……………………1.1…………………………. /*ประกาศฟังก์ชัน sq
main()
{int z=5;

printf("%d",………1.2……………); /* ส่งค่า z เข้าไปท างานในฟังก์ชัน sq Programming 2
getch();
}
int sq(int x)

{int a;
a=x*x;
…………1.3…………………….. /*ส่งค่า a กลับ
}

1.1 ……………………………………………….
1.2 ………………………………………………
1.3 ………………………………………………

1.4 ผลลัพธ์ของการท างานของฟังก์ชัน คือ
………………………………………………………………….
1.5 จากฟังก์ชัน sq เป็นการส่งค่าผ่านแบบ
………………………………………………………………….
87

2. ให้นักเรียนเติมส่วนของโปรแกรมต่อไปนี้ให้ท างานได้สมบูรณ์

#include<conio.h>
#include<stdio.h>
int sq(int *x);

main()
{int z=5;
………………… 2.1 …………………. /*ส่งค่า z เข้าไปท างานในฟังก์ชัน sq;
printf("%d",z);
getch();

}
………………………… 2.2 ……………….. /* ประกาศฟังก์ชัน sq
{int a;

a=*x;
*x=a*a;
}
Programming 2 2.1 ………………………………………………..



2.2 ………………………………………………..
2.3 ผลลัพธ์ของการท างานของฟังก์ชัน เมื่อ z=2คือ
………………………………………………………………….

2.4 จากฟังก์ชัน sq เป็นการส่งค่าผ่านแบบ
………………………………………………………………….

3. ให้นักเรียนสร้างฟังก์ชัน Positive1 ส่งค่าไปกลับแบบ pass by value เพื่อหาเลขยก

ก าลังสอง และ Positive2 ส่งค่าไปกลับแบบ pass by reference ในการเปลี่ยนค่าใน
ตัวเลขสองจ านวน
Positive1 Positive2

Input x : 5 x = 4 y = 5
Result = 25 Result x=8 y=9




88

ใบความรู้หน่วยที่ 13

เรื่อง การจัดการแฟ้มข้อมูล


เนื้อหา
1. ชนิดของแฟมขอมูล
2. ขั้นตอนการจัดการกับแฟมขอมูลประเภทขอความ
1) การเปดแฟมขอมูล
2) การประมวลผลขอมูลในแฟ้มขอมูล

3) การปดแฟมขอมูล
ผลการเรียนรูที่คาดหวัง
1. เขียนโปรแกรมอานและเขียนแฟมขอมูลประเภทขอความ (text file) ได

ในภาษาซี แฟม(file) หมายถึงโครงสรางขอมูลที่ประกอบดวยกลุมของขอมูลที่สัมพันธกัน
หรือที่เกี่ยวข้องกันแฟมหนึ่งๆ ประกอบดวยกลุมของระเบียน(record) และภายในแตละระเบียนจะ
ประกอบไปดวยเขตข้อมูล(field) ที่มีชนิดขอมูลตางกัน และจะมีสัญลักษณเพื่อแสดงการจบแฟม(End
of File : EOF) อยู่ต่อจากระเบียนสุดท้าย


1. ชนิดของแฟมขอมูล Programming 2
1) แฟมขอความ หรือ text files ไฟลประเภทนี้จะจัดเก็บขอมูลเปนขอความในรูปของรหัส
แอสกี้(ASCII) ไฟลประเภทนี้ สวนมากมีสวนขยาย เปน txt, bat, c, ini, nfg, log, bak หรืออื่น ๆ

ไฟลเหลานี้สามารถเปดไดโดยใช เชน notepad โดยจะปรากฏเปน ขอความ ไฟล
เหลานี้เมื่อใชรหัสบางอยาง เชน \n เวลาบันทึกไฟล จะถูกเปลี่ยนเปน รหัส carriage return หรือ
line feed และเมื่ออานไฟลเหลานี้รหัสนี้จะถูกเปลี่ยนเปน \n
2) แฟมในระบบเลขฐานสอง หรือ binary files ไฟลเหลานี้จัดเก็บขอมูลไวในรูป

เลขฐานสอง เมื่อบันทึกไฟลประเภทนี้ จะไมเปลี่ยนรหัสค าสั่ง เชน \n เปน carriage return หรือ
line feed ไฟลประเภทนี้ไมสามารถเปดดวย notepad เปดขึ้นมาจะไดสัญลักษณตาง ๆ ซึ่งดูไมรู
เรื่อง ตองเปดดวยโปรแกรมเฉพาะที่จัดการกับแฟมเหลานั้น เชน ไฟลที่มีสวนขยาย xls, doc, exe,

com, bmp,gif, dat, jpg เปนตน

2. ขั้นตอนการจัดการกับแฟมขอมูลประเภทข้อความ
ในการจัดกระท ากับไฟล เชน การแกไข การเพิ่ม ฯลฯ ไมไดกระท ากับไฟลที่เก็บอยูในดิสก
หรือฮาร์ดดิสก โดยตรง แตกระท ากับพื้นที่ในหนวยความจ า(memory)ซึ่งเครื่องคอมพิวเตอร

จัดเตรียมไวเพื่อประมวลผลเกี่ยวกับไฟล หนวยความจ าที่จัดเตรียมไวเพื่อเปนตัวกลางในการ 89
ประมวลผลกับไฟลนี้เรียกวาบัฟเฟอร เชน ถาจะกระท าการกับไฟล 3 ไฟล คือ ไฟล
คอมพิวเตอรจะเตรียมบัฟเฟอรไว สวนส าหรับแตละไฟล

ไฟลในภาษาซีมีการจัดเก็บในลักษณะเรียงตอกันไปตั้งแตตนจนจบไมมีการแบงเปนชวง

ดังนั้นการจะกระท ากับขอมูลในไฟลจะตองระบุต าแหนง สิ่งที่ใชในการหาต าแหนงของขอมูลใน
แฟ้มข้อมูลเรียกวาตัวชี้แฟม(file pointer) โดยเมื่อเปดไฟลจะตองมีการสรางตัวชี้แฟมหรือไฟลพอยน
เตอร ซึ่งจะชี้ไปยังต าแหนงเริ่มต้นของแฟมขอมูล และเปลี่ยนต าแหนงไปยังต าแหนงที่ถูกระบุ ในการ

ประมวลผลหลายแฟมขอมูล แตละแฟมข้อมูลจะมีตัวชี้ต าแหนงเปนของมันเองไมไดใชรวมกับแฟมข้อ
มูลอื่น
เมื่อเริ่มท างานกับภาษาซี ระบบปฎิบัติการจะเปดแฟมใหโดยอัตโนมัติ 3 แฟม คือ แฟ
มน าเข้ามาตรฐาน(stdin) แฟมสงออกมาตรฐาน (stdout) แฟมขอผิดพลาดมาตรฐาน (stderr)เรา
สามารถเขาถึงแตละระเบียนในแฟมไดทั้งแบบเรียงล าดับและแบบโดยตรง โดยใช ตัวชี้แฟ้ม(file

pointer) เปนตัวระบุต าแหนงของระเบียนที่ก าลังด าเนินการอยูในการท างานกับแฟ้มหนึ่งๆ จะต้อง
ประกอบด้วยขั้นตอนทั่วไป ดังต่อไปนี้
1) การเปิดแฟ้มข้อมูลเมื่อต้องการเริ่มต้นจะท างานกับแฟ้ม

2) การประมวลผลข้อมูลในแฟ้มข้อมูล คือการเขียนข้อมูลหรืออ่านข้อมูลจากแฟ้ม
3) การปิดแฟ้มข้อมูล เมื่อต้องการจะเลิกท างานกับแฟ้ม

Programming 2 แฟ้มพร้อมทั้งระบุชื่อของแฟ้ม รวมถึงจุดประสงค์ของการใช้แฟ้ม เช่น การอ่าน การเขียน รูปแบบ

3. ค าสั่งเปิดแฟ้มข้อมูล
ในการเปิดแฟ้มเพื่อใช้งานจะต้องท าการประกาศตัวชี้แฟ้ม ซึ่งจะท าหน้าที่ชี้ต าแหน่งข้อมูลใน


ค าสั่งที่ใช้ในการเปิดแฟ้ม มีดังนี้

FILE *fp;

fp = fopen(filename , mode);

ค าอธิบาย
fp = ตัวชี้ตําแหน่งข้อมูลในแฟ้ม คือชี้ไปที่ตําแหน่งเริ่มต้นของแฟ้มข้อมูล

filename = ชื่อแฟ้มข้อมูลที่ตั้งขึ้นโดยต้องเขียนอยู่ภายใตเครื่องหมาย “…”
mode = จุดประสงค์ของการใช้แฟ้มข้อมูล เช่น เปิดแฟ้มขึ้นมาเพื่อบันทึกข้อมูล
หรืออ่านข้อมูลขึ้นมาใช้งาน หรือเพิ่มข้อมูลเข้าไปในแฟ้ม ดังตารางต่อไปนี้


Mode ความหมาย
text file binary file
“r” , “rt” “rb” เปิดแฟ้มข้อมูลเก่าที่เคยสร้างไว้แล้ว เพื่ออ่านข้อมูลขึ้นมาจากแฟ้มอย่างเดียว
* ถ้าแฟ้มข้อมูลที่ระบุให้เป็นแฟ้มใหม่จะไม่สามารถเปิดแฟ้มได
90

“w” , “wb” เปิดแฟ้มข้อมูลใหม่เพื่อบันทึกข้อมูลลงแฟ้มอย่างเดียว
“wt” * ถ้าแฟ้มข้อมูลที่ระบุให้เป็นแฟ้มเก่าข้อมูลในแฟ้มเก่าจะถูกลบทิ้งไปโดยอัตโนมัติ พร้อมกับสร้างแฟ้มใหม่ในชื่อเดิม




“a” , “at” “ab” เปิดแฟ้มข้อมูลเก่าที่เคยสร้างไว้แล้วเพื่อบันทึกข้อมูลเพิ่มลงไปในแฟ้มข้อมูลเก่าโดยข้อมูลที่
เพิ่มเข้าไปจะไปอยู่ตอนท้ายของแฟ้มเสมอ
* ถ้าแฟ้มข้อมูลที่ระบุให้เป็นแฟ้มใหม่จะเป็นการสร้างแฟ้มใหม่แต่บันทึกข้อมูลไดครั้งเดียว
เท่านั้น


“r + t” “r + b” เปิดแฟ้มข้อมูลเก่าที่เคยสร้างไวแล้วเพื่ออ่านและบันทึกข้อมูลในแฟ้ม
* ถ้าใช้โหมดนี้เพื่อบันทึกข้อมูลลงแฟ้ม คือใช้คู่กับค าสั่งบันทึกข้อมูลลงแฟ้มจะท าใหบันทึกข้อมูล
ใหมทับขอมูลเกาลงไปตั้งแตตนแฟมไปจนถึงทายแฟม ท าใหขอมลู เดิมถูกแทนที่ดวยขอมูลใหม

“w + t” “w + b” เปิดแฟ้มข้อมูลใหม่เพื่อบันทึกและอ่านข้อมูลในแฟ้ม
* ถ้าแฟ้มข้อมูลที่ระบุไว้เป็นแฟ้มที่ก าลังใชงานอยู่จะเป็นการท าลายข้อมูลในแฟ้มทั้งหมด และ
สร้างแฟ้มใหมขึ้นมาแทนที่
“a + t” “a + b” เปิดแฟ้มข้อมูลเก่าที่เคยสร้างไว้แล้วเพื่ออ่านข้อมูลจากแฟ้มและเพิ่มข้อมูลเข้าไปในแฟ้มข้อมูล
โดยข้อมูลที่เพิ่มเข้าไปจะอยู่ตอนท้ายแฟ้มข้อมูลเสมอ
* ถ้าแฟ้มข้อมูลที่ระบุให้เป็นแฟ้มใหมจะเป็นการสร้างแฟ้มข้อมูลใหมตามชื่อที่ระบุไว้ทันที และ
สามารถบันทึกข้อมูลลงไปในแฟ้มได


Programming 2
การเปิดแฟ้มหนึ่งๆ อาจมีข้อผิดพลาดที่ท าให้ไม่สามารถเปิดแฟ้มได้ส าเร็จ เช่น
1) มีการป้องกันการบันทึกข้อมูลทับ(write protect)
2) เนื้อที่ในหน่วยความจ าส ารองเต็ม

3) ไม่มีชื่อแฟ้มที่ระบุ (ในกรณีที่เปิดแฟ้มเพื่อท าการอ่าน(
ในกรณีเหล่านี้ค าสั่ง fopen() จะคืนค่า NULL ถ้าไม่สามารถเปิดแฟ้มได แต่ถ้าเปิดแฟ้มส าเร็จ จะคืน
ค่าต าแหน่งระเบียนแรกของแฟ้ม


ตัวอย่างที่ 1 ส่วนของโปรแกรมแสดงการเปิดแฟ้ม เพื่อท าการเขียนข้อมูลลงแฟ้ม

...

FILE *fp;
fp = fopen(“C:\\MyFile.txt” , “w”);

คําอธิบาย เปิดแฟ้มข้อมูลชื่อ MyFile.txt ที่อยูdrive C เพื่อใช้สําหรับบันทึกข้อมูลลงแฟ้ม
อย่างเดียวโดยมีตัวแปร fp เป็น file pointer ชี้ไปยังตําแหน่งของข้อมูลใน file 91


ตัวอย่างที่ 2 ส่วนของโปรแกรมแสดงการเปิดแฟ้ม เพื่อท าการอ่าน


FILE *fp;
fp = fopen(“C:\\MyFile.txt” , “r”);
if (fp==NULL)

printf(“file doesn’t exist. \n”);


คําอธิบาย เปิดแฟ้มขอ้มูลชื่อ MyFile.txt ที่อยูdrive C เพื่อใช้สําหรับอ่านข้อมูลจากแฟ้ม
โดยมีตัวแปร fp เป็น file pointer ชี้ไปยังตําแหน่งของข้อมูลใน file ถ้าไม่มีแฟ้มชื่อ MyFile.txt

โปรแกรมจะแสดงข้อความ “File doesn’t exitst.” ให้ผู้ใช้ทราบ

4. ค าสั่งปิดแฟ้มข้อมูล

หลังจากที่สิ้นสุดการใช้งานแฟ้มหนึ่งๆ แล้วผู้ใช้ควรที่จะท าการปิดแฟ้ม เพื่อให้ระบบน า
ข้อมูลที่เหลือในบัฟเฟอร์ทั้งหมดเข้าไปบันทึกในแฟ้มและป้องกันข้อมูลไม่ให้สูญหาย รูปแบบค าสั่งที่
ใช้ในการปิดแฟ้ม มีดังนี้
Programming 2 ค าอธิบาย

fclose(file pointer);



file pointer = ชื่อของตัวชี้แฟ้ม(file pointer) ที่ต้องการจะปิด
ถ้าการปดแฟ้มด้วยคําสั่ง fclose() สําเร็จจะคืนค่าศูนย แต่ถ้าการปิดแฟ้มไมสําเร็จจะคืนค่าอื่นๆ

ตัวอย่างที่ 5.3 ส่วนของโปรแกรมแสดงการเปิดแฟ้ม เพื่อปิดแฟ้ม MyFile.txt

...
FILE *fp;
fp = fopen(“C:\\MyFile.txt” , “r”);


fclose(fp);


5. ค าสั่งอ่านและเขียนข้อมูลแฟ้ม

5.5.1 การอ่านและเขียนอักขระ
การอ่านและเขียนอักขระ เป็นการประมวลผลทีละตัวอักขระโดยใช้ค าสั่ง putc()
และgetc() ทั้งนี้ค าสั่งทั้งสอง จะมีพารามิเตอร์ตัวชี้แฟ้มเพื่อที่จะได้รู้ว่าจะท างานกับแฟ้มใด
1) ค าสั่ง getc() คือ ค าสั่งอ่านอักขระตัวต่อไปในสายอักขระภายในแฟ้มซึ่งถูก
อ้างอิงด้วยตัวชี้แฟ้มจนพบ <EOF> เมื่อจบแฟ้มรูปแบบค าสั่งที่ใช้มีดังนี้
92
getc(fp);

หรือ
single_char = getc(fp);

ค าอธิบาย

single_char = ตัวแปรชนิด single character ที่ใช้เก็บข้อมูลตัวอักขระตัวเดียว
fp = ตัวชี้ของแฟ้มข้อมูล
2) ค าสั่ง putc() คือ ค าสั่งการน าอักขระในสายอักขระที่ก าหนด เขียนลงในแฟ้มซึ่ง

ถูกอ้างอิงด้วยตัวชี้แฟ้ม

putc(single_char , fp);

ค าอธิบาย

single_char = ตัวแปรชนิด single character ที่ใช้เก็บข้อมูลตัวอักขระตัวเดียว
fp = ตัวชี้ของแฟ้มข้อมูล


ตัวอย่างที่ 4 โปรแกรมแสดงการอ่านข้อความจากแฟ้ม MyFile.txt และแสดงผลออกทางจอภาพ

1 #include<stdio.h>

2 void main() {
Programming 2
3 FILE *fp;

4 char c;
5 fp = fopen(“C:\\MyFile.txt” , “r”);

6 if (fp == NULL) {
7 printf(“File doesn’t’ exist \n”);

8 }
9 else {

10 do{

11 c = getc(fp); //อ่านอักขระจากแฟ้ม
12 putchar(c); //แสดงอักขระบนจอภาพ

13 }while(c!=EOF); //วนซ้ าจนจบแฟ้ม

14 fclose(fp);

15 }

93

การอ่านและเขียนสายอักขระ

1) ค าสั่ง fscanf() คือค าสั่งที่ใช้ในการอ่านข้อมูลจากแฟ้มข้อมูลแล้วน ามาเก็บไว้ในตัวแปร
ที่ต้องการได้โดยมีการท างานคล้ายค าสั่ง scanf() แตกต่างกันตรงที่ค าสั่ง fscanf() เป็นค าสั่งที่ใช้อ่าน
ข้อมูลจากแฟ้มข้อมูลแต่ค าสั่ง scanf() ใช้รับข้อมูลจากคีย์บอร์ดแล้วไปเก็บไว้ในตัวแปรที่ต้องการ

รูปแบบค าสั่งที่ใชมีดังนี้

fscanf(fp , control string , variable list);
ค าอธิบาย
fp = file pointer ของแฟ้มข้อมูล

control string = รหัสรูปแบบของข้อมูลและรหัสควบคุมใชเหมือนคําสั่ง scanf () เช่น
%d %s
variable list = ชื่อตัวแปรที่ใช้เก็บข้อมูลที่อ่านมาจากแฟ้มข้อมูลโดยจะต้องระบุ

เครื่องหมาย & (ampersand) นําหน้าชื่อตัวแปรด้วย ยกเว้นตัวแปร
string เท่านั้นที่ไม่ต้องมีเครื่องหมาย &
ตัวอย่างที่ 5 โปรแกรมแสดงการอ่านข้อความจากแฟ้ม MyFile.txt และแสดงผลออกทางจอภาพ
Programming 2 2 void main() {
1
#include<stdio.h>


3
FILE *fp;
4 char data[200] , c;
5 fp = fopen(“C:\\MyFile.txt” , “r”);

6 if (fp == NULL) {

7 printf(“File doesn’t’ exist \n”);
8 }

9 else {

10 do{
11 c = fscanf(fp, “%s”, data);

12 if (c != EOF)

13 printf(“%s\n”,data);
14 }while(c!=EOF); //วนซ้ าจนจบแฟ้ม


94 15 fclose(fp);
16 }

2) ค าสั่ง fprintf() คือค าสั่งที่ใช้บันทึกข้อมูลลงแฟ้มโดยสามารถจัดรูปแบบข้อมูลที่ต้องการ

บันทึกไดคล้ายกับค าสั่ง printf() แต่ต่างกันตรงที่ printf() เป็นค าสั่งที่ใช้พิมพ์ผลลัพธ์ออกทางจอภาพ
แต่ค าสั่ง fprintf()ใช้บันทึกข้อมูลลงแฟ้มรูปแบบค าสั่งที่ใช้มีดังนี้


fprintf(fp , control string , variable list);

ค าอธิบาย
fp = file pointer ของแฟ้มข้อมูล
control string = รหัสรูปแบบของข้อมูลและรหัสควบคุมใช้เหมือนคําสั่ง printf()

เช่น %d %s
variable list = ค่าคงที่ตัวแปร หรือนิพจน์ที่จะเขียนลงแฟ้มข้อมูลแต่ถ้าเป็นค่า string
ต้องเขียนอยูในเครื่องหมาย “…”


ตัวอยางที่ 6 โปรแกรมแสดงการเขียนขอมูลลงแฟม MyFile.txt
1 #include <stdio.h>

2 int main(void)
Programming 2
3 {

4 FILE *stream;
5 int i = 100;

6 char c = 'C';
7 float f = 1.234;

8 /* open a file for update */
9 stream = fopen("C:\\MyFile.txt", "w+");

10 /* write some data to the file */

11 fprintf(stream, "%d %c %f", i, c, f);
12 /* close the file */

13 fclose(stream);
14 return 0;

15 }

95

ใบงานประจ าหน่วยที่ 13

เรื่อง การจัดการแฟ้มข้อมูลประเภทข้อความ
-----------------------------------------------------------------------------------------------------------------------
ผลการเรียนรู้ที่คาดหวัง

อธิบายการอ่านและเขียนแฟ้มข้อมูลประเภทข้อความ(text file) ได้

1. ในภาษาซีแบ่งลักษณะการจัดเก็บข้อมูลออกเป็นกี่ลักษณะ อะไรบ้าง
2. ให้นักเรียนอธิบายการท างานกับไฟล์ ดังนี้
a. การเปิดไฟล์ หมายถึง

b. การกระท ากับไฟล์ หมายถึง
c. การปิดไฟล์ หมายถึง
3. ก าหนดให้ FILE *fp; และ data.txt เป็นไฟล์ชนิด text file ให้นักเรียนเขียน

ค าสั่งเพื่อท างานต่อไปนี้
a. เปิดไฟล์เพื่อการเขียน

Programming 2 c. เปิดไฟล์เพื่ออ่านและท าการตรวจสอบว่ามีไฟล์อยู่หรือไม่

b. เปิดไฟล์เพื่อการอ่าน




d. ค าสั่งในการปิดไฟล์



4. จงเขียนค าสั่งตามข้อก าหนดต่อไปนี้
a. ก าหนดให้ str เก็บค่า “This is a file system test”

b. ก าหนดให้ fp เป็นไฟล์พอยเตอร์
c. ก าหนดให้ p เป็นสตริงพอยเตอร์
d. เปิดไฟล์ test.txt เพื่อเขียน

e. ให้ p ชี้ไปที่ str
f. น าค่าที่พอยเตอร์ p ชี้อยู่เขียนลงใน test.txt

5. จากข้อ 4 ให้นักเรียนเขียนเป็นฟังก์ชัน รับข้อมูล(file_in) และแสดงข้อมูล
(file_out) พร้อมทั้งเรียก ทั้งสองฟังก์ชันขึ้นมาท างานในฟังก์ชัน main
96

ใบความรู้หน่วยที่ 14

เรื่อง ค าสั่งเพิ่มเติมในการจัดการแฟ้มข้อมูล
เนื้อหา ค าสั่งเพิ่มเติม


ผลการเรียนรูที่คาดหวัง
1. สามารถเขียนโปรแกรมใหท างานตามขั้นตอนวิธีที่ไดมีการออกแบบไวได

ค าสั่งอื่น ๆ (เพิ่มเติม จากสาระการเรียนรู้)

1 rewind() เป็นค าสั่งที่ใช้ย้ายต าแหน่งของ file pointer ไปยังต าแหน่งเริ่มต้นของแฟ้ม
รูปแบบค าสั่งมีดังนี้


rewind(fp);

ตัวอย่างที่ 1
1 #include <stdio.h>

2 #include <dir.h>
3 int main(void) Programming 2
4 {
5 FILE *fp;


6 char *fname = "TXXXXXX", *newname, first;
7 newname = mktemp(fname);
8 fp = fopen(newname,"w+");

9 fprintf(fp,"abcdefghijklmnopqrstuvwxyz");
10 rewind(fp);
11 fscanf(fp,"%c",&first);

12 printf("The first character is: %c\n",first);
13 fclose(fp);
14 remove(newname);
15 return 0;
16 }

97
2. fseek() เป็นค าสั่งที่ใช้ย้ายต าแหน่งของ file pointer ไปยังต าแหน่งที่ต้องการใน
แฟ้มข้อมูลโดยจะต้องก าหนดจุดเริ่มต้น (origin) ของ file pointer และค่า offset รูปแบบค าสั่งมี

ดังนี้


fseek(fp , offset , origin);
ค าอธิบาย

offset = ระยะห่างจากตําแหน่งจุดเริ่มต้นมีหน่วยเป็น byte
origin = จุดที่ file pointer ชี้อยู่มีอยู 3 สถานะคือ
ตัวอย่างที่ 2
1 #include <stdio.h>
2 #include <conio.h>
3 long filesize(FILE *stream);
4 int main(void)
5 {
6 FILE *stream;
7 clrscr();
macro-name คาคงที่ ความหมาย
8
stream = fopen("MYFILE.TXT", "w+");
fprintf(stream, "This is a test");
9
SEEK_SET 0 file pointer อยูที่ตนแฟม (BOF)
printf("Filesize of MYFILE.TXT is %ld bytes\n", filesize(stream));
10
SEEK_OUR
file pointer อยูที่ต าแหนงปจจุบัน
1
fclose(stream);
11
Programming 2 13 return 0;
12
SEEK_END getch(); 2 file pointer อยูที่ทายแฟม (EOF)
14 }

15
16 long filesize(FILE *stream)
17 {
18 long curpos, length;
19 curpos = ftell(stream);
20 fseek(stream, 0L, SEEK_END);
21 length = ftell(stream);
22 fseek(stream, curpos, SEEK_SET);
23 return length;
24 }


3. ftell() เป็นค าสั่งที่ใช้บอกต าแหน่งของ file pointer ว่าปัจจุบันชี้อยู่ที่ต าแหน่งใดในแฟ้ม

ขอมูลโดยค าสั่งนี้จะส่งค่ากลับเป็นตัวเลขจ านวนเต็ม รูปแบบค าสั่งมีดังนี้

ftell(fp);

98

ตัวอย่างที่ 3

1 #include <stdio.h>
2 int main(void)
3 {
4 FILE *stream;
5 stream = fopen("MYFILE.TXT", "w+");
6 fprintf(stream, "This is a test");
7 printf("The file pointer is at byte %ld\n", ftell(stream));
8 fclose(stream);
9 return 0;
10 }



4. remove() ค าสั่งใช้ลบไฟล์รูปแบบ คือ remove(file name) เช่น
result = remove("c:\\c_train\\t4.txt"); */ result เป็นชื่อตัวแปร */ ข้อควรจ า ฟังกชันนี้ เมื่อลบ
ไฟล์ส าเร็จจะให้ค่า 0 หรือ เท็จ กลับมาถ้าลบไม่ส าเร็จจะให้ค่าอื่นที่ไม่ใช่ 0 ดังนั้นการเขียนโปรแกรม
เพื่อตรวจสอบจึงต้องระวัง

5. rename() ค าสั่งใช้เปลี่ยนชื่อไฟล รูปแบบ คือ rename(old name ,new name)
เช่น result = rename("c:\\c_train\\t4.txt","c:\\c_train\\b4.dat"); ข้อควรจ า ฟังก์ชันนี้เมื่อ
เปลี่ยนชื่อไฟล์ส าเร็จจะใหค่า 0 หรือ เท็จ กลับมา ถ้าเปลี่ยนชื่อไมส าเร็จ จะให้ค่าอื่นที่ไมใช ดังนั้น Programming 2

การเขียนโปรแกรมเพื่อตรวจสอบจึงต้องระวัง
6. ferror () ค าสั่งใช้ตรวจสอบว่ามีข้อผิดพลาดจากการอ่านแฟ้มข้อมูลหรือไม รูปแบบ คือ
ferror(file pointer) ข้อควรจ า ฟังก์ชันนี้ถ้าตรวจสอบว่าไม่มีข้อผิดพลาดจากการอ่านไฟล์จะใหค่า
0 หรือเท็จ กลับมาถ้าพบข้อผิดพลาดจะให้ค่าอื่นที่ไม่ใช่ 0 ดังนั้นการเขียนโปรแกรม เพื่อตรวจสอบจึง

ต้องระวัง
7. feof() ค าสั่งใช้ตรวจสอบว่าข้อมูลหมดไฟล์หรือไม คือหาจุดสิ้นสุดของไฟล์รูปแบบ คือ
feof(file pointer) โดยเมื่อถึงจุดสิ้นสุดของไฟล์จะคืนค่าที่ไม่ใช 0 มาให้ และคืนค่า 0 เมื่อยังไม่ถึง
จุดสิ้นสุดของไฟล์การตรวจสอบโดยใช้ฟังก์ชันนี้อาจดีกว่าการใช้ค่าคงที่ EOF ส าหรับแฟ้ม stdin หรือ

การรับข้อมูลจากแป้นพิมพ์รหัสแสดงว่าจบไฟล คือ การกดแป้น ctrl ค้างไว้แล้วเคาะแป้น z








99


Click to View FlipBook Version