12
1 บทที5 ฟังก์ชัน (Function) การเขียนโปรแกรมทั้งหมดภายในฟังก์ชันเดียวหากเป็นโปรแกรมขนาดใหญ่ เมื่อมีการกลับมาแก้ไข หรือต้องการ ปรับปรุงโปรแกรมเพิ่มเติมจะทาได้ยาก โดยเฉพาะเมื่อผู้ที่มาปรับปรุงนั้นไม่ใช่ผู้เขียนโปรแกรม การเขียนโปรแกรมแบบ ฟังก์ชันเป็นการกระจายการทางานของโปรแกรมออกเป็นงานเล็ก จะสามารถช่วยแก้ปัญหาดังกล่าวได้ โปรแกรมภาษาซีจะประกอบขึ้นจากฟังก์ชันหลาย ฟังก์ชันอยู่ในแฟ้มต้นฉบับ (Source File) ตั้งแต่หนึ่งแฟ้มขึ้น ไปหลังจากนั้นจะนา แฟ้มเหล่านี้ไปทา การแปลโปรแกรม (Compile) เพื่อให้ได้แฟ้มจุดหมาย (Object File) และเชื่อม (Link) เข้าด้วยกัน และอาจจะมีการเชื่อมเข้ากับคลังโปรแกรม (Library File) หากมีการเรียกใช้ฟังก์ชันอื่น จากคลัง โปรแกรม คลังโปรแกรมเป็นแฟ้ม จุดหมายที่เก็บฟังก์ชันย่อยที่สามารถเรียกใช้ได้โดยโปรแกรมใด ช่วยให้ประหยัดเวลาใน การพัฒนาโปรแกรมได้เป็นอย่างมาก เช่น หากมีการใช้ฟังก์ชันใดบ่อยในหลาย โปรแกรม หรือหากจะต้องเขียนฟังก์ชัน นั้นในทุกโปรแกรมที่เรียกใช้จะเป็นการเสียเวลาพัฒนาโปรแกรม ก็สามารถนาฟังก์ชันนั้นไปเก็บไว้ในคลังโปรแกรมเพื่อให้ โปรแกรมอื่นเรียกใช้ได้ รูปที5.1 แสดงขั้นตอนการแปลโปรแกรมภาษาซี 5.1 แนวความคิดในการออกแบบฟังก์ชัน เมื่อเริ่มเขียนโปรแกรมเราจะต้องรู้ว่าโปรแกรมนั้นเขียนขึ้นเพื่อทางานอะไร โดยที่เราสามารถหารายละเอียดเหล่า นั้นจากผู้ใช้งาน จากเอกสารต่าง ที่เกี่ยวข้อง และจากแหล่งข้อมูลต่าง หลังจากนั้นจะเป็นออกแบบโปรแกรมเพื่อให้ สามารถทาในสิ่งที่เราต้องการ การออกแบบโปรแกรมในภาษาซีจะอยู่บนพื้นฐานของการออกแบบโมดูล (Module Design) โดยการแบ่ง โปรแกรมออกเป็นงานย่อย (หรือโมดูล) แต่ละงานย่อยจะทา งานอย่างใดอย่างหนึ่งเท่านั้น และไม่ควรจะมีขนาดใหญ่จน เกินไป งานย่อยเหล่านี้เมื่อนา ไปเขียนโปรแกรมในภาษาซีจะเป็นการเขียนในลักษณะของฟังก์ชัน ในการออกแบบงานหรือฟังก์ชันจะอยู่บนพื้นฐานของการประมวลผลระบบคอมพิวเตอร์ คือมีข้อมูลเข้า มี กระบวนการ และมีข้อมูลออก โดยที่จะมีฟังก์ชันหลักทาหน้าที่ควบคุมและประสานการทางาน

5 (Function) - RMUTI · 1 บทที่ 5 ฟังก์ชัน (Function) การเขียนโปรแกรมทั้งหมดภายในฟังก์ชันเดียวหากเป็นโปรแกรมขนาดใหญ่

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 5 (Function) - RMUTI · 1 บทที่ 5 ฟังก์ชัน (Function) การเขียนโปรแกรมทั้งหมดภายในฟังก์ชันเดียวหากเป็นโปรแกรมขนาดใหญ่

1

บทท 5 ฟงกชน (Function)

