บทที่ 5
ฟังก์ชันของภาษา c
ในบทนี้จะอธิบายถึงฟังก์ชัน   ในภาษาซีซึ่งกล่าวถึงการทำงานของฟังชันก์   การสร้างฟังก์ชันและรูปแบบของฟังก์ชัน   การส่งค่าลักษณะต่าง ๆ และจะกล่าวถึงฟังก์ชันมาตรฐานของภาษาซีด้วย
การเขียนโปรแกรมภาษาในภาษาซี
การเขียนโปรแกรมในภาษาซีนั้นสามารถเขียนได้ 2 แบบ
แบบที่ 1 เขียนแบบโครงสร้าง
                หรือเป็นบรรทัดไปเรื่อย ๆ หรือทั้งโปรแกรมมีเพียงหนึ่งฟังก์ชันคือ ฟังชันก์ main( ) การเขียนแบบนี้มีข้อดีคือ  เหมาะสำหรับโปรแกรมสั้น ๆ แต่เมื่อนำไปใช้กับโปรแกรมที่มีขนาดยาวถ้าในโปรแกรมมีชุดคำสั่งที่ซ้ำกัน และการตรวจสอบหาข้อผิดพลาดนั้นทำได้ยาก  เพราะจะต้องรันทั้งโปรแกรม
แบบที่ 2 เขียนแบบฟังก์ชัน
เป็นการเขียนโปรแกรมโดยแบ่งการทำงานของโปรแกรมออกเป็นฟังก์ชันย่อย   แต่ยังต้องมีฟังก์ชัน main( ) อยู่เหมือนเดิม  แต่ฟังก์ชัน main( ) นี้จะไปเรียกฟังก์ชันอื่นขึ้นมาทำงานต่อไป   การเขียนแบบนี้มีข้อดีคือ การทำงานของโปรแกรมนั้นตรวจสอบได้ง่าย  เพราะสามารถรันเฉพาะฟังก์ชันได้   และทำให้ตัวโปรแกรมนั้นสั้นลงในกรณีที่ชุดคำสั่งที่เหมือนกัน   ซึ่งโปรแกรมเมอร์เกือบทั้งหมดนิยมเขียนในลักษณะนี้
การเขียนโปรแกรมแบบฟังก์ชัน
การเขียนโปรแกรมแบบฟังก์ชันมีขั้นตอนดังนี้
1. ประกาศฟังก์ชันที่ต้องการไว้ในส่วนแรกของโปรแกรม
2. เรียกใช้ฟังก์ชันที่ประกาศไว้
3. กำหนดหรือสร้างรายละเอียดของฟังก์ชันนั้น

โปรแกรม 5 – 1 แสดงขั้นตอน 3 ขั้นตอนของการสร้างฟังก์ชัน

           จากตัวอย่างข้างต้นจะเห็นได้ว่า   สิ่งที่จำเป็นสำหรับเรื่องฟังก์ชันก็คือ   ชื่อของฟังก์ชันเพราะถ้าเรียกใช้  หรือประกาศชื่อฟังก์ชันไว้ไม่ตรงกัน  โปรแกรมที่เขียนขึ้นก็จะเกิด Error  ขึ้นมาได้   ฉะนั้นจะต้องรู้ว่าโปรแกรมที่เขียนนั้นมีฟังก์ชันอะไรบ้าง

การสร้างฟังก์ชัน

รูปที่ 5 – 2 ส่วนประกอบต่าง ๆ ของฟังก์ชัน

  

