!                                          บทที่ 5                                   ฟงกชน (Function)                     ...
!                                                  59♦!สวนประกอบในการสรางฟงกชัน          ฟงกชนทเ่ี ราสรางขนเอง เรยกวา ...
!                                                 60                  int factorial(int number)                           ...
!                                                     61           #include <header file>           #include <header file>...
!                                                   62          จากโครงสรางโปรแกรมทีมการสรางฟงกชน สรุปไดดังนี้       ...
!                                                   63 clrscr(); cout<< "Display 1 line from line() functionn"; line(); //...
!                                                  64cout<<"Number2 : ";cin>>y;}int summation() //return value function{ i...
!                                            65    for(x=1; x<=amount;++x)     cout<<"_";    cout<<n;}         หมายเหตุ จา...
!                                               66    cout<<"Result of   10.0+20.25= "<<addition(120.0,20.25)<<endl;    co...
!                                                   67♦! งกชนแบบไมประกาศ prototype ฟ ั         การสรางฟงกชันในโปรแกร...
!                                                    68♦! ินไลนฟงกชัน (inline function) อ          โปรแกรมที่เรียกใชฟ...
!                                                  69♦! ปแบบการสงอารกวเมนตใหฟงกชน (reference argument) รู         ิ     ...
!                                                   70        รูปแบบการกาหนดและการเรียกใชฟงกชันที่มีการสงอารกิวเมนตแ...
!                                                71        •! ตัวอยางโปรแกรม argument.cpp แสดงการเปรียบเทียบการเรียกใชฟง...
!                                                     72    {        para3++; //change para3 and return valut to arg3     ...
!                                                 73{    cout<< "================================n";}void line(int x) //ov...
!                                                  74 Process : creat and call default argument function line()*/#include ...
!                                                        75                         { int x=50;             //declaration ...
!                                                     76                     { static float total; //declaration static va...
!                                                 77    for(y=1;y<=40;++y) //usy y from automatic or local variable      c...
!                                         78  #include <iostream.h>  #include <conio.h>  //declaration templat function su...
!                                           79♦! บบฝกหัดทายบท แ1. ใหเขียนโปรแกรมสรางฟงกชันเสนกรอบสี่เหลี่ยม โดยกําห...
!                                              80     sum_even(1,10)     คอหาผลรวมของ 2+4+6+8                         ื   ...
Upcoming SlideShare
Loading in …5
×

Lesson5

759 views
703 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
759
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
10
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Lesson5

  1. 1. ! บทที่ 5 ฟงกชน (Function)   ั♦! วามหมายและประโยชนของฟงกชน ค    ั ฟงกชัน (Function) หมายถึง ประโยคคําสั่ง(statements) ชุดหนึ่งซึ่งมีชื่อเรียกใชโดยเฉพาะฟงกชันหนึ่ง ๆ จะทําหนาที่เฉพาะอยางใดอยางหนึ่ง สวนอน ๆ ของโปรแกรมสามารถเรยกสเตตเมนต  ่ื ีชุดนีได โดยการเรียกใช ชื่อฟงกชัน นัน ๆ ใหถูกตองตามรูปแบบที่ฟงกชันนั้น ๆ กําหนดไว ้ ้ ฟงกชันในภาษา C++ มี 2 ประเภท คือ 1. User Defined Function คือ ฟงกชนทผเู ขยนโปรแกรมสรางขนหรอกาหนดขึนเอง ตามรูป   ั ่ี ี  ้ึ ื ํ ้แบบการสรางฟงกชันของ C++ เพือนํามาใชในการเขยนโปรแกรมของตนเอง (จะกลาวถึงรายละเอียด ่  ีตอไป) 2. Standard Function คือ ฟงกชันมาตรฐานที่บริษัทผูสราง Compiler ภาษา C++ ไดสรางรวบรวมไวในคลัง (Library) ผเู ขยนโปรแกรมสามารถเรยกใชไดทนที ไดแก ฟงกชันที่ประกอบอยูใน ี ี   ัheader file ตาง ๆ ขณะเรียกใช ตอง #include ชื่อไฟลที่รวบรวมฟงกชันนั้นไวกอน เชน ฟงกชัน   clrscr() ทาหนาที่ลางจอภาพใหวางและเลื่อน cursor ไปไวที่มุมซายบนของจอภาพ เปนฟงกชันอยูใน ํไฟล conio.h เปนตน ประโยชนฟงกชนในการเขยนโปรแกรมใน C++ มีดังตอไปนี้    ั ี 1. ชวยใหไมตองเขียน statement เดม ๆ ซํากันหลายครั้งในโปรแกรมเดียวกัน ิ ้ 2. ชวยใหสามารถคนหาสวนทผลหรอสวนทตองปรบปรงไดอยางรวดเรว เนืองจากเราทราบวา     ่ี ื  ่ี  ั ุ   ็ ่แตละฟงกชันทาหนาที่อะไร และสรางฟงกชันไวที่สวนใดของโปรแกรม ํ 3. ทาใหโปรแกรมมีขนาดกระทัดรัด ทาความเขาใจไดงายและรวดเร็ว เพราะเขยนแบงเปน ํ ํ ี  ฟงกชนตามงานหรอหนาททตองการเขยน   ั ื  ่ี ่ี  ี 4. เนื่องจากฟงกชันมีการทํางานเปนอสระ สามารถนําฟงกชันที่สรางไวและมีการทางานเปน  ิ ํมาตรฐานแลว เก็บไวใน Header File เพื่อใหเปนคลังคําสั่ง(Library) ของผูใช นําไปใชไดในโปรแกรม   อน ๆ ไดอก ซึงชวยใหเราเขียนโปรแกรมใหมไดรวดเร็วขึน โดยการนําฟงกชันที่มีอยูแลวมาใชใหมได ่ื ี ่ ้ศิริชัย นามบุรี ฟงกชน(Functions) ั
  2. 2. ! 59♦!สวนประกอบในการสรางฟงกชัน ฟงกชนทเ่ี ราสรางขนเอง เรยกวา User Defined Function ซึ่งใน C++ กําหนดใหเมือมีการเรียก   ั  ้ึ ี  ่ใชชื่อฟงกชันใด ๆ จะตองมีการ สงคากลับมา (return value) ในชื่อฟงกชันนั้นเสมอ มีรปแบบโครง ูสรางของฟงกชันประกอบไปดวยสวนหัวของฟงกชันและสวนของ statement ดังนี้ function_type function_name (parameter1,parameter2,…) //function header { int … //declaration variable in function float … //declaration variable in function statement; //statement in function statement; //statement in function return(value); //function must return only one or null value to function_name } ความหมายของสวนประกอบในฟงกชัน มีดังนี้ function_type คือ ประเภทคาหรอขอมลทไดจากการทํางานของฟงกชัน ซึ่งจะตองใหคาคืน  ื  ู ่ี กลับมาเก็บไวในชื่อของฟงกชัน (function_name) ถาเปนประเภท void จะเปนฟงกชันประเภทที่ตองมีการ return value function_name คือ ชื่อฟงกชันที่กําหนดขนตามกฎเกณฑการตงชอของ C++ และจะเปนชื่อที่ใช ้ึ  ้ั ่ืสําหรับการเรียกใชฟงกชันตอไป (parameter1,parameter2,…) หรือพารามิเตอรประกอบไปดวย ประเภทและชื่อของตัวแปรใชรบคาคงทเ่ี พอนํามาใชทางานในฟงกชัน ในขณะที่ฟงกชันนั้นถูกเรียกใชทางาน พารามเิ ตอรของ ั  ่ื ํ ํ ฟงกชันมีมากกวา 1 ตวและหลายประเภทได ั return(value); โดยที่ return เปนคยเ วรด และ value คือคาคงที่ที่สงคืนไปใหแกชื่อฟงกชัน 1  ี ิคาหรือไมมีก็ได ( กรณีเปนฟงกชันที่ไมใหคาใด ๆ) ตัวอยางการกําหนดชื่อฟงกชัน เชนศิริชัย นามบุรี ฟงกชน(Functions) ั
  3. 3. ! 60 int factorial(int number) parameter ของฟงกชันเปน integer ชื่อฟงกชัน factorial ประเภทฟงกชันใหคาเปน integer ความหมาย คือ ฟงกชันชื่อ factorial() คาที่ไดจากการทํางานของฟงกชันเปน int และขณะเรยกใชตองมการรบคาพารามเิ ตอรมาเกบไวทตวแปร number และเปนประเภท int เพื่อในมาใช ี   ี ั   ็  ่ี ัภายในฟงกชัน void line() ความหมายคือ ฟงกชันชื่อ line() เปนฟงกชนทไมมพารามเิ ตอร เมื่อฟงกชันทํางาน    ั ่ี  ีเสร็จแลว จะไมใหคาใด ๆ คืนกลับมา เพราะมีประเภทเปน void float power(int base, int exp) ความหมาย ฟงกชันชื่อ power() คาที่ไดจากฟงกชันเปน float และขณะเรียกใชตองมีการรับคาพารามิเตอร 2 ตัว ตัวแรก base เปน int และตัวที่สอง exp เปน int มาใชในฟงกชันดวย  ♦! ารสรางและการเรยกใชฟงกชนในโปรแกรม ก  ี    ั การสรางและการเรียกใชฟงกชนในโปรแกรม มีการกําหนดรูปแบบการสรางและเรียกใช ดังนี้  ัศิริชัย นามบุรี ฟงกชน(Functions) ั
  4. 4. ! 61 #include <header file> #include <header file> //declaration 2 prototype function in this program are line() and factorial() void line(); int factorial(int number); void main() //function main() { int … //declaration variable in function main() statement; //statement in function factorial(int value or variable); //call function factorial() in function main() statement; //statement in function line(); //call function line() in function main() statement; //statement in function } //end of main() and end of this program void line() { int … //declaration variable in function float … //declaration variable in function statement; //statement in function statement; //statement in function } //return int factorial(int number) { int … //declaration variable in function factorial() float … //declaration variable in function factorial() statement; //statement in function factorial() line(); //call function line() in function factorial() statement; //statement in function factorial() return(value);//return only one value to factorial() function } //returnศิริชัย นามบุรี ฟงกชน(Functions) ั
  5. 5. ! 62 จากโครงสรางโปรแกรมทีมการสรางฟงกชน สรุปไดดังนี้ ่ ี ั 1. การประกาศชื่อฟงกชันที่ผูใชกาหนดไวทตอนตนโปรแกรมกอนฟงกชน main() เรยกวา ํ  ่ี     ั ี ฟงกชันตนแบบ (prototype) หรือการกําหนดฟงกชัน (function declaration) แสดงวาในโปรแกรมมีการสรางและเรียกใชฟงกชันเหลานี้ ซึ่งสามารถเรียกใชชื่อฟงกชันนั้น ณ ตําแหนงใด ๆ ของโปรแกรมกได ็ยกเวนหาม เรยกใชชอฟงกชนนนในตวฟงกชนเอง   ี  ่ื   ั ้ั ั   ั การประกาศฟงกชันตนแบบ(prototype) ที่มีพารามเิ ตอร(parameters) ทาได 2 ลักษณะ คือ ํ - ในสวนของพารามเิ ตอรของฟงกชน เขยนทงชนดขอมลและตวพารามเิ ตอร เชน     ั ี ้ั ิ  ู ั  int factorial(int number); - ในสวนของพารามเิ ตอรของฟงกชน เขียนเฉพาะชนิดขอมูล เชน     ั  int factorial(int); 2. การเรียกใชฟงกชันมีรูปแบบการเรียกใชเสมือนเปน statement เชน line() factorial(x) โดย ที่ฟงกชันใดที่มีพารามิเตอรกาหนดไว ตองใสคา argument ใหถูกตองในขณะเรียกใชดวย และเรียก x ํของฟงกชัน factorial() วาอากวเมนต (argument)  ิ 3. เมื่อมีการเรียกใชฟงกชัน ณ ตําแหนงใด โปรแกรมจะไปทางานในฟงกชันนั้นจนเสร็จ แลวจะ ํ กลับมาทํางานตอใน statement ถัดไปจากตาแหนงที่เรียกใชฟงกชัน ํ 4. สามารถเรียกใชฟงกชันกี่ครั้งก็ไดในโปรแกรม♦! งกชนไมมพารามเิ ตอร ฟ  ั  ี ฟงกชนไมมพารามเิ ตอร หมายถึง ฟงกชันที่ไมมีการรับคาพารามิเตอรมาใชในขณะทํางาน   ั  ีและการเรียกใชก็ไมตองสง argument มาใหฟงกชัน อาจเปนฟงกชนประเภทคนคา (return value) หรือ    ั ื ไมมีการคืนคาใด ๆ ใหแกชื่อฟงกชันเมื่อทํางานเสรจกได ็ ็ •! ตัวอยางโปรแกรม line_non.cpp แสดงการสรางและเรยกใชฟงกชันแบบไมมพารามเิ ตอร  ี     ี และไมมีการคืนคาใด ๆ คือ ฟงกชันประเภท viod/*Program : line_non.cpp Process : creat non-parameter function line() */#include <iostream.h>#include <conio.h>//declaration prototype functionvoid line();//begin main programvoid main(){ int i;ศิริชัย นามบุรี ฟงกชน(Functions) ั
  6. 6. ! 63 clrscr(); cout<< "Display 1 line from line() functionn"; line(); //call line() and non-argument getch(); cout<< "Display 5 lines from line() functionn"; for (i=1;i<=5;++i) line(); //call line() and non-argument getch();}//end main programvoid line() //non-parameter function{ cout<< "_________________________________n";} •! ตัวอยางโปรแกรม func_non.cpp แสดงโปรแกรมที่มีการสรางฟงกชันประเภทที่ไมมี parameter ไมมการ return value คือ ฟงกชัน input() และฟงกชันที่ไมมี parameter ี แตมการ return value คือฟงกชัน summation() ี/*Program : func_non.cpp process : display return value and non-parameter function*/#include <iostream.h>#include <conio.h>//prototype function declarationint summation();void input();//global variableint x,y;void main(){ clrscr(); input(); //called function input() cout<<"Result of x+ y =a"<<summation(); //called function summation() getch();}void input() //non-return value function{ cout<<"Enter 2 number for summation : "<<endl<<endl; cout<<"Number1 : ";cin>>x;ศิริชัย นามบุรี ฟงกชน(Functions) ั
  7. 7. ! 64cout<<"Number2 : ";cin>>y;}int summation() //return value function{ int result; result=x+y; return (result); //return result value to summation() called}♦! งกชนมีพารามิเตอร ฟ ั ฟงกชนมพารามเิ ตอร หมายถึงฟงกชันที่มีการรับคาพารามิเตอรมาใชในขณะฟงกชันทํางาน ดัง   ั ีนั้นการเรียกใชฟงกชันประเภทนี้ ตองสง argument มาใหฟงกชันดวย จึงจะสามารถทางานได ดัง ํตวอยาง ั •! ตัวอยางโปรแกรม line_par.cpp แสดงการสรางและเรียกใชฟงกชันแบบมีพารามิเตอรและ ไมมีการคืนคาใด ๆ (เปนฟงกชันประเภท void) ใหแกชื่อฟงกชัน ณ จุดเรียกใช คาที่ไดจาก การทํางานของฟงกชัน จะตองนําไปใชอยางใดอยางหนงในโปรแกรม เชน แสดงคานั้นทาง    ่ึ จอภาพ เก็บคาที่ไดไวในตัวแปร เปนตน/*Program : line_par.cpp Process : creat parameter function line()*/#include <iostream.h>#include <conio.h>void line(int amount); //declaration prototype function//begin main programvoid main(){ int i=45; //begin statement clrscr(); cout<< "Display line from line() functionn"; line(30); //call line() and send constant argument is 30 getch(); line(50); //call line() and send constant argument is 50 getch(); line(i); //call line() and send variable argument is i getch();}//end main programvoid line(int amount) //amount is int parameter of function{ int x;ศิริชัย นามบุรี ฟงกชน(Functions) ั
  8. 8. ! 65 for(x=1; x<=amount;++x) cout<<"_"; cout<<n;} หมายเหตุ จากโปรแกรมตวอยาง การกาหนดคาอารกวเมนต (argument) ในการเรียกใชฟงกชัน ั  ํ ิทาได 2 ลักษณะ คือ ํ 1. กําหนดเปนคาคงท่ี (constant) ใหเ ปนประเภทเดยวกนกบพารามเิ ตอรของฟงกชน เชน การ    ี ั ั    ั เรียกใชฟงกชัน line(30) line(50) ซึ่ง 30 และ 50 คือ คาคงที่ชนิด int 2. กําหนดเปนตวแปร(variable) โดยกําหนดใหเ ปนตวแปรประเภทเดยวกนกบพารามเิ ตอรของ  ั  ั ี ั ั ฟงกชัน เชน การเรียกใชฟงกชัน line(i) ซึ่ง i เปนตัวแปรชนิด int  •! ตัวอยางโปรแกรม func_par.cpp แสดงการคานวณการบวก ลบ คูณ หาร เลข ํ จานวนจริง 2 จานวน โดยการสรางฟงกชันประเภทที่มี parameters และมีการ ํ ํ return value ใหแกชอฟงกชน ณ ตําแหนงทีเ่ รียกใชฟงกชน ่ื ั  ั/*Program : func_par.cpp process : display return value and parameter function calculate addition,subtract,multiply and divide*/#include <iostream.h>#include <conio.h>#include <iomanip.h>//prototype function declarationvoid input();float addition(float x, float y);float subtract(float x, float y);float multiply(float x, float y);float divide(float x, float y);//global variablefloat num1,num2;void main(){ clrscr(); input(); cout<<"Result of addition = "<<addition(num1,num2)<<endl; cout<<"Result of subtract = "<<subtract(num1,num2)<<endl; cout<<"Result of multiply = "<<multiply(num1,num2)<<endl; cout<<"Result of subtract = "<<divide(num1,num2)<<endl<<endl; cout<<"Calculate by sent argument to parameters of function..."<<endl;ศิริชัย นามบุรี ฟงกชน(Functions) ั
  9. 9. ! 66 cout<<"Result of 10.0+20.25= "<<addition(120.0,20.25)<<endl; cout<<"Result of 10.0-20.25= "<<subtract(120.0,20.25)<<endl; cout<<"Result of 10.0*20.25= "<<multiply(120.0,20.25)<<endl; cout<<"Result of 10.0/20.25= "<<setprecision(3)<<divide(10.0,20.25)<<endl; getch();}void input() //non-parameter and non-return value function{ cout<<"Enter 2 number for calculate : "<<endl<<endl; cout<<"Number1 : ";cin>>num1; cout<<"Number2 : ";cin>>num2;}float addition(float x, float y){ float result; result=x+y;result=x-y; return (result);}float subtract(float x, float y){ float result; result=x-y; return (result);}float multiply(float x, float y){ float result; result=x*y; return (result);}float divide(float x, float y){ float result; result=x/y; return (result);}ศิริชัย นามบุรี ฟงกชน(Functions) ั
  10. 10. ! 67♦! งกชนแบบไมประกาศ prototype ฟ ั การสรางฟงกชันในโปรแกรมแบบไมประกาศเปน prototype คือ การสรางรายะเอยดของ  ีฟงกชันตางๆ ไวกอนฟงกชัน main() การเรียกใชฟงกชันประเภทนี้จะตองเรียกใชตามลําดับของการสรางฟงกชนในโปรแกรม ฟงกชันที่ถูกเรียกใชจะตองสรางอยูกอนฟงกชันที่เรียกใชเสมอ เหมาะสาหรบ    ั ํ ัการเขียนโปรแกรมงาย ๆ หรือมีขนาดสัน ๆ ไมสลับซับซอนมากนัก ้ •! ตัวอยางโปรแกรม non_prot.cpp แสดงการสรางฟงกชนแบบไมประกาศ prototype ไวกอน    ั  ดงรายละเอยดโปรแกรมในหนาตอไป ั ี  /*Program : non_prot.cpp Process : creat non prototype function */#include <iostream.h>#include <conio.h>// create non-prototype function before function main()void line1(int amount) //parameter function{ int x; for(x=1; x<=amount;++x) cout<<"_"; cout<<n;}void line2() //non-parameter function{ cout<< "*********************************n"; line1(65);}//begin main programvoid main(){ clrscr(); cout<< "Display line from line1() functionn"; line1(40); //call line1() and constant argument is 40 getch(); cout<< "nDisplay line from line2() functionn"; line2(); //call line2() and constant argument is 50 getch();} //end main programศิริชัย นามบุรี ฟงกชน(Functions) ั
  11. 11. ! 68♦! ินไลนฟงกชัน (inline function) อ โปรแกรมที่เรียกใชฟงกชันจะมีการเรียกใชหนวยความจานอยกวาโปรแกรมที่ไมเรียกใชฟงกชัน ํทั้งนี้เพราะฟงกชันจะจองและใชพื้นที่หนวยความจาขณะถูกเรียกใชเทานั้น เมื่อฟงกชันทํางานเสรจจะคน ํ ็ ืพื้นที่หนวยความจําใหกบโปรแกรม สวนโปรแกรมที่ไมเรียกใชฟงกชันจะมีการใชหนวยความจําเตมท่ี ั ็ตลอดเวลาตามความตองการของโปรแกรมในขณะทํางาน โปรแกรมที่เรียกใชฟงกชันมีสวนดีในแงประหยัดการใชหนวยความจํา แตการเรียกใชฟงกชันทาใหโปรแกรมตองใชเ วลาเพม มีผลทาใหการทํางานของโปรแกรมชากวาโปรแกรมที่ไมเรียกใชฟงกชัน ํ   ่ิ ํแตเราสามารถกําหนดใหฟงกชันในโปรแกรมถูกเรียกใชโดยจองพื้นที่หนวยความจําตลอดเวลา ไมเสียเวลาในการเรยกใช โดยกําหนดใหฟงกชนเปนประเภท อินไลนฟงกชัน (inline function) ี    ั  วิธีการสราง อินไลนฟงกชัน (inline function) มีวิธีการดังนี้ 1. สรางอินไลนฟงกชันอยูกอนฟงกชัน main() 2. เพมคยเ วรดคาวา inline ที่สวนหัวของฟงกชัน ่ิ ี ิ  ํ หมายเหตุ ขอจํากัดของอินไลนฟงกชัน คือ ฟงกชันตองมีขนาดสั้น ถาอินไลนฟงกชันมีขนาด ยาวเกินไป compiler ของ C++ จะ compile ใหเปนฟงกชันที่มีการเรียกใชแบบปกติ •! ตัวอยางโปรแกรม inline.cpp แสดงการสรางและการเรยกใช อินไลนฟงกชัน ชื่อ square()  ี ซึงทําหนาที่คานวณหาคาเลขยกกําลังสอง ดังนี้ ่ ํ/*Program : inline.cpp Process : creat and call inline function*/ #include<iostream.h> #include<conio.h> inline float square(float number) //declaration inline function { return(number*number); } void main() //begin function main() { float x; clrscr(); cout<< "Enter number to calculate square : "; cin>>x; cout<< "Result of square = "<<square(x); //call square() function getch(); }ศิริชัย นามบุรี ฟงกชน(Functions) ั
  12. 12. ! 69♦! ปแบบการสงอารกวเมนตใหฟงกชน (reference argument) รู  ิ     ั ฟงกชนประเภททสรางแบบมพารามเิ ตอร(parameter)   ั ่ี  ี เมื่อถูกเรียกใชจะตองมีการสงอารกิวเมนต (argument) ไปใหแกฟงกชันนั้น ๆ โดยทีชนิดของตัวแปรหรือคาคงทีทของอารกวเมนตจะตอง ่ ่ ่ี ิเปนชนดเดยวกบพารามเิ ตอรของฟงกชนและมจานวนเทากับพารามิเตอร และกรณทมพารามเิ ตอรมาก  ิ ี ั    ั ีํ ี ่ี ี กวา 1 ตัว ลําดับการสงอารกวเมนตตองตรงกับลําดบของพารามเิ ตอรทกําหนดไว ดังตัวอยาง เชน ิ  ั  ่ี  void main() { int x = 5, y=2; float result; result = power(x, y); //เรียกใชฟงกชัน power() ตองสง argument x และ y ไปใหฟงกชัน } โดยที่ x และ y เปนตวแปรประเภท int เหมอนกับตว parameters  ั ื ั float power(int base, int exp) //ตัวแปร base , exp เปน parameters ของ function  { //รอรับคาจาก argument x และ y ตามลําดบั statement1; statement2; return value; } ลักษณะของการสงอารกิวเมนตที่เปน ตัวแปร ใหแกฟงกชัน มี 2 ลักษณะ คือ 1. สงเฉพาะคาอารกิวเมนต (passed argument by value) หมายถึง เมือสงคาของตัวแปรทีเ่ ปน ่อารกวเมนตไปใหแกพารามเิ ตอรของฟงกชนแลว เมื่อฟงกชันทํางานเสรจแลว คาตวแปรทเ่ี ปนอารกว ็ิ       ั  ็   ั  ิเมนตยงคงมคาเดม การทางานของฟงกชันไมมีผลทาใหตวแปรอารกวเมนตเ ปลยนแปลงคา เรยกอารกว ั ี ิ ํ ํ  ั ิ ่ี  ี ิเมนตประเภทนวา value argument  ้ี  2. สงและเปลี่ยนคาอารกิวเมนต(passed argument by reference) เมอสงคาของตวแปรทเ่ี ปน ่ื   ั อารกวเมนตไปใหแกพารามเิ ตอรของฟงกชนแลว เมื่อฟงกชันทํางานเสรจแลว คาตวแปรทเ่ี ปนอารกว ็ิ       ั  ็   ั  ิเมนตมีการเปลี่ยนแปลง การทางานของฟงกชันทําใหตวแปรอารกวเมนตเ ปลยนแปลงคาไปจากเดม ํ  ั ิ ่ี  ิเรยกอารกวเมนตชนดนวา reference argument ี ิ  ิ ้ี ศิริชัย นามบุรี ฟงกชน(Functions) ั
  13. 13. ! 70 รูปแบบการกาหนดและการเรียกใชฟงกชันที่มีการสงอารกิวเมนตแบบ value argument และ ํreference argument มดงน้ี ีั #include <header file> //declaration prototype function float square(float number); float area(float& width, float& high); void main() { float x,y,z; statement; } float square(float number) // value argument function { statement; return value_of_function; } float area(float& width, float& high) // reference argument function { statement; return value_of_function; } หมายเหตุ การกาหนดฟงกชนใหเ ปนประเภท reference argument ใชเครืองหมาย & ตอทาย ํ   ั  ่ชนิดขอมูลของพารามิเตอรในการกําหนดสวนหัวของฟงกชัน ในฟงกชันสามารถกําหนดทง reference ้ัargument และ value argument รวมกันได ศิริชัย นามบุรี ฟงกชน(Functions) ั
  14. 14. ! 71 •! ตัวอยางโปรแกรม argument.cpp แสดงการเปรียบเทียบการเรียกใชฟงกชันแบบ value  argument และ แบบ reference argument/*Program : argument.cpp Process : show creat and call value and reference function*/ #include <iostream.h> #include <conio.h> //declaration prototype function float sum(float arg1,float arg2); float multiply(float& arg3,float& arg4); void main() //begin main program { float arg1,arg2,arg3,arg4; clrscr(); cout<< "Please enter 4 number for argument : n"; cout<< "Argument1 : ";cin>>arg1; cout<< "Argument2 : ";cin>>arg2; cout<< "Argument3 : ";cin>>arg3; cout<< "Argument4 : ";cin>>arg4; //display call value argument function cout<< "nnDisplay call function sum() and send value argument"; cout<< "nValue argument before send to function :"; cout<< "nArgument 1 = "<<arg1<< " Argument 2 ="<<arg2; cout<< "nResult of sum = "<<sum(arg1,arg2); cout<< "nValue argument after send to function :(not change)"; cout<< "nArgument 1 = "<<arg1<< " Argument 2 ="<<arg2; // display call reference argument function cout<< "nnDisplay call function multiply() and send reference argument"; cout<< "nValue argument before send to function :"; cout<< "nArgument 3 = "<<arg3<< " Argument 4 ="<<arg4; cout<< "nResult of multiply from function= "<<multiply(arg3,arg4); cout<< "nValue argument after send to function :(changed)"; cout<< "naArgument 3 = "<<arg3<< " Argument 4 ="<<arg4; getch();} //end main program float sum(float para1, float para2) //value argument function { return para1+para2; }float multiply(float& para3, float& para4) //reference argument functionศิริชัย นามบุรี ฟงกชน(Functions) ั
  15. 15. ! 72 { para3++; //change para3 and return valut to arg3 para4++; //change para4 and return valut to arg4 return para3*para4; }♦! verloaded function O โอเวอรโหลดฟงกชน(overloaded function) เปนฟงกชันที่สามารถทํางานไดหลาย ๆ ลักษณะ    ัขึ้นอยูกับอารกิวเมนตที่ผูใชกาหนดให ดงนนชอฟงกชนประเภทน้ี ขณะเรียกใชจึงสามารถกาหนดอาร ํ ั ้ั ่ื   ั ํกิวเมนตไดหลายลักษณะ วิธีการสราง overloaded function มีวิธีการสรางเหมือนกับฟงกชันปกติ แตมีการสรางชื่อoverloaded function ใหมชอเหมอนกน โดยกําหนดพารามิเตอรแตละฟงกชันใหแตกตางกัน ดังตัว  ี ่ื ื ัอยางในโปรแกรม  •! โปรแกรม over_fun.cpp แสดงการสราง overloaded function ชื่อฟงกชัน line() /*Program : over_fun.cpp Process : creat and call overloaded function line()*/#include <iostream.h>#include <conio.h>//declaration overloaded prototype functionvoid line();void line(int x);void line(char ch,int x);void line(char ch);void main() //begin main program{ clrscr(); cout<< "Display 1 line from line() functionn"; line(); //call line() cout<< "Display 2 line from line() functionn"; line(30); //call line() cout<< "Display 3 line from line() functionn"; line(*,60); //call line()cout<< "Display 4 line from line() functionn"; line(+); //call line() getch();} //end main programvoid line() //overload function1 line()ศิริชัย นามบุรี ฟงกชน(Functions) ั
  16. 16. ! 73{ cout<< "================================n";}void line(int x) //overload function2 line(){ int y; for (y=1;y<=x;++y) cout<< "_"; cout<<n;}void line(char ch,int x) //overload function3 line(){ int y; for (y=1;y<=x;++y) cout<< ch; cout<<n;}void line(char ch) //overload function4 line(){ int y; for (y=1;y<=80;++y) cout<< ch; cout<<n;}♦! efault argument D การประกาศ prototype function สามารถกาหนดคาเริมตน (default) ใหกับฟงกชันได ในขณะ ํ ่เรียกใชฟงกชันทาใหเราสามารถกําหนดอารกิวเมนตไดหลายลักษณะ ถึงแมเราไมกาหนด หรอกาหนด ํ ํ ื ํอารกิวเมนตเพียงบางสวน ฟงกชันก็ยังสามารถทํางานได เรยกอารกวเมนตแบบนวา default argument ี ิ  ้ี  •! ตัวอยางโปรแกรม default.cpp แสดงการสรางฟงกชันแบบกําหนด default argument ไว สําหรับการเรียกใชพังกชัน/*Program : argument.cppศิริชัย นามบุรี ฟงกชน(Functions) ั
  17. 17. ! 74 Process : creat and call default argument function line()*/#include <iostream.h>#include <conio.h>//ประกาศ prototype function และกําหนด default argumentvoid line(char ch= _,int x=80);void main() //begin main program{ clrscr(); cout<< "Display line from line() functionn"; line(); //call line() function line(+); //call line() function line(#,50); //call line() function line(65); //call line() will display character of ASCII CODE 65 getch();}//end main programvoid line(char ch,int x) //function line(){ for (int y=1;y<=x;++y) cout<< ch; cout<<n;}♦! กษณะการใชตวแปรในฟงกชน ลั  ั   ั การใชหรอการประกาศตวแปรในโปรแกรมของ C++ สามารถกาหนดใหตัวแปรมีลักษณะการ  ื ั ํใชงานได 3 ลักษณะ คือ 1. automatic variable เปนการประกาศตวแปร อยูใน { } ของฟงกชันใดฟงกชันหนึ่ง ตัว  ัแปรประเภทนจะนําไปใชไดเฉพาะในฟงกชันนี้เทานั้น จงเรยกอกอยางหนงวา Local variable การ ้ี ึ ี ี  ่ึ ทางานของตวแปรประเภทน้ี จะจองพนทหนวยความจําเมื่อฟงกชันถูกเรียกใชเทานั้น และยกเลิกการใช ํ ั ้ื ่ี หนวยความจําเมื่อฟงกชันทํางานเสรจ ปกติ C++ จะไมกาหนดคาเรมตนใหแกตวแปร automatic ็ ํ  ่ิ    ัvariable ดงนนผใชควรกําหนดคาเรมตนใหกบตวแปรดวยเพอปองกนความผดพลาด การกาหนดตัว ั ้ั ู   ่ิ   ั ั  ่ื  ั ิ ํแปร automatic variable จะใชคียเวิรด auto หรือไมกได เชน ็  void main()ศิริชัย นามบุรี ฟงกชน(Functions) ั
  18. 18. ! 75 { int x=50; //declaration x and number are automatic variable in main() auto float number = 0; //used keywoad auto before type and name fo variable statement; … } void repeat() //function repeat() { int y; //declaration y is automatic variable for(y=1;y<=40;++y) //use y from automatic or local variable cout<<#; cout<<endl; } 2. external variable เปนการประกาศตวแปร อยนอก { } ของทุกฟงกชัน ตัวแปรประเภทนี้  ั ูจะนําไปใชไดในทุกฟงกชัน จงเรยกอกอยางหนงวา Global variable การทางานของตวแปรประเภทน้ี ึ ี ี  ่ึ  ํ ัจะจองพนทหนวยความจําตลอดเวลาทโปรแกรมทางาน และยกเลิกการใชหนวยความจําเมอโปรแกรม ้ื ่ี  ่ี ํ ่ืทางานเสรจ ปกติ C++ จะไมกาหนดคาเริมตนใหอตโนมัตแตอาจจะไมถกตอง ดงนนผใชควรกําหนดคา ํ ็ ํ ่ ั ิ ู ั ้ั ู  เรมตนใหกบ ่ิ   ัตวแปรดวยเพอปองกนความผดพลาด การกาหนดตวแปร external variable จะกําหนดหรือประกาศไว ั  ่ื  ั ิ ํ ักอนฟงกชัน main() int y=0; //declaration y and x are external variable float x=0; void main() //function main() { int x=50; //declaration x and number are automatic variable in main() statement; … } หมายเหตุ ชือตัวแปรประเภท automatic และ external สามารถกาหนดชอซากันได เนืองจาก ่ ํ ่ื ้ํ ่ใชหนวยความจําพื้นที่คนละสวนกัน 3. static variable เปนการประกาศตวแปร อยูใน { } ของฟงกชันใดฟงกชันหนึ่ง ตัวแปร  ัประเภทนี้จะนาไปใชไดเฉพาะในฟงกชันนี้เทานั้น การทางานของตวแปรประเภทน้ี จะจองพนทหนวย ํ ํ ั ้ื ่ี ความจําไวตลอดเวลาทโปรแกรมทางาน และยกเลิกการใชหนวยความจําโปรแกรมจบการทางาน เรียก  ่ี ํ ํอกอยางหนงวา static automatic variable จะใชคียเวิรด static นําหนาในการประกาศตัวแปร เชน ี  ่ึ   float Avg(float value)ศิริชัย นามบุรี ฟงกชน(Functions) ั
  19. 19. ! 76 { static float total; //declaration static variable in function Avg() static int amount; total = total+value; //summation of total statement; } •! ตัวอยางโปรแกรม type_var.cpp แสดงการกําหนดและการใชตัวแปรประเภท automatic และ external variable ในโปรแกรม/*Program : type_var.cpp Process : show using automatic and external variable*/#include <iostream.h>#include <conio.h>void line(); //declaration prototype functionvoid repeat();int x; //declaration external or global variablevoid main() //begin main program{ int x; //declaration automatic or global variable in main() auto int y; //declaration automatic or global variable in main() clrscr(); line(); repeat(); for(y=1;y<=5;++y) //use y is automatic or local variable line(); for(x=1;x<=5;++x) //use x is automatic or local variable repeat();getch();} //end main programvoid line() //function line(){ for(x=1;x<=80;x++) //use x from global or external variable cout<<=; cout<<endl; }void repeat() //function repeat(){int y;ศิริชัย นามบุรี ฟงกชน(Functions) ั
  20. 20. ! 77 for(y=1;y<=40;++y) //usy y from automatic or local variable cout<<#; cout<<endl;}♦! emplate Function T เท็มเพลตฟงกชัน (Template Function) หมายถึง ฟงกชันที่มีคุณสมบัติในการใชอากิวเมนต(argument) ไดกับขอมูลหลาย ๆ ประเภท เท็มเพลตฟงกชันกาหนดใหพารามเิ ตอรของฟงกชนสามารถ ํ     ัรบคาอารกิวเมนตไดหลายประเภท เชน ฟงกชัน sum() กําหนดใหเ ปนประเภท template function ั      สามารถรบคาจากตวแปรประเภท int, float และ double ได คํานวณมาหาผลรวมไดทงอารกวเมนต ั  ั ้ั ิประเภท int, float และ double ซงในฟงกชนแบบปกตพารามเิ ตอรจะรบอารกวเมนตไดเ ฉพาะขอมล ่ึ   ั ิ  ั ิ   ูประเภทเดียวกันกับที่กาหนดไวเ ทานน ํ  ้ั การกาหนด template function กําหนดไวกอนหนาฟงกชัน main() มรปแบบดงน้ี ํ ีู ั template <class Type> Type Sum(Type first, Type second) //function sum() { statement; statement; return first+second; } สวนประกอบใน template function มดงน้ี ีั 1. template เปนคียเ วิรดเพือกําหนดวา ฟงกชัน sum() เปน template function  ่  2. <class Type> class เปนคียเ วิรดเพือกําหนดชนดขอมล มชอวา Type ซึ่งสามารถกาหนด  ่ ิ  ู ี ่ื  ํชอไดตามความตองการของผใช ตามกฎการตงชอของ C++ ่ื   ู ้ั ่ื 3. Type Sum(Type first, Type second) ชื่อฟงกชัน sum() มประเภทเปน Type มีพารา ี มิเตอร 2 ตัว มชนดเปน Type เชนกน ี ิ   ั •! ตัวอยางโปรแกรม template.cpp แสดงการใชฟงกชันประเภท template function ชื่อ sum() ทําหนาที่คานวณหาผลรวมของเลข 2 จานวน ฟงกชันชื่อ multiply() หาผลคูณเลข 2 ํ ํ จานวน ซึ่งเปนตัวเลขประเภท integer, float และ double ํ/*Program : template.cpp Process : show create and call template function */ศิริชัย นามบุรี ฟงกชน(Functions) ั
  21. 21. ! 78 #include <iostream.h> #include <conio.h> //declaration templat function sum() template<class TYPE> TYPE sum(TYPE first, TYPE second) { return first+second; } //declare template function multiply() template<class New_type> New_type multiply(New_type number1,New_type number2) { return number1*number2; }void main() //begin main program { int x=50,y=30; float a=300.25, b=100.50; double c=3.21541005,d=10005.02541152; //begin statement clrscr(); cout<< " Sum integer "<< sum(x,y)<<endl; cout<< " Sum float "<< sum(a,b)<<endl; cout<< " Sum double "<< sum(c,d)<<endl; cout<< "n Multiply integer "<< multiply(x,y)<<endl; cout<< " Multiply float "<< multiply(a,b)<<endl; cout<< " Multiply double "<< multiply(c,d); getch(); } //end main programศิริชัย นามบุรี ฟงกชน(Functions) ั
  22. 22. ! 79♦! บบฝกหัดทายบท แ1. ใหเขียนโปรแกรมสรางฟงกชันเสนกรอบสี่เหลี่ยม โดยกําหนดพารามิเตอรกาหนดตําแหนง มุมซาย ํ  ดานบนและมุมขวาดานลางของกรอบได เชน frame(5,2,50,10) แสดงวากรอบสี่เหลี่ยมจะเริ่มวาด  ตังแตตาแหนง มุมซายบนที่ คอลัมน 5 แถว 2 และมุมขวาลางที่ตําแหนง คอลัมน 50 แถวที่ 10 ้ ํ   5,2 50,102. ใหเ ขยนโปรแกรมเพอสรางฟงกชนคํานวณคา factorial(n) เพอคานวณหาคาแฟกทอเรยลของ ี ่ื    ั  ่ื ํ  ี จํานวน n3. ใหเขียนโปรแกรมเพื่อสรางฟงกชันแบบพารามิเตอรและมีการ return value ในการคํานวณเลข ยกกําลังโดยการสง argument เปนเลขจํานวนฐานและเลขกาลังไปใหแกฟงกชัน เชน power(2,4)  ํ  คือการคํานวณเลขจํานวน 2 ยกกําลัง 44. ใหเ ขยนโปรแกรมเพอสรางฟงกชนประเภทมพารามเิ ตอรและมการ return value ในการคํานวณหา ี ่ื    ั ี  ี คาพนทของรปเรขาคณตตอไปน้ี วงกลม, สามเหลี่ยม และ สี่เหลี่ยม  ้ื ่ี ู ิ 5. จงเขยนโปรแกรมเพอคานวณการตัดเกรด โดยการเขียนแยกเปนฟงกชัน มีเงือนไขการตัดเกรด ดังนี้ ี ่ื ํ ่ คะแนน 0-49 เกรด F คะแนน 50-59 เกรด D คะแนน 60-69 เกรด C คะแนน 70-79 เกรด B คะแนน 80-100 เกรด A ในโปรแกรมใหสรางฟงกชนตอไปน้ี     ั  void input() ทาหนาที่รับคะแนนระหวางภาคและปลายภาคเรียน ํ int summation(int x, int y) ทาหนาทในการรวมคะแนน ํ  ่ี char calculate(int total) ทาหนาทีในการตัดเกรด ํ ่ void display() ทาหนาที่ในการแสดงผลขอมูลของโปรแกรมทั้งหมด ํ6. ใหเขียนโปรแกรมสรางฟงกชนประเภทมีพารามิเตอรและมีการ return value เพือคํานวณหาผลรวม ั ่ ของเลขอนกรม 2 ฟงกชัน โดยมีชื่อฟงกชัน sum_even() และ sum_odd มีการทางาน ดังตัวอยาง ุ ํ sum_odd(1,10) คอหาผลรวมของ 1+3+5+7+9 ื sum_odd(9,20) คอหาผลรวมของ 9+11+13+15+17+19 ืศิริชัย นามบุรี ฟงกชน(Functions) ั
  23. 23. ! 80 sum_even(1,10) คอหาผลรวมของ 2+4+6+8 ื sum_even(9,20) คอหาผลรวมของ 10+12+14+16+18+20 ื7. Write the function digitsum(n) ,which computes and returns the sum of the decimal digits of the integer parameter n.8. Write the function sort4, which has four parameters. If the integer variables a,b,c and d are available and have been assigned values, we want to write sort4(&a, &b,&c,&d); to sort four variables, so that, after that call, we have a<=b<=c<=dศิริชัย นามบุรี ฟงกชน(Functions) ั

×