วันเสาร์ที่ 27 ธันวาคม พ.ศ. 2557

ฟังก์ชันในภาษาซี

ฟังก์ชันในภาษาซี



     ในบทนี้จะอธิบายถึงฟังก์ชันในภาษาซีซึ่งกล่าวถึงการทำงาน

ของฟังชันก์ การสร้างฟังก์ชันและรูปแบบของฟังก์ชัน การส่งค่า

ลักษณะต่างๆ และจะกล่าวถึงฟังก์ชันมาตรฐานของภาษาซีด้วย


การเขียนโปรแกรมภาษาในภาษาซี 

การเขียนโปรแกรมในภาษาซีนั้นสามารถเขียนได้ 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









ไม่มีความคิดเห็น:

แสดงความคิดเห็น