function - kmutnb

37
FUNCTION 030523300- Computer Programming Asst. Prof. Dr. Choopan Rattanapoka

Upload: others

Post on 23-Jan-2022

3 views

Category:

Documents


0 download

TRANSCRIPT

FUNCTION030523300- Computer Programming

Asst. Prof. Dr. Choopan Rattanapoka

Function

ในการท างานบางอยางจ าเปนตองใชค าสงมากวาหนงค าสงเพอท างานนนให

ส าเรจ ซงค าสงทเขยนรวมกนไวเพอใชงานจะเรยกวา ฟงกชน(function)

ทผานมาเราไดเรยกใชงานฟงกชนในภาษาซมาบางแลว เชน

printf( )

scanf( )

ฟงกชนเหลานเปนฟงกชนมาตรฐานใน ภาษาซหรอไลบรารฟงกชน

รปแบบของฟงกชน

โครงสรางของโปรแกรมทเขยนดวยภาษาซ ภายในโปรแกรมจะประกอบดวยฟงกชนตางๆ

โดยจะไมมค าสงทเขยนเดยวๆ อยนอกฟงกชน

อยางนอยทสดในโปรแกรมจะตองมหนงฟงกชนเสมอนนคอ ฟงกชน main( ) ซงเปน

ฟงกชนหลกทโปรแกรมภาษาซจะเรมตนท างานจากจดน จากนนภายในฟงกชน main( )

อาจจะมการเรยกใชฟงกชนอนๆ

โครงสรางการเรยกใชงานฟงกชน

การท างานของฟงกชน

Input

Output

ฟงกชนในภาษาซ

ฟงกชนในภาษาซสามารถแบงออกเปน 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