การเขยนโปรแกรมทงหมดภายในฟงกชนเดยวหากเปนโปรแกรมขนาดใหญ เมอมการกลบมาแกไข หรอตองการ ปรบปรงโปรแกรมเพมเตมจะท าไดยาก โดยเฉพาะเมอผทมาปรบปรงนนไมใชผเขยนโปรแกรม การเขยนโปรแกรมแบบ ฟงกชนเปนการกระจายการท างานของโปรแกรมออกเปนงานเลก ๆ จะสามารถชวยแกปญหาดงกลาวได โปรแกรมภาษาซจะประกอบขนจากฟงกชนหลาย ๆ ฟงกชนอยในแฟมตนฉบบ (Source File) ตงแตหนงแฟมขนไปหลงจากนนจะน า แฟมเหลานไปท า การแปลโปรแกรม (Compile) เพอใหไดแฟมจดหมาย (Object File) และเชอม (Link) เขาดวยกน และอาจจะมการเชอมเขากบคลงโปรแกรม (Library File) หากมการเรยกใชฟงกชนอน ๆ จากคลงโปรแกรม คลงโปรแกรมเปนแฟม จดหมายทเกบฟงกชนยอยทสามารถเรยกใชไดโดยโปรแกรมใด ๆ ชวยใหประหยดเวลาในการพฒนาโปรแกรมไดเปนอยางมาก เชน หากมการใชฟงกชนใดบอยในหลาย ๆ โปรแกรม หรอหากจะตองเขยนฟงกชนนนในทกโปรแกรมทเรยกใชจะเปนการเสยเวลาพฒนาโปรแกรม กสามารถน าฟงกชนนนไปเกบไวในคลงโปรแกรมเพอใหโปรแกรมอนเรยกใชได

รปท 5.1 แสดงขนตอนการแปลโปรแกรมภาษาซ

5.1 แนวความคดในการออกแบบฟงกชน เมอเรมเขยนโปรแกรมเราจะตองรวาโปรแกรมนนเขยนขนเพอท างานอะไร โดยทเราสามารถหารายละเอยดเหลา นนจากผใชงาน จากเอกสารตาง ๆ ทเกยวของ และจากแหลงขอมลตาง ๆ หลงจากนนจะเปนออกแบบโปรแกรมเพอให สามารถท าในสงทเราตองการ การออกแบบโปรแกรมในภาษาซจะอยบนพนฐานของการออกแบบโมดล (Module Design) โดยการแบง โปรแกรมออกเปนงานยอย ๆ (หรอโมดล) แตละงานยอยจะท า งานอยางใดอยางหนงเทานน และไมควรจะมขนาดใหญจน เกนไป งานยอยเหลานเมอน า ไปเขยนโปรแกรมในภาษาซจะเปนการเขยนในลกษณะของฟงกชน ในการออกแบบงานหรอฟงกชนจะอยบนพนฐานของการประมวลผลระบบคอมพวเตอร คอมขอมลเขา มกระบวนการ และมขอมลออก โดยทจะมฟงกชนหลกท าหนาทควบคมและประสานการท างาน

Page 2: 5 (Function) - RMUTI · 1 บทที่ 5 ฟังก์ชัน (Function) การเขียนโปรแกรมทั้งหมดภายในฟังก์ชันเดียวหากเป็นโปรแกรมขนาดใหญ่

2

- ขอมลเขา หมายถงขอมลทจ าเปนตองทราบกอนการประมวลผลฟงกชนนน โดยฟงกชนทออกค าสงจะเปนผให ขอมลแกฟงกชนทไดรบค าสงใหท างาน - ขอมลออก หมายถงขอมลทไดจากการประมวลผลของฟงกชน เมอฟงกชนทไดรบค าสงท างานเสรจจะสงคาขอมลนกลบไปใหกบฟงกชนทออกค าสง เนองจากภาษาซมการสงอารกวเมนท (argument) ใหกบฟงชนกแบบ By Value และฟงกชนสามารถคนคา(return) คาไดเพยงหนงคา ซงสามารถอธบายไดดงน - ในการออกค าสงใหฟงกชนใดท างานนน ฟงกชนทเปนผออกค าสงอาจตองมการสงขอมลบางอยางใหกบฟงกชนยอยนน ฟงกชนทออกค าสงสามารถสงขอมลจ านวนเทาใดกไดใหแกฟงกชนทไดรบค าสงใหท างาน หรออาจจะไมสงขอมลใดๆ เลยกได - เมอฟงกชนทไดรบค าสงท างานเสรจจะสามารถสงคาขอมลกลบใหแกฟงกชนทออกค าสงไดเพยงหนงคาเทานน หรออาจไมสงขอมลกลบเลยกสามารถท าได ตวอยางท 5.1 การออกแบบโปรแกรมการบวกเลขจ านวนจรง 2 จ านวนทรบจากผใช และแสดงผลลพธทไดจาก การค านวณ

