1 / 42

05-530-111 Computer Programming 1

05-530-111 Computer Programming 1. บทที่ 4 ฟังก์ชัน (Function). หัวข้อศึกษา. ประเภทของฟังก์ชันใน C++ ฟังก์ชันมาตรฐานใน C++ ฟังก์ชันที่กำหนดโดยผู้เขียนโปรแกรม ต้นแบบของฟังก์ชัน การนิยามฟังก์ชัน ฟังก์ชันที่ไม่มีการรับและส่งค่า. หัวข้อศึกษา. ฟังก์ชันที่รับค่าเพียงอย่างเดียว

jane
Download Presentation

05-530-111 Computer Programming 1

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 05-530-111 Computer Programming 1 บทที่ 4ฟังก์ชัน (Function)

  2. หัวข้อศึกษา • ประเภทของฟังก์ชันใน C++ • ฟังก์ชันมาตรฐานใน C++ • ฟังก์ชันที่กำหนดโดยผู้เขียนโปรแกรม • ต้นแบบของฟังก์ชัน • การนิยามฟังก์ชัน • ฟังก์ชันที่ไม่มีการรับและส่งค่า

  3. หัวข้อศึกษา • ฟังก์ชันที่รับค่าเพียงอย่างเดียว • ฟังก์ชันที่ส่งค่าออกเพียงอย่างเดียว • ฟังก์ชันที่รับและส่งค่า

  4. ประเภทของฟังก์ชันใน C++ • ฟังก์ชัน (Function) หรือ โปรแกรมย่อย ในบางภาษาอาจเรียกว่า Procedure • ฟังก์ชันใน C++ มี 2 ประเภทคือ • ฟังก์ชันมาตรฐาน • ฟังก์ชันที่กำหนดขึ้นโดยผู้เขียนโปรแกรม

  5. ฟังก์ชันมาตรฐานใน C++ (C++ Standard Function) • เป็นฟังก์ชันที่มีอยู่แล้วใน C++ การเรียกใช้ฟังก์ชันเหล่านี้ต้องมีการรวม (include) เข้ามาร่วมในการคอมไพล์ด้วย • ตัวอย่างของฟังก์ชันมาตรฐาน • cin, cout ( include ไฟล์ iostream.h) • sqrt, log, sin, cos (include ไฟล์ math.h) • สามารถศึกษาวิธีใช้ฟังก์ชันต่างๆ ได้โดยใช้คำสั่ง man เช่น man sin

  6. Math Function Function Include File abs stdlib.h acos math.h asin math.h atan math.h atof stdlib.h atoi stdlib.h cos math.h cosh math.h

  7. Function Include File exp math.h itoa stdlib.h log math.h log10 math.h sin math.h sinh math.h sqrt math.h tan math.h tanh math.h

  8. ฟังก์ชันที่สร้างขึ้นโดยผู้เขียนโปรแกรม(Programmer-Defined Function) • เป็นฟังก์ชันที่ผู้เขียนโปรแกรมสร้างขึ้นมาใหม่ • ช่วยให้ผู้เขียนโปรแกรมสามารถแบ่งการทำงานของทั้งโปรแกรมออกเป็นส่วนย่อยๆ ที่เรียกว่า โมดูล (Module) • เขียนฟังก์ชันครั้งเดียว แต่สามารถเรียกใช้งานได้หลายครั้ง

  9. ผลลัพธ์ First time... 1 2 3 4 5 6 7 8 9 10 Second time... 1 2 3 4 5 6 7 8 9 10 #include <iostream.h>int main(){ int i; cout <<"First time...” << endl;i=1; while(i<=10) { cout << i << “ “; i++; } cout << endl << “Second time...” << endl;i=1; while(i<=10) { cout << i << “ “; i++; } cout << endl; return 0;}

  10. ต้นแบบของฟังก์ชัน (Function Prototype) เรียกใช้ฟังก์ชัน (Call Function) การนิยามฟังก์ชัน (Function Definition) ผลลัพธ์ First time... 1 2 3 4 5 6 7 8 9 10 Second time... 1 2 3 4 5 6 7 8 9 10 #include <iostream.h>void one_to_ten();int main(){ cout << "First time...” << endl;one_to_ten(); cout << endl << "Second time..."<< endl;one_to_ten(); cout << endl; return 0;}void one_to_ten(){ int i; i=1; while(i<=10) { cout << i << “ “; i++; }}

  11. return-value-type function-name parameter-list ต้นแบบของฟังก์ชัน (Function Prototype) • ต้นแบบของฟังก์ชันเป็นตัวบอกให้คอมไพเลอร์รู้ถึง: • ชนิดข้อมูลที่จะส่งค่ากลับ • จำนวนพารามิเตอร์ที่คาดหวังว่าจะได้รับ • ชนิดของพารามิเตอร์แต่ละตัว รวมทั้งลำดับของพารามิเตอร์เหล่านั้น • รูปแบบ: ชนิดข้อมูลที่จะส่งค่ากลับ ชื่อฟังก์ชัน (ชนิดของพารามิเตอร์ที่รับเข้า);

  12. void my_func(); void my_func(void); int square(int); int square(int num); float to_real(int x,int y); ตัวอย่างการเขียนต้นแบบของฟังก์ชัน - ฟังก์ชันชื่อ my_func ไม่มีการรับค่าเข้า และไม่มีการส่งค่ากลับ หรือ - ฟังก์ชันชื่อ square รับพารามิเตอร์ 1 ตัวเป็นจำนวนเต็ม และส่งค่ากลับเป็นจำนวนเต็ม หรือ - ฟังก์ชันชื่อ to_real รับพารามิเตอร์ 2 ตัวเป็นจำนวนเต็มทั้งคู่ และส่งค่ากลับเป็นจำนวนจริง

  13. การนิยามฟังก์ชัน (Function Definition) • การนิยามฟังก์ชันเป็นการกำหนดการทำงานภายในฟังก์ชัน • รูปแบบ: ชนิดข้อมูลที่จะส่งค่ากลับ ชื่อฟังก์ชัน (ชนิดของพารามิเตอร์ที่รับเข้า) { ประกาศตัวแปร; คำสั่ง; }

  14. ผลลัพธ์ Print 1 to 10 1 2 3 4 5 6 7 8 9 10 ฟังก์ชันที่ไม่มีการรับและส่งค่า #include <iostream.h> void one_to_ten(); int main() { cout << "Print 1 to 10" << endl; one_to_ten(); return 0; } void one_to_ten() { int i; for(i=1;i<=10;i++) cout << i << “ “; }

  15. การเรียกใช้ฟังก์ชันจะทำได้ก็ต่อเมื่อการเรียกใช้ฟังก์ชันจะทำได้ก็ต่อเมื่อ ฟังก์ชันนั้นได้มีการประกาศต้นแบบ ของฟังก์ชันหรือนิยามฟังก์ชันก่อน ที่จะเรียกใช้ฟังก์ชัน ดังนั้นการเขียนแบบนี้ถือว่า ผิด! จำเป็นต้องมีต้นแบบของฟังก์ชันหรือไม่ ? #include <iostream.h> int main() { cout << "Print 1 to 10" << endl; one_to_ten(); return 0; } void one_to_ten() { int i; for(i=1;i<=10;i++) cout << i << " "; }

  16. จำเป็นต้องมีต้นแบบของฟังก์ชันหรือไม่ ? (ต่อ) #include <iostream.h> void one_to_ten() { int i; for(i=1;i<=10;i++) cout << i << " "; } int main() { cout << "Print 1 to 10" << endl; one_to_ten(); return 0; }

  17. อาร์กิวเมนต์ (Argument) ‘A’ 4 ch loop พารามิเตอร์ (Parameter) ผลลัพธ์ A A A A ฟังก์ชันที่มีการรับค่าเข้าทางเดียว #include <iostream.h> void my_print(char ch,int loop); int main() { my_print('A',4); return 0; } void my_print(char ch,int loop) { int i; for(i=0;i<loop;i++) cout << ch << " "; } loop ch

  18. การส่งผ่านค่าให้กับฟังก์ชันการส่งผ่านค่าให้กับฟังก์ชัน • การส่งผ่านค่าให้กับฟังก์ชันใช้วิธีการที่เรียกว่า “Pass by Value” ซึ่งเป็นการคัดลอก (Copy) ค่าของอาร์กิวเมนต์ ให้กับพารามิเตอร์ของฟังก์ชันที่ใช้ในการรับค่า • การเปลี่ยนแปลงค่าของพารามิเตอร์ภายในฟังก์ชัน จะไม่ส่งผลต่อค่าของอาร์กิวเมนต์ที่ส่งมาตอนเรียกใช้ฟังก์ชัน

  19. ผลลัพธ์ num = 2 a = 1 การส่งผ่านค่าให้กับฟังก์ชัน (ต่อ) #include <iostream.h> void inc_print(int num); int main() { int a = 1; inc_print(a); cout << "a = " << a << endl; return 0; } void inc_print(int num) { num = num + 1; cout << "num = " << num << endl; }

  20. ผลลัพธ์ sum from 1 to 10 = 55 ฟังก์ชันที่มีการส่งค่ากลับทางเดียว #include <iostream.h> int sum_one_to_ten(); int main() { int a; a = sum_one_to_ten(); cout << "sum from 1 to 10 = << a << endl; return 0; } int sum_one_to_ten() { int i,sum = 0; for(i=1;i<=10;i++) sum = sum + i; return sum; }

  21. ฟังก์ชัน main ที่มีการส่งค่ากลับ • จากเดิมที่ส่วนหัวของฟังก์ชัน main จะใช้เป็น void main() ซึ่งเมื่อคอมไพล์จะมีคำเตือนว่า return type of `main' is not `int’ • ฟังก์ชัน main ที่ถูกต้องควรใช้เป็น int main() { คำสั่ง; return 0; } • Return 0 เป็นส่งค่า 0 กลับไปให้กับระบบปฏิบัติการเพื่อบอกว่าโปรแกรมทำงานเสร็จโดยสมบูรณ์

  22. ผลลัพธ์ b = 4 ฟังก์ชันที่มีทั้งการรับค่าเข้าและส่งค่ากลับ #include <iostream.h> int square(int x); int main() { int a=2,b; b = square(a); cout << "b = " << b << endl; return 0; } int square(int x) { int y; y = x*x; return y; }

  23. ค่าที่ return จะเป็นตัวแปร, ค่าคงที่, หรือนิพจน์ก็ได้ นิพจน์ #include <iostream.h> int square(int x); int main() { int a=2,b; b = square(a); cout << "b = " << b << endl; return 0; } int square(int x) { return x*x; }

  24. วิธีการใช้ค่าที่ส่งกลับจากฟังก์ชันวิธีการใช้ค่าที่ส่งกลับจากฟังก์ชัน การใช้งานค่าที่ส่งกลับจากฟังก์ชันมีอยู่ 3 รูปแบบคือ 1. ใช้ตัวแปรมารับค่า 2. เป็นอาร์กิวเมนต์ของฟังก์ชันอื่น 3. เป็นส่วนหนึ่งของนิพจน์

  25. เป็นอาร์กิวเมนต์ของฟังก์ชันอื่นเป็นอาร์กิวเมนต์ของฟังก์ชันอื่น ใช้ตัวแปรมารับค่า เป็นส่วนหนึ่งของนิพจน์ #include <iostream.h> int square(int x); int main() { int a=2,b; b = square(a); cout << "b = " << b << endl; cout << "Square of a+1 = " << square(a+1) << endl; b = 1 + square(a+2); cout << "b = " << b << endl; return 0; } int square(int x) { return x*x; }

  26. ผลลัพธ์ b = 4 Square of a+1 = 9 b = 17 #include <iostream.h> int square(int x); int main() { int a=2,b; b = square(a); cout << "b = " << b << endl; cout << "Square of a+1 = " << square(a+1) << endl; b = 1 + square(a+2); cout "b = " << b << endl; return 0; } int square(int x) { return x*x; } 4 9 16

  27. 11 add(10,1) #include <iostream.h> int add(int a,int b); int main() { int sum = add(add(2,add(5,3)),1); cout << "sum = " << sum << endl; return 0; } int add(int a,int b) { return a+b; } add(add(2,8),1) ผลลัพธ์ sum = 11 ตัวอย่างการเรียกฟังก์ชันซ้อนกันหลายชั้น จงเขียนผลลัพธ์ของโปรแกรมต่อไปนี้

  28. I, R main get_volt V โจทย์ตัวอย่าง จงเขียนโปรแกรมสำหรับหาค่าศักย์ไฟฟ้าซึ่งมีสมการดังนี้ V = I*R โดยที่ V คือ ค่าศักย์ไฟฟ้า , I คือ ค่ากระแสไฟฟ้า ส่วน R คือ ค่าความ ต้านทาน และทั้งสามค่านี้เป็นจำนวนจริง โดยกำหนดให้ส่วนที่คำนวณ ค่า V อยู่ในฟังก์ชัน get_volt สำหรับส่วนที่รับค่า I และ R จากผู้ใช้ รวม ทั้งส่วนที่แสดงผลลัพธ์ของค่า V ให้อยู่ในฟังก์ชัน main

  29. int main() { return 0; } return 0; } #include <iostream.h> float get_volt(float I,float R); float i,r,v; cout << "Enter I : "; cin >> i; cout << "Enter R : "; cin >> r; v = get_volt(i,r); cout << "Volt = " << v << endl; float get_volt(float I,float R) { float V = I*R; return V; }

  30. x main get_fx F(x) โจทย์ตัวอย่าง จงเขียนโปรแกรมสำหรับหาค่า F(x) ซึ่งมีสมการดังนี้ F(x) = x2 + 2x + 1 ถ้า x มีค่าไม่ต่ำกว่า 0 = 0 ถ้า x มีค่าต่ำกว่า 0 กำหนดให้ส่วนที่ใช้ในการคำนวณค่า F(x) อยู่ในฟังก์ชัน get_fx สำหรับส่วนที่รับค่า x จากผู้ใช้ และแสดงผลลัพธ์ของค่า F(x) อยู่ใน ฟังก์ชัน main (x และ F(x) เป็นจำนวนเต็ม)

  31. int main() { return 0; } #include <iostream.h> int get_fx(int a); int x,fx; cout << "Enter x : "; cin >> x; fx = get_fx(x); cout << "f("<< x << ") = " << fx << endl; int get_fx(int a) { if(a >= 0) return a*a + 2*a + 1; else return 0; }

  32. int maximum(int x,int y,int z) { int max = x; if(y > max) max = y; if(z > max) max = z; return max; } โจทย์ตัวอย่าง จงเขียนฟังก์ชันชื่อ maximum ซึ่งมีการรับพารามิเตอร์ 3 ตัวเป็น จำนวนเต็มทั้งหมด และให้ส่งค่ากลับเป็นค่าที่มากที่สุดของจำนวนเต็ม ทั้งสาม

  33. QUIZ จงเขียนโปรแกรมในการรับค่าจำนวนเต็มจากผู้ใช้ 1 ตัว จากนั้น โปรแกรมจะแสดงค่าของผลรวมตั้งแต่ 1 จนถึงจำนวนเต็มตัวนั้น กำหนดให้ส่วนที่คำนวณค่าผลรวมอยู่ในฟังก์ชัน sum_one_to_n สำหรับส่วนที่รับค่าจากผู้ใช้และส่วนที่แสดงค่าผลรวมให้อยู่ในฟังก์ชัน main (ไม่ต้องตรวจสอบค่าจากผู้ใช้ว่ามากกว่า 1 หรือไม่)

  34. QUIZ จงเขียนฟังก์ชันชื่อ sum_one_n ซึ่งฟังก์ชันนี้จะมีการรับพารามิเตอร์ เป็นจำนวนเต็ม 1 ตัว และจะส่งค่ากลับเป็นค่าผลรวมตั้งแต่ 1 จนถึง จำนวนเต็มดังกล่าว (ไม่ต้องตรวจสอบค่าจองพารามิเตอร์ที่รับเข้ามาว่ามากกว่า 1 หรือไม่)

  35. 3 * fac(2) 2 * fac(1) ผลลัพธ์ 3! = 6 ฟังก์ชันที่มีการเรียกตัวเองซ้ำ (Recursive Function) 2 #include <iostream.h> int fac(int x); int main() { int y = fac(3); cout "3! = " << y << endl; return 0; } int fac(int x) { if(x <= 1) return 1; else return x* fac(x-1); } 6 1

  36. โจทย์ตัวอย่าง • จงเขียนฟังก์ชันสำหรับหาค่า F(x) ซึ่งมีสมการดังนี้ F(x) = 0 ถ้า x เท่ากับ 0 = 1 ถ้า x เท่ากับ 1 = F(x-1) + F(x-2) ถ้า x มากกว่า 1 • กำหนดให้ x และ F(x) เป็นจำนวนเต็ม และให้ตั้งชื่อฟังก์ชันว่า fib (อนุกรม Fibonacci)

  37. int fib(int x) { if(x == 0) return 0; else if(x == 1) return 1; else if(x > 1) return fib(x-1) + fib(x-2); }

  38. ตัวแปรภายในและตัวแปรภายนอกตัวแปรภายในและตัวแปรภายนอก • ตัวแปรภายใน (Internal Variable) คือ ตัวแปรที่ประกาศภายในฟังก์ชัน และสามารถใช้งานได้เฉพาะภายในฟังก์ชันเท่านั้น • ตัวแปรภายนอก (External Variable) คือ ตัวแปรที่ประกาศไว้ภายนอกฟังก์ชัน สามารถใช้งานได้ในทุกฟังก์ชัน หรือทั้งโปรแกรม • หากไม่มีการกำหนดค่าเริ่มต้น ตัวแปรภายนอกจะถูกกำหนดให้เป็น 0 โดยอัตโนมัติ แต่สำหรับตัวแปรภายในจะใช้ค่าที่ค้างอยู่ในหน่วยความจำ

  39. ผลลัพธ์ In my_func, x = 2.5 In main, x = 1.1 ตัวอย่างการใช้ตัวแปรภายใน #include <iomanip> #include <iostream.h> void my_func(); int main() { double x = 1.1; my_func(); cout << "In main, x = " << setprecision(3)<< x << endl; return 0; } void my_func() { double x; x = 2.5; cout << "In my_func, x = "<<setprecision(3)<<x<< endl; }

  40. ผลลัพธ์ In my_func, x = 2.5 In main, x = 2.5 ตัวอย่างการใช้ตัวแปรภายนอก #include <iomanip> #include <iostream.h> double x; void my_func(); int main() { x = 1.1; my_func(); cout << "In main, x = "<< setprecision(1)<< x << endl; return 0; } void my_func() { x = 2.5; cout << "In my_func, x = "<<setprecision(1)<< x<< endl; }

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

  42. ผลลัพธ์ In my_func, x = 2.5 In main, x = 1.1 ตัวแปรภายใน ตัวแปรภายนอก ตัวแปรภายในที่มีชื่อเดียวกับตัวแปรภายนอก #include <iomanip> #include <iostream.h> double x; void my_func(); int main() { double x = 1.1; my_func(); cout << "In main, x = " << setprecision(3) << x<< endl; return 0; } void my_func() { x = 2.5; cout << "In my_func, x = " << setprecision(3) << x<< endl; }

More Related