ฟังก์ชันและการประยุกต์ ·...

24
02/10/58 1 1. การสร้างฟังก์ชัน 2. การประกาศตัวแปร 3. Library function 4. การประยุกต์ฟังก์ชัน 5. ฟังก์ชันเรียกซ้า (Recursive function) ฟังก์ชันและการประยุกต์ ฟังก์ชันแรกในภาษาซี (main) #include “stdio.h” void test() { int x, y, z; x = 100; y = 65; z = x + y; printf(“%d”,z); } void main() { test(); } #include “stdio.h” void main() { int x,y,z; x = 100; y = 65; z = x + y; printf(“%d”,z); } Test.exe เรียกใช้ฟังก์ชัน test()

Transcript of ฟังก์ชันและการประยุกต์ ·...

02/10/58

1

1. การสรางฟงกชน

2. การประกาศตวแปร 3. Library function 4. การประยกตฟงกชน

5. ฟงกชนเรยกซ า (Recursive function)

ฟงกชนและการประยกต

ฟงกชนแรกในภาษาซ (main) #include “stdio.h” void test() { int x, y, z; x = 100; y = 65; z = x + y; printf(“%d”,z); } void main() { test(); }

#include “stdio.h” void main() { int x,y,z; x = 100;

y = 65;

z = x + y; printf(“%d”,z); }

Test.exe เรยกใชฟงกชน test()

02/10/58

2

ฟงกชนในภาษาซ • ฟงกชนมาตรฐาน (Standard Function) เปนฟงกชนทอยในโปรแกรม เกบไวใน header fine ผใชจะตองรวาฟงกชนนน ๆ เกบอยในไฟลใด • ฟงกชนทเขยนขนเอง (user defined function) เขยนขนเพอใหท างานตามทตองการ เชน void cal_sum()

{ int x,sum = 0; for(x=1; x<=10;x++) sum = sum + x; }

ฟงกชน (function)

ฟงกชนเปนกลมค าสงทใชในการแบงโปรแกรมเปนสวนยอย ๆ เพอท างานอยางใดอยางหนง ฟงกชนนอาจมการสงขอมลไปและกลบระหวางฟงกชนได

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

ชนดขอมล ชอฟงกชน(การประกาศพารามเตอร) { การประกาศตวแปรเฉพาะท กลมค าสง [return] }

จะมหรอไมมขนการลกษณะของฟงกชน

คาทสงกลบ(ถาม)

02/10/58

3

ประเภทของฟงกชนทสรางขนเอง

• ฟงกชนทไมมการสงคาไปและรบคากลบ

• ฟงกชนทมการสงคาไปแตไมมการรบคากลบ

• ฟงกชนทมการสงคาไปและรบคากลบ

ถาหากแยกตามประเภทการสงคาไปกลบจะแยกไดดงน

ตวอยางเชนสงคาไปใหค านวณ

เชน สงใหพมพขอความ

เชนใหหาคาทเขามาทางอนพต

ฟงกชนทไมมทงการสงคาไปและรบคากลบ ฟงกชนประเภทนจะใหชนดของขอมลเปน void และภายในวงเลบใช void เพอบอกวาไมมการสงและรบคา และจะไมใชค าสง return

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

void funct_name(void) { local variable declaration; statement(); }

02/10/58

4

ฟงกชนทมการสงคาไปแตไมมการรบกลบ ฟงกชนประเภทนจะใหชนดของขอมลเปน void ภายในวงเลบจะมอารกวเมนต และจะไมใชค าสง return

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

void funct_name(type1 arg1, type2 arg2,……,typeN argN) { local variable declaration; statement(); }

void ADD(int a, int b) { int x; x = a+b; printf(“sum = %d”,x); }

ฟงกชนทมการสงคาไปและมการรบกลบ ฟงกชนประเภทนจะใหชนดของขอมลเปนประเภททจะสงกลบ ภายในวงเลบจะมอารกวเมนต และจะใชค าสง return สงคากลบมาใหฟงกชน

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

type funct_name(type1 arg1, type2 arg2,……,typeN argN) { local variable declaration; statement(); return (value); }

int ADD(int a, int b) { int x; x = a+b; return x; }

ขอมล ประเภทเดยวกน

02/10/58

5

#include <stdio.h>

void one(void);

void two(void);

void main(void)

{

clrscr( );

one( );

two( );

}

ตวอยางโปรแกรม สรางฟงกชนมาสองฟงกชน ไมมการสงและรบคา

void one( )

{

int a = 5, b = 7;

printf(“A = %d, B = %d\n”,a,b);

}

void two( )

