function - kmutnb
TRANSCRIPT
Function
ในการท างานบางอยางจ าเปนตองใชค าสงมากวาหนงค าสงเพอท างานนนให
ส าเรจ ซงค าสงทเขยนรวมกนไวเพอใชงานจะเรยกวา ฟงกชน(function)
ทผานมาเราไดเรยกใชงานฟงกชนในภาษาซมาบางแลว เชน
printf( )
scanf( )
ฟงกชนเหลานเปนฟงกชนมาตรฐานใน ภาษาซหรอไลบรารฟงกชน
รปแบบของฟงกชน
โครงสรางของโปรแกรมทเขยนดวยภาษาซ ภายในโปรแกรมจะประกอบดวยฟงกชนตางๆ
โดยจะไมมค าสงทเขยนเดยวๆ อยนอกฟงกชน
อยางนอยทสดในโปรแกรมจะตองมหนงฟงกชนเสมอนนคอ ฟงกชน main( ) ซงเปน
ฟงกชนหลกทโปรแกรมภาษาซจะเรมตนท างานจากจดน จากนนภายในฟงกชน main( )
อาจจะมการเรยกใชฟงกชนอนๆ
ฟงกชนในภาษาซ
ฟงกชนในภาษาซสามารถแบงออกเปน 2 ประเภท คอ
ไลบรารฟงกชน (Library Function) หรอ ฟงกชนมาตรฐาน
ฟงกชนมาตรฐานในภาษาซเปนฟงกชนทมมาใหพรอมกบตวแปลภาษาซตามขอก าหนด
ANSI C เพอใชงานในดานตางๆ โดยเนนทงานพ นฐาน อยางเชนฟงกชนค านวณทาง
คณตศาสตร, ฟงกชนส าหรบจดการกบขอความ หรอฟงกชนจดการเกยวกบเวลา
การใชงานฟงกชนมาตรฐานปกตแลวจ าเปนตองใชค าสง #include แฟมขอมล .h
หรอทเรยกวา header file เขาไปในโปรแกรมกอนการเรยกใชงาน เนองจาก
header file จะเปนตวทนยามฟงกชน และคาตางๆ ทฟงกชนจ าเปนตองใช เชนถา
ตองการใชงานฟงกชนทางคณตศาสตร ในโปรแกรมจะเปนตอง #include
<math.h> เขาไปกอน
ฟงกชนทผใชสรางข นเอง (User defined function)
ฟงกชนทผใชสรางขนเอง
type function-name (type arg-1, type arg-2, … ) {
local variable declaration;statement-1;statement-2;….statement-n;return(value);
}
ประเภทของฟงกชน
ฟงกชนในภาษาซ ถาใชการรบ/สงคาของฟงกชนเปนเกณฑ สามารถแบง
ออกไดเปน 3 ประเภท
ฟงกชนทไมมการรบ/สงคา
ฟงกชนทมการรบคาเขาไปในฟงกชน
ฟงกชนทมการสงคากลบออกจากฟงกชน
ฟงกชนทไมมการรบ/สงคา
ฟงกชนทไมมการรบ/สงคาใดๆ ซงหมายความวา
การเรยกใชฟงกชนประเภทนไมตองสงอารกวเมนตใดๆ เขามาใหกบฟงกชน
และฟงกชนจะท างานโดยไมมการสงผลลพธใดๆ กลบมาใหกบผเรยกใช
ดงนนถอไดวาฟงกชนประเภทนเปนประเภททเขยนงายทสด สวนใหญจะใชใน
การแสดงผลขอความ
void showProgram( ) {
printf(“= Today Program =\n”);
printf(“1. Mummy\n”);
printf(“2. Star war\n”);
printf(“3. Spiderman\n\n”);
}
ตวอยางการใชงาน
#include <stdio.h>
void showProgram( ) {
printf(“=== Today Program ===\n”);
printf(“1. Mummy\n”);
printf(“2. Star war\n”);
printf(“3. Spiderman\n\n”);
}
int main(int argc, char **argv) {
char ch;
printf("Do you want to check showing program (y/n) : ");
ch = getchar( );
if((ch == ‘Y’) || (ch == ‘y’)) {
showProgram( );
} else {
printf(“Thank you\n”);
}
}
ฟงกชนทมการรบคา
ฟงกชนประเภททมการรบคาหมายถง ฟงกชนทเวลาจะเรยกใชงานตองม
การสงคาอารกวเมนตไปใหกบฟงกชนนนดวย
โดยอารกวเมนตทสงไปตองตรงตามขอก าหนดของฟงกชน อยางเชน
ฟงกชนก าหนดใหสงอารกวเมนตเขาไป 3 ตวคอ int, float, long เวลา
เรยกใชงานฟงกชนกตองสงขอมลซงอาจจะอยในรปของนพจน ตวแปร หรอ
คาคงทกได แตตองเปนขอมลชนด int, float, และ long ตามล าดบ
เทานน
void average(int x, int y) {
printf(“Average of %d and %d = %f\n”, x, y, (x + y)/2.0);
}
ตวอยางการใชงาน(1)
#include <stdio.h>
void average(int x, int y)
{
printf(“Average of %d and %d = %f\n”, x,
y,
(x + y)/2.0);
}
int main(int argc, char **argv)
{
int a = 5, b = 10;
average(a, b);
}
average
Main
5
10
a
b
x
y
5
10
ตวอยางการใชงาน(2)
#include <stdio.h>
void average(int b, int a)
{
printf(“Average of %d and %d = %f\n”, b,
a,
(b + a)/2.0);
}
int main(int argc, char **argv)
{
int a = 5, b = 10;
average(a, b);
}
average
Main
5
10
a
b
b
a
5
10
ตวอยางการใชงาน(3)
#include <stdio.h>
void average(int x, int y)
{
printf(“Average of %d and %d = %f\n”, x,
y,
(x + y)/2.0);
}
int main(int argc, char **argv)
{
average((3+2), (100/10));
}
average
Main
3+2
100/10
x
y
5
10
ตวอยางการใชงาน(4)
#include <stdio.h>
void average(int a, int b)
{
a = 10;
b = 20;
}
int main(int argc, char **argv)
{
int a = 5, b = 10;
average(a, b);
}
average
Main
5
10
a
b
a
b
5
10
10
20
แบบฝกหด 1 : จงหาผลการรน
#include <stdio.h>
void disp(int a)
{
int i;
for(i = 1; i <= 12; i++)
printf(“%d x %d = %d\n”, a, i, (a*i));
}
int main(int argc, char **argv)
{
disp(5);
}
แบบฝกหด 2 : จงหาผลการรน
#include <stdio.h>
void plus5(int x)
{
x = x + 5;
printf(“X in plus5 = %d\n”, x);
}
int main(int argc, char **argv)
{
int x = 10;
printf(“X in main before calling function = %d\n”, x);
plus5( x );
printf(“X in main after calling function = %d\n”, x);
}
แบบฝกหด 3 : จงหาผลการรน
#include <stdio.h>
void swap(int a, int b) {
int tmp;
tmp = a;
a = b;
b = tmp;
printf(“In swap : A = %d, B = %d\n”, a, b);
}
int main(int argc, char **argv) {
int a = 5, b = 10;
printf(“Before swap A = %d, B = %d\n”, a, b);
swap(a, b);
printf(“After swap A = %d, B = %d\n”, a, b);
}
ฟงกชนทมการสงคากลบออกจากฟงกชน
ฟงกชนทมการสงคากลบออกจากฟงกชนดวย โดยสวนใหญแลวฟงกชน
ประเภทนมกจะใชกบงานประเภททตองการค านวณคา
ในการเรยกใชงานฟงกชนประเภททมการสงคากลบ เราจ าเปนจะตองสราง
ตวแปรทมประเภทขอมลเดยวกนกบประเภททฟงกชน
คาทสงกลบจากฟงกชน จะใชค าสง return ซงสามารถคนไดคาเดยว
เทานน
int power3(int x) {
return( x * x * x);
}
ตวอยางการใชงาน(1)
#include <stdio.h>
int power3(int x) {
return( x * x * x);
}
int main(int argc, char **argv) {
int num;
num = power3(2);
printf(“2^3 = %d\n”, num);
}
power3
Main
?num
x
2
8
ตวอยางการใชงาน(2)
#include <stdio.h>
float average(int x, int y)
{
return( (x + y)/2.0 );
}
int main(int argc, char **argv)
{
int a = 5, b = 10; float f;
f = average(a, b);
printf(“Average of %d and %d = %f\n”,
a, b, f);
}
average
Main
5
10
a
b
x
y
5
10
?f
7.5
แบบฝกหด 4 : จงหาผลการรน
#include <stdio.h>
int multiply(int a, int b)
{
return (a * b);
}
int main(int argc, char **argv)
{
int a = 5, b = 10;
printf(“%d\n”, multiply(3,2));
printf(“%d\n”, multiply(a, 5));
printf(“%d\n”, multiply((3+2), (b – 6));
printf(“%d\n”, multiply( multiply(2,3), multiply(2, multiply(3, 2 -1))));
}
การเขยนโปรโตไทปส าหรบฟงกชน
โปรโตไทป (Prototype) คอ ค าสงอธบายรายละเอยดของฟงกชน
เปนค าสงทบอกใหตวแปรภาษาซรจกกบฟงกชนกอนทฟงกชนจะถกเรยกใช
งาน
ตามปกตถาตองการใหตวแปรภาษาซแปลความหมายของโปรแกรมให
ถกตอง เราจะตองเขยนฟงกชนทสรางข นเอง ไวกอนฟงกชน main( )
เนองจากถามการเรยกใชฟงกชนกอนทจะเจอตวฟงกชน ตวแปรภาษาซจะ
เตอนวาไมรจกฟงกชน แตการเขยนโปรโตไทปจะท าใหเราสามารถยาย
ต าแหนงของฟงกชนไปไวสวนใดของโปรแกรมกได
int power3(int x) {
การประกาศโปรโตไทป
ซงรปแบบการเขยนโปรโตไทปจะเหมอนกบการเขยนบรรทดแรกสดของ
ฟงกชน คอ
ตวอยาง
type function-name (type arg-1, type arg-2, … );
int power3(int x) {
return( x * x * x);
}
Function Prototype
;
ตวอยางการใชงาน(1)
#include <stdio.h>
int power3(int x) {
return( x * x * x);
}
int main(int argc, char **argv) {
printf(“2^3 = %d\n”,
power3(2));
}
#include <stdio.h>
int main(int argc, char **argv) {
printf(“2^3 = %d\n”,
power3(2));
}
int power3(int x) {
return( x * x * x);
}
ถกตอง ไมถกตอง
int power3(int x);
ถกตอง
ตวแปรและขอบเขตการใชงานส าหรบฟงกชน
เมอมการสรางฟงกชนข นมาใชงานเพมในโปรแกรม การประกาศตวแปรใน
แตละฟงกชนนนจงตองมขอก าหนดและขอบเขตของตวแปรเพอปองกนความ
สบสนในการใชงาน
โดยประเภทของตวแปรในภาษาซจะแบงตามขอบเขตของการสรางและการ
ใชงานตวแปรของเปน 4 ประเภทใหญๆคอ
Local
Global
Extern
Static
ตวแปร local
ตวแปร local จะเรยกอกอยางหนงวา ตวแปร automatic
เปนตวแปรประเภททสรางข นมาภายในฟงกชน ขอบเขตการใชงานตวแปร
local กจะอยภายในฟงกชนทสรางตวแปรข นมาเทานน จะไมสามารถถก
เรยกใชงานจากฟงกชนอนได
ถามการสรางตวแปร local แลวมการตงชอซ ากนระหวางฟงกชน กถอวา
เปนคนละตวแปรกน การสงใหเปลยนคาทฟงกชนใดฟงกชนหนงจะไมสงผล
กระทบตออกฟงกชนหนงทใชชอตวแปร local เดยวกน
ตวอยางการใชงาน
#include <stdio.h>
void testLocal( ) {
int i = 10;
i += 5;
}
int main(int argc, char **argv) {
int i = 10;
printf(“i = %d\n”, i);
testLocal( );
printf(“i = %d\n”, i);
}
testLocal
Main
10i
10i
ผลการรน :
i = 10i = 10
15
ตวแปร global
ตวแปร global หรอเรยกอกอยางหนงวา ตวแปร external เปนตว
แปรประเภททสามารถเรยกใชงานจากฟงกชนใดกไดในโปรแกรม
โดยการสรางตวแปร global จะตองเขยนค าสงประกาศสรางไว ทสวน
ก าหนดคาเรมตนของโปรแกรมตอจากสวนของ Preprocessor โดย
ไมไดสรางไวภายในฟงกชนใดฟงกชนหนงโดยเฉพาะ
ขอบเขตการใชงานตวแปร global กคอตลอดทงโปรแกรมสามารถ
เรยกใชหรอเขยนค าสงเพอเปลยนแปลงคาของตวแปรประเภท global
จากฟงกชนใดกไดในโปรแกรม
การสรางตวแปรชนด Global
#include <stdio.h>
int i; // ประกาศตวแปร global
void testGlobal( ) {
i += 5;
}
int main(int argc, char **argv) {
i = 10;
printf(“i = %d\n”, i);
testGlobal( );
printf(“i = %d\n”, i);
}
ตวอยางการใชงาน
#include <stdio.h>
int i; // ประกาศตวแปร global
void testGlobal( ) {
i += 5;
}
int main(int argc, char **argv) {
i = 10;
printf(“i = %d\n”, i);
testGlobal( );
printf(“i = %d\n”, i);
}
testGlobal
Main
ผลการรน :
i = 10i = 15
Global
i ?1015
ล าดบในการเรยกใชตวแปรของฟงกชน
ถาชอตวแปรซ ากน ระหวางตวแปรประเภท Local และ Global
ฟงกชนจะเรยกใชงานตวแปรทเปน Local กอน
จากนนถาไมพบตวแปรนนใน Local จงจะคนหาและเรยกใชในสวน Global
ตวแปรทผานเขามาใหฟงกชน (parameter หรอ argument) จะเปน
ตวแปรประเภท Local
ดงนนจงหามตงชอซ ากนเนองจากจะคอมไพลไมผาน
void testFunc(int x) {
int x;
....
....
}
ชอซ า
แบบฝกหด 5 : จงหาผลการรน
#include<stdio.h>
int i=0;void disp(int i);void show();void main(void){
int i =9; printf(“i in main function = %d\n",i);disp(3); show( );
}
void disp(int i){i=5;printf(“i in function disp = %d\n",i);
}
void show() { printf("i in function show = %d\n",i); }
ฟงกชนมาตรฐาน (1)
ฟงกชนมาตรฐานทางคณตศาสตร (ตรโกณมต) #include <math.h>
ฟงกชนมาตราฐาน ค าอธบายsin(x) ฟงกชนส ำหรบหำคำ sine ของมม x ทมหนวยเปนเรเดยนcos(x) ฟงกชนส ำหรบหำคำ cos ของมม x ทมหนวยเปนเรเดยนtan(x) ฟงกชนส ำหรบหำคำ tan ของมม x ทมหนวยเปนเรเดยนasin(x) ฟงกชนส ำหรบหำคำ arcsin ของคา x จะคนคามมทมหนวยเปนเรเดยนacos(x) ฟงกชนส ำหรบหำคำ arccos ของคา x จะคนคามมทมหนวยเปนเรเดยนatan(x) ฟงกชนส ำหรบหำคำ arctan ของคา x จะคนคามมทมหนวยเปนเรเดยน
คณตศาสตรตรโกณมต
180 องศาดกร คอ π องศาเรเดยน (โดย π คอ 3.14…)
การแปลงมมองศาดกรใหเปนมมองศาเรเดยน สามารถท าไดโดยค านวณ
องศาเรเดยน =
การแปลงมมองศาเรเดยนใหเปนมมองศาดกร สามารถท าไดโดยค านวณ
องศาดกร =
ฟงกชนมาตรฐาน (2)
ฟงกชนมาตรฐานทางคณตศาสตร (ลอการธม, ยกก าลง และคาสมบรณ) #include <math.h>
ฟงกชนมาตราฐาน ค าอธบายexp(x) ฟงกชนส ำหรบหำคำ ex
log(x) ฟงกชนส ำหรบหำคำ log ฐาน e ของ x log10(x) ฟงกชนส ำหรบหำคำ log ฐาน 10 ของ x
ฟงกชนมาตราฐาน ค าอธบายpow(x, y) ฟงกชนส ำหรบหำคำเลขยกก ำลง xy
sqrt (x) ฟงกชนส ำหรบหำคำรำกทสองของ x fabs(x) ฟงกชนส ำหรบหำคำสมบรณของ x
ฟงกชนมาตรฐาน ค าอธบายfloor(x) ฟงกชนส ำหรบปดเศษทศนยมของ x ออกใหเปนจ านวนเตมceil(x) ฟงกชนส ำหรบปดเศษทศนยมของ x ขนใหเปนจ านวนเตม
round(x) ฟงกชนส ำหรบปดเศษทศนยมของ x ใหเปนจ านวนเตม ถาจดทศนยมมากกวาหรอเทากบ .5 จะปดขนนอกนนปด ง
ฟงกชนมาตรฐานเกยวกบตวอกษร <ctype.h>
ฟงกชนมาตรฐาน ค าอธบายtolower(ch) ฟงกชนทใชแปลงตวอกษร ch ใหเปนตวพมพเ กtoupper(ch) ฟงกชนทใชแป งตวอกษร ch ใหเปนตวพมพใหญislower(ch) ฟงกชนทใชตรวจสอบตวอกษร ch วำเปนตวพมพเลกหรอไม จะคนคำจรง(คำไม
เทำกบศนย) ถำ ch เปนตวพมพเลก นอกนนคนคำเทจหรอศนยisupper(ch) ฟงกชนทใชตรวจสอบตวอกษร ch วำเปนตวพมพใหญหรอไม จะคนคำจรง(คำ
ไมเทำกบศนย) ถำ ch เปนตวพมพใหญ นอกนนคนคำเทจหรอศนยisalnum(ch) ฟงกชนจะใหคำกลบคนออกมำเปนจรง(คาไมเทากบศนย) ถาตวแปร ch มคา
เปน 'A' - 'Z' , 'a' - 'z' , แ ะ '0' – '9' นอกนนจะใหคาเปนเทจหรอศนยisalpha(ch) ฟงกชนจะใหคำกลบคนออกมำเปนจรง(คาไมเทากบศนย) ถาตวแปร ch มคา
เปน 'A' - 'Z' , แ ะ 'a' - 'z' นอกนนจะใหคาเปนเทจหรอศนยisdigit(ch) ฟงกชนจะใหคำกลบคนออกมำเปนจรง(คาไมเทากบศนย) ถาตวแปร ch มคา
เปน '0' - '9' นอกนนจะใหคาเปนเทจหรอศนยispunct(ch) ฟงกชนจะใหคำกลบคนออกมำเปนจรง(คาไมเทากบศนย) ถาตวแปร ch มคา
เปนตวเชอมตางๆ เชน #, <, @, > แ ะอนๆ นอกนนจะใหคำเปนเทจหรอศนย
ฟงกชนมาตรฐานเกยวกบขอความ <string.h>
ฟงกชนมาตรฐาน ค าอธบาย
strcpy(str1, str2) ฟงกชนส ำหรบคดลอก (copy) ขอควำมจำกตวแปร str2 ไปเกบยงตวแปร str1
strcat(str1, str2) ฟงกชนส าหรบเชอมตอขอความโดยการน าขอความในตวแปรstr2 ไปตอทำยขอควำมในตวแปร str1 โดยผลลพธจะเกบไวในตวแปร str1
strcmp(str1, str2) ฟงกชนส ำหรบเปรยบเทยบขอควำมในตวแปร str1 และ str2 ถำขอควำมเหมอนกนจะคนคำศนย
strlen(str) ฟงกชนส ำหรบหำควำมยำวของขอควำมใน str