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");
}