ในการออกแบบโปรแกรมน สามารถแบงออกเปนงานยอย ๆ ดงน

• รบขอมล 2 จ านวนจากผใช • บวกเลข 2 จ านวนแลวเกบผลลพธ • แสดงผลลพธของการท างาน

จากการแบงการท างานออกเปนงานยอยๆ และขอควรค านงทระบขางตน เราสามารออกแบบโปรแกรมนโดยแบงการท างานออกเปน 3 ฟงกชนยอย และ 1 ฟงกชนหลก โดยท 3 ฟงกชนยอยดงกลาวไดแก 1. ฟงกชนรบขอมล ท าหนาทรบขอมลจ านวนจรงครงละ 1 จ านวนจากผใช ( เนองจากแตละฟงกชนสามารถสง ขอมลออกไดเพยงคาเดยว ) และสงคาขอมลทรบเขามาใหกบฟงกชนหลก 2. ฟงกชนบวกเลข ท าหนาทบวกเลขจ านวนจรง 2 จ านวน และสงคาขอมลทไดจากการค านวณกลบมาใหฟงกชนหลก 3. ฟงกชน แสดงผลท าหนาทแสดงผลลพธจากการค านวณ ส าหรบฟงกชนหลก คอ ฟงกชน main( ) ในภาษาซการท างานจะเรมท างานทฟงกชน main( ) เสมอ ฟงกชนน

Page 3: 5 (Function) - RMUTI · 1 บทที่ 5 ฟังก์ชัน (Function) การเขียนโปรแกรมทั้งหมดภายในฟังก์ชันเดียวหากเป็นโปรแกรมขนาดใหญ่

3

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

ในการออกแบบฟงกชนยอยสามารถใชวธออกแบบแบบกลองด า (Black Box Design) การออกแบบในลกษณะน จะคดจากหนาทของฟงกชนนนเปนหลก และพจารณาวาจะตองมขอมลเขาสฟงกชนและขอมลทจะสงกลบเมอจบฟงกชน คออะไร ดงรปท 5.2

รปท 5.2 การออกแบบฟงกชนแบบกลองด า

จากตวอยาง 5.1 เราสามารถออกแบบแตละฟงกชนยอยทง 3 ฟงกชนแบบกลองด า ไดดงน ฟงกชนรบขอมล ท าหนาทรบขอมลจ านวนจรง 1 จ านวนจากผใช เมอท างานเสรจจะท าการสงคาจ านวนจรงทรบจากผใชกลบไปยง ฟงกชนทออกค าสงใหฟงกชนรบขอมลท างาน ซงในทนคอฟงกชน main( ) ส าหรบขอมลเขาสฟงกชนในกรณนจะพบวาไม จ าเปน ตองมขอมลเขาสฟงกชน การออกแบบฟงกชนรบขอมล แสดงไดดงรปท 5.3

รปท 5.3 แสดงกลองด าของฟงกชนรบขอมล

Page 4: 5 (Function) - RMUTI · 1 บทที่ 5 ฟังก์ชัน (Function) การเขียนโปรแกรมทั้งหมดภายในฟังก์ชันเดียวหากเป็นโปรแกรมขนาดใหญ่

4

ฟงกชนบวกเลข ฟงกชน บวกเลขมหนาทในการบวกเลข 2 จ านวน พจารณาขอมลเขาสฟงกชนจะไดวาในการบวกเลขจะตองมการ รบขอมลจ านวน 2 จ านวนเขาสฟงกชนเพอน ามาบวกกน และคนคาผลลพธของการบวกนนกลบไปยงฟงกชนทออกค าสงให ฟงกชนบวกเลขท างาน ซงในทนคอฟงกชน main( ) ซงผลลพธของการบวกนนคอขอมลทออกจากฟงกชน การออกแบบ ฟงกชนบวกเลขแสดงดงรปท 5.4

รปท 5.4 แสดงกลองด าของฟงกชนบวกเลข

