ฟังก์ชันในมุมมองของนักคณิตศาสตร์

Download Report

Transcript ฟังก์ชันในมุมมองของนักคณิตศาสตร์

C Programming
Lecture no. 6:
Function
ความสัมพันธ์ (Relations)
ตัวอย่างในชีวิตจริง
• ความสัมพันธ์ระหว่างงานกับรายได้ ตอ่ เดือน
• ความสัมพันธ์ระหว่างการเป็ นสมาชิกกับพรรคการเมือง
• ความสัมพันธ์ระหว่างแม่กบั ลูก
• ความสัมพันธ์ระหว่างจานวนเต็มสองจานวนที่หารด้ วย 5 ลงตัว
Department of Computer Science
2
310222 C Programming
ความสัมพันธ์ (Relations)
• คูอ่ นั ดับ (a, b) พบว่า (a, b) ≠ (b, a)
• นิยาม 1. ให้ (a, b) และ (c, d) เป็ นคูอ่ นั ดับใดๆ แล้ ว
(a, b) = (c, d) ก็ตอ่ เมื่อ (a=c) และ (b=d)
• นิยาม 2. ให้ A และ B เป็ นเซตใดๆ ผลคูณคาร์ ทีเซียนของเซต A
และเซต B จะเขียนแทนด้ วย AxB คือ เซตของคูอ่ นั ดับ (a,b) ที่
a Є A และ b Є B นันคื
้ อ
AxB = {(a, b) | a Є A และ b Є B}
Department of Computer Science
3
310222 C Programming
ความสัมพันธ์ (Relations)
• นิยาม 3. ให้ r เป็ นความสัมพันธ์จาก A ไป B และ s เป็ น
ความสัมพันธ์จาก B ไป C ความสัมพันธ์ประกอบของ r และ s
เป็ นความสัมพันธ์จาก A ไป C เขียนแทนด้ วย s ○ r กาหนดโดย
s ○ r = {(x,z)| มี y Є B ที่ (x,y) Є r และ (y,z) Є S }
Department of Computer Science
4
310222 C Programming
ฟั งก์ ชนั
Department of Computer Science
(Function)
5
310222 C Programming
ฟังก์ ชันในมุมมองของนักคณิตศาสตร์
สาหรับเซต A และเซต B ใดๆ
• เราสามารถกาหนดความสัมพันธ์ระหว่างเซต A และเซต B ได้
หลายรูปแบบ
• สามารถนับจานวนความสัมพันธ์ได้ ถ้ าเซต A และเซต B เป็ นเซต
จากัด
– n(A) = m และ n(B) = n แล้ ว n(A x B) = mn
Department of Computer Science
6
310222 C Programming
ฟังก์ ชันในมุมมองของนักคณิตศาสตร์
• ความสัมพันธ์ระหว่างระยะทางกับเวลา
r  {(t, s)     | s  2t 2  t  1}
• เป็ นความสัมพันธ์ระหว่างเซตของเวลากับเซตองระยะทาง จะสังเกตได้ วา่ เมื่อ
เวลาเปลี่ยนระยะทางก็จะเปลี่ยนด้ วย
• ความสัมพันธ์ระหว่างนักเรี ยนที่ได้ ระดับคะแนนวิชาคณิตศาสตร์ เป็ น
4,3,2,1,0 เป็ นความสัมพันธ์ระหว่างเซตของนักเรี ยนที่เรี ยนวิชาคณิตศาสตร์
กับ เซตผลการเรี ยน คือ 4,3,2,1,0 จะสังเกตได้ วา่ นักเรี ยนที่เรี ยนคณิตศาสตร์
แต่ละคนได้ รับระดับคะแนนเพียงระดับเดียว
• ความสัมพันธ์แบบนี ้ เราเรี ยกว่า ฟั งก์ชนั
Department of Computer Science
7
310222 C Programming
ฟังก์ ชันในมุมมองของนักคณิตศาสตร์
• นิยาม 4. กาหนดให้ A และ B เป็ นเซตใดๆ ให้ f เป็ น
ความสัมพันธ์จาก A ไป B จะกล่าวได้ วา่ f เป็ นฟั งก์ชนั ก็ตอ่ เมื่อ
สาหรับแต่ละ x Є A และแต่ละ y, z Є B
ถ้ า (x, y) Є f และ (x, z) Є f แล้ ว y=z
Department of Computer Science
8
310222 C Programming
ฟังก์ ชันในมุมมองของนักคณิตศาสตร์
จากนิยามและข้ อสังเกตของฟั งก์ชนั จะกล่าวได้ วา่
• ฟั งก์ชนั f คือ กฎที่ได้ ผลลัพธ์เพียงอย่างเดียวที่สมนัยกับการใส่ข้อมูลเข้ าไป
ในกฎนันๆ
้
x
Input
Department of Computer Science
โปรแกรมคอมพิวเตอร์
9
Output
y
310222 C Programming
ฟังก์ ชันในมุมมองของนักคณิตศาสตร์
• นิยาม 5. ให้ A และ B เป็ นเซตใดๆ และ f เป็ นฟั งก์ชนั A ไป B
ถ้ า (x, y) Є f เรี ยก y ว่าตัวแปรตามที่ขึ ้นกับตัวแปรอิสระ x
นิยามโดย y เป็ นค่าของฟั งก์ชนั f ที่ x เขียนแทนด้ วย y=f(x)
Department of Computer Science
10
310222 C Programming
ฟังก์ ชันในมุมมองของนักคณิตศาสตร์
• นิยาม 6. ให้ f:A->B และ g:B->C ฟั งก์ชนั ประกอบของ f และ g
เขียนแทนด้ วย g ○ f กาหนดโดย
(g ○ f)(a) = g(f(a))
สาหรับ a Є A
นันคื
้ อ (g ○ f) = {(x,y)| y Є B, (x,y) Є f และ (y,z) Є g}
A
B
C
a
f(a)
g(f(a))
(g○f)(a)
Department of Computer Science
11
310222 C Programming
ฟังก์ ชันในมุมมองของนักคณิตศาสตร์
x
Input
f(x)
โปรแกรม
คอมพิวเตอร์
Output
y
g(f(x))
โปรแกรม
คอมพิวเตอร์
Output
z
(g○f)(x)
x
Input
Department of Computer Science
โปรแกรมคอมพิวเตอร์
12
Output
z
310222 C Programming
ฟั งก์ ชัน (Function in C)
• การออกแบบโปรแกรมในภาษาซีจะอยู่บนพืน้ ฐาน
ของการออกแบบโมดูล (Module Design)
• โดยการแบ่ งโปรแกรมออกเป็ นงานย่ อย ๆ (หรื อ
โมดูล) แต่ ละงานย่ อยจะทางานอย่ างใดอย่ างหนึ่ง
เท่ านัน้ และไม่ ควรจะมีขนาดใหญ่ จนเกินไป
• งานย่ อยเหล่ านีเ้ มื่อนาไปเขียนโปรแกรมในภาษาซี
จะเป็ นการเขียนในลักษณะของฟั งก์ ชัน
Department of Computer Science
13
310222 C Programming
ตัวอย่ างที่ 1
โปรแกรมเพื่อบวกเลขสองจานวนที่รับจากผู้ใช้ และ
แสดงผลการคานวณ
สามารถแบ่ งการทางานเป็ นงานย่ อยได้ ดังนี ้
รั บข้ อมูล 2 จานวนจากผู้ใช้
บวกเลข 2 จานวนแล้ วเก็บผลลัพธ์
แสดงผลลัพธ์ ของการทางาน
Department of Computer Science
14
310222 C Programming
ตัวอย่ างที่ 1 (ต่ อ)
จะได้ ว่าโปรแกรมประกอบด้ วยฟั งก์ ชัน 4 ฟั งก์ ชันคือ
ฟั งก์ ชันหลัก
ฟั งก์ ชันการรั บข้ อมูล
ฟั งก์ ชันในการบวกเลข
ฟั งก์ ชันแสดงผลลัพธ์
Department of Computer Science
15
310222 C Programming
ขัน้ ตอนการสร้ างโปรแกรมด้ วยภาษา C
Source file
function compile
function
function
Source file compile
function
function
function
Department of Computer Science
Object
file
link
link
Library file
link
Execute
file
Object
file
16
310222 C Programming
รู ปแบบของฟั งก์ ชัน
int , char , float , double ฯลฯ
แบบที่ 1
ชนิดข้ อมูลที่คืนค่ า ชื่อฟั งก์ ชัน ( การประกาศตัวแปร )
{
การประกาศตัวแปรภายในฟั งก์ ชัน;
คาสั่ง;
return (ค่ าข้ อมูลที่ต้องการส่ งค่ ากลับ);
}
Department of Computer Science
17
310222 C Programming
รู ปแบบของฟั งก์ ชัน (ต่ อ)
แบบที่ 2
void ชื่อฟั งก์ ชัน ( การประกาศตัวแปร )
{
การประกาศตัวแปรภายในฟั งก์ ชัน;
คาสั่ง;
}
Department of Computer Science
18
310222 C Programming
ตัวอย่ างที่ 2
แสดงการทางานของโปรแกรมการบวกเลขจานวนจริง 2
จานวนที่รับจากผู้ใช้
#include <stdio.h>
double InputDouble ( ) {
double x;
printf ( “\nInput real value : “ );
scanf ( “%.2f ”, &x );
return ( x );
}
Department of Computer Science
19
310222 C Programming
ตัวอย่ างที่ 2 (ต่ อ)
double SumDouble ( double x, double y ) {
return ( x + y );
}
void PrintOut ( double x ) {
printf ( “\n Result of sum is : %.2f”, x );
}
Department of Computer Science
20
310222 C Programming
ตัวอย่ างที่ 2 (ต่ อ)
void main ( ) {
double a1, a2, sumVal;
a1 = InputDouble( );
a2 = InputDouble( );
sumVal = SumDouble ( a1, a2 );
PrintOut ( sumVal );
}
Department of Computer Science
21
310222 C Programming
การประกาศโพรโทไทป์ของฟั งก์ ชัน
การประกาศโปรโตไทป์เป็ นสิ่งจาเป็ นใน
ภาษาซีเนื่องจากภาษาซีเป็ นภาษาในลักษณะที่ต้อง
มีการประกาศฟั งก์ ชันก่ อนจะเรี ยกใช้ ฟังก์ ชันนัน้
(Pre-defined Function)
Department of Computer Science
22
310222 C Programming
• จากตัวอย่ างที่ 1จะเห็นว่ าฟั งก์ ชัน main ( ) จะอยู่
ใต้ ฟังก์ ชันอื่น ๆ ที่มีการเรี ยกใช้ เป็ นลักษณะที่
ต้ องประกาศฟั งก์ ชันที่ต้องการเรี ยกใช้ ก่อนจาก
เรี ยกใช้ ฟังก์ ชันนัน้
• แต่ หากต้ องการย้ ายฟั งก์ ชัน main ( ) ขึน้ ไปไว้
ด้ านบน จะต้ องมีการประกาศโปรโตไทป์ของ
ฟั งก์ ชันที่ต้องการเรี ยกใช้ ก่อนเสมอ
Department of Computer Science
23
310222 C Programming
ตัวอย่ างที่ 3
แสดงการทางานของโปรแกรมการบวกเลขจานวนจริง
2 จานวน ที่รับจากผู้ใช้ ในลักษณะที่มีการประกาศ
โปรโตไทป์
#include <stdio.h>
double InputDouble (double );
double SumDouble ( double , double );
void PrintOut ( double );
Department of Computer Science
24
310222 C Programming
ตัวอย่ างที่ 3 (ต่ อ)
void main ( void ) {
double a1, a2, sumVal;
a1 = InputDouble( );
a2 = InputDouble( );
sumVal = SumDouble ( a1, a2 );
PrintOut ( sumVal );
}
Department of Computer Science
25
310222 C Programming
จะเห็นว่ าในโปรโตไทป์ไม่ มีการประกาศชื่อตัวแปร มีแต่ การ
เขียนประเภทของตัวแปรไว้ ภายในเป็ นการช่ วยให้
คอมไพเลอร์ สามารถตรวจสอบ
•จานวนของตัวแปร
•ประเภทของตัวแปร
•ประเภทของการคืนค่ า
ภายในโปรแกรมว่ ามีการเรียกใช้ งานสิ่งต่ างๆเกี่ยวกับฟั งก์ ชัน
นัน้ ถูกต้ องหรือไม่ นอกจากนีเ้ ราอาจจะแยกส่ วน โปรโตไทป์
ไปเขียนไว้ ในอินคลูชไฟล์ กไ็ ด้ เช่ นเดียวกัน
Department of Computer Science
26
310222 C Programming
การเรี ยกใช้ ฟังก์ ชัน
การเรี ยกใช้ ฟังก์ ชันที่มีการคืนค่ า จะใช้
รู ปแบบดังต่ อไปนี ้
ค่ าที่รับ = ฟั งก์ ชัน (อาร์ กวิ เมนต์ )
ค่ าทีถ่ ูกคืนมาจากการทางานของฟั งก์ ช่ัน
Department of Computer Science
27
310222 C Programming
a1 ต้ องมีชนิดเป็ น double เนื่องจากค่ าที่จะส่ ง
คืนกลับมาจากฟังก์ชันมีชนิดเป็ น double
ตัวอย่ างที่ 4
a1 = InputDouble ( );
ใช้ ค่ ูกับโปรโตไทป์
double InputDouble ( );
Department of Computer Science
28
310222 C Programming
a1 และ a2 ต้ องมีชนิดเป็ น double
เพือ่ ให้ ตรงกับชนิดตัวแปรของอาร์ กวิ เมนท์
ที่ประกาศในโปรโตไทป์
ตัวอย่ างที่ 5
sumVal = SumDouble (a1,a2 );
ใช้ ค่ ูกับโปรโตไทป์
double InputDouble ( );
Department of Computer Science
29
310222 C Programming
ตัวอย่ างที่ 6
PrintOut( sumVal );
ใช้ ค่ ูกับโปรโตไทป์
void PrintOut ( double );
ประกาศให้ ร้ ูว่าฟังก์ ชั่นนี้ไม่ มีการคืนค่ า
Department of Computer Science
30
310222 C Programming
ขอบเขต ( Scope)
การทางานของโปรแกรมภาษาซี
• จะทางานที่ฟังก์ ชัน main ( ) ก่ อนเสมอ
• เมื่อฟั งก์ ชัน main ( ) เรี ยกใช้ งานฟั งก์ ชันอื่น ก็จะมี
การส่ งคอนโทรล (Control) ที่ควบคุมการทางานไปยัง
ฟั งก์ ชันนัน้ ๆ จนกว่ าจะจบฟั งก์ ชัน หรื อ พบคาสั่ง
return
Department of Computer Science
31
310222 C Programming
ขอบเขต ( Scope) (2)
• เมื่อมีการเรี ยกใช้ งานฟั งก์ ชันจะมีการจองพืน้ ที่
หน่ วยความจาสาหรั บตัวแปรที่ต้องใช้ ภายใน
ฟั งก์ ชันนัน้
• เมื่อสิน้ สุดการทางานของฟั งก์ ชันก็จะมีการคืน
พืน้ ที่หน่ วยความจาส่ วนนัน้ กลับสู่ระบบ การใช้
งานตัวแปรแต่ ละตัวจะมีขอบเขตของการใช้ งาน
ขึน้ อยู่กับตาแหน่ งที่ประกาศตัวแปรนัน้
Department of Computer Science
32
310222 C Programming
ตัวอย่ างที่ 7
จากตัวอย่ างที่1 และตัวอย่ างที่ 2 สามารถ
แสดงขอบเขตการทางานได้ ดังนี ้
main ( )
a1
a2
sumVal
step1
a1 = InputDouble( );
InputDouble ( ) x
Department of Computer Science
33
310222 C Programming
ตัวอย่ างที่ 7 (ต่ อ)
main ( )
a1
a2
sumVal
step2
a2 = InputDouble( );
InputDouble ( ) x
Department of Computer Science
34
310222 C Programming
ตัวอย่ างที่ 7 (ต่ อ)
Step3
main ( )
sumVal=SumDouble(a1,a2)
a1
a2
sumVal
sumDouble ( ) x
y
Department of Computer Science
35
310222 C Programming
ตัวอย่ างที่ 7 (ต่ อ)
main ( )
a1
a2
sumVal
PrintSum ( )
Department of Computer Science
step4
PrintSum(sumVal);
x
36
310222 C Programming
จะเห็นว่ าตัวแปร x ที่ประกาศในแต่ ละขัน้ ตอนจะ
ทางานอยู่ภายในฟั งก์ ชันที่มีการประกาศค่ าเท่ านัน้ และใช้
พืน้ ที่ในการเก็บข้ อมูลคนละส่ วนกัน
ขอบเขตการทางานของตัวแปรแต่ ละตัวจะกาหนดอยู่
ภายในบล็อกของคาสั่งภายในเครื่องหมายปี กกา ( { } ) หรือ
การประกาศในช่ วงของการประกาศฟั งก์ ชัน เรียกตัวแปร
เหล่ านีว้ ่ า ตัวแปรโลคอล (Local Variable)
Department of Computer Science
37
310222 C Programming
นอกจากนีส้ ามารถประกาศตัวแปรไว้ ท่ ภี ายนอกฟั งก์ ชัน
บริเวณส่ วนเริ่มของโปรแกรมจะเรี ยกว่ า
ตัวแปรโกลบอล (Global Variable) ซึ่งเป็ นตัว
แปรที่สามารถเรี ยกใช้ ท่ ตี าแหน่ งใด ๆ ในโปรแกรมก็ได้
ยกเว้ นในกรณีท่ มี ีการประกาศตัวแปรที่มีช่ ือเดียวกันกับ
ตัวแปรโกลบอลภายในบล็อกหรื อฟั งก์ ชัน
Department of Computer Science
38
310222 C Programming
ตัวอย่ างที่ 8
แสดงการทางานของโปรแกรมในลักษณะที่มีตัวแปรโกลบอล
แสดงขอบเขตการใช้ งานของตัวแปรภายในโปรแกรม
#include <stdio.h>
int x;
void func1 ( ) {
x = x + 10;
printf ( “func1 -> x : %d\n”, x );
}
Department of Computer Science
39
310222 C Programming
ตัวอย่ างที่ 8 (ต่ อ)
void func2 ( int x ) {
x = x + 10;
printf ( “func2 -> x : %d\n”, x );
}
void func3 ( ) {
int x=0;
x = x + 10;
printf ( “func3 -> x : %d\n”, x );
}
Department of Computer Science
40
310222 C Programming
ตัวอย่ างที่ 8 (ต่ อ)
void main ( ) {
x = 10;
printf ( “main (start) -> x : %d\n”, x );
func1 ( );
printf ( “main (after func1) -> x : %d\n”, x );
func2 ( x );
printf ( “main (after func2) -> x : %d\n”, x);
func3 ( );
printf ( “main (after func3) -> x : %d\n”, x);
}
Department of Computer Science
41
310222 C Programming
ตัวอย่ างที่ 8 (ต่ อ)
ผลการทางาน
main (start) -> x : 10
func1 -> x : 20
main (after func1) -> x : 20
func2 -> x : 30
main (after func2) -> x : 20
func3 -> x : 10
main (after func3) -> x : 20
Department of Computer Science
42
310222 C Programming
The End