{

float p = 4.5, q = 3.5;

printf(“P = %6.2f, Q = %6.2f\n”

,p,q);

} จะสงเกตเหนวาไมมพารามเตอร ไมม return

มการประกาศ Prototype

#include <stdio.h>

ตวอยางโปรแกรม สรางฟงกชนมาสองฟงกชน ไมมการสงและรบคา

void main(void )

{

clrscr( );

one( );

two( );

}

ถาหากสรางฟงกชนกอน main จะไมประกาศ Prototype กได

อกแบบ

void one( )

{

int a = 5, b = 7;

printf(“A = %d, B = %d\n”,a,b);

}

void two( )

{

float p = 4.5, q = 3.5;

printf(“P = %6.2f, Q = %6.2f\n”,p,q);

}

02/10/58

6

การเรยกใชฟงกชน

funct_name(argument_list); รปแบบ ชอฟงกชนทเรยกใช

ชอตวแปรหรอนพจนทใชสงคา

void one(void); void two(void); void main(void) { clrscr(); one(); two(); }

โปรแกรมหลก

int a = 5,b = 7; printf(…….);

float p = 4.5,q = 3.5; printf(…….);

ฟงกชน one()

ฟงกชน two()

การประกาศรปแบบฟงกชน (function prototype)

รปแบบการประกาศฟงกชน

คลายกบการประกาศตวแปร เพอบอกวาในโปรแกรมของเรามฟงกชนอะไรทสรางขนเอง ฟงกชนนน ๆ มการเรยกใชอยางไร ใชตวแปรอยางไร ต าแหนงทประกาศ ควรจะอยกอน main()

type funct_name(type1, type2,……,typeN); หรอ type funct_name(type1 arg1, type2 arg2 ,……, typeN argN);

ชนดของขอมลทจะสงกลบ

ชอฟงกชน รปแบบขอมลของ argument

ชออารกวเมนตทใชในการสงคาเขาฟงกชน

02/10/58

7

ตวอยางการประกาศรปแบบฟงกชน ตวอยาง 1. float add(int, float); 2. int sum(int p, int q); หรอ int sum(int, int); 3. void move(int, float, int); 4. float calculate(float, float); 5. void point(int*, int*, float);

ฟงกชนนไมมการคนคา จะรบอารกวเมนตเปน int, float และ int เชน move(5, 2.70, 12);

ฟงกชนนใชอารกวเมนตทเปนตวแปร แบบพอยนเตอร

การประกาศตวแปรของฟงกชน

ตวแปรแบบทวไป (global variables)

เปนตวแปรททกสวนของโปรแกรมสามารถเรยกใชได บางครงจะเรยกวาตวแปร เอกเทอรนล (External variables)

ตวแปรเฉพาะท (local variables)

เปนตวแปรทสรางขนภายในฟงกชน ใชในฟงกชนนน ๆ เมอออกจากฟงกชนคา ตวแปรจะหายไป การใชตวแปรประเภทนจะท าใหฟงกชนตาง ๆ สามารถใชชอ ตวแปรชอเดยวกนได ตวแปรประเภทนบางครงเรยกวา ออโตเมตก(automatic variable)

02/10/58

8

#include <stdio.h>

int a;

void Ex()

{

a = 5;

printf(“%d\n”,a);

}

ตวอยางการใชตวแปรแบบทวไปรวมกบฟงกชน

main()

{

a = 3;

printf(“%d\n”,a);

Ex();

printf(“%d\n”,a);

return 0;

}

3

5

5

#include <stdio.h>

int a;

void Ex()

{

int a;

a = 5;

printf(“%d\n”,a);

}

ตวอยางการใชตวแปรเฉพาะท

main()

{

a = 3;

printf(“%d\n”,a);

Ex();

printf(“%d\n”,a);

return 0;

}

3

5

3

02/10/58

9

#include <stdio.h>

int x,y;

int add_num(int a, int b)

{

int m;

m = a + b;

return m;

}

ตวอยางฟงกชนทคนคาเปนเลขจ านวนเตม

void main()

{

printf(“INPUT X “);

scanf(“%d”,&x);

printf(“INPUT Y “);

scanf(“%d”,&y);

printf(“%d + %d = %d\n”,

x,y,add_num(x,y) );

} สงตวแปร x,y ไปให a กบ b

#include <stdio.h>

void test_f(int a, int b, double f, char c, char s[20])

{

printf(“Integer %d, %d\n”,a, b);

printf(“Float %f\n”, f);

printf(“Char %c\n”, c);

printf(“String %s\n”,s);

}

void main()

{

test_f(23, 34, 3.564, ‘p’ ,Yellow River”);

}

ตวอยางการฟงกชนทสงผานตวแปรหลายประเภท

Integer 23, 34

Float 3.564000

