ฟังก์ชัน -...

Preview:

Citation preview

Function

ฟงกชน

1 เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน

ฟงกชน (Function) คอ?

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน2

ฟงกชน คอ ชดค าสงทเขยนขนเพอแยกการท างานออกเปนสวนยอย ๆ (Module) โดยแตละฟงกชนจะมวตถประสงคการท างานเฉพาะสวน และสามารถเรยกใชงานฟงกชนจากสวนตาง ๆ ของโปรแกรมไดตามตองการ

ในภาษา C การท างานของค าสงตาง ๆ ตองเขยนไวภายในฟงกชน โดยเฉพาะฟงกชน main() ซงเปนฟงกชนหลกทภาษา C จะเรมตนท างานจากจดน และภายในฟงกชน main() อาจจะมการเรยกใชฟงกชนอน ๆ ไดอก

ประโยชนของฟงกชน

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน3

ฟงกชน เปนลกษณะการเขยนโปรแกรมแบบโครงสรางทมการแยกการท างานออกเปนสวนยอย ซงมขอดกวาการเขยนโปรแกรมไวรวมกนทเดยว ดงนงายตอการตรวจสอบและการบ ารงรกษาโปรแกรมหลกเลยงการเขยนชดค าสงทใชงานบอย ๆ ในโปรแกรมซ า ๆ กนหลายครง ซงมผลท าใหโปรแกรมมขนาดใหญเปนลกษณะทดของการเขยนโปรแกรมเชงโครงสรางทควรแยกการท างานตางๆ ออกเปนสวนยอย

ฟงกชนในภาษา C (Function in C Language)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน4

ฟงกชนในภาษา C แบงไดเปน 2 ประเภท คอ

ฟงกชนมาตรฐาน(Standard Function)

ฟงกชนทผเขยนโปรแกรมสรางขนเอง (User-Defined Function)

ฟงกชนมาตรฐาน (Standard Function)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน5

ฟงกชนมาตรฐานในภาษา C เปนฟงกชนทมมาใหพรอมกบตวแปลภาษา C ตามขอก าหนด ANSI C เพอใชงานดานตาง ๆ โดยเนนทงานพนฐาน ซงจะชวยใหการเขยนโปรแกรมสะดวกมากขน ตวอยางเชน ฟงกชนค านวณทางคณตศาสตร , ฟงกชนส าหรบจดการกบขอความ , ฟงกชนจดการเวลา เปนตนฟงกชนมาตรฐานจะเกบอยใน header file (นามสกล .h) ในการเรยกใชฟงกชนมาตรฐานจะตองประกาศค าสง #include <header file> ไวทสวนหวของโปรแกรม เพอใหตวแปลภาษา C รวาภายในโปรแกรมมการเรยกใชฟงกชนทอยใน header file ดงกลาว

ตวอยาง

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน6

ฟงกชน sqrt อยใน math.h

ฟงกชน printf , scanfอยใน stdio.h

ฟงกชนทสรางขนเอง (User-Defined Function)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน7

เปนฟงกชนทผเขยนโปรแกรมสรางขนเอง เพอใหท างานทอาจะนอกเหนอจากทฟงกชนมาตรฐานมให โดยอาจจะสรางฟงกชนทมชดค าสงทมการใชงานบอย ๆ ออกเปนฟงกชน เพอจะเขยนค าสงเพยงแคครงเดยว แตสามารถเรยกใชงานไดหลายครงการแบงการท างานของโปรแกรมออกเปนสวนเลกๆ ท าใหงายและสะดวกตอการตรวจสอบ และแกไขโปรแกรม โดยเฉพาะโปรแกรมทมขนาดใหญ หรอมผเขยนรวมกนหลายคน

ตวอยาง

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน8

ฟงกชนตนแบบ (Function prototype)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน9

โดยปกตหากประกาศฟงกชนใด ๆ ไวเหนอฟงกชน main() กไมจ าเปนตองประกาศฟงกชนตนแบบ เพราะคอมไพเลอรจะรจกฟงกชนทสรางขนเองนนกอน แตถายายต าแหนงการประกาศฟงกชนทสรางขนเอง ไปไวหลงฟงกชน main() และถามการเรยกใชงานฟงกขนนน ๆ ภายในฟงกชน main() คอมไพเลอรจะไมรจกฟงกชนนนเพราะประกาศไวทหลง ดงนนจงควรประกาศฟงกชนตนแบบกอน เพอเปนการบอกใหคอมไพเลอรรวาจะมการใชฟงกชนนน และเปนการจองพนทในหนวยความจ าส าหรบฟงกชนนน ๆ