ฟงกชนแสดงผล ฟงกชนแสดงผลมหนาทแสดงผลลพธออกทางจอภาพ พจารณาขอมลเขาสฟงกชนจะไดวาขอมลทตองการแสดง ทางจอภาพของโปรแกรมนคอขอมลผลลพธของการบวกเลขจ านวนจรง 2 จ านวน และเมอแสดงผลเสรจกจะจบการท า งานของฟงกชนโดยทไมจ า เปนตองมคนคาใด ๆ ไปยงฟงกชนทออกค าสงใหฟงกชนนท า งาน การออกแบบฟงกชนแสดงผลแสดงดงรปท 5.5

รปท 5.5 แสดงกลองด าของฟงกชนแสดงผล

5.2 รปแบบของฟงกชน การเขยนฟงกชนในภาษาซสามารถแบงการเขยนออกเปน 2 แบบหลกตามลกษณะการเขยน คอ 1. ฟงกชนทมการสงคากลบเมอท า งานเสรจ 2. ฟงกชนทไมมการสงคากลบเมอท างานเสรจ 5.2.1 ฟงกชนทมการสงคากลบเมอท างานเสรจ ฟงกชนทมการสงคากลบเมอท างานเสรจนเปนฟงกชนทจะตองมการสงคากลบไปยงฟงกชนทเรยกใชงานฟงกชนน เมอท างานเสรจ

Page 5: 5 (Function) - RMUTI · 1 บทที่ 5 ฟังก์ชัน (Function) การเขียนโปรแกรมทั้งหมดภายในฟังก์ชันเดียวหากเป็นโปรแกรมขนาดใหญ่

5

รปท 5.6 แสดงกลองด าของรปแบบฟงกชนทมการสงคากลบเมอท างานเสรจ

รปแบบฟงกชนทมการสงคากลบเมอท างานเสรจมลกษณะดงน จากรปแบบของฟงกชนขางตน ชนดของขอมลทคนคา จะเปนประเภทขอมลชนดใด ๆ เชน int float float char เปนตน กอนจบฟงกชนจะตองมการสงคากลบดวยค าสง return แลวตามดวยคาทคนกลบซงเปนขอมลชนดเดยวกบ ชนด ของขอมลทคนคา 5.2.2 ฟงกชนทไมมการสงคากลบเมอท างานเสรจ ฟงกชนทไมมการสงคากลบเมอท างานเสรจ จะเปนฟงกชนทเมอท างานในฟงกชนเสรจกจะคนการท างานกลบไป ยงฟงกชนทเรยกใชงานโดยทไมมการคนคาใด ๆ กลบไป

รปท 5.7 แสดงกลองด าของรปแบบฟงกชนทไมมการสงคากลบเมอท างานเสรจ

รปแบบฟงกชนทไมมการสงคากลบเมอท างานเสรจมลกษณะดงน

ชนดขอมลทคนคาฟงกชน ( การประกาศตวแปรทจะรบคาจากฟงกชนอนทเรยกใชฟงกชนน ) { การประกาศตวแปรภายในฟงกชน; ค าสง; return(คาขอมลทตองการสงคากลบ); }

void ชอฟงกชน ( การประกาศตวแปรทจะรบคาจากฟงกชนอนทเรยกใชฟงกชนน ) { การประกาศตวแปรภายในฟงกชน; ค าสง; }

Page 6: 5 (Function) - RMUTI · 1 บทที่ 5 ฟังก์ชัน (Function) การเขียนโปรแกรมทั้งหมดภายในฟังก์ชันเดียวหากเป็นโปรแกรมขนาดใหญ่

6

