Transcript Function
Function
วัตถุประสงค์การเรี ยนรู้
ให้รู้จกั ว่าฟังก์ชนั คืออะไร
ให้รู้จกั ว่าเราสร้างฟังก์ชนั เพือ่ จุดประสงค์ใด หรื อเพื่อประโยชน์ใด
ให้รู้จกั ประเภทของฟังก์ชนั
ว่ามีกี่แบบ
แตกต่างกันอย่างไร
มีรูปแบบของการประกาศฟังก์ชนั อย่างไร
และมีวธิ ีการเรี ยกใช้ฟังก์ชนั ในแต่ละประเภทอย่างไร
ให้รู้จกั จุดประสงค์ หรื อประโยชน์ในการส่ งผ่านค่าอาร์กเู มนต์ให้กบั ฟังก์ชนั
ให้รู้จกั วิธีการส่ งผ่านค่าอาร์กเู มนต์ให้กบั ฟังก์ชนั
ว่ามีกี่แบบ
แต่ละแบบเป็ นอย่างไร แตกต่างกันอย่างไร
ฟังก์ชนั คืออะไร
ในการเขียนโปรแกรม เราทาการแยกส่ วนของการทางานที่มีหน้าที่ชดั เจน
ออกเป็ นส่ วนย่อยที่เราเรี ยกว่า subroutine หรื อ function
ประโยชน์ที่ได้จากการสร้างฟังก์ชนั
เพื่อให้โปรแกรมมีโครงสร้างที่ดูเข้าใจได้ง่ายขึ้น มีความเป็ น abstract
สู งขึ้น
เพื่อให้เราสามารถเรี ยกใช้ชุดคาสัง่ ที่มีหน้าที่การทางานอย่างหนึ่ง ที่เรานิยาม
ไว้ ให้มาทางานเมื่อใดก็ได้ โดยไม่ตอ้ งเขียนชุดคาสัง่ เหล่านั้นใหม่ให้เสี ยเวลา
ประเภทของฟังก์ชนั
ฟังก์ชนั มี 2 แบบ คือ
ฟังก์ชนั ที่ไม่มีการส่ งค่ากลับที่ชื่อฟังก์ชนั (Void Function)
คือฟังก์ชนั ที่มีการนิยาม return type ด้วยคียเ์ วิร์ด void
ฟั งก์ชน
ั ที่มีการส่ งค่ากลับที่ชื่อฟังก์ชนั (Function with Return Value)
คือฟังก์ชนั ที่มีการนิยาม return type ด้วย data type ใดๆที่ไม่ใช่ void
ฟังก์ชนั ที่ไม่มีการส่ งค่ากลับที่ชื่อฟังก์ชนั (Void Function)
รู ปแบบการประกาศ
void ชื่อฟังก์ชนั ([อาร์กเู มนต์]);
รู ปแบบการนิยาม
void ชื่อฟังก์ชนั ([อาร์กเู มนต์]) {
คาสัง่ ;
...
}
รู ปแบบการเรี ยกใช้
ชื่อฟังก์ชนั ([อาร์กเู มนต์]);
ฟังก์ชนั ที่มีการส่ งค่ากลับที่ชื่อฟังก์ชนั (Function with
Return Value)
รู ปแบบการประกาศ
ชนิดข้อมูล ชื่อฟังก์ชนั ([อาร์กเู มนต์]);
รู ปแบบการนิยาม
ชนิดข้อมูล ชื่อฟังก์ชนั ([อาร์กเู มนต์]) {
คาสัง่ ;
...
return นิพจน์ที่มีค่าผลลัพธ์ตรงกับชนิดข้อมูลของฟังก์ชนั ;
}
รู ปแบบการเรี ยกใช้
ตัวแปรที่มีชนิดข้อมูลเดียวกับชนิดข้อมูลของฟังก์ชนั = ชื่อฟังก์ชนั ([อาร์กเู มนต์]);
หรื อ
printf(" ...", ชื่อฟังก์ชนั ([อาร์กเู มนต์]));
ตัวอย่าง Void Function
#include <stdio.h>
void greeting();
int main() {
greeting();
printf("Bye Bye.");
reutrn 0;
}
void greeting() {
printf("Hello!!!");
}
ตัวอย่าง Void Function
#include <stdio.h>
void greeting();
void askName();
int main() {
greeting();
printf("Bye Bye.");
return 0;
}
void greeting() {
printf("Hello!!!");
}
void askName() {
printf("What's your name?");
}
Void Function Example
#include <stdio.h>
void greeting();
void askName();
int main() {
greeting();
printf("Bye Bye.");
reutrn 0;
}
void greeting() {
printf("Hello!!!");
askName();
}
void askName() {
printf("What's your name?");
}
#include <stdio.h>
void A();
void P();
void Y();
int main() {
P();
A();
P();
A();
Y();
A();
return 0;
}
void A() {
printf("AAAAA\n");
printf("A
A\n");
printf("AAAAA\n");
printf("A
A\n");
printf("A
A\n");
printf("\n");
}
void P() {
printf("PPPPP\n");
printf("P
P\n");
printf("PPPPP\n");
printf("P
\n");
printf("P
\n");
printf("\n");
}
void Y() {
printf("Y
Y\n");
printf("Y
Y\n");
printf("YYYYY\n");
printf(" Y \n");
printf(" Y \n");
printf("\n");
}
ตัวอย่าง Function with Return Value
#include <stdio.h>
int one();
int nine();
int ten();
int main() {
int x;
x = one() + ten() * nine();
printf("x = %d\n",x);
return 0;
}
int one() {
return 1;
}
int nine() {
return 9;
}
int ten() {
return 10;
}
#include <stdio.h>
int main() {
long result;
int i;
long res23 = 1;
for (i=0;i<3;i++)
res23 = res23 * 2;
long res24 = 1;
for (i=0;i<4;i++)
res24 = res24 * 2;
long res26 = 1;
for (i=0;i<6;i++)
res26 = res26 * 2;
result = res23 + res24 * res26;
printf("2^3 + 2^4 * 2^6 = %ld\n",result);
return 0;
}
#include <stdio.h>
long twoPower(int exponent);
int main() {
long result;
long res23 = twoPower(3);
long res24 = twoPower(4);
long res26 = twoPower(6);
result = res23 + res24 * res26;
printf("2^3 + 2^4 * 2^6 = %ld\n",result);
return 0;
}
long twoPower(int exponent) {
int i;
long res = 1;
for (i=0;i<exponent;i++)
res = res * 2;
return res;
}
ตัวอย่าง Function with Return Value
#include <stdio.h>
long twoPower(int exponent);
int main() {
long result;
result = twoPower(3) + twoPower(4) * twoPower(6);
printf("2^3 + 2^4 * 2^6 = %ld\n",result);
return 0;
}
long twoPower(int exponent) {
int i;
long res = 1;
for (i=0;i<exponent;i++)
res = res * 2;
return res;
}
จุดประสงค์ หรื อประโยชน์ในการส่ งผ่านค่าอาร์กเู มนต์ให้กบั
ฟังก์ชนั
เนื่องจากฟังก์ชนั ที่ดีควรมีลกั ษณะดังนี้
1. มีหน้าที่ชดั เจนเพียงหนึ่งอย่าง (Functional Cohesion)
2. เป็ นอิสระ (Coupling) ไม่ข้ ึนต่อฟังก์ชนั อื่น หรื อข้อมูลจากฟังก์ชนั อื่น
หรื อไม่อา้ งอิงข้อมูลที่เป็ น global เช่นตัวแปรglobal
- หากจาเป็ นต้องอ้างอิงควรมีลกั ษณะการอ้างอิงในรู ปแบบที่เรี ยกว่า Data
coupling นัน่ คือ ให้มีการเรี ยกใช้ฟังก์ชนั นี้ทางานโดยทาการส่ งข้อมูล
เท่าที่จาเป็ นเพื่อใช้ในการประมวลผลเพื่อให้ฟังก์ชนั นั้นสามารถทางานได้
บรรลุตามวัตถุประสงค์หรื อหน้าที่ของฟังก์ชนั นั้น
- นัน่ จึงเป็ นที่มาของการศึกษาเรื่ องการส่ งผ่านอาร์กเู มนต์ให้กบั ฟังก์ชนั
การส่ งผ่านค่าอาร์กเู มนต์ให้กบั ฟังก์ชนั
มีอยู่ 2 แบบคือ
1. การส่ งผ่านเฉพาะค่าข้อมูล (Passing By Value)
วิธีการส่ งผ่านค่าวิธีน้ ีจะทาการส่ งผ่านเฉพาะข้อมูลให้กบั ฟังก์ชนั เพื่อใช้ในการ
ประมวลผล และเมื่อทางานในฟังก์ชนั นั้นเสร็ จแล้วจะไม่ มผี ลกระทบใดๆเกิด
ขึน้ กับตัวแปรทีส่ ่ งเป็ นอาร์ กูเมนต์ เลย
2. การส่ งผ่านทั้งแอดเดรสที่เก็บข้อมูล (Passing By Reference)
วิธีการส่ งผ่านค่าวิธีน้ ีจะทาการส่ งผ่านแอดเดรสที่เก็บข้อมูลให้กบั ฟังก์ชนั เพื่อ
ใช้ในการประมวลผล ซึ่งเมื่อทางานในฟังก์ชนั นั้นเสร็ จแล้วจะมีผลกระทบ
กับตัวแปรทีส่ ่ งเป็ นอาร์ กูเมนต์
ตัวอย่างการส่ งผ่านเฉพาะค่าข้อมูลให้กบั ฟังก์ชนั (Passing By Value)
#include <stdio.h>
void aaa(int x);
void aaa(int x) {
x = x + 1;
printf("value of x in aaa is %d.\n",x);
}
int main() {
int a = 5;
aaa(a);
printf("value of a in main is %d.\n",a);
return 0;
}
Output:
value of x in aaa is 6
value of a in main is 5
ตัวอย่างการส่ งผ่านแอดเดรสที่เก็บข้อมูลให้กบั ฟังก์ชนั (Passing By
Reference)
#include <stdio.h>
void aaa(int *x);
void aaa(int *x) {
*x = *x + 1;
printf("value of *x in aaa is %d.\n",*x);
}
int main() {
int a = 5;
aaa(&a);
printf("value of a in main is %d.\n",a);
return 0;
}
Output:
value of *x in aaa is 6
value of a in main is 6
ตัวอย่างการเขียนโปรแกรมที่มีการสร้างเป็ นฟังก์ชนั
// Example of function with return value and passing argument by value
#include <stdio.h>
long power(int a, int b);
long power(int a,int b) {
int i;
long res=1;
for (i=0;i<b;i++)
res = res * a;
return res;
}
int main() {
long result;
result = power(5,3) * power(2,7) + power(3,4) * power(4,6);
printf("result = %ld\n",result);
return 0;
}
ตัวอย่างการเขียนโปรแกรมที่มีการสร้างเป็ นฟังก์ชนั
// Example of function with no return value and passing argument by
reference
#include <stdio.h>
void swap(int* x, int* y);
void swap(int* x, int* y) {
int tmp;
tmp = *x;
*x = *y;
*y = tmp;
}
int main() {
int a,b;
a = 3; b = 5;
swap(&a,&b);
printf("a = %d b = %d \n",a,b);
return 0;
}
ตัวอย่างการแยกฟังก์ชนั ไว้ในไลบรารี่
papaya.c
#include <stdio.h>
#include "banner.h"
int main() {
P();
A();
P();
A();
Y();
A();
return 0;
}
banner.h
void A() {
printf("AAAAA\n");
printf("A
A\n");
printf("AAAAA\n");
printf("A
A\n");
printf("A
A\n");
printf("\n");
}
void P() {
printf("PPPPP\n");
printf("P
P\n");
printf("PPPPP\n");
printf("P
\n");
printf("P
\n");
printf("\n");
}
void Y() {
printf("Y
Y\n");
printf("Y
Y\n");
printf("YYYYY\n");
printf(" Y \n");
printf(" Y \n");
printf("\n");
}