430 likes | 549 Views
C Programming. Lecture no. 6: Function. ความสัมพันธ์ (Relations). ตัวอย่างในชีวิตจริง ความสัมพันธ์ระหว่างงานกับรายได้ต่อเดือน ความสัมพันธ์ระหว่างการเป็นสมาชิกกับพรรคการเมือง ความสัมพันธ์ระหว่างแม่กับลูก ความสัมพันธ์ระหว่างจำนวนเต็มสองจำนวนที่หารด้วย 5 ลงตัว. ความสัมพันธ์ (Relations).
E N D
C Programming Lecture no. 6: Function
ความสัมพันธ์ (Relations) ตัวอย่างในชีวิตจริง • ความสัมพันธ์ระหว่างงานกับรายได้ต่อเดือน • ความสัมพันธ์ระหว่างการเป็นสมาชิกกับพรรคการเมือง • ความสัมพันธ์ระหว่างแม่กับลูก • ความสัมพันธ์ระหว่างจำนวนเต็มสองจำนวนที่หารด้วย 5 ลงตัว 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} 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 } 310222 C Programming
ฟังก์ชัน(Function) 310222 C Programming
ฟังก์ชันในมุมมองของนักคณิตศาสตร์ฟังก์ชันในมุมมองของนักคณิตศาสตร์ สำหรับเซต A และเซต B ใดๆ • เราสามารถกำหนดความสัมพันธ์ระหว่างเซต A และเซต B ได้หลายรูปแบบ • สามารถนับจำนวนความสัมพันธ์ได้ ถ้าเซต A และเซต B เป็นเซตจำกัด • n(A) = m และ n(B) = n แล้ว n(A x B) = mn 310222 C Programming
ฟังก์ชันในมุมมองของนักคณิตศาสตร์ฟังก์ชันในมุมมองของนักคณิตศาสตร์ • ความสัมพันธ์ระหว่างระยะทางกับเวลา • เป็นความสัมพันธ์ระหว่างเซตของเวลากับเซตองระยะทาง จะสังเกตได้ว่าเมื่อเวลาเปลี่ยนระยะทางก็จะเปลี่ยนด้วย • ความสัมพันธ์ระหว่างนักเรียนที่ได้ระดับคะแนนวิชาคณิตศาสตร์เป็น 4,3,2,1,0 เป็นความสัมพันธ์ระหว่างเซตของนักเรียนที่เรียนวิชาคณิตศาสตร์ กับ เซตผลการเรียน คือ 4,3,2,1,0 จะสังเกตได้ว่านักเรียนที่เรียนคณิตศาสตร์แต่ละคนได้รับระดับคะแนนเพียงระดับเดียว • ความสัมพันธ์แบบนี้ เราเรียกว่า ฟังก์ชัน 310222 C Programming
ฟังก์ชันในมุมมองของนักคณิตศาสตร์ฟังก์ชันในมุมมองของนักคณิตศาสตร์ • นิยาม 4.กำหนดให้ A และ B เป็นเซตใดๆให้ f เป็นความสัมพันธ์จาก A ไป B จะกล่าวได้ว่า f เป็นฟังก์ชันก็ต่อเมื่อ สำหรับแต่ละ x Є A และแต่ละ y, z Є Bถ้า (x, y) Є f และ (x, z) Є f แล้ว y=z 310222 C Programming
ฟังก์ชันในมุมมองของนักคณิตศาสตร์ฟังก์ชันในมุมมองของนักคณิตศาสตร์ จากนิยามและข้อสังเกตของฟังก์ชันจะกล่าวได้ว่า • ฟังก์ชัน f คือ กฎที่ได้ผลลัพธ์เพียงอย่างเดียวที่สมนัยกับการใส่ข้อมูลเข้าไปในกฎนั้นๆ Input Output โปรแกรมคอมพิวเตอร์ x y 310222 C Programming
ฟังก์ชันในมุมมองของนักคณิตศาสตร์ฟังก์ชันในมุมมองของนักคณิตศาสตร์ • นิยาม 5. ให้ A และ B เป็นเซตใดๆและ f เป็นฟังก์ชัน A ไป B ถ้า (x, y) Є f เรียก y ว่าตัวแปรตามที่ขึ้นกับตัวแปรอิสระ x นิยามโดย y เป็นค่าของฟังก์ชัน f ที่ x เขียนแทนด้วย y=f(x) 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) 310222 C Programming
ฟังก์ชันในมุมมองของนักคณิตศาสตร์ฟังก์ชันในมุมมองของนักคณิตศาสตร์ f(x) g(f(x)) Input โปรแกรม คอมพิวเตอร์ Output โปรแกรม คอมพิวเตอร์ Output x z y (g○f)(x) Input Output โปรแกรมคอมพิวเตอร์ x z 310222 C Programming
ฟังก์ชัน (Function in C) • การออกแบบโปรแกรมในภาษาซีจะอยู่บนพื้นฐานของการออกแบบโมดูล (Module Design) • โดยการแบ่งโปรแกรมออกเป็นงานย่อย ๆ (หรือโมดูล) แต่ละงานย่อยจะทำงานอย่างใดอย่างหนึ่งเท่านั้น และไม่ควรจะมีขนาดใหญ่จนเกินไป • งานย่อยเหล่านี้เมื่อนำไปเขียนโปรแกรมในภาษาซีจะเป็นการเขียนในลักษณะของฟังก์ชัน 310222 C Programming
ตัวอย่างที่ 1 โปรแกรมเพื่อบวกเลขสองจำนวนที่รับจากผู้ใช้ และแสดงผลการคำนวณ สามารถแบ่งการทำงานเป็นงานย่อยได้ดังนี้ รับข้อมูล 2 จำนวนจากผู้ใช้ บวกเลข 2 จำนวนแล้วเก็บผลลัพธ์ แสดงผลลัพธ์ของการทำงาน 310222 C Programming
ตัวอย่างที่ 1 (ต่อ) จะได้ว่าโปรแกรมประกอบด้วยฟังก์ชัน 4 ฟังก์ชันคือ ฟังก์ชันหลัก ฟังก์ชันการรับข้อมูล ฟังก์ชันในการบวกเลข ฟังก์ชันแสดงผลลัพธ์ 310222 C Programming
Source file Source file function function function function function function ขั้นตอนการสร้างโปรแกรมด้วยภาษา C Library file compile link Object file link Execute file link compile Object file 310222 C Programming
รูปแบบของฟังก์ชัน int , char , float , double ฯลฯ แบบที่ 1 ชนิดข้อมูลที่คืนค่า ชื่อฟังก์ชัน(การประกาศตัวแปร) { การประกาศตัวแปรภายในฟังก์ชัน; คำสั่ง; return (ค่าข้อมูลที่ต้องการส่งค่ากลับ); } 310222 C Programming
รูปแบบของฟังก์ชัน (ต่อ) แบบที่ 2 void ชื่อฟังก์ชัน(การประกาศตัวแปร) { การประกาศตัวแปรภายในฟังก์ชัน; คำสั่ง; } 310222 C Programming
ตัวอย่างที่ 2 แสดงการทำงานของโปรแกรมการบวกเลขจำนวนจริง 2 จำนวนที่รับจากผู้ใช้ #include <stdio.h> double InputDouble ( ) { double x; printf ( “\nInput real value : “ ); scanf ( “%.2f”, &x ); return ( x ); } 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 ); } 310222 C Programming
ตัวอย่างที่ 2 (ต่อ) void main ( ) { double a1, a2, sumVal; a1 = InputDouble( ); a2 = InputDouble( ); sumVal = SumDouble ( a1, a2 ); PrintOut ( sumVal ); } 310222 C Programming
การประกาศโพรโทไทป์ของฟังก์ชันการประกาศโพรโทไทป์ของฟังก์ชัน การประกาศโปรโตไทป์เป็นสิ่งจำเป็นในภาษาซีเนื่องจากภาษาซีเป็นภาษาในลักษณะที่ต้องมีการประกาศฟังก์ชันก่อนจะเรียกใช้ฟังก์ชันนั้น (Pre-defined Function) 310222 C Programming
จากตัวอย่างที่ 1จะเห็นว่าฟังก์ชัน main ( ) จะอยู่ใต้ฟังก์ชันอื่น ๆ ที่มีการเรียกใช้ เป็นลักษณะที่ต้องประกาศฟังก์ชันที่ต้องการเรียกใช้ก่อนจากเรียกใช้ฟังก์ชันนั้น • แต่หากต้องการย้ายฟังก์ชัน main ( ) ขึ้นไปไว้ด้านบน จะต้องมีการประกาศโปรโตไทป์ของฟังก์ชันที่ต้องการเรียกใช้ก่อนเสมอ 310222 C Programming
ตัวอย่างที่ 3 แสดงการทำงานของโปรแกรมการบวกเลขจำนวนจริง2 จำนวนที่รับจากผู้ใช้ ในลักษณะที่มีการประกาศโปรโตไทป์ #include <stdio.h> double InputDouble (double ); double SumDouble ( double , double ); void PrintOut ( double ); 310222 C Programming
ตัวอย่างที่ 3 (ต่อ) void main ( void ) { double a1, a2, sumVal; a1 = InputDouble( ); a2 = InputDouble( ); sumVal = SumDouble ( a1, a2 ); PrintOut ( sumVal ); } 310222 C Programming
จะเห็นว่าในโปรโตไทป์ไม่มีการประกาศชื่อตัวแปร มีแต่การเขียนประเภทของตัวแปรไว้ภายในเป็นการช่วยให้คอมไพเลอร์ สามารถตรวจสอบ • จำนวนของตัวแปร • ประเภทของตัวแปร • ประเภทของการคืนค่า • ภายในโปรแกรมว่ามีการเรียกใช้งานสิ่งต่างๆเกี่ยวกับฟังก์ชัน นั้นถูกต้องหรือไม่ นอกจากนี้เราอาจจะแยกส่วน โปรโตไทป์ไปเขียนไว้ในอินคลูชไฟล์ก็ได้เช่นเดียวกัน 310222 C Programming
การเรียกใช้ฟังก์ชัน การเรียกใช้ฟังก์ชันที่มีการคืนค่า จะใช้รูปแบบดังต่อไปนี้ ค่าที่รับ = ฟังก์ชัน (อาร์กิวเมนต์) ค่าที่ถูกคืนมาจากการทำงานของฟังก์ชั่น 310222 C Programming
a1 ต้องมีชนิดเป็น double เนื่องจากค่าที่จะส่ง คืนกลับมาจากฟังก์ชันมีชนิดเป็น double ตัวอย่างที่ 4 • a1 = InputDouble ( ); • ใช้คู่กับโปรโตไทป์ • double InputDouble ( ); 310222 C Programming
a1 และ a2 ต้องมีชนิดเป็น double เพื่อให้ตรงกับชนิดตัวแปรของอาร์กิวเมนท์ ที่ประกาศในโปรโตไทป์ ตัวอย่างที่ 5 • sumVal = SumDouble (a1,a2 ); • ใช้คู่กับโปรโตไทป์ • double InputDouble ( ); 310222 C Programming
ตัวอย่างที่ 6 • PrintOut( sumVal ); • ใช้คู่กับโปรโตไทป์ • void PrintOut ( double ); ประกาศให้รู้ว่าฟังก์ชั่นนี้ไม่มีการคืนค่า 310222 C Programming
ขอบเขต ( Scope) • การทำงานของโปรแกรมภาษาซี • จะทำงานที่ฟังก์ชัน main ( ) ก่อนเสมอ • เมื่อฟังก์ชัน main ( ) เรียกใช้งานฟังก์ชันอื่น ก็จะมีการส่งคอนโทรล (Control) ที่ควบคุมการทำงานไปยังฟังก์ชันนั้น ๆ จนกว่าจะจบฟังก์ชัน หรือพบคำสั่ง return 310222 C Programming
ขอบเขต ( Scope)(2) • เมื่อมีการเรียกใช้งานฟังก์ชันจะมีการจองพื้นที่หน่วยความจำสำหรับตัวแปรที่ต้องใช้ภายในฟังก์ชันนั้น • เมื่อสิ้นสุดการทำงานของฟังก์ชันก็จะมีการคืนพื้นที่หน่วยความจำส่วนนั้นกลับสู่ระบบ การใช้งานตัวแปรแต่ละตัวจะมีขอบเขตของการใช้งานขึ้นอยู่กับตำแหน่งที่ประกาศตัวแปรนั้น 310222 C Programming
ตัวอย่างที่ 7 จากตัวอย่างที่1 และตัวอย่างที่ 2 สามารถ แสดงขอบเขตการทำงานได้ดังนี้ step1 main ( ) a1 a1 = InputDouble( ); a2 sumVal x InputDouble ( ) 310222 C Programming
ตัวอย่างที่ 7 (ต่อ) main ( ) step2 a1 a2 sumVal a2 = InputDouble( ); x InputDouble ( ) 310222 C Programming
ตัวอย่างที่ 7 (ต่อ) Step3 main ( ) a1 a2 sumVal=SumDouble(a1,a2) sumVal x sumDouble ( ) y 310222 C Programming
ตัวอย่างที่ 7 (ต่อ) main ( ) step4 a1 a2 sumVal PrintSum(sumVal); x PrintSum ( ) 310222 C Programming
จะเห็นว่าตัวแปร x ที่ประกาศในแต่ละขั้นตอนจะทำงานอยู่ภายในฟังก์ชันที่มีการประกาศค่าเท่านั้น และใช้พื้นที่ในการเก็บข้อมูลคนละส่วนกัน ขอบเขตการทำงานของตัวแปรแต่ละตัวจะกำหนดอยู่ภายในบล็อกของคำสั่งภายในเครื่องหมายปีกกา ({ } ) หรือการประกาศในช่วงของการประกาศฟังก์ชัน เรียกตัวแปรเหล่านี้ว่า ตัวแปรโลคอล (Local Variable) 310222 C Programming
นอกจากนี้สามารถประกาศตัวแปรไว้ที่ภายนอกฟังก์ชันบริเวณส่วนเริ่มของโปรแกรมจะเรียกว่า ตัวแปรโกลบอล (Global Variable) ซึ่งเป็นตัวแปรที่สามารถเรียกใช้ที่ตำแหน่งใด ๆ ในโปรแกรมก็ได้ ยกเว้นในกรณีที่มีการประกาศตัวแปรที่มีชื่อเดียวกันกับตัวแปรโกลบอลภายในบล็อกหรือฟังก์ชัน 310222 C Programming
ตัวอย่างที่ 8 แสดงการทำงานของโปรแกรมในลักษณะที่มีตัวแปรโกลบอล แสดงขอบเขตการใช้งานของตัวแปรภายในโปรแกรม #include <stdio.h> int x; void func1 ( ) { x = x + 10; printf ( “func1 -> x : %d\n”, x ); } 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 ); } 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); } 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 310222 C Programming