Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
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();
}
นอนนาน งานนอย ใชมากหนอย เงนหมด
นอนมาก หนาสด เงนหมด หนาแหง
ท าโจทยดกวา