ฟังก์ชัน (Function)
Outline รูปแบบในการกำหนดฟังก์ชัน ตัวอย่างการกำหนดฟังก์ชันในภาษาซี รูปแบบในการเรียกใช้ฟังก์ชัน ขอบเขตของตัวแปร โปรโตไทป์ (prototype) การเวียนเกิด (Recursion)
รูปแบบในการกำหนดฟังก์ชัน [type] function-name ([formal parameters]) 1. statement 1 2. statement 2 … [return function-variable] n. end type : int , float , char , user-defined formal parameters : datatype parameter-name
ตัวอย่างการกำหนดฟังก์ชันในภาษาซี กรณีที่ 1 ไม่มีพารามิเตอร์ และไม่มีการส่งค่ากลับ void prn () { int i; for(i=1;i<=15;i++) printf(“*”); printf(“\n”); }
ตัวอย่างการกำหนดฟังก์ชันในภาษาซี กรณีที่ 2. ไม่มีพารามิเตอร์ แต่มีการส่งค่ากลับ int sum () { int i,n,s=0; scanf(“%d”,&n); for(i=1;i<=n;i++) s += i; return s; }
ตัวอย่างการกำหนดฟังก์ชันในภาษาซี กรณีที่ 3. มีพารามิเตอร์ และมีการส่งค่ากลับ int fac (int m) { int i,ans=1; for(i=1;i<=m;i++) ans *= i; return ans; }
ตัวอย่างการกำหนดฟังก์ชันในภาษาซี กรณีที่ 4 มีพารามิเตอร์ แต่ไม่มีการส่งค่ากลับ void func (int x , float y) { printf(“answer = %f\n”, y / (x * x)); }
รูปแบบในการเรียกใช้ฟังก์ชัน มีการส่งค่ากลับ ans sum() ไม่มีพารามิเตอร์ ans fac(int m) มีพารามิเตอร์ var function-name ([arguments])
รูปแบบในการเรียกใช้ฟังก์ชัน ไม่มีการส่งค่ากลับ prn () ไม่มีพารามิเตอร์ func (int x , float y) มีพารามิเตอร์ function-name ( [arguments] )
ตัวอย่างการกำหนดและการเรียกใช้ฟังก์ชัน float area (float a , float b) { return 1.0/2 * a * b; } void func (int x , float y) { printf(“answer = %f\n”, y / (x * x)); void main() { int a; float triangle, b; triangle = area(3.5,4.0); scanf(“%d %f”,&a,&b); func(a,b); การกำหนดฟังก์ชัน การเรียกใช้ฟังก์ชัน (มีการส่งค่ากลับ) การเรียกใช้ฟังก์ชัน (ไม่มีการส่งค่ากลับ)
ขอบเขตของตัวแปร Global Local Static Extern
ขอบเขตของตัวแปร: Global & Local int i , n; int sumi2 () { int j=0, i, n; …. } void func (int a , int b , int c) { int i, n; float j; …. void main() { int ans, j; ….. Global variables ทุกฟังก์ชันมองเห็นและสามารถเรียกใช้ได้ Local variables ใช้งานได้ภายในฟังก์ชันเท่านั้น ฟังก์ชันอื่น ๆ มองไม่เห็น ถูกประกาศไว้ในฟังก์ชันใด ก็ถูกเรียกใช้ได้เฉพาะในฟังก์ชันนั้น
ขอบเขตของตัวแปร: Static รูปแบบการประกาศตัวแปร: static data-definition; Ex. static int i; ถ้ากำหนดใช้ในฟังก์ชัน จะทำให้ค่าของตัวแปรยังคงถูกเก็บไว้หลังจากทำงานในฟังก์ชันเสร็จสิ้นและเมื่อเรียกใช้ฟังก์ชันอีกครั้ง ค่าดังกล่าวจะถูกนำมาใช้ต่อไปได้เลย
ขอบเขตของตัวแปร: Extern รูปแบบ extern data-definition; extern function-prototype; เป็นการเรียกใช้ตัวแปรหรือฟังก์ชันที่กำหนดไว้นอกโปรแกรม Ex. extern int c; extern int fac (int);
ตัวอย่างโปรแกรมใช้ตัวแปรแบบ extern #include<stdio.h> extern int c; extern int fac(int); void main() { b = fac(5); printf("5! = %d\n",b); } #include <stdio.h> int c; int fac(int m) { int i, f=1; for (i=1;i<=m;i++) f *= i; return f; }
โปรโตไทป์ (Prototype) Prototype declaration เป็นการประกาศรูปแบบฟังก์ชันที่มีใช้ในโปรแกรมซึ่งเขียนต่อจากส่วนโปรแกรมหลัก ทั้งนี้เพื่อให้ตัวแปลภาษารู้จักก่อนมีการเรียกใช้งานฟังก์ชันนั้น
ตัวอย่างการเขียนโปรโตไทป์ float area (float , float); void func (int , float); void main() { int a; float triangle, b; triangle = area(3.5,4.0); scanf(“%d %f”,&a,&b); func(a,b); } float area (float a , float b) { return 1.0/2 * a * b; void func (int x , float y) { printf(“answer = %f\n”, y / (x * x)); การเขียนโปรโตไทป์ เขียนฟังก์ชันไว้หลัง main จึงต้องมีการประกาศโปรโตไทป์
การเวียนเกิด (Recursion) คือการเรียกตัวเองซ้ำของฟังก์ชัน โดยต้องมีส่วนที่ทำการเรียกตัวฟังก์ชันเอง และจุดที่ทำให้จบการเรียกซ้ำตัวเอง เช่น n! (n factorial) 1! = 1 2! = 2 x 1 = 2 x 1! 3! = 3 x 2 x 1 = 3 x 2! … n! = n x (n-1) x (n-2) x … x 2 x 1 = n x (n-1)!
การเวียนเกิด (Recursion) Algorithm n factorial Input: a number of n Output: n! Read n n! fac(n) Write n! fac(n) 1. if (n=1) then return 1 2. else return n * fac(n-1) ฟังก์ชัน fac() มีการเรียกใช้ฟังก์ชัน fac() (เรียกใช้ตัวมันเอง)
การเวียนเกิด (Recursion) Algorithm power n Input: ค่า n Output: Xn Read n power(n) 1. if (n=0) then return 1 2. else write x * power(n-1) ฟังก์ชัน power() มีการเรียกใช้ฟังก์ชัน power() (เรียกใช้ตัวมันเอง)
Class Exercise เขียนขั้นตอนวิธีด้วยรหัสลำลองเพื่อคำนวณหาค่าผลรวมของ โดยมีการเรียกใช้ฟังก์ชัน xn