ส่วนหัวของฟังก์ชัน  ( Function Header )ประกอบด้วย 3 ส่วนหลัก  คือ  ชนิดข้อมูลของค่าที่ส่งกลับ  (Return Type )ชื่อฟังก์ชัน ( Function name )   และรายชื่อพารามิเตอร์ซึ่งจะมีการบอกชนิดข้อมูล  เหมือนการประกาศตัวแปร  และสามารถมีหลายตัวได้โดยเครื่องหมาย , คั้นระหว่างแต่ละพารามิเตอร์
ถ้าไม่ได้ใช้ Return type ภาษาซี จะถือว่ามีค่าที่ส่งกลับเป็นชนิดข้อมูลแบบ Integer  แล้ว ในส่วนรายละเอียดของฟังก์ชันจะต้องมีคำสั่ง Return  ด้วนในบรรทัดที่ต้องการออกจากฟังก์ชัน  ถ้าไม่ต้องการให้ฟังก์ชันนั้นมีการส่งค่ากลับ ให้ใส่ Return Type เป็น Void และไม่ต้องใส่คำสั่ง Return
และในส่วนของรายชื่อพารามิเตอร์   ถ้าไม่ต้องการส่งค่ากลับก็ไม่ต้องใส่ก็ได้ หรือใส่เป็น Void ไว้
ส่วนรายละเอียดของฟังก์ชัน ประกอบด้วย  การประกาศตัวแปรแบบ Local และ  ชุดคำสั่งต่าง ๆ ของฟังก์ชันนั้น   เมื่อต้องการจบฟังก์ชัน  ถ้ามีการใส่ Return Type  ไว้ก็ให้ส่งค่ากลับตามชนิดของ  Return Type  ที่ใส่ เช่น
return 0; แต่ถ้าไม่มีการส่งค่ากลับใส่  ก็ไม่จำเป็นต้องมีคำสั่ง return  หรือให้ใส่คำสั่งดังนี้ return ;


               

รูปที่ 5 – 3 แสดงตัวอย่างของฟังก์ชัน

รูปแบบของฟังก์ชัน
รูปแบบของฟังก์ชันของภาษา ซี มีอยู่ 4 รูปแบบ
แบบที่ 1 ฟังก์ชันแบบไม่มีการส่งค่ากลับ  และไม่มีพารามิเตอร์   เป็นฟังก์ชันที่ไม่มีการส่งค่ากลับไปให้กับฟังก์ชันที่เรียกมา  และไม่มีการส่งค่าจากฟังก์ชันที่เรียกมาให้ด้วย
แบบที่ 2 ฟังก์ชันแบบไม่มีการส่งค่ากลับ และพารามิเตอร์  เป็นฟังก์ชันที่จะไม่มีการส่งค่ากลับไปให้ฟังก์ชันที่เรียกขึ้นมา   แต่มีการส่งค่าจากฟังก์ชันที่เรียกมาให้ด้วย
แบบที่ 3 ฟังก์ชันแบบมีการส่งค่ากลับ  และไม่มีพารามิเตอร์  เป็นฟังก์ชันที่จะมีการส่งค่ากลับไปให้ฟังก์ชันที่เรียกมา   แต่ไม่มีการส่งค่าจากฟังก์ชันที่เรียกมาให้ด้วย
แบบที่ 4 ฟังก์ชันแบบมีการส่งค่ากลับ  และมีพารามิเตอร์  เป็นฟังก์ชันที่จะมีการส่งค่ากลับไปให้กับฟังก์ชันที่เรียกมา  แต่มีการส่งค่าจากฟังก์ชันที่เรียกมาให้ด้วย
โปรแกรม 5- 2 ตัวอย่างฟังก์ชันแบบไม่มีการส่งค่ากลับ   และไม่มีพารามิเตอร์
การประกาศฟังก์ชั่น (Prototype Declarations)
การประกาศฟังก์ชั่นนั้น  เป็นสิ่งที่จำเป็นต้องทำเสมอเมื่อจะสร้างฟังก์ชั่น  การประกาศฟังก์ชั่นนั้นจะประกาศอยู่ตรงส่วนบนสุดของโปรแกรม  หรือก่อนส่วนการประกาศตัวแปรแบบ Global ดังที่แสดงในตัวอย่างที่ 5-1 ซึ่งเมื่อสังเกตแล้วจะพบว่าการประกาศฟังก์ชั่นก็คือ  การตัดเอาเฉพาะส่วนหัวของฟังก์ชั่นไป  แล้วต่อฐานด้วยเครื่องหมาย ; นั่นเอง