จากรปแบบของการประกาศฟงกชนทไมมการสงคากลบจะขนตนดวยค า วา void และไมมค า สง return กอนจะ จบการท างานของฟงกชน ตวอยางท 5.1 แสดงการท างานของโปรแกรมการบวกเลขจ านวนจรง 2 จ านวนทรบจากผใช ตวอยางท 5.1 เปนตวอยางทแสดงใหเหนถงการประกาศฟงกชน การท างานของฟงกชน การสงผานคาขอมล การคนคาจากฟงกชน จะเหนวาฟงกชนแตละฟงกชนท างานเพยงอยางใดอยางหนงเทานน การท างานเรมจากค าสงแรก #include <stdio.h> เปนการเรยกใชอนคลชไฟล (Include File) เมอโปรแกรมมการเรยกใชงานฟงกชนจากคลงโปรแกรม ซงอาจจะเปนแฟมจากคลงโปรแกรมมาตรฐานทผผลตคอมไพเลอรเตรยมไว หรอแฟมจากคลงโปรแกรมทผพฒนาโปรแกรมจดท าขนเอง จะท าการเรยกใชแฟมทเกบฟงกชนทตองการในคลงโปรแกรม ในทนมการเรยกใชฟงกชนทเกยวของกบการรบขอมลจากผใชและแสดงผลขอมลทางอปกรณแสดงผล ไดแก scanf และ printf จงมการเรยกใชแฟมทเกบฟงกชนทเกยวของกบอปกรณรบและแสดงผลมาตรฐาน คอ stdio.h กรณทเปนแฟมโปรแกรมมาตรฐานจะเกบไวในไดเรกทอร (directory) ทผผลตคอมไพเลอรจดเตรยมไว จะใชค าสง include <stdio.h> แตหากเปนแฟมทรวบรวมฟงกชนทผเขยนโปรแกรมสรางขนเองจะใชค าสง include “myfile.h” หากไมมการระบไดเรกทอร โปรแกรมจะคนหาแฟม myfile.h ทไดเรกทอรทท างานปจจบน แตผเขยนโปรแกรมสามารถระบไดเรกทอร ไวในเครองหมาย “ “ ไดเชนเดยวกน แฟมทรวบรวมฟงกชนทผเขยนโปรแกรมสรางขนเองนจะเปนแฟมขอความธรรมดาทสามารถเปดอานได เกบขอมลทจ าเปนตองใชในการเรยกใชฟงกชน เชน การประกาศตวแปร การประกาศโปรโตไทปของฟงกชน เปนตน

#include <stdio.h> float InputFloat ( ) { float x; printf ( “\nInput real value : “ ); scanf ( “%f”, &x ); return ( x ); } float SumFloat ( float x, float y ) { return ( x + y ); } void PrintOut ( float x ) { printf ( “\n Result of sum is : %.2f”, x ); } void main ( ) { float a1, a2, sumVal; a1 = InputFloat( ); a2 = InputFloat( ); sumVal = SumFloat ( a1, a2 ); PrintOut ( sumVal ); }

Page 7: 5 (Function) - RMUTI · 1 บทที่ 5 ฟังก์ชัน (Function) การเขียนโปรแกรมทั้งหมดภายในฟังก์ชันเดียวหากเป็นโปรแกรมขนาดใหญ่

7

จากนนการท างานของโปรแกรมจะเรมจากฟงกชนหลกคอ ฟงกชน main( ) ภายในฟงกชน main( ) หากมการ เรยกใชฟงกชนยอยใด กจะมสงการท างานไปยงฟงกชนยอยนน ๆ เมอฟงกชนยอยนนท างานเสรจกจะคนการท างานกลบ มายงฟงกชน main( ) ท าเชนนจนกระทงหมดค าสงในฟงกชน main( ) ล าดบของการเรยกใชงานฟงกชนยอยมดงน 1. เรยกฟงกชนรบขอมล เพอรบขอมลตวแรก 2. เรยกฟงกชนรบขอมล เพอรบขอมลตวทสอง 3. เรยกฟงกชนบวกเลขเพอท าการค านวณ 4. เรยกฟงกชนแสดงผลเพอแสดงผลลพธจากการค านวณ ขนตอนท 1 และ 2 เปนขนตอนของการรบขอมลเขาเพอประมวลผล การท างานทงสองขนตอนนฟงกชนหลกจะ ท าการเรยกใชงานฟงกชนรบขอมล ซงเปนฟงกชนทมการคนคากลบเปนจ านวนจรง 1 จ านวน ฟงกชนรบขอมลมการ ประกาศหวของฟงกชน รปแบบดงนคอ float InputFloat ( ); ในฟงกชนหลกหรอฟงกชน main( ) จะตองมการรบขอมลจ านวนจรง 2 คา เพราะฉะนนจะตองมการเรยกใชงาน ฟงกชนน 2 ครง ดงขนตอนท 1 และ 2 ขางตน เนองจากฟงกชนนมการคนคาเปนจ านวนจรงแบบ float ภายในฟงกชน main( ) จะตองมตวแปรแบบ float เพอมารรบคาดงกลาว การเรยกใชฟงกชนนสามารถใชค าสง float a1, a2; // ตวแปรทใชรบคาการรบขอมลจากผใช a1 = InputFloat( ); a2 = InputFloat( ); พจารณาจากการเรยกใชงาน หากฟงกชนใดมการสงคากลบไปยงฟงกชนทเรยกใช การเรยกใชจะตองมตวแปรท มชนดเดยวกนกบขอมลทสงคนจากฟงกชนยอยมารบคาเสมอ จากในตวอยางฟงกชน InputFloat( ) มการคนคาเปนแบบ float เพราะฉะนนตวแปรทมารบคาจะเปนตวแปรประเภทเดยวกน ในทนคอ a1 เปนตวแปรประเภท float จะถกก าหนดใหมคาเทากบคาทสงคนมาจากฟงกชน InputFloat( ) ในทนมการรบคาจ านวนจรง 2 จ านวนจากผใชเพราะฉะนนจะตองมการเรยกใชฟงกชน InputFloat( ) 2 ครง ครงแรกเกบคาทผใชปอนในตวแปร a1 และเมอมการเรยกใชครงท 2 คาทไดจะเกบไวในตวแปร a2 ขนตอนท 3 เปนขนตอนของการบวกเลขจ านวนจรง 2 จ านวนทรบเขามาจากผใช การท างานขนตอนนฟงกชน หลกจะท าการเรยกใชงานฟงกชนบวกเลข โดยมการสงคาเลขจ านวนจรง 2 คาใหกบฟงกชนบวกเลขเพอท าการค านวณ และเมอท า การค านวณเสรจฟงกชนบวกเลขจะสงคาผลลพธของการบวกกลบเปนจ านวนจรง 1 จ านวนคนใหกบฟงกชนหลก ฟงกชนบวกเลขมการประกาศหวของฟงกชนรปแบบดงนคอ float SumFloat ( float, float ); เมอตองการเรยกใชงานฟงกชนยอยดงกลาวจะตองมการสงคาเขาไป 2 คา ในทนคอ a1 และ a2 ทรบจากผใช มชนดขอมลเปน float และเมอฟงกชน SumFloat( ) ท างานเสรจจะมการสงคากลบจงตองมตวแปรชนด float อก 1 ตวมา