รปแบบการประกาศฟงกชนตนแบบ

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน10

type : ชนดขอมลของฟงกชนทสงกลบคนมา เชน int , char เปนตน หากไมมการสงคากลบใชค าสงวนคอ void หากไมระบจะมคา default เปน int function-name : คอชอของฟงกชน ตงตามกฎการตงชอ type arg-1,type arg-2, … : รายการพารามเตอร พรอมระบชนดขอมลของแตละตว ถามมากกวา 1 รายการใหคนดวยเครองหมาย , ระบภายในวงเลบ ( ) หลงชอฟงกชน และจบดวยเครองหมาย ;

type function-name(type arg-1,type arg-2, …);

รปแบบการประกาศฟงกชนในภาษา C

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน11

type function-name (type arg-1 , type arg-2, …)

{

local variable declaration ;

statement-1 ;

statement-2;

statement-n;

return(value);

}

type : ชนดของฟงกชน พจารณาจากผลลพธทไดถาไมมการสงคากลบ ใหก าหนดเปน void

Function-name : ชอฟงกชน

type arg-1 , type arg-2 : ก าหนดชนดของอารกวเมนตทจะสงเขามาใหกบฟงกชน ถาไมตองการอารกวเมนตใด ๆ ใหก าหนดเปน void หรอวงเลบวาง ๆ

Local variable declaration : ประกาศตวแปรไวใชภายในฟงกชน

Return(value) : คาทสงกลบไปยงสวนทเรยกฟงกชน ตองมชนดเดยวกบ type ของฟงกชน

การเรยกใชงานฟงกชน

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน12

รปแบบ

สามารถเรยกใชงานโดยระบชอฟงกชน ตามดวยรายการพารามเตอร ซงสวนนเรยกวา actual parameter หรอ อารกวเมนต (argument) ภายในวงเลบ () ถามอารกวเมนตมากกวา 1 รายการใหคนดวยเครองหมาย , ถาไมมอารกวเมนตเลยอาจใชค าสงวน void หรอเวนวางกได

function-name(arg1 , arg2,…);

ค าสง return

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน13

return จะเปนขอความสงทใหหยดกระท าการ (execute) ของฟงกชน และสงการควบคมกลบไปยงฟงกชนทเรยกได รปแบบ

expression : คอ นพจนทจะสงคากลบคน จะตองมชนดเดยวกบฟงกชน ถาไมมการสงคากลบคนอาจจะเขยน return ; ถาไมระบ จะมคา default เปน int return จะสงคากลบไดเพยง 1 คาเทานน

return (expression);

แผนภาพการเรยกใชงานฟงกชน

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน14

main(){

one();…two();

}

