เรื่อง ฟังก์ชัน
DESCRIPTION
ÂTRANSCRIPT
เรอง ฟงกชน
ฟงกชน1 ความหมายของฟงกชน
ฟงกชน หมายถง โปรแกรมยอยทผเขยนโปรแกรมเขยนขน ซงเกดจากการแบงโปรแกรมใหญใหมขนาดเลกลง เพอใหงายตอการตรวจสอบ แกไข หรอหาขอผดพลาด ไดงายขน โดยแตละฟงกชนจะมหนาทการทำางานทแตกตางกน นอกจากนน ฟงกชนยงสามารถเรยกใชไดหลายๆ ครง โดยไมจำาเปนตองเขยนฟงกชนใหม
2 ประเภทของฟงกชน
ในการเขยนโปรแกรมภาษาซ มการแบงประเภทของฟงกชนตามลกษณะการสรางฟงกชนได 2 ประเภท คอ
2.1 ฟงกชนมาตรฐาน 2.2 ฟงกชนทสรางขน2.1 ฟงกชนมาตรฐาน
หมายถง ฟงกชนทภาษาซใหมาพรอมโปรแกรม ซงผเขยนโปรแกรมสามารถ เรยกใชไดทนท โดยไมจำาเปนตองสรางฟงกชนขนมาใชงาน ทำาใหเกดความสะดวก รวดเรวมากขน ตวอยางของฟงกชนมาตรฐาน เชน clrscr( ), printf( ), scanf( ), getch( ), getchar( ), gets( ) เปนตน
2.2 ฟงกชนทสรางขน หมายถง ฟงกชนทผเขยนโปรแกรมสรางขน เพอใหตรงกบ
ความตองการในการใชงาน ตวอยางของฟงกชนทสรางขน เชน ฟงกชนคำานวณเงนเดอน ฟงกชนคำานวณเกรดนกเรยน ฟงกชนหาพนทวงกลม เปนตน โดยฟงกชนทสรางขนอาจจะมการสงคากลบไปยงคำาสงหรอฟงกชนทเรยกใช หรอไมสงคากลบกได ขนอยกบความเหมาะสมในการใชงาน หากตองการสงคากลบไปยงคำาสงหรอฟงกชนทเรยกใช จะสงคากลบไดเพยงคาเดยวเทานน
ฟงกชนทสรางขนมสวนประกอบคลายกบสวนประกอบของโปรแกรม โดยฟงกชนทสรางขน มสวนประกอบทสำาคญ 2 สวน ดงน
8.3.1 สวนหวของฟงกชน
8.3.2 สวนฟงกชนหลก
8.3.1 สวนหวของฟงกชน
สวนหวของฟงกชน หมายถง สวนทอยตอนบนสดของฟงกชน ประกอบดวยชนดของขอมลทสงกลบ ชอฟงกชน และอารกวเมนตโดยรปแบบของฟงกชนทสรางขนเปนดงน
ชนดของขอมลทสงกลบ ชอฟงกชน(ชนดของขอมล อารกวเมนต 1,
ชนดของขอมล อารกวเมนต 2,
ชนดของขอมล อารกวเมนต 3)
ภาพท 8.1 รปแบบของฟงกชนทสรางขน
จากภาพท 8.1 อธบายรปแบบของฟงกชนทสรางขนไดดงน
ชนดของขอมลทสงกลบ
หมายถง ชนดของขอมลทไดจากการประมวลผลของฟงกชน ทตองการสงกลบไปยงคำาสงหรอฟงกชนทเรยกใช โดยชนดขอมลทสงกลบมชนดเดยวกบชนดขอมลของภาษาซ หากไมตองการสงคาขอมลกลบจะใชคำาวา void นำาหนาฟงกชน
ชอฟงกชน หมายถง ชอทตงขนตามกฎเกณฑการตงชอของภาษาซ
ชนดของขอมล หมายถง ชนดขอมลของโปรแกรมภาษาซ เพอบงบอก
ชนดของอารกวเมนตแตละอารกวเมนต
อารกวเมนต หมายถง ชนดขอมลของโปรแกรมภาษาซ เพอบงบอกชนดของอารกวเมนตแตละอารกวเมนต อารกวเมนต เปน int ชนดของอารกวเมนตจะตองเปน int ดวย หากมมากกวา 1 อารกวเมนตจะตองคนแตละอารกวเมนตดวยเครองหมายคอมมา (,) หากไมมการรบคาขอมลเขามาใชในฟงกชน จะไมมอารกวเมนตไวคอยรบคา
8.3.2 สวนฟงกชนหลก
สวนฟงกชนหลก หมายถง สวนทอยถดจากสวนหวของฟงกชน เปนสวนทใชสำาหรบเขยนคำาสงตางๆ เพอใหฟงกชนทำางาน โดยรปแบบของสวนฟงกชนหลก เปนดงน
1 {
2 คำาสงท 1;
3 คำาสงท 2;
4 คำาสงท n;
5 return คาท
ตองการสงกลบ;
6 }
ภาพท 8.2 รปแบบของสวนฟงกชนหลก
จากภาพท 8.2 อธบายรปแบบของสวนฟงกชนหลกของฟงกชน ไดดงน
บรรทดท 1,2,3,4 หมายถง คำาสงท 1, คำาสงท 2, .....คำาสงท n ซงเปนคำาสงทสงใหฟงกชนทำางาน ซงแตละคำาสงจะตองจบดวยเครองหมายเซมโคลอน (;)
บรรทดท 5 หมายถง คาของฟงกชนทตองการสงกลบไปยงคำาสงหรอฟงกชนทเรยกใช โดยคาทตองการสงกลบจะมเพยงคาเดยวเทานน คาทตองการสงกลบตองนำาหนาดวย return
ตวอยางการใชฟงกชนทสรางขน มดงน
ตวอยางท 8.1 ฟงกชนแสดงรายชอนกเรยนออกทางจอภาพ
1 void showname() 2 { 3 printf(”Miss Thanawan Kiriya”);
4 printf(”end of function”); 5 }
จากตวอยางท 8.1 อธบายการทำางานของฟงกชนไดดงน
บรรทดท 1 สวนหวของฟงกชน ประกอบดวย
void หมายถง ไมมการสงคาของฟงกชนกลบ
showname() หมายถง ชอฟงกชน showname() โดยไมมการรบคาขอมลเขามาใชในฟงกชน ซงสงเกตจากเครองหมาย () (วงเลบ) หลงชอฟงกชนจะวางเปลาหรอใสคำาวา void ในวงเลบแทนได
บรรทดท 2 สญลกษณบอกจดเรมตนของฟงกชน
บรรทดท 3 แสดงคำาวา Miss Thanawan Kiriya ออกทางจอภาพ
บรรทดท 4 แสดงคำาวา end of function ออกทางจอภาพ
บรรทดท 5 สญลกษณบอกจดสนสดของฟงกชน
ตวอยางท 8.2 ฟงกชนคำานวณหาผลบวกของเลข 2 จำานวน และสงผลบวกของเลข 2 จำานวน กลบไปยงคำาสงหรอฟงกชนทเรยกใช
1 int summation() 2 { 3 int x = 3, y = 10, sum; 4 sum =
x+y; 5 return sum; 6 }
จากตวอยางท 8.2 อธบายการทำางานของฟงกชนไดดงน
บรรทดท 1 สวนหวของฟงกชน ประกอบดวย
int หมายถ ง มการสงคาของฟงกชนกลบ โดยขอมลทสงกลบมชนดเปน int
บรรทดท 3 ประกาศตวแปร x,y และ sum มชนดเปน int โดยกำาหนดใหตวแปร x มคาเทากบ 3 และตวแปร y มคาเทากบ 10
บรรทดท 4 นำาคาตวแปร x บวกดวยคาตวแปร y นำาผลลพธเกบไวในตวแปร sum
บรรทดท 5 สงคาตวแปร sum กลบ
ในการเขยนโปรแกรม ซงโปรแกรมนนอาจจะมเฉพาะฟงกชนหลก หรออาจมทงฟงกชนหลกและฟงกชนยอย มกจะมการใชตวแปรทสำาคญ 2 ชนด คอตวแปรแบบโกลบอล (global ) และตวแปรแบบโลคอล (local) ซงตวแปรทง 2 ชนดน มการประกาศตวแปร เพอใชงานแตกตางกน ดงน
8.4 ตวแปรแบบโกลบอล (global) และตวแปรแบบ
8.4.1 ตวแปรแบบโกลบอล (global) หมายถง ตวแปรทประกาศไวนอกฟงกชน เปน ตวแปรทสามารถใชไดในทกๆ สวนของโปรแกรม โดยสามารถเรยกใชตวแปรชนดนไดทงในสวนของฟงกชนหลกและฟงกชนยอย
8.4.2 ตวแปรแบบโลคอล (local) หมายถง ตวแปรทประกาศไวในสวนของฟงกชน ซงตวแปรชนดนสามารถใช ไดเฉพาะในสวนของฟงกชนทประกาศตวแปรชนดนเทานน หากยกเลกการใชงานฟงกชน ตวแปรชนดนกจะถกยกเลก การใชงานตามฟงกชนไปดวย
การใชงานตวแปรแบบโกลบอล (global) และตวแปรแบบโลคอล (local) แสดงดงตวอยางตอไปน
ตวอยางท 8.3 การใชงานตวแปรแบบโกลบอล (global)
1 #include<stdio.h> 2 #include<conio.h> 3 int x = 5, y = 10, sum; 4 void summation(); 5 main() 6 { 7 printf(”in main() \n”); 8 printf(”x = %d ”,x); 9 printf(”y = %d \n”,y); 10 printf(”in function\n”); 11 summation();
12 } 13 void summation(); 14 { 15 printf(”x = %d ”,x); 16 printf(”y = %d ”,y); 17 sum = x + y; 18 printf(”sum =%d \n”,sum); 19 }
จากตวอยางท 8.3 อธบายการทำางานของโปรแกรมไดดงน
บรรทดท 3 ประกาศตวแปร x, ตวแปร y และตวแปร sum มชนดเปน int เปนตวแปรแบบโกลบอล (global) เนองจากประกาศตวแปรไวในนอกฟงกชน โดยกำาหนดใหตวแปร x มคาเทากบ 5 และตวแปร y มคาเทากบ 10
บรรทดท 4 ประกาศโปรโตไทปของฟงกชน summation()
บรรทดท 5 คำาบงคบ main() บอกใหทราบถงสวนของฟงกชนหลก
บรรทดท 6 บอกจดเรมตนของฟงกชนหลก
บรรทดท 7 แสดงคำาวา in main ออกทางจอภาพ
บรรทดท 8 แสดงคำาวา x = ตามดวยคาตวแปร x โดยตวแปร x มชนดเปน int จงใชคกบ %d
บรรทดท 9 แสดงคำาวา y = ตามดวยคาตวแปร y โดยตวแปร y มชนดเปน int จงใชคกบ %d
บรรทดท 10 แสดงคำาวา in function ออกทางจอภาพ
บรรทดท 11 เรยกใชฟงกชน summation()
บรรทดท 12 บอกจดสนสดของฟงกชนหลก
บรรทดท 13 สวนหวของฟงกชน summation() โดยฟงกชนนไมมการสงคากลบ จงใชคำาวา void นำาหนา
บรรทดท 14 บอกจดเรมตนของฟงกชน summation()
บรรทดท 15 แสดงคำาวา x = ตามดวยคาตวแปร x โดยตวแปร x มชนดเปน int จงใชคกบ %d
บรรทดท 16 แสดงคำาวา y = ตามดวยคาตวแปร y โดยตวแปร y มชนดเปน int จงใชคกบ %d
บรรทดท 17 นำาคาตวแปร x บวกดวยคาตวแปร y นำาผลลพธเกบไวในตวแปร sum
บรรทดท 18 แสดงคำาวา sum = ตามดวยคาตวแปร sum โดยตวแปร sum มชนดเปน int จงใชคกบ %d
จากตวอยางท 8.3 โปรแกรมจะเรยกใชฟงกชน summation() โดยในฟงกชน summation() ใหแสดงคาตวแปร x ตวแปร y และตวแปร sum โดยตวแปร sum เกดจากผลบวกของตวแปร x และตวแปร y ซงตวแปรทง 3 ตว ไดประกาศไวนอกฟงกชน จงมชนดของตว
แปรเปนแบบโกลบอล (Global) ทำาใหฟงกชน summation() สามารถเรยกใชตวแปร x และตวแปร y ได ทำานองเดยวกนกบฟงกชนหลก (main()) กสามารถเรยกใชตวแปร x และตวแปร y ไดเชนเดยวกน
จากตวอยางท 8.3 แสดงผลการรนโปรแกรมไดดงน
ภาพท 8.3 ผลการรนโปรแกรมการใชงานตวแปรแบบโกลบอล (global)
จากภาพท 8.3 จะเหนวาคาตวแปร x และคาตวแปร y ทงในฟงกชนหลกและฟงกชนยอยมคาเทากน เนองจากตวแปร x และตวแปร y เปนตวแปรแบบโกลบอล (global)
ตวอยางท 8.4 การใชงานตวแปรแบบโลคอล (local)
1. #include<stdio.h> 2. #include<conio.h> 3. void subprogram(); 4. main()(){ 5. clrscr(); 6. int x = 5, y = 10;
7. printf(“in main() \n”); 8 printf(“x = %d\n”,x);9. printf(“y = %d\n”,y); 10. subprogram(); 11. getch() 12. } 13. void subprogram() 14. { 15. int x = 5, y = 10; 16. printf(“in function \n”); 17. printf(“x = %d ”,x); 18. printf(“y = %d ”,y); 19. }
จากตวอยางท 8.4 อธบายการทำางานของโปรแกรมไดดงน
บรรทดท 6 ประกาศตวแปร x และตวแปร y มชนดเปน int โดยกำาหนดใหตวแปร x มคาเทากบ 5 และตวแปร y มคาเทากบ 10
บรรทดท 7 แสดงคำาวา in main ออกทางจอภาพ
บรรทดท 8 แสดงคำาวา x = ตามดวยคาตวแปร x โดยตวแปร x มชนดเปน int จงใชคกบ %d
บรรทดท 9 แสดงคำาวา y = ตามดวยคาตวแปร y โดยตวแปร y มชนดเปน int จงใชคกบ %d
บรรทดท 10 เรยกใชฟงกชน subprogram()
บรรทดท 13 สวนหวของฟงกชน subprogram() โดยฟงกชนนไมมการสงคากลบ จงใชคำาวา void นำาหนา
บรรทดท 15 ประกาศตวแปร x และตวแปร y มชนดเปน int โดยกำาหนดใหตวแปร x มคาเทากบ 5 และตวแปร y มคาเทากบ 10
บรรทดท 16 แสดงคำาวา in function ออกทางจอภาพ
บรรทดท 17 แสดงคำาวา x = ตามดวยคาตวแปร x โดยตวแปร x มชนดเปน int จงใชคกบ %d
บรรทดท 18 แสดงคำาวา y = ตามดวยคาตวแปร y โดยตวแปร y มชนดเปน int จงใชคกบ %d
จากตวอยางท 8.4 แสดงผลการรนโปรแกรมไดดงน
ภาพท 8.4 ผลการรนโปรแกรมการใชงานตวแปรแบบโลคอล (local)
จากภาพท 8.4 จะเหนวาผลการรนโปรแกรมมคาเหมอนกนกบภาพท 8.3 แตโปรแกรมในตวอยางท 8.4 มการประกาศตวแปร x และตว
แปร y ในฟงกชน main() และฟงกชน subprogram() จากนนกำาหนดคาใหตวแปร x และตวแปร y มคาเทากนทงในฟงกชน main() และฟงกชน subprogram() โดยคาตวแปร x เทากบ 5 และคาตวแปร y เทากบ 10 แตตวแปร x และตวแปร y ทงในฟงกชน main( ) และในฟงกชน subprogram() เปนตวแปรแบบโลคอล (local) เนองจากตวแปร x และตวแปร y ทประกาศในแตละฟงกชน จะเปนทรจกเฉพาะในฟงกชนทประกาศตวแปรนเทานน ไมสามารถนำาไปใชในฟงกชนอนๆ ทไมไดประกาศตวแปรนไวได
ในการเขยนโปรแกรมทประกอบดวยฟงกชน สงทจะขาดไมไดคอการประกาศ โปรโตไทปของฟงกชนเพอใหโปรแกรมรจกฟงกชนทเขยนขน ดงนนโปรโตไทปของฟงกชนจงหมายถง ตนแบบของฟงกชนนนเอง
ในการเขยนฟงกชนยอยจะมรปแบบเหมอนฟงกชนหลก สวนการวางตำาแหนงของฟงกชนสามารถวางไวเหนอฟงกชน main() หรอวางไวใตฟงกชน main() กได แตถาหากวางไว
ใตฟงกชน main() จะตองประกาศโปรโตไทปของฟงกชนใหกบโปรแกรมดวยการประกาศโปรโตไทป มจดประสงคเพอประกาศใหโปรแกรมภาษาซ รจกและสามารถใชฟงกชนทสรางขนได การประกาศโปรโตไทปของฟงกชน ทำาไดโดยการนำาสวนหวของฟงกชนมาเขยนไวกอนเขยนฟงกชน main() นนเอง
ตวอยางตอไปนเปนการเขยนโปรแกรมทประกอบไปดวยฟงกชนยอย และการประกาศโปรโตไทปของฟงกชน
1. การเขยนโปรแกรมทประกอบดวยฟงกชน โดยไมประกาศโปรโตไทปของฟงกชน
ตวอยางท 8.5 การเขยนโปรแกรมเพอแสดงชอของนกเรยนออกทางจอภาพ โดยใหแสดง รายชอนกเรยนในสวนของฟงกชน
1. #include<stdio.h> 2. #include<conio.h>
8.5 โปรโตไทปของฟงกชน
3. void displayname() 4. { 5. printf(“My name is Thanawan Kiriya”);
7. main() 8. { 9. clrscr(); 10. displayname(); 11. getch() 12. }
จากตวอยางท 8.5 อธบายการทำางานของโปรแกรมไดดงน
บรรทดท 3 สวนหวของฟงกชน displayname() โดยฟงกชนนไมมการสงคากลบ จงใชคำาวา void นำาหนา
บรรทดท 5 แสดงคำาวา My name is Thanawan Kiriya ออกทางจอภาพ
บรรทดท 7 คำาบงคบ main() บอกใหทราบถงสวนของฟงกชนหลก
บรรทดท 10 เรยกใชฟงกชน displayname()
จากตวอยางท 8.5 แสดงผลการรนโปรแกรมไดดงน
ภาพท 8.5 ผลการรนโปรแกรมเพอแสดงชอของนกเรยนออกทางจอภาพ โดยใหแสดงรายชอนกเรยนในสวนของฟงกชน
จากโปรแกรมท 8.5 จะเหนวาในการเขยนโปรแกรมทมฟงกชนยอยดงกลาว มการประกาศฟงกชน displayname() ไวเหนอฟงกชน main() ดงนนจงไมจำาเปนตองประกาศโปรโตไทปของฟงกชน เพอใหโปรแกรมรบทราบ
2. การเขยนโปรแกรมทประกอบดวยฟงกชน โดยมการประกาศโปรโตไทปของฟงกชน
ตวอยางท 8.6 การเขยนโปรแกรมเพอแสดงชอของนกเรยนออกทางจอภาพ โดยใหแสดง รายชอนกเรยนในสวนของฟงกชน
1. #include<stdio.h> 2. #include<conio.h>
3. void displayname(); 4. main() 5. { 6. clrscr(); 7. displayname(); 8. getch() 9. } 10. void displayname() 11. { 12. printf(“My name is Thanawan Kiriya”); 13. }
จากตวอยางท 8.6 อธบายการทำางานของโปรแกรมไดดงน
บรรทดท 3 ประกาศโปรโตไทปใหกบฟงกชน displayname()
บรรทดท 7 เรยกใชฟงกชน displayname()
บรรทดท 10 สวนหวของฟงกชน displayname() โดยฟงกชนนไมมการสงคากลบ จงใชคำาวา void นำาหนา
บรรทดท 12 แสดงคำาวา My name is Thanawan Kiriya ออกทางจอภาพ
จากตวอยางท 8.6 แสดงผลการรนโปรแกรมไดดงน
ภาพท 8.6 ผลการรนโปรแกรมเพอแสดงชอของนกเรยนออกทางจอภาพ โดยใหแสดงรายชอนกเรยนในสวนของฟงกชน
จากภาพท 8.6 จะเหนวาผลการรนโปรแกรมของตวอยางท 8.6 เหมอนผลการรนโปรแกรมในตวอยางท 8.5 แตการเขยนโปรแกรมในตวอยางท 8.6 เปนการเขยนโปรแกรมทประกอบดวยฟงกชน displayname() และมการประกาศฟงกชนดงกลาวไวใตฟงกชน main() ดงนน จงจำาเปนตองประกาศโปรโตไทปของฟงกชน displayname() ไวเหนอฟงกชน main() เพอใหโปรแกรมรบทราบ
ในการสงผานคาระหวางฟงกชน ไมวาจะเปนการสงผานคาระหวางฟงกชนหลกไปยงฟงกชนยอยหรอสงผานจากฟงกชนยอยไปยงฟงกชนยอย มรปแบบการสงผานคาระหวางฟงกชน 4 รปแบบ คอ
8.6.1 ฟงกชนทไมมการสงผานคาไปยงฟงกชน
8.6 รปแบบการสงผานคาระหวางฟงกชน
8.6.2 ฟงกชนทมการสงผานคาไปยงฟงกชนทางเดยว 8.6.3 ฟงกชนทมการสงคากลบทางเดยว 8.6.4 ฟงกชนทมการสงผานคาไปและกลบ
8.6.1 ฟงกชนทไมมการสงผานคาไปยงฟงกชน ฟงกชนทไมมการสงผานคาไปยงฟงกชน หมายถง การเขยน
โปรแกรมทมการเรยกใชฟงกชน ซงอาจจะเรยกจากฟงกชนหลกไปยงฟงกชนยอยหรอเรยกจากฟงกชนยอยไปยงฟงกชนยอย โดยไมมการสงผานคาไปยงฟงกชนทเรยกใช การเรยกใชฟงกชนโดยไมมการสงผานคาไปยงฟงกชน แสดงตวอยางดงตอไปน
ตวอยางท 8.7 การเขยนโปรแกรมเพอคำานวณหาพนทสามเหลยม โดยใหทำาการคำานวณหาพนทสามเหลยมในฟงกชน
1. #include<stdio.h> 2. #include<conio.h> 3. void trianglearea(); 4. main() 5. { 6. clrscr(); 7. trianglearea(); 8. getch(); 9. } 10. void trianglearea() 11. { 12. int base, high; 13. float area; 14. printf(“enter triangle’s base : ”); 15. scanf(“%d”,&base); 16. printf(“enter triangle’s high : ”); 17. scanf(“%d”,&high); 18. area = 0.5*base*high; 19. printf(“triangle area = %.2f”,
area); 20. }
จากตวอยางท 8.7 อธบายการทำางานของโปรแกรมไดดงน
บรรทดท 3 ประกาศโปรโตไทปใหกบฟงกชน trianglearea() บรรทดท 7 เรยกใชงานฟงกชน trianglearea() บรรทดท 10 สวนหวของฟงกชน trianglearea() โดย
ฟงกชนนไมมการสงคากลบ จงใชคำาวา void นำาหนา บรรทดท 12 ประกาศตวแปร base และตวแปร high มชนด
เปน int บรรทดท 13 ประกาศตวแปร area มชนดเปน float บรรทดท 14 แสดงคำาวา enter triangle’s base : ออก
ทางจอภาพ บรรทดท 15 รบคาตวแปร base ผานทางแปนพมพ โดย
ตวแปร base มชนดเปน int จงใชคกบ %d บรรทดท 16 แสดงคำาวา enter triangle’s high : ออก
ทางจอภาพ บรรทดท 17 รบคาตวแปร high ผานทางแปนพมพ โดย
ตวแปร high มชนดเปน int จงใชคกบ %d บรรทดท 18 คำานวณหาพนทสามเหลยม โดยคำานวณจาก
0.5*base*high นำาผลลพธเกบไวในตวแปร area บรรทดท 19 แสดงคำาวา triangle area = ตามดวยคาตว
แปร area โดยตวแปร area มชนดเปน float จงใชคกบ %d โดยใหแสดงทศนยม 2 ตำาแหนง
จากตวอยางท 8.7 แสดงผลการรนโปรแกรมไดดงน
ภาพท 8.7 ผลการรนโปรแกรมเพอคำานวณหาพนทสามเหลยม โดยใหทำาการคำานวณหาพนทสามเหลยมในฟงกชน
จากโปรแกรมท 8.7 จะเหนวา เมอมการเรยกใชงานฟงกชน trianglearea() ในบรรทดท 7 จะไมมการสงคาใดๆ ไปยงฟงกชน trianglearea() โดยสงเกตจากภายในเครองหมายวงเลบ ()
ทอยหลงคำาวา trianglearea() จะไมมตวแปรหรอขอมลใดๆ ภายในวงเลบ และขอสงเกตอกประการหนง ทสวนหวของฟงกชน trianglearea() ในบรรทดท 10 ภายในวงเลบ () หลงคำาวา trianglearea() จะไมมตวแปรใดๆ เชนกน นนหมายถง ฟงกชนนเปนฟงกชนทไมมการรบคาใดๆ มาใชในฟงกชนนนเอง
8.6.2 ฟงกชนทมการสงผานคาไปยงฟงกชนทางเดยว ฟงกชนทมการสงผานคาไปยงฟงกชนทางเดยว หมายถง
การเขยนโปรแกรมทมการเรยกใชฟงกชนยอย โดยมการสงผานคาจากฟงกชนหลกหรอฟงกชนยอยไปยงฟงกชนทเรยกใช โดยเมอประมวลผลขอมลในฟงกชนยอยเรยบรอยแลว จะไมมการสงผานคาทประมวลผลแลวกลบมายงฟงกชนหลก หรอฟงกชนทเรยกใชอกตอไปนเปนตวอยางการเรยกใชฟงกชน โดยมการสงผานคาไปยงฟงกชนทางเดยวตวอยางท 8.8 การเขยนโปรแกรมเพอรบคาความยาวของฐานและความสงของสามเหลยม ในฟงกชนหลก จากนนสงคาความยาวของฐานและความสงไปคำานวณหา พนทสามเหลยมในฟงกชน
1. #include<stdio.h> 2. #include<conio.h> 3. void trianglearea(float b, float h); 4. main() 5. { 6. clrscr(); 7. float base, high; 8. printf(“enter base : ”);
9. scanf(“%f”,&base); 10. printf(“enter high : ”); 11. scanf(“%f”,&high); 12. trianglearea(base, high); 13. getch(); 14. } 15. void trianglearea(float b, float h) 16. { 17. float area; 18. area = 0.5*b*h; 19. printf(“area of triangle = %.2f”,area); 20. }
จากตวอยางท 8.8 อธบายการทำางานของโปรแกรมไดดงน บรรทดท 3 ประกาศโปรโตไทปใหกบฟงกชน trianglearea()
โดยมอารกวเมนตททำาหนาทรบคาขอมล 2 คา คอ b และ h ซงมชนดเปน float
บรรทดท 7 ประกาศตวแปร base และ high มชนดเปน float
บรรทดท 8 แสดงคำาวา enter base : ออกทางจอภาพ
บรรทดท 9 รบคาตวแปร base ผานทางแปนพมพ โดยตวแปร base มชนดเปน float จงใชคกบ %f
บรรทดท 10 แสดงคำาวา enter high : ออกทางจอภาพ บรรทดท 11 รบคาตวแปร high ผานทางแปนพมพ โดย
ตวแปร high มชนดเปน float จงใชคกบ %f บรรทดท 12 เรยกใชฟงกชน trianglearea() โดยสงคาตว
แปร base และ high ไปยงฟงกชน trianglearea() บรรทดท 15 สวนหวของฟงกชน trianglearea() โดย
ฟงกชนนมอารกวเมนตททำาหนาทรบคา 2 คา คอ b และ h มชนดขอมลเปน float โดยอารกวเมนต b รบคาจากตวแปร base สวนอารกวเมนต h รบคาจากตวแปร high
บรรทดท 17 ประกาศตวแปร area ในฟงกชน trianglearea() มชนดเปน float
บรรทดท 18 คำานวณหาพนทสามเหลยม โดยคำานวณจาก 0 .5*base*high ผลลพธเกบไวในตวแปร area
บรรทดท 19 แสดงคำาวา area of triangle = ตามดวยคาตวแปร area โดยตวแปร area มชนดเปน float จงใชคกบ %f โดยใหแสดงทศนยม 2 ตำาแหนง
จากตวอยางท 8.8 แสดงผลการรนโปรแกรมไดดงน
ภาพท 8.8 ผลการรนโปรแกรมเพอรบคาความยาวของฐานและความสงของสามเหลยม ในฟงกชนหลก จากนนสงคาความยาวของฐานและความสงไปคำานวณหาพนทสามเหลยมในฟงกชน
จากโปรแกรมท 8.8 จะเหนวา เมอมการเรยกใชฟงกชน trianglearea() ในบรรทดท 12 จะมการสงคาตวแปร base และ high ซงแทนความยาวของฐานและความสงของสามเหลยม ไปยงฟงกชน trianglearea() โดยอารกวเมนต b และ h ทำาหนาทรบคาตวแปรจาก base และ high ตามลำาดบและฟงกชน trianglearea() ไมมการสงคาของฟงกชนกลบ จงใชคำาวา void นำาหนาฟงกชน
8.6.3 ฟงกชนทมการสงคากลบทางเดยวฟงกชนทมการสงคากลบทางเดยว หมายถง การเรยกใช
ฟงกชนยอย โดยไมมการสงผานคาจากฟงกชนทเรยกใชไปยงฟงกชนยอยแตเมอฟงกชนยอยทำาการประมวลผลขอมลเรยบรอยแลว จะทำาการสงผานคาฟงกชนยอยกลบไปยงฟงกชนทเรยกใชตอไปนเปนตวอยางการเรยกใชฟงกชนทมการสงคากลบทางเดยว
ตวอยางท 8.9 การเขยนโปรแกรมเพอคำานวณผลบวกของเลขคตงแต 1-10 โดยทำาการ คำานวณในฟงกชน จากนนสงผลบวกทไดจากการคำานวณกลบมาแสดงผล ในฟงกชนหลกหรอฟงกชนทเรยกใชงาน
1. #include<stdio.h> 2. #include<conio.h> 3. int summation(); 4. main() 5. { 6. clrscr(); 7. int sum; 8. sum = summation(); 9. printf(“sum of even no from 1-10 = %d”,
sum); 10. getch(); 11. } 12. int summation() 13. { 14. int i, tot = 0; 15. i = 2;
16. while(i<=10) 17. { 18. tot = tot + i; 19. i += 2; 20. } 21. return tot; 22. }
จากตวอยางท 8.9 อธบายการทำางานของโปรแกรมไดดงน บรรทดท 3 ประกาศโปรโตไทปใหกบฟงกชน summation()
โดยฟงกชนสงคากลบมชนดเปน int บรรทดท 7 ประกาศตวแปร sum มชนดเปน int บรรทดท 8 เรยกใชฟงกชน summation() และนำาผลลพธทได
จากการเรยกใชฟงกชน เกบไวในตวแปร sum บรรทดท 9 แสดงคำาวา sum of even no from 1-10
= ตามดวยคาตวแปร sum โดยตวแปร sum มชนดเปน int จงใชคกบ %d
บรรทดท 12 สวนหวของฟงกชน summation() โดยฟงกชนไมมการรบคาอารกวเมนตเขามาในฟงกชน แตมการสงคาฟงกชนกลบ โดยสงคาฟงกชนกลบมชนดเปน int
บรรทดท 14 ประกาศตวแปร I และตวแปร tot มชนดเปน int ซงเปนตวแปรทถกใชในฟงกชน summation() และกำาหนดใหตวแปร tot มคาเทากบ 0
บรรทดท 15 กำาหนดใหตวแปร i มคาเทากบ 2 บรรทดท 16 วนรอบทำาซำาคำาสงในบรรทดท 18-19 ตราบใดท
คาตวแปร I นอยกวาหรอเทากบ 10 หากคาตวแปร I มคามากกวา 10 ใหทำาคำาสงในบรรทดท 21
บรรทดท 18 คำานวณคาตวแปร tot โดยคำานวณจากการนำาคาตวแปร tot บวกดวยคาตวแปร i นำาผลลพธเกบไวในตวแปร tot
บรรทดท 19 เพมคาตวแปร i อก 2 บรรทดท 21 สงคาตวแปร tot กลบไปยงคำาสงทเรยกใช
ฟงกชนโดยใชคำาวา return ตามดวยคาตวแปร tot
จากตวอยางท 8.9 แสดงผลการรนโปรแกรมไดดงน
ภาพท 8.9 ผลการรนโปรแกรมเพอคำานวณผลบวกของเลขคตงแต 1-10 โดยทำาการคำานวณใน ฟงกชน จากนนสงผลบวกทไดจากการคำานวณกลบมาแสดงผลในฟงกชนหลกหรอฟงกชนทเรยกใชงาน
8.6.4 ฟงกชนทมการสงผานคาไปและกลบฟงกชนทมการสงผานคาไปและกลบ หมายถง การเรยกใช
ฟงกชนยอย โดยมการสงผานคาจากฟงกชนหลกหรอฟงกชนยอยไปยงฟงกชนทเรยกใช เมอฟงกชนยอยมการประมวลผลขอมลเรยบรอยแลว จะมการสงผานคาทประมวลผลแลว กลบไปยงฟงกชนหลกหรอฟงกชนทเรยกใชตอไปนเปนตวอยางการเรยกใชฟงกชน โดยการสงผานคาไปและกลบ
ตวอยางท 8.10 การเขยนโปรแกรมเพอหาคาเลขทมากทสดของเลขสองจำานวน ทรบผานทางแปนพมพในฟงกชนหลก และนำาเลขทง 2 จำานวนสงไปหาคาทมากทสดในฟงกชน จากนนสงผลลพธทไดกลบมาแสดงคาทมากทสดในฟงกชนหลก
1. #include<stdio.h> 2. #include<conio.h> 3. int maximum(int n1, int n2); 4. main() 5. {
. int num1, num2, max; 8. printf(“enter number1 : ”); 9. scanf(“%d”,&num1); 10. printf(“enter number2 : ”); 11. scanf(“%d”,&num2); 12. max = maximum(num1, num2); 13. printf(“maximum number is %d”,
max); 14. getch(); 15. } 16. int maximum(int n1, int n2) 17. { 18. int maxnumber; 19. if(n1 > n2) 20. maxnumber = n1; 21. else 22. maxnumber = n2; 23. return maxnumber; 24. }
จากตวอยางท 8.10 อธบายการทำางานของโปรแกรมไดดงน บรรทดท 3 ประกาศโปรโตไทปใหกบฟงกชน maximum()
โดยฟงกชนมอารกวเมนต 2 ตวคอ n1 และ n2 ทง n1 และ n2 มชนดเปน int และมการสงคาของฟงกชนกลบมชนดเปน int
บรรทดท 7 ประกาศตวแปร num1, num2 และ max มชนดเปน int
บรรทดท 8 แสดงคำาวา enter number1 : ออกทางจอภาพ บรรทดท 9 รบคาตวแปร num1 ผานทางแปนพมพ โดย
ตวแปร num1 มชนดเปน int จงใชคกบ %d บรรทดท 10 แสดงคำาวา enter number2 : ออกทาง
จอภาพ
บรรทดท 11 รบคาตวแป ร num2 ผานทางแปนพมพ โดยตวแปร num2 มชนดเปน int จงใชคกบ %d
บรรทดท 12 เรยกใชฟงกชน maximum() โดยสงคาตวแปร num1 และคาตวแปร num2 ไปหาคาสงสด และนำาผลลพธทไดจากการเรยกใชฟงกชน เกบไวในตวแปร max
บรรทดท 13 แสดงคำาวา maximum number is ตามดวยคาตวแปร max โดยตวแปร max มชนดเปน int จงใชคกบ %d
บรรทดท 16 สวนหวของฟงกชน maximum() โดยมอารกวเมนตททำาหนาทรบคา 2 ตว คอ n1 และ n2 มชนดขอมลเปน int โดยอารกวเมนต n1 รบคาจากตวแป ร num1 อารกวเมนต n2 รบคาจากตวแปร num2 และฟงกชนนมการสงคาของฟงกชนกลบมชนดเปน int
บรรทดท 18 ประกาศตวแปร maxnumber มชนดเปน int บรรทดท 19 ทดสอบคาตวแปร n1 และ n2 หากคาตวแปร
n1 มากวาคาตวแปร n2 จรง ใหทำาคำาสงในบรรทดท 20 มฉะนนแลวใหทำาคำาสงในบรรทดท 22
บรรทดท 20 กำาหนดใหตวแปร maxnumber เกบคาตวแปร n1
บรรทดท 22 กำาหนดใหตวแปร maxnumber เกบคาตวแปร n2
บรรทดท 23 สงคาตวแปร maxnumber กลบไปยงคำาสงทเรยกใชฟงกชนโดยใช return ตามดวยคาตวแปร maxnumber
จากตวอยางท 8.10 แสดงผลการรนโปรแกรมไดดงน
ภาพท 8.10 ผลการรนโปรแกรมเพอหาคาเลขทมากทสดของเลขสองจำานวน ทรบผานทางแปนพมพในฟงกชนหลก และนำาเลขทง 2 จำานวนสงไปหาคาทมากทสดใน ฟงกชน จากนนสงผลลพธทไดกลบมาแสดง
จากโปรแกรมท 8.10 จะเหนวาโปรแกรมมการเรยกใชฟงกชน maximum() ในฟงกชนหลกโดยสงคาตวแปร num1 และตวแปร num2 ไปใหฟงกชน จากนนฟงกชน maximum() หาคาทมากทสด ของเลข 2 จำานวน และสงคาของเลขทมากทสด ซงเกบในตวแปร maxnumber กลบไปยงคำาสงทเรยกใชฟงกชน โดยใช return นำาหนา และทสวนหวฟงกชนทมการสงคากลบ ตองใช int นำาหนา เนองจากฟงกชนสงคากลบมชนดเปน int
จากตวอยางทงหมดทกลาวมา จะเหนวาการเขยนโปรแกรมตางๆ มทงการเรยกใชฟงกชน โดยไมมการสงผานคาตวแปรไปยงฟงกชน การเรยกใชฟงกชน โดยมการสงผานคาตวแปรไปยงฟงกชนอยางเดยวไมมการสงคาของฟงกชนกลบ การเรยกใชฟงกชน โดยมการสงผานคาตวแปรไป
ยงฟงกชน แตไมมการสงคาของฟงกชนกลบ และการเรยกใชฟงกชนโดยมการสงผานคาตวแปรไปยงฟงกชน และมการสงคาของฟงกชนกลบ ตอไปนเปนการประยกตใชฟงกชนทสรางขนเพอใชในการเขยนโปรแกรม แสดงตวอยางดงตอไปน
ตวอยางท 8.11 การเขยนโปรแกรมเพอหาคาเฉลยคะแนนของนกเรยน 10 คน โดยสง คะแนนของนกเรยนทง 10 คน ไปคำานวณหาคาเฉลยในฟงกชนและแสดง คาเฉลยคะแนนของนกเรยนทง 10 คนในฟงกชน
1. #include<stdio.h> 2. #include<conio.h> 3. average(float score[]); 4. main(){ 5. clrscr();
8.7 การประยกตใชฟงกชนทสรางขนใน
6. float score[10]; 7. int index; 8. for(index = 0; index < 10; index++) 9. { 10. printf(“enter student score :”);
11. scanf(“%f”, &score[index]); 12. } 13. average(score); 14. getch(); 15. } 16. average(float score[]) 17. { 18. int i ; 19. float sum = 0, avg_score; 20. for(i = 0; i < 10; i++){ 21. sum = sum + score[i]; 22. } 23. avg_score = sum/10; 24. printf(“average score = %.2f”,
avg_score); 25. }
จากตวอยางท 8.11 อธบายการทำางานของโปรแกรมไดดงน บรรทดท 3 ประกาศโปรโตไทปใหกบฟงกชน average โดย
ฟงกชนมอารกวเมนต 1 ตว คอ score โดย score มชนดเปนอารเรยของ float
บรรทดท 7 ประกาศตวแปร score มชนดเปนอารเรยขนาด 10 ชอง โดยแตละชองเกบขอมลมชนดเปน float
บรรทดท 8 ประกาศตวแปร index มชนดเปน int บรรทดท 9 วนรอบทำาซำาคำาสงในบรรทดท 11-12 ตราบใดท
คาตวแปร index มคาตงแต 0 ถง 9 โดยแตละรอบเพมคาตวแปร index อก 1
บรรทดท 12 รบคะแนนผานทางแปนพมพ เกบไวในตวแปร score ณ ตำาแหนง index
บรรทดท 14 เรยกใชฟงกชน average โดยสงคาตวแปรอารเรย score ไปใชในฟงกชน
บรรทดท 17 สวนหวของฟงกชน average โดยมอารกวเมนตททำาหนาทรบคา 1 ตว คอ score มชนดขอมลเปนอารเรยของ float
บรรทดท 19 ประกาศตวแปร I มชนดเปน int
บรรทดท 20 ประกาศตวแปร sum และ avg_score มชนดขอมลเปน float โดยใหตวแปร sum มคาเทากบ 0
บรรทดท 21 วนรอบทำาซำาคำาสงในบรรทดท 23 ตราบใดทคาตวแปร i มคาตงแต 0 ถง 9 โดยแตละรอบเพมคาตวแปร I อก 1
บรรทดท 23 คำานวณคาตวแปร sum โดยคำานวณจากการนำาคาตวแปร sum บวกดวยคาตวแปรอารเรย score ณ ตำาแหนง i นำาผลลพธเกบไวในตวแปร sum
บรรทดท 25 คำานวณคาเฉลยของคะแนน โดยคำานวณจากการนำาคาตวแปร sum หารดวย 10 นำาผลลพธเกบไวในตวแปร avg_score
บรรทดท 26 แสดงคำาวา average score = ตามดวยคาตวแปร avg_score โดยคาตวแปร avg_score มชนดเปน float จงใชคกบ %f โดยใหแสดงทศนยม 2 ตำาแหนง
จากตวอยางท 8.11 แสดงผลการรนโปรแกรมไดดงน
ภาพท 8.11 ผลการรนโปรแกรมเพอหาคาเฉลยคะแนนของนกเรยน 10 คน โดยสงคะแนนของนกเรยนทง 10 ค น ไปคำานวณหาคาเฉลยในฟงกชนและแสดง คาเฉลยคะแนนของนกเรยนทง 10 คนในฟงกชน
ตวอยางท 8.12 การเขยนโปรแกรมเพอหาคาแฟคทอเรยลจากนนสงคาตวเลขไปคำานวณหาคา แฟคทอเรยลในฟงกชน และสงผลลพธของตวแปร แฟคทอเรยลกลบมา แสดงผลในฟงกชนหลก
1. #include<stdio.h> 2. #include<conio.h> 3. int findfact(int n);
4. main()() 5. { 6. int no, factorial; 7. printf(“enter number for find factorial : ”); 8. scanf(“%d”, &no); 9. factorial = findfact(no); 10. printf(“factorial = %d”, factorial ); 11. getch(); 12. }
21. int findfact(int n) 22 { 23 int index, fact = 1; 24 for(index = 1; index < n; index++) 25 { 26 fact = fact*index; 27 } 28 return fact; 29 }
จากตวอยางท 8.12 อธบายการทำางานของโปรแกรมไดดงน บรรทดท 3 ประกาศโปรโตไทปใหกบฟงกชน findfact() โดยฟงกชนม
อารกวเมนต 1 ตว คอ n โดย n มชนดเปน int และมการสงคาของฟงกชนกลบมชนดเปน int
บรรทดท 6 ประกาศตวแปร no และ factorial มชนดเปน int บรรทดท 7 แสดงคำาวา enter number for find factorial :
ออกทางจอภาพ บรรทดท 8 รบคาตวแปร no ผานทางแปนพมพ โดยตวแปร no มชนดเปน int จงใชคกบ %
บรรทดท 9 เรยกใชฟงกชน findfact() โดยสงคาตวแปร no ไปใหฟงกชนนำาผลลพธทไดจากการเรยกใชฟงกชน เกบไวในตวแปร factorial
บรรทดท 10 แสดงคำาวา factorial = ตามดวยคาตวแปร factorial โดยคาตวแปร factorial มชนดเปน int จงใชคกบ %d
บรรทดท 13 สวนหวของฟงกชน findfact() โดยฟงกชนมอารกวเมนต 1 ตว คอ n มชนดขอมลเปน int ทำาหนาทรบคาจากตวแปร no ฟงกชนมการสงคาของฟงกชนกลบมชนดเปน int
บรรทดท 15 ประกาศตวแปร index และตวแปร fact มชนดเปน int โดยใหตวแปร fact มคาเทากบ 1
บรรทดท 16 วนรอบทำาซำาคำาสงในบรรทดท 18 ตราบใดทคาตวแปร index มคานอยกวาหรอเทากบ 10 โดยแตละรอบใหเพมคาตวแปร index อก 1
บรรทดท 18 คำานวณคาแฟคทอเรยล โดยนำาคาตวแปร fact คณดวยคาตวแปร index นำาผลลพธเกบไวในตวแปร fact
บรรทดท 20 สงคาตวแปร fact กลบไปยงคำาสงทเรยกใชฟงกชน โดยใช return ตามดวยคาตวแปร factorial
จากตวอยางท 8.12 แสดงผลการรนโปรแกรมไดดงน
ภาพท 8.12 ผลการรนโปรแกรมเพอหาคาแฟคทอเรยล จากนนสงคาตวเลขไปคำานวณหาคาแฟคทอเรยลในฟงกชน และสงผลลพธของตวแปร แฟคทอเรยลกลบมาแสดงผลในฟงกชนหลก