Char p

String Yellow River

ผลการท าโปรแกรม

02/10/58

10

ฟงกชนมาตรฐาน

ฟงกชน sin(x), cos(x), tan(x) หาคาของฟงกชนโดยรบคามมเปนเรเดยน ฟงกชน sqrt(x)

หาคารากทสองของ x ฟงกชน exp(x) ฟงกชนหาคา ex โดย e มคาประมาณ 2.718282 ฟงกชน pow(x,y)

ใชหาคา xy โดย x เปนคาคงทหรอตวแปรทมคามากกวา 0 y เปนคายกก าลง ฟงกชน lox(x) , log10(x)

หาคา log ฐาน n และคา log ฐาน 10

ฟงกชนทางคณตศาสตร #include <math.h>

ตองรวารบขอมลเขาเปนอะไร และคนคาประเภทใดออกมา

#include “stdio.h”

#include “math.h”

main()

{

double r, pi = 3.14159;

r = pi/180; clrscr();

printf(“%f\n”,sin(r));

printf(“%f\n”,cos(r));

printf(“%f\n”,tan(r));

}

โปรแกรมหาคาจากฟงกชนตรโกณมต

ผลการรน

0.017452

0.999848

0.017455

อาจใช M_PI

360 องศา = 2*pi x องศา = (pi/180)*x

02/10/58

11

ฟงกชนทพบบอย ฟงกชน clrscr() ใชลบจอภาพ ฟงกชน gotoxy(x,y)

ก าหนดต าแหนงของเคอรเซอร ฟงกชน abs(x) หาคาสมบรณของ x ฟงกชน atoi(s)

เปลยนคาสตรง s ใหเปนเลขจ านวนเตม ฟงกชน atof(s)

เปลยนคาสตรง s ใหเปนเลขทศนยม

#include <stdio.h>

int f_x(int x);

main()

{

int i;

printf(“ x x2 + 3x + 1 \n”);

for(i = 1; i <= 10; i++)

printf(“%d %d \n”,i,f_x(i) );

getch();

}

ตวอยางการหาคาของ f(x) = x2 + 3x + 1

int f_x(int x)

{

int y;

y = x*x + 3*x + 1;

return y;

}

02/10/58

12

23

ตวอยาง แสดงการท างานของโปรแกรมการบวกเลขจ านวนจรง 2 จ านวนทรบจากผใช

#include <stdio.h> double InputDouble ( ) { double x; printf ( “\nInput real value : “ ); scanf ( “%.2f ”, &x ); return ( x ); }

24

ตวอยาง (ตอ)

double SumDouble ( double x, double y ) { return ( x + y ); } void PrintOut ( double x ) { printf ( “\n Result of sum is : %.2f”, x ); }

02/10/58

13

25

ตวอยาง (ตอ)

void main ( ) { double a1, a2, sumVal; a1 = InputDouble( ); a2 = InputDouble( ); sumVal = SumDouble ( a1, a2 ); PrintOut ( sumVal ); }

26

#include <stdio.h> double InputDouble ( ); double SumDouble ( double , double ); void PrintOut ( double );

ตวอยาง แสดงการท างานของโปรแกรมการบวกเลขจ านวนจรง 2 จ านวนทรบจากผใช ในลกษณะทมการประกาศโปรโตไทป

02/10/58

14

27

void main ( ) { double a1, a2, sumVal; a1 = InputDouble( ); a2 = InputDouble( ); sumVal = SumDouble ( a1, a2 ); PrintOut ( sumVal ); }

ตวอยาง (ตอ)

28

4.3 การเรยกใชฟงกชน

การเรยกใชฟงกชนทมการคนคา จะใชรปแบบดงตอไปน

คาทรบ = ฟงกชน (อารกวเมนต)

02/10/58

15

29

a1 = InputDouble ( ); ใชคกบโปรโตไทป

double InputDouble ( );

ตวอยาง a1 ตองมชนดเปน double เนองจากคาทจะสง

คนกลบมาจากฟงกชนมชนดเปน double

30

sumVal = SumDouble (a1,a2 ); ใชคกบโปรโตไทป

double InputDouble ( );

ตวอยาง a1 และ a2 ตองมชนดเปน double

เพอใหตรงกบชนดตวแปรของอารกวเมนท

ทประกาศในโปรโตไทป

02/10/58

16

31

PrintOut( sumVal ); ใชคกบโปรโตไทป

void PrintOut ( double );

ตวอยาง

ประกาศใหรวาฟงกชนนไมมการคนคา

32

ขอบเขต ( Scope)