Function two(){

// function body}

เรยกใชฟงกชน one

Function one(){

// function body}

เรยกใชฟงกชน two

เมอแตละฟงกชนท างานเสรจ กจะสงการควบคมกลบมาท

ฟงกชนหลก

ตวอยางฟงกชน(ทไมมการรบ/สงคา)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน15

ตวอยางฟงกชน

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน16

ประกาศฟงกชนตนแบบ

เรยกใชฟงกชน find_bmi

สวนหวและสวนการท างานของฟงกชน find_bmi

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน17

ผลลพธ

กฏเกณฑในการสง Actual parameter ไปยง Formal parameter

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน18

จ านวน actual parameter และ formal parameter ตองเทากน การสงคาระหวางพารามเตอรทงสอง จะกระท าแบบหนงตอหนง

ชนดของขอมลระหวาง actual parameter กบ formal parameter ในแตละคตองเหมอนกน ชอของ actual parameter กบ formal parameter ในแตละคจะเหมอนหรอตางกนกได

การสงผานคาระหวางฟงกชนทเรยกใชและฟงกชนทถกเรยก

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน19

การสงคาระหวาง actual parameter กบ formal parameter ในภาษา C จะแบงออกเปน 2 แบบ คอ

การผานโดยระบคา (pass by value) การผานโดยการอางอง (pass by reference)

การผานโดยระบคา (pass by value)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน20

จะเปนการส าเนาขอมลจาก actual parameter ไปยง formal parameter โดยคาของ formal parameter ทมการเปลยนแปลงภายในฟงกชนทถกเรยกใช จะไมมผลกระทบตอขอมลของ actual parameter ในบางครงเราจะเรยกวาเปนการสงขอมลแบบทางเดยว

Formal parameter

Actual parameter

กฎเกณฑในการสงพารามเตอรโดยวธการผานโดยระบคา

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน21

actual parameter กบ formal parameter ในแตละค จะตองมชนดขอมลเหมอนกน formal parameter แตละตว หามเปนตวช (pointer) actual parameter อาจจะเปนคาคงตว, ตวแปร หรอ นพจน แตละครงทการควบคมโปรแกรมถกสงไปใหฟงกชนทถกเรยกใช จะมการส าเนาคาของแตละ actual parameter ไปยง formal parameter ทสอดคลองกน การเปลยนแปลงคาใด ๆ ทถกส าเนามาในฟงกชนทถกเรยกใช จะไมมผลกระทบตอ actual parameter ทสอดคลองกน ดงนน การผานคาแบบนจะใชเฉพาะสงคาไปยงฟงกชนทถกเรยกเทานน

ตวอยางการสงผานคากลบมายงฟงกชนทเรยกใช

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน22

ผลลพธ

ตวอยางการสงผานคากลบมายงฟงกชนทเรยกใช

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน23

main(){

…x = callme ();

}

int callme (void){

return (5);}

เรยกใชฟงกชน callme()

สงคา 5 กลบคน

การสงผานโดยการอางอง (pass by reference)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน24

จะเปนการสงคาทอยของ actual parameter ไปยง formal parameter นนคอ ทง actual parameter กบ formal parameter จะมทอยของขอมลอยทต าแหนงเดยวกน ดงนนถาขอมลของ formal parameter มการเปลยนแปลงคาภายในฟงกชนทถกเรยกใชกจะมผลกระทบตอขอมลของ actual parameter ในบางครงเราจะเรยกวา เปนการสงขอมลแบบสองทาง ดงนน ถาเราตองการสงขอมลกลบมากกวา 1 คา เราจะใชวธการผานโดยการอางอง

กฎเกณฑในการสงพารามเตอรโดยวธการผานโดยการอางอง

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน25

actual parameter กบ formal parameter ในแตละคจะตองมชนดขอมลเหมอนกน actual parameter จะตองเปนทอยของตวแปร โดยจะมเครองหมาย ampersand (&) เตมหนา formal parameter แตละตว ตองมเครองหมาย * เตมหนา ในสวนของฟงกชนตนแบบ formal parameter แตละตวจะตองมเครองหมาย * เตมหนา การเขาถงขอมลในต าแหนงหนวยความจ าของ actual parameter เราจะตองใชชอทสอดคลองกบ formal parameter เตมหนาดวยเครองหมาย * โดยเราจะเรยกเครองหมาย * นวา ตวด าเนนการเขาถงโดยออม (indirection operator)

ตวอยางการสงผานคาโดยการอางอง

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน26

ผลลพธ

ตวอยางการสงผานคาโดยการอางอง

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน27

main(){

int x; x

callme (&x) ;

&x

void callme (int *p)

p&x

ต าแหนงทอยของตวแปร x เกบไว

ทน

{ *p = 5;

}

5

printf(“value is %d”,x);

ขอบเขตของตวแปร (Scope of variable)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน28

ในภาษา C กอนจะใชงานตวแปรในโปรแกรมตองประกาศตวแปรนน ๆ กอน เพอก าหนดบรเวณทแนนอนในโปรแกรม ซงบรเวณดงกลาวเรยกวา ขอบเขตของตวแปร ขอบเขตของตวแปรใด ๆ จะเรมตนทจดประกาศ และจดสนสดของตวแปร ขนอยวาประกาศตวแปรนนบรเวณใดในโปรแกรมและประกาศอยางไร ขอบเขตของตวแปรสวนกลาง จะมจดเรมตนทตวแปรถกประกาศ และสนสดเมอจบโปรแกรม ดงนนเราจะเรยกตวแปรสวนกลางนวา ขอบเขตของแฟม (file scope)

ขอบเขตของตวแปร (Scope of variable)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน29

ขอบเขตของตวแปรเฉพาะท จะมจดเรมตนทตวแปรถกประกาศ และมจดสนสดท block ของฟงกชนทตวแปรนประกาศอย ดงนนเราจะเรยกตวแปรเฉพาะทนวา ขอบเขตของ block (block scope) หรอ ขอบเขตเฉพาะท (local scope) formal parameter กเปนตวแปรเฉพาะทเชนกน เพยงแตวาเปนตวแปรทถกประกาศไวในรายการของฟงกชนทถกเรยกใช ดงนนจดเรมตนของตวแปรเฉพาะทจะเรมตนทรายการน และมจดสนสดท block ของฟงกชน ดงนนเราจะเรยกตวแปรเฉพาะทของ formal parameter นวา ขอบเขต parameter (parameter scope)

ตวแปรสวนกลาง (Global variable)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน30

ตวแปรสวนกลาง เปนตวแปรททก ๆ ฟงกชนในโปรแกรมสามารถเรยกใชได โดยตวแปรน จะมชวงชวต (lifetime) อยตลอดไป จนกระทงยตโปรแกรมจงจะถกท าลาย ตวแปรนจะตองถกประกาศภายนอกฟงกชน และกอนฟงกชน main ()

ตวแปรสวนกลาง (Global variable)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน31

Variable

main()OK

OK

OK

ตวแปร หรอ คาคงทใด ๆ ทประกาศกอนและนอก main() ทกฟงกชนสามารถน าไปใชได

ตวแปรเฉพาะท (Local variable)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน32

ตวแปรเฉพาะท จะเปนตวแปรทถกใชเฉพาะภายในฟงกชนของตวมนเอง และไมเปนทรจกของฟงกชนอน ๆ เมอฟงกชนนถกเรยกใช ตวแปรเฉพาะททกตวทอยภายในฟงกชนน จะถกก าหนดเนอทใหกบตวแปรแตละตว โดยใชหนวยความจ าทเรยกวา สแตก (stack) ชวงชวตของตวแปรเหลานจะสนสดและถกท าลายเมอสนสดฟงกชนน ตวแปรนจะตองถกประกาศอยภายในแตละฟงกชน และ formal parameter กจะถอวาเปนตวแปรเฉพาะทดวย

ตวแปรเฉพาะท (Local variable)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน33

variable

?

?

ตวแปร หรอ คาคงทใด ๆ ทประกาศในฟงกชนน จะไมเปนทรจกของฟงกชนอน

หนวยเกบแบบของตวแปร (Storage class)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน34

o ตวแปรแตละตวในภาษา C จะมประเภทหนวยเกบทแตกตางกน เพอทจะใชก าหนด ความมองเหนได (visibility), ชวงชวต (lifetime) และต าแหนง (location)

oภาษา C มประเภทหนวยเกบของตวแปร 4 แบบตวแปรอตโนมต (automatic variable) ตวแปรสถต (static variable) ตวแปรภายนอก (external variable) ตวแปรรจสเตอร (register variable)

ตวแปรอตโนมต (automatic variable)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน35

ในภาษา C ตวแปรใด ๆ ทถกประกาศอยภายในฟงกชน รวมทงรายการของ formal parameter จะเปนตวแปรเฉพาะท (local variable) และจะถกก าหนดใหเปนตวแปรอตโนมต โดยจะมการระบโดยใชค าสงวน auto ถาไมระบกจะม default เปน auto จะมขอบเขตและชวงชวตอยภายใน block ของฟงกชนทตวแปรนถกประกาศเทานน

ตวแปรอตโนมต (automatic variable)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน36

ตวแปร value จะเปนตวแปรอตโนมต เนองจากมการระบค าสงวน auto บางครงเราไมจ าเปนตองเขยน auto กได เนองจากในภาษา C จะม default เปน auto

ตวแปรสถต (static variable)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน37

ในภาษา C ตวแปรสถตกเปนตวแปรเฉพาะทเหมอนกน แตไมเหมอนตวแปรเฉพาะท โดยทวไปคอ ตวแปรสถตจะมชวงชวตอยจนกวาโปรแกรมจะยต ถงแมวาฟงกชนทถกเรยกใชจะสนสดไปแลวกตาม แตตวแปรสถตนยงไมถกท าลาย และยงจ าคาปจจบนอย และมขอบเขตอยภายในฟงกชนทตวแปรสถตนอย โดยปกตแลวเมอสนสดฟงกชนทตวแปรเฉพาะทนอย ตวแปรเฉพาะททกตวกจะถกท าลายหมด

ตวแปรสถต (static variable)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน38

ผลลพธ

ตวอยาง การใชตวแปร automatic กบตวแปร static ในฟงกชน trystat

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน39

ตวอยาง การใชตวแปร automatic กบตวแปร static ในฟงกชน trystat

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน40

o ตวอยางโปรแกรมน ในฟงกชน trystat มการประกาศตวแปรสถตคอ stay และตวแปรอตโนมต คอ fade o ความแตกตางของทง 2 ตวแปร คอ เมอสนสดการเรยกใชฟงกชน trystat คาของตวแปร fade จะถกท าลายไป แตคาของตวแปร stay ยงคงอย เนองจากไดก าหนดใหเปนตวแปรสถตo แตตวแปรทงสองกยงคงมขอบเขตภายในฟงกชนนเหมอนกน

ผลลพธ

ตวแปรภายนอก (external variable)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน41

ตวแปรทถกประกาศไวภายนอกฟงกชน ในภาษา C จะก าหนดใหเปนตวแปรภายนอก และภายในแตละฟงกชนกสามารถประกาศใหเปนตวแปรภายนอกไดเชนกน โดยระบค าสงวนวา extern ขอบเขตและชวงชวตของตวแปรภายนอกน จะเรมตนทจดประกาศตวแปรไปสนสดทโปรแกรมยต

ตวแปรภายนอก (external variable)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน42

นยามการประกาศอางองการประกาศ

ตวแปรภายนอก (external variable)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน43

ผลลพธ

• ตวอยางโปรแกรมน จะมตวแปรประกาศ Units ซ ากนอย 3 ท คอ อยกอนฟงกชน main(), อยภายในฟงกชน main() แตระบเปนตวแปรภายนอก และอยภายในฟงกชน critic() และระบเปนตวแปรภายนอก • ถาภายในฟงกชน main () และ critic () ไมไดระบเปนตวแปรภายนอก เราจะถอวาเปนตวแปรเฉพาะท • แตการทเราระบเปนตวแปรภายนอกจดประสงคเพอจะบอกใหคอมไพเลอรรวา เราตองการอางถงตวแปร Units ทถกประกาศอยภายนอกฟงกชน หรอบางครงอาจจะนอกโปรแกรมกได • ดงนน ตวแปร Units ทประกาศอยกอนฟงกชน main() เราจะเรยกวา เปนนยามการประกาศ (defining declaration) และตวแปรภายนอกทงสอง จะเรยกวาเปนการอางอง การประกาศ (referencing declaration)

ตวแปรรจสเตอร (register variable)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน44

โดยปกตตวแปรใด ๆ จะถกเกบไวในหนวยความจ าหลก แตถาเราตองการใหตวแปรไปอยหนวยความจ าประเภทรจสเตอร เพอตองการเขาถงตวแปรเหลานนไดรวดเรวยงขน เราจะตองระบค าสงวน register ไวหนาตวแปร

ฟงกชนเรยกซ า(Recursive function)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน45

ฟงกชนเรยกซ า เปนฟงกชนทมการเรยกใชฟงกชนตวมนเอง ซงแบงออกเปน 2 แบบ คอ

1. แบบโดยตรง (Direct)2. แบบโดยออม (Indirect)

ฟงกชนเรยกซ า(Recursive function)

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน46

main(){

myself();}

myself(){

myself();}

แบบโดยตรง

แบบโดยออม

main(){

first();}

first(){

second();}

second(){

first();}

ตวอยาง Recursive function

เรยบเรยงโดย อ.เรวด พพฒนสงเนน สาขาวชาวทยาการคอมพวเตอรและเทคโนโลยสารสนเทศ คณะวทยาศาสตร มหาวทยาลยราชภฏอดรธาน47

Recommended