ฟังก์ชันในภาษา C
ฟังก์ชัน (Functions) 2 การออกแบบโปรแกรมในภาษาซี จะอยู่บนพื้นฐานของการออกแบบ โมดูล (Module Design) โดยการแบ่ง โปรแกรมออกเป็นงานย่อย ๆ ( หรือ โมดูล ) แต่ละงานย่อยจะทำงานอย่าง ใดอย่างหนึ่งเท่านั้น และไม่ควรจะมี ขนาดใหญ่จนเกินไป งานย่อยเหล่านี้ เมื่อนำไปเขียนโปรแกรมในภาษาซีจะ เป็นการเขียนในลักษณะของฟังก์ชัน
3 รับข้อมูล 2 จำนวน จากผู้ใช้ บวกเลข 2 จำนวนแล้ว เก็บผลลัพธ์ แสดงผลลัพธ์ของการ ทำงาน โปรแกรมเพื่อบวกเลขสอง จำนวนที่รับจากผู้ใช้ และ แสดงผลการคำนวณ ตัวอ ย่าง สามารถแบ่งการทำงานเป็นงานย่อยได้ดังนี้
4 ฟังก์ชันการรับ ข้อมูล ฟังก์ชันในการบวกเลข ฟังก์ชันแสดงผลลัพธ์ จะได้ว่าโปรแกรมประกอบด้วย ฟังก์ชัน 4 ฟังก์ชันคือ ฟังก์ชันหลัก ตัวอย่าง ( ต่อ )
5 Source file function Source file function Object file Library file Execute file compile link ขั้นตอนการสร้างโปรแกรม ด้วยภาษา C
6 4.1 รูปแบบของ ฟังก์ชัน ชนิดข้อมูลที่คืนค่า ชื่อฟังก์ชัน ( การ ประกาศตัวแปร ) { การประกาศตัวแปรภายใน ฟังก์ชัน ; คำสั่ง ; return ( ค่าข้อมูลที่ต้องการ ส่งค่ากลับ ); } int, char, float, double ฯลฯ แบบที่ 1
7 รูปแบบของ ฟังก์ชัน ( ต่อ ) void ชื่อฟังก์ชัน ( การประกาศตัว แปร ) { การประกาศตัวแปรภายใน ฟังก์ชัน ; คำสั่ง ; } แบบที่ 2
8 ตัวอย่าง 4.1 แสดงการทำงานของ โปรแกรมการบวกเลข จำนวนจริง 2 จำนวนที่รับ จากผู้ใช้ #include double InputDouble ( ) { double x; printf ( “\nInput real value : “ ); scanf ( “%.2f ”, &x ); return ( x ); }
9 ตัวอย่าง 4.1 ( ต่อ ) double SumDouble ( double x, double y ) { return ( x + y ); } void PrintOut ( double x ) { printf ( “\n Result of sum is : %.2f”, x ); }
10 ตัวอย่าง 4.1 ( ต่อ ) void main ( ) { double a1, a2, sumVal; a1 = InputDouble( ); a2 = InputDouble( ); sumVal = SumDouble ( a1, a2 ); PrintOut ( sumVal ); }
การประกาศโพรโทไทป์ ของฟังก์ชัน การประกาศโปรโตไทป์เป็น สิ่งจำเป็นในภาษาซีเนื่องจาก ภาษาซีเป็นภาษาในลักษณะที่ต้อง มีการประกาศฟังก์ชันก่อนจะ เรียกใช้ฟังก์ชันนั้น (Predefined Function)
12 จากตัวอย่างที่ 4.1 จะเห็นว่าฟังก์ชัน main ( ) จะอยู่ใต้ฟังก์ชันอื่น ๆ ที่มีการ เรียกใช้ เป็นลักษณะที่ต้องประกาศ ฟังก์ชันที่ต้องการเรียกใช้ก่อนจาก เรียกใช้ฟังก์ชันนั้น แต่หากต้องการ ย้ายฟังก์ชัน main ( ) ขึ้นไปไว้ด้านบน จะต้องมีการประกาศโปรโตไทป์ของ ฟังก์ชันที่ต้องการเรียกใช้ก่อนเสมอ
13 #include double InputDouble ( ); double SumDouble ( double, double ); void PrintOut ( double ); ตัวอย่าง 4.2 แสดงการทำงานของ โปรแกรมการบวกเลข จำนวนจริง 2 จำนวนที่รับ จากผู้ใช้ ในลักษณะที่มี การประกาศโปรโตไทป์
14 void main ( ) { double a1, a2, sumVal; a1 = InputDouble( ); a2 = InputDouble( ); sumVal = SumDouble ( a1, a2 ); PrintOut ( sumVal ); } ตัวอย่าง 4.2 ( ต่อ )
15 จะเห็นว่าในโปรโตไทป์ไม่มีการ ประกาศชื่อตัวแปร มีแต่การเขียน ประเภทของตัวแปรไว้ภายใน เป็น การช่วยให้คอมไพเลอร์สามารถ ตรวจสอบจำนวนของตัวแปร ประเภทของตัวแปร ประเภทของ การคืนค่า ภายในโปรแกรมว่ามี การเรียกใช้งานสิ่งต่าง ๆ เกี่ยวกับ ฟังก์ชันนั้นถูกต้องหรือไม่ นอกจากนี้เราอาจจะแยกส่วนโปร โตไทป์ไปเขียนไว้ในอินคลูชไฟล์ก็ ได้เช่นเดียวกัน
การเรียกใช้ ฟังก์ชัน การเรียกใช้ฟังก์ชันที่มีการคืน ค่า จะใช้รูปแบบดังต่อไปนี้ ค่าที่รับ = ฟังก์ชัน ( อาร์กิวเมนต์ )
17 a1 = InputDouble ( ); ใช้คู่กับโปรโตไทป์ double InputDouble ( ); ตัวอย่ าง a1 ต้องมีชนิดเป็น double เนื่องจากค่าที่จะส่ง คืนกลับมาจากฟังก์ชันมีชนิดเป็น double
18 sumVal = SumDouble (a1,a2 ); ใช้คู่กับโปรโตไทป์ double InputDouble ( ); ตัวอย่ าง a1 และ a2 ต้องมีชนิดเป็น double เพื่อให้ตรงกับชนิดตัวแปรของอาร์กิวเมนท์ ที่ประกาศในโปรโตไทป์
19 PrintOut( sumVal ); ใช้คู่กับโปรโตไทป์ void PrintOut ( double ); ตัวอย่ าง ประกาศให้รู้ว่าฟังก์ชันนี้ไม่มีการคืนค่า
ขอบเขต ( Scope) การทำงานของโปรแกรม ภาษาซีจะทำงานที่ฟังก์ชัน main ( ) ก่อนเสมอ เมื่อฟังก์ชัน main ( ) เรียกใช้งานฟังก์ชันอื่น ก็จะมีการ ส่งคอนโทรล (Control) ที่ควบคุม การทำงานไปยังฟังก์ชันนั้น ๆ จนกว่าจะจบฟังก์ชัน หรือพบ คำสั่ง return
21 เมื่อมีการเรียกใช้งานฟังก์ชันจะมี การจองพื้นที่หน่วยความจำ สำหรับตัวแปรที่ต้องใช้ภายใน ฟังก์ชันนั้น และเมื่อสิ้นสุดการ ทำงานของฟังก์ชันก็จะมีการคืน พื้นที่หน่วยความจำส่วนนั้นกลับสู่ ระบบ การใช้งานตัวแปรแต่ละตัว จะมีขอบเขตของการใช้งาน ขึ้นอยู่กับตำแหน่งที่ประกาศตัว แปรนั้น
22 a1 a2 sumVal main ( ) x InputDouble ( ) a1 = InputDouble( ); ตัวอย่ าง step1 จากตัวอย่าง 4.1 และ 4.2 สามารถแสดงขอบเขตการ ทำงานได้ดังนี้
23 a1 a2 sumVal main ( ) x InputDouble ( ) a2 = InputDouble( ); ตัวอย่าง ( ต่อ ) step2
24 a1 a2 sumVal main ( ) x sumDouble ( ) sumVal=SumDouble(a1,a2) ตัวอย่าง ( ต่อ ) Step3 y
25 a1 a2 sumVal main ( ) x PrintSum ( ) PrintSum(sumVal); ตัวอย่าง ( ต่อ ) step4
26 จะเห็นว่าตัวแปร x ที่ประกาศใน แต่ละขั้นตอนจะทำงานอยู่ภายใน ฟังก์ชันที่มีการประกาศค่าเท่านั้น และ ใช้พื้นที่ในการเก็บข้อมูลคนละส่วนกัน ตัวแปรโลคอล (Local Variable) ขอบเขตการทำงานของตัวแปร แต่ละตัวจะกำหนดอยู่ภายบล็อกของ คำสั่งภายในเครื่องหมายปีกกา ( { } ) หรือการประกาศในช่วงของการ ประกาศฟังก์ชัน เรียกตัวแปรเหล่านี้ ว่า ตัวแปรโลคอล (Local Variable)
27 ตัว แปรโกลบอล (Global Variable) นอกจากนี้สามารถประกาศตัวแปร ไว้ที่ภายนอกฟังก์ชันบริเวณส่วน เริ่มของโปรแกรมจะเรียกว่า ตัว แปรโกลบอล (Global Variable) ซึ่ง เป็นตัวแปรที่สามารถเรียกใช้ที่ ตำแหน่งใด ๆ ในโปรแกรมก็ได้ ยกเว้นในกรณีที่มีการประกาศตัว แปรที่มีชื่อเดียวกันตัวแปรโกลบอล ภายในบล็อกหรือฟังก์ชัน
28 #include int x; void func1 ( ) { x = x + 10; printf ( “func1 -> x : %d\n”, x ); } ตัวอย่าง 4.3 แสดงการทำงานของ โปรแกรมในลักษณะที่มี ตัวแปรโกลบอล แสดง ขอบเขตการใช้งานของ ตัวแปรภายในโปรแกรม
29 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 ); } ตัวอย่าง 4.3 ( ต่อ )
30 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); } ตัวอย่าง 4.3 ( ต่อ )
31 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 ตัวอย่าง 4.3 ( ต่อ ) ผลการทำงาน