Page 8: 5 (Function) - RMUTI · 1 บทที่ 5 ฟังก์ชัน (Function) การเขียนโปรแกรมทั้งหมดภายในฟังก์ชันเดียวหากเป็นโปรแกรมขนาดใหญ่

8

รบคาผลบวกดงกลาว จะเรยกใชงานฟงกชน SumFloat ไดวา float sumVal; sumVal = SumFloat ( a1, a2 ); ขนตอนท 4 เปนขนตอนของการแสดงผลลพธของการค านวณ การท างานขนตอนนฟงกชนหลกจะท าการเรยกใชงานฟงกชนแสดงผล โดยมการสงคาเลขจ านวนจรง 1 คาซงเปนผลลพธใหกบฟงกชนนเพอพมพผลลพธ ซงการท างานของ ฟงกชนนไมจ า เปนตองมการสงคากลบใหฟงกชนหลก ฟงกชนแสดงผลมการประกาศหวของฟงกชนรปแบบดงนคอ void PrintOut ( float ); ฟงกชนมการรบคาจ านวนจรง 1 คาเปนแบบ float โดยทเมอท างานเสรจจะไมมการสงคากลบ เมอตองการเรยกใชงาน สามารถเรยกใชไดดวยค าสง PrintOut(sumVal); จะเหนวาการเรยกใชงานฟงกชนทไมมการสงคากลบนนสามารถเรยกใชชอฟงกชนไดทนทโดยไมตองมตวแปรมา รบคา 5.3 การประกาศโปรโตไทปของฟงกชน การประกาศโปรโตไทปเปนสงจ าเปนในภาษาซ เนองจากภาษาซเปนภาษาในลกษณะทตองมการประกาศฟงกชน กอนจะเรยกใชฟงกชนนน (Predefined Function) จากตวอยางท 5.1 จะเหนวาฟงกชน main ( ) จะอยใตฟงกชนอน ๆ ทมการเรยกใช นนคอมการประกาศฟงกชนยอยไวในบรรทดกอนทจะมการเรยกใช แตหากตองการยายฟงกชน main ( ) ขนไปไวดานบน จะตองมการประกาศโปรโตไทป ของฟงกชนทตองการเรยกใชกอนเสมอ ดงตวอยางท 5.2 ซงผเขยนโปรแกรมจะเลอกวธการเขยนในรปแบบในตวอยางท 5.1 หรอ 5.2 กได ตวอยางท 5.2 แสดงการท างานของโปรแกรมการบวกเลขจ านวนจรง 2 จ านวนทรบจากผใช ในลกษณะทมการ ประกาศโปรโตไทป