การเรียกฟังก์ชั่น (Function Call)
การเรียกใช้ฟังก์ชั่นนั้น  จะต้องรู้ก่อนว่าฟังชั่นที่จะเรียกใช้มีรูปแบบเป็นอย่างไร  อาทิเช่น  มีการส่งค่ากลับหรือไม่  หรือต้องมีการส่งค่าพารามิเตอร์ไปให้ฟังก์ชันที่จะเรียกใช้หรือไม่เพื่อให้การใช้ฟังก์ชันนั้นถูกต้องและไม่มีข้อผิดพลาด  ซึ่งการเรียกใช้ฟังก์ชันสามารถดูได้จากตัวอย่างที่ 5-2 ถึง 5-5 ดังรูปที่ 5-4 แสดงตัวอย่างการเรียกใช้ฟังก์ชันแบบต่างๆที่สามารถทำได้

test(a,7);
test(6,b);
test(a+6,b);
test(test(a,b),b);

  

รูปที่ 5-4 แสดงตัวอย่างการเรียกใช้ฟังก์ชันแบบต่างๆ

ตัวอย่างโปรแกรม
โปรแกรม 5-6 โปรแกรมแสดงเลขหลักแรก

ผลลัพธ์ที่ได้
Enter an integer: 27
Least significant digit is: 7
โปรแกรม 5-7 โปรแกรมบวกค่าตัวเลขทั้งสองหลักแรกมาบวกกัน

 ผลลัพธ์ที่ได้
     Enter an integer: 23
     Sum of last two digits is:5
     Enter an integer: 8
     Sum of last two digits is:8

 

โปรแกรม 5-8 โปรแกรมแสดงตัวเลขในรูปแบบ Long Integer

ผลลัพธ์ที่ได้
            Enter a number with up to 6 digits: 123456
        The number you entered is 123,456

        Enter a number with up to 6 digits: 12
        The number you entered is 000,012
การส่งค่าผ่านพารามิเตอร์
ในภาษา C นั้นจะมีการส่งค่าผ่านพารามิเตอร์  หรือ  Parameter Passing ซึ่งสามารถแบ่งได้เป็น  3 ประเภทใหญ่ๆ  ดังนี้

การส่งค่าแบบกำหนดค่า (Pass by Value)
จากตัวอย่างที่ได้แสดงมาข้างต้นจะเป็นการส่งค่าในแบบกำหนดค่าทังหมด  ซึ่งเมื่อใดที่การส่งค่า  จะทำการคัดลอกข้อมูลไปให้กับพารามิเตอร์ในฟังก์ชันที่ถูกเรียก  การส่งค่าแบบนี้จะไม่ทำให้ค่าเดิมถูกเปลี่ยนแปลง ดังรูป 5-5 แสดงการส่งค่าแบบกำหนดค่า

การส่งค่าแบบอ้างอิง (Pass by Reference)
ในบางกรณี  จำเป็นที่จะต้องใช้การส่งค่าแบบอ้างอิง  ซึ่งการส่งค่าแบบนี้จะทำการเชื่อมระหว่าง  ตัวแปรที่ประกาศในฟังก์ชันที่เรียกกับพารามิเตอร์ในฟังก์ชันที่ถูกเรียกมีการเปลี่ยนค่า  ก็จะทำให้ค่าในตัวแปรของฟังก์ชันที่เรียกเปลี่ยนตามไปด้วย

การส่งค่าแบบอ้างที่อยู่(Pass by Address)
การส่งค่าแบบนี้จะใช้พอยเตอร์ซึ่งจะขอยกไปกล่าวในบทที่8

ฟังก์ชันมาตรฐาน
ในภาษา C ได้จัดเตรียมฟังก์ชันมาตรฐานต่างๆเอาไว้ให้ใช้มากมาย  ฟังก์ชันมาตรฐานต่างๆ จะอยู่ในStandard Library Files  ที่มีนามสกุลเป็น.h ถ้าต้องใช้ฟังก์ชันมาตรฐานเหล่านั้นจะต้องทราบก่อนว่าฟังก์ชันนั้นอยู่ใน Standard Library Files อันไหน แล้วนำเอา Standard Library Files นั้นเข้ามาโดยใช้คำสั่ง include
ยกตัวอย่างฟังก์ชันที่ใช้บ่อยๆ คือ ฟังก์ชัน scanf() , printf() ซึ่งถ้าจะใช้ฟังก์ชันทั้ง 2 นี้จะต้องนำเข้า Standard Library Files ที่ชื่อ stdio.h ก่อนจึงจะสามารถใช้ได้