การท างานของโปรแกรมภาษาซจะท างานทฟงกชน main ( ) กอนเสมอ เมอฟงกชน main ( ) เรยกใชงานฟงกชนอน กจะมการสงคอนโทรล (Control) ทควบคมการท างานไปยงฟงกชนนน ๆ จนกวาจะจบฟงกชน หรอพบค าสง return

02/10/58

17

33

เมอมการเรยกใชงานฟงกชนจะมการจองพนทหนวยความจ าส าหรบตวแปรทตองใชภายในฟงกชนนน และเมอสนสดการท างานของฟงกชนกจะมการคนพนทหนวยความจ าสวนนนกลบสระบบ การใชงานตวแปรแตละตวจะมขอบเขตของการใชงานขนอยกบต าแหนงทประกาศตวแปรนน

34

a1 a2

sumVal

main ( )

x InputDouble ( )

a1 = InputDouble( );

ตวอยาง

step1

จากตวอยางทผานมา สามารถแสดงขอบเขตการท างานไดดงน

02/10/58

18

35

a1 a2

sumVal

main ( )

x InputDouble ( )

a2 = InputDouble( );

ตวอยาง (ตอ)

step2

36

a1 a2

sumVal

main ( )

x sumDouble ( )

sumVal=SumDouble(a1,a2)

ตวอยาง (ตอ)

Step3

y

02/10/58

19

37

a1 a2

sumVal

main ( )

x PrintSum ( )

PrintSum(sumVal);

ตวอยาง (ตอ)

step4

38

จะเหนวาตวแปร x ทประกาศในแตละขนตอนจะท างานอยภายในฟงกชนทมการประกาศคาเทานน และใชพนทในการเกบขอมลคนละสวนกน

ขอบเขตการท างานของตวแปรแตละตวจะก าหนดอยภายบลอกของค าสงภายในเครองหมายปกกา ( { } ) หรอการประกาศในชวงของการประกาศฟงกชน เรยกตวแปรเหลานวา

ตวแปรโลคอล (Local Variable)

02/10/58

20

39

นอกจากนสามารถประกาศตวแปรไวทภายนอกฟงกชนบรเวณสวนเรมของโปรแกรมจะเรยกวา ตวแปรโกลบอล (Global Variable) ซงเปนตวแปรทสามารถเรยกใชทต าแหนงใด ๆ ในโปรแกรมกได ยกเวนในกรณทมการประกาศตวแปรทมชอเดยวกนตวแปรโกลบอลภายในบลอกหรอฟงกชน

ลองเขยนโปรแกรมวนลปรบตวเลข แลวคนคาเปนตวเลข char ch; ch = getch() – ‘0’;

02/10/58

21

คาคงทของฟงกชนทางคณตศาสตร

สญลกษณ ความหมาย

M_E e M_LOG2E log e M_LOG10E log(10) e M_LN2 ln 2 M_LN10 ln 10 M_PI pi M_PI_2 pi/2

ฟงกชนเรยกซ า (Recursive Function)

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

ตวอยาง

5! = 5 x 4 x 3 x 2 x 1

สามารถมองไดเปน

5! = 5 x 4 !

4 x 3! 3 x 2!

N! = N x (N-1)!

02/10/58

22

การคนคาของฟงกชน 5!

5 x 4!

4 x 3!

1

3 x 2!

2 x 1!

5!

5 x 4!

4 x 3!

1

3 x 2!

2 x 1! 2! = 2*1 = 2

5! = 5*24 = 120

4! = 4*6 = 24

3! = 3*2 = 6

#include <stdio.h>

long factorial(long)

main()

{

int i;

for(i = 1 ; i<= 10; i++)

printf(“%2d! = %ld\n”,i,factorial(i));

}

ตวอยางการฟงกชนหาคา factorial

long factorial(long number) { if (number <= 1) return 1; else return(number*factorial(number-1)); }

02/10/58

23

ฟงกชนสมตวเลข

#include "stdlib.h" #include "time.h" main() { srand(time(NULL)); printf("%d\n",rand()%10); getch();

}

นอนนาน งานนอย ใชมากหนอย เงนหมด

นอนมาก หนาสด เงนหมด หนาแหง

ท าโจทยดกวา

02/10/58

24

แบบฝกหดเพมเตม

1. จงเขยนฟงกชนตรวจสอบวากด y/Y หรอ n/N หรอไม

2. เขยนฟงกชนรบขอมล 10 คาแลวหาผลรวม 3. เขยนโปรแกรมหาคา sin, cos, tan โดยมมมเปนองศา ตงแต 0 ถง 90 โดยให

กระโดดครงละ 5

4. เขยนโปรแกรมหาคา f(x) = x2 +1

5. เขยนโปรแกรมหาพนทใตกราฟของ y(x) = x2 - 3x +2