#include <stdio.h> float InputFloat ( ); float SumFloat ( float , float ); void PrintOut ( float ); void main ( ) { float a1, a2, sumVal; a1 = InputFloat( ); a2 = InputFloat( ); sumVal = SumFloat ( a1, a2 ); PrintOut ( sumVal ); } float InputFloat ( ) { float x; printf ( “\nInput real value : “ ); scanf ( “%f”, &x ); return ( x ); } float SumFloat ( float x, float y ) { return ( x + y ); }

Page 9: 5 (Function) - RMUTI · 1 บทที่ 5 ฟังก์ชัน (Function) การเขียนโปรแกรมทั้งหมดภายในฟังก์ชันเดียวหากเป็นโปรแกรมขนาดใหญ่

9

จะเหนวาในโปรโตไทปไมมการประกาศชอตวแปร มแตการเขยนประเภทของตวแปรไวภายใน เปนการชวยให คอมไพเลอรสามารถตรวจสอบจ านวนของตวแปร ประเภทของตวแปร ประเภทของการคนคา ภายในโปรแกรมวามการ เรยกใชงานสงตาง ๆ เกยวกบฟงกชนนนถกตองหรอไม นอกจากนเราอาจจะแยกสวนโปรโตไทป ไปเขยนไวในอนครชไฟลกไดเชนเดยวกน ตวอยางท 5.3 แสดงการแยกสวนของโปรโตไทปไปไวในอนคลชไฟลชอ myinc.h และการเรยกใชจากโปรแกรม หลก 5.4 ขอบเขต (Scope) การท างานของโปรแกรมภาษาซจะท างานทฟงกชน main ( ) กอนเสมอ เมอฟงกชน main ( ) เรยกใชงานฟงกชน อน กจะมการสงคอนโทรล (Control) ทควบคมการท างานไปยงฟงกชนนน ๆ จนกวาจะจบฟงกชน หรอพบค าสง return เมอมการเรยกใชงานฟงกชนจะมการจองพนทหนวยความจ า ส าหรบตวแปรทตองใชภายในฟงกชนนน และเมอสนสดการ ท างานของฟงกชน กจะมการคนพนทหนวยความจ า สวนนนกลบสระบบ การใชงานตวแปรแตละตวจะมขอบเขตของการใชงาน ขนอยกบต าแหนงทประกาศตวแปรนน จากตวอยางท 5.1 และ 5.2 แสดงการท างานไดดงรปท 5.8

void PrintOut ( float x ) { printf ( “\n Result of sum is : %.2f”, x ); }

#include <stdio.h> #include “myinc.h” void main ( ) { float a1, a2, sumVal; a1 = InputFloat( ); a2 = InputFloat( ); sumVal = SumFloat ( a1, a2 ); PrintOut ( sumVal ); } float InputFloat ( ) { float x; printf ( “\nInput real value : “ ); scanf ( “%f”, &x ); return ( x ); } float SumFloat ( float x, float y ) { return ( x + y ); } void PrintOut ( float x ) { printf ( “\n Result of sum is : %.2f”, x ); }

/* myinc.h */ float InputFloat ( ); float SumFloat ( float , float ); void PrintOut ( float );

Page 10: 5 (Function) - RMUTI · 1 บทที่ 5 ฟังก์ชัน (Function) การเขียนโปรแกรมทั้งหมดภายในฟังก์ชันเดียวหากเป็นโปรแกรมขนาดใหญ่

10

รปท 5.8 แสดงการท างานของฟงกชน