ฟังก์ชันมาตรฐานทางคณิตศาสตร์
ถ้าต้องการใช้ฟังก์ชันมาตรฐานทางคณิตศาสตร์จะต้องนำเข้า  Standard Library Files 2ไฟล์ คือ math.h และ stdlib.h

          abs/fabs/labs ทั้ง3ฟังก์ชัน จะส่งค่ากลับเป็นค่า Absolute ของตัวเลขที่ส่งไปให้  ค่าAbsolute คือ ค่าทางบวกของค่านั้น สำหรับ abs ต้องมีการส่งพารามิเตอร์ที่มีชนิดข้อมูลเป็นตัวเลขจำนวนเต็มหรือ Integer สำหรับ labs ต้องมีการส่งพารามิเตอร์ที่มีชนิดข้อมูลเป็นตัวเลขที่เป็นทศนิยมหรือ Float-Point การประกาศฟังก์ชันของทั้ง 3 ฟังก์ชันเป็นดังนี้
int abs (Int number);
long labs(long number);
double fabs(double number);
ตัวอย่าง
abs(3)        ส่งค่ากลับเป็น 3
fabs(-3.4)   ส่งค่ากลับเป็น 3.4

ceil ฟังก์ชัน ceil หรือ ceiling เป็นฟังก์ชันที่จะหาค่าจำนวนเต็มที่มากกว่าหรือเท่ากับ ค่าที่ส่งไปให้ ตัวอย่างเช่น  หาค่า ceiling ของ 3.000001 จะเป็น 4.0 ถ้าพิจารณาแล้ว ผลของฟังก์ชัน ceil คือ ค่าตัวเลขจำนวนเต็มที่อยู่ทางด้านขวามือของค่าที่ส่งไปให้ ดังแสดงในรูปที่ 5-6

การประกาศฟังก์ชันของ ceil จะเป็นดังนี้
Double ceil (double number);
ตัวอย่าง
ceil(-1.9)              ส่งค่ากลับเป็น-1.0
ceil(1.1)               ส่งค่ากลับเป็น  2.0

floor ฟังก์ชัน floor เป็นฟังก์ชันที่จะหาค่าจำนวนเต็มที่น้อยกว่าหรือเท่ากับค่าที่ส่งไปให้ ตัวอย่างเช่น หาค่า floor ของ 3.99999 จะเป็น 3.0 ถ้าพิจารณาแล้ว ผลของฟังก์ชัน floor คือ ค่าตัวเลขจำนวนเต็มที่อยู่ทางด้านซ้ายมือของค่าที่ส่งไปให้  ดังแสดงในรูปที่ 4-6 โดยมีการประกาศฟังก์ชันเป็นดังนี้

                double floor(double number);
ตัวอย่าง
                floor(-1.1)            ส่งค่ากลับเป็น -2.0
                floor(1.9)             ส่งค่ากลับเป็น 1.0
pow ฟังก์ชัน pow เป็นฟังก์ชันที่หาค่า x ยกกำลังด้วย y หรือ xy ซึ่งมีการประกาศฟังก์ชันดังนี้

                double pow(double x,double y);
ตัวอย่าง
                pow(3.0,4.0)       ส่งค่ากลับเป็น 81.0
                pow(3.4,2.3)       ส่งค่ากลับเป็น 16.687893
sqrt ฟังก์ชัน sqrt เป็นฟังก์ชันที่หาค่ารากที่สองของค่าที่ส่งไปให้  ซึ่งมีการประกาศฟังก์ชันเป็นดังนี้ double sqrt(double number);
                ตัวอย่าง
          sqrt(25.0)            ส่งค่ากลับเป็น 5.0