เมอเรมการท างานทฟงกชน main ( ) จะมการจองพนทหนวยความจ าใหกบตวแปรตาง ๆ ทเกยวของ คอ a1 a2 และ sumVal เมอมการเรยกใชฟงกชน InputFloat ( ) ในขนท 1 จะมการจองพนทหนวยความจ าใหกบตวแปร x และท าการรบขอมลจากผใช เมอมการใชค าสง return ( x ); จะมการน า คาในตวแปร x ก าหนดใหกบ a1 แลวคนพนทเพอการท างานของ InputFloat ใหกบระบบ ในขนตอนท 2 เมอมการเรยกใช InputFloat อกครงหนง จะมการจองพนทในหนวยความจ าขนใหม โดยมตวแปร x เชนเดยวกน แตเปนตวแปรคนละตวกบขนตอนท 1 และมการท างานเหมอนขนตอนท 1 เมอมการสงใหค านวณคาในขนตอนท 3 ดวยฟงกชน SumFloat ( ) จะมกาารจองพนทใหกบตวแปร x และ y และก าหนดคา a1 ใหกบ x และก าหนด a2 ใหกบ y ฟงกชนนจะบวกคาใน x กบ y แลวคนคาผลลพธการค านวณใหกบตวแปร sumVal ในขนตอนสดทายเปนการแสดงผลลพธดวยฟงกชน PrintSum ( ) จะมการจองพนทใหกบตวแปร x เชนเดยวกน และก าหนดคาของ sumVal ใหกบตวแปร x และแสดงคานน จะเหนวาตวแปร x ทประกาศในแตละขนตอนจะท างานอยภายในฟงกชนทมการประกาศคาเทานน และใชพนท ในการเกบขอมล คนละสวนกบขอบเขตการท างานของตวแปรแตละตวจะก าหนดอยภายในบลอกของค าสงภายในเครองหมายปกกา ( { } ) หรอการประกาศในชวงของการประกาศฟงกชน เรยกตวแปรเหลานวา ตวแปรเฉพาะท (Local Variable) นอกจากนสามารถประกาศตวแปรไวทภายนอกฟงกชนบรเวณสวนเรมของโปรแกรมจะเรยกวา ตวแปร

Page 11: 5 (Function) - RMUTI · 1 บทที่ 5 ฟังก์ชัน (Function) การเขียนโปรแกรมทั้งหมดภายในฟังก์ชันเดียวหากเป็นโปรแกรมขนาดใหญ่

11

สวนกลาง (Global Variable) ซงเปนตวแปรทสามารถเรยกใชทต าแหนงใด ๆ ในโปรแกรมกได ยกเวนในกรณทมการประกาศตวแปรทมชอเดยวกบตวแปรสวนกลางภายในบลอกหรอฟงกชน แสดงดงตวอยางท 5.4 ตวอยางท 5.4 แสดงการท างานของโปรแกรมในลกษณะทมตวแปรสวนกลาง แสดงขอบเขตการใชงานของตว แปรภายในโปรแกรม การท างานของตวแปรสวนกลาง x เรมตนมการก าหนดคาในฟงกชน main ( ) ใหตวแปรสวนกลาง x มคา 10 เมอ มการเรยกฟงกชน func1 ( ) ตวแปร x ภายในฟงกชนนเปนตวแปรตวเดยวกบตวแปรสวนกลาง x เมอมการเพมคาขน 10 คาของตวแปรสวนกลางจงเปลยนเปน 20 เมอมการเรยกใชฟงกชน func2 ( ) โดยสงตวแปรสวนกลาง x เปนอารกวเมนตใหกบฟงกชน func2 ( ) จะมการจองพนทใหกบตวแปร x ซงเปนตวแปรเฉพาะทใชไดเฉพาะภายในฟงกชน func2 ( ) เทานน โดยมการก าหนดใหตวแปร

#include <stdio.h> int x; void func1 ( ) { x = x + 10; printf ( “func1 -> x : %d\n”, x ); /* x is 20 */ } void func2 ( int x ) { x = x + 10; printf ( “func2 -> x : %d\n”, x ); /* x is 30 */ } void func3 ( ) { int x=0; x = x + 10; printf ( “func3 -> x : %d\n”, x ); /* x is 10 */ }

void main ( ) { x = 10; printf ( “main (start) -> x : %d\n”, x ); /* x is 10 */ func1 ( ); printf ( “main (after func1) -> x : %d\n”, x ); /* x is 20 */ func2 ( x ); printf ( “main (after func2) -> x : %d\n”, x); /* x is 20 */ func3 ( ); printf ( “main (after func3) -> x : %d\n”, x); /* x is 20 */ }

ผลการท างานของโปรแกรม main (start) -> x : 10 func1 -> x : 20 main (after func1) -> x : 20 func2 -> x : 30 main (after func2) -> x : 20 func3 -> x : 10 main (after func3) -> x : 20

Page 12: 5 (Function) - RMUTI · 1 บทที่ 5 ฟังก์ชัน (Function) การเขียนโปรแกรมทั้งหมดภายในฟังก์ชันเดียวหากเป็นโปรแกรมขนาดใหญ่

12

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