วันพุธที่ 8 มิถุนายน พ.ศ. 2559

เริ่มต้นใช้งานอาดุยโน่ : บทที่ 7 ฟังก์ชัน (function)


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

การใช้งานฟังก์ชั่น สามารถช่วยลดการซ้ำซ้อนของโปรแกรม เพราะฟังก์ชันสามารถใช้แทนกลุ่มของคำสั่ง เช่นคำสั่งที่มีการใช้ซ้ำหลายครั้ง การเรียกใช้ฟังก์ชันสามารถแทนการทำงานนั้นได้ทั้งหมดนอกจากนี้ยังสามารถใช้แทนวิธีการคำนวณได้

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

การประกาศฟังก์ชัน
คือการบอกให้โปรแกรมรู้ว่า ชื่อนี้คือฟังก์ชั่น คล้ายๆกับตัวแปร แต่จะต้องระบุข้อมูลเพิ่มเติม

บริเวณที่ใช้ประกาศฟังก์ชั่น คือนอกวงเล็บปีกกาของ setup และ loop

ชนิดของตัวแปรที่ส่งกลับ  ชื่อฟังก์ชัน ( ชนิดตัวแปรที่รับเข้า  ชื่อตัวแปรที่รับเข้า){
การทำงานของฟังก์ชัน
 } 

การส่งส่งกลับค่าจะใส่ประเภทตัวแปรที่ต้องการส่งกลับ เช่น char ,int ,float เป็นต้น ถ้าไม่มีการส่งคืนให้ใส่ void   และถ้าไม่มีการรับค่า ไม่ต้องใส่ชนิดตัวแปร และชื่อตัวแปร

สำหรับชื่อฟังก์ชัน จะใช้กฎการตั้งชื่อเหมือนกับตัวแปร และไม่ควรซ้ำกับชื่อของอะไรก็ตามที่เราตั้งชื่อไว้ในโปรแกรม

การเรียกใช้ฟังก์ชัน

ชื่อฟังก์ชัน ( ค่าที่ส่งให้ฟังก์ชัน ) ; 




จุดนี้อาจจะยากสักหน่อยที่จะเข้าใจ งั้นลองไปดูตัวอย่างกันก่อน

การใช้งานฟังก์ชันแบบไม่ส่งกลับค่าและไม่รับค่า

ฟังก์ชั่นที่ไม่ส่งกลับค่า และไม่รับค่า จะเป็นการเขียนการทำงานย่อย เช่น




 
ข้อสังเกต

จากการอ่านโค๊ดคร่าวๆ จะเห็นว่า โปรแกรมทำงานตามคำสั่งที่ชี่อ saySth ก่อน   จากนั้นจึงแสดงข้อความ "some thing that after function"    ซึ่งคำสั่ง saySth นั้นไม่มีอยู่จริงในภาษาซี แต่เป็นคำสั่งที่เราสร้างขึ้นมา โดยเมื่อเราเรียกใช้คำสั่ง saySth นั้น  โปรแกรมจะกระโดดไปยังบรรทัดที่มีการประกาศฟังก์ชั่น แล้วเริ่มการทำงานตั้งแต่ปีกกาเปิดของฟังก์ชัน กระทั่งจบที่ปีกกาปิด จึงเป็นการสิ้นสุดการทำงาน
จากนั้นโปรแกรมจะกลับไปทำงานต่อจากจุดที่มันกระโดดมา


ToolTips
การสร้างฟังก์ชันขึ้นมาเพื่อแสดงถึงการทำงานซึ่งเฉพาะเจาะจง ควรตั้งชื่อฟังก์ชันให้สอดคล้องกับการทำงาน

การใช้งานฟังก์ชันแบบรับค่าแต่ไม่คืนค่า

ฟังก์ชันที่รับค่า แต่ไม่คืนค่า  ก็คือฟังก์ชั่นที่ต้องการข้อมูลบางอย่างในการทำคำสั่ง เช่น


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

ลักษณะการทำงานของโปรแกรมยังเป็นเช่นเดิม ในจุดของการรับค่าในฟังก์ชั่น มีการประกาศตัวแปร  int Time ไว้ในฟังก์ชั่น   ซึ่งค่าของตัวแปร Time นั้น จะโยงกับค่าที่ใส่ไว้ในวงเล็บ

**ผู้อ่านสามารถทดลองใส่ค่าอื่นๆเข้าไปในฟังก์ชั่นได้

สำหรับค่าที่รับเข้ามาในฟังก์ชันนั้น สามารถรับได้หลายค่า แต่จะต้องระบุค่าให้ครบตอนที่เรียกใช้ เช่น


สรุปก็คือ สามามารถใส่ค่ารับเข้าในฟังก์ชันมากกว่าหนึ่งค่า  โดยคั่นด้วยเครื่องหมายจุลภาค (, ) 

การใช้งานฟังก์ชันแบบส่งกลับค่า


ฟังก์ชันที่คืนค่า ก็คือฟังก์ชั่นที่ส่งค่ากลับไปยังโปรแกรม ซึ่งจะมีการรับค่า หรือไม่ก็ได้
การส่งกลับค่านั้น จะใช้คำสั่ง
return ค่าที่ส่งกลับ;

สำหรับการใช้งานฟังก์ชั่นที่คืนค่า จะมีการใช้งานที่หลากหลาย เช่น ฟังก์ชั่นในการคำนวณ



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

การทำงานของโปรแกรม จะมีการรับค่าเข้ามาสองค่า คือ a และ b จากนั้นนำมาคำนวณ และส่งกลับค่าออกไป


ข้อควรระวัง
  -  ตัวแปรที่ return จะต้องเป็นชนิดเดียวกับชนิดการส่งกลับที่ระบุไว้ตอนประกาศ
   - การ return จะเป็นการออกจากการทำงานของฟังก์ชันทันที

บทสรุป
setup และ  loop ก็คือการประกาศฟังก์ชัน ซึ่งถูกกำหนดการคืนค่าและการรับค่าไว้แล้ว  เรามีหน้าที่กำหนดการทำงานภายใน  โดยจะมีโปรแกรมใหญ่ที่เรียกใช้งานฟังก์ชั่นทั้งสองนี้ซ่อนอยู่ โดยจะเรียก setup(); ก่อน 1 ครั้ง จากนั้นจะวนซ้ำโดยไม่มีเงื่อนไขเพื่อเรียก loop();

การเรียกใช้ฟังก์ชัน และการเรียกใช้ตัวแปรนั้นคล้ายกัน แต่ฟังก์ชั่นจะมี () ต่อท้ายชื่อ


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

ภาคผนวก   เครื่องหมายทางไวยากรณ์
วงเล็บปีกกา {}
คือเครื่องหมายที่แสดงถึงขอบเขตของคำสั่ง เพื่อรวมเป็นกลุ่มเดียว
หากชุดคำสั่งมีบรรทัดเดียว ไม่จำเป็นต้องใส่ปีกกาก็ได้ เช่น

if(a>5)Serial.println(a);
else Serial.println("none");
การเขียนแบบนี้ คำสั่งที่จะถูกข้ามเมื่อเงื่อนไขผิดก็คือ คำสั่งที่อยู่ต่อจากวงเล็บเงื่อนไข
นอกจากนี้ ยังสามารถใช้ได้กับ while for ได้อีกด้วย ส่วนในกรณีของ  switch case นั้น โดยทั่วไปคำสั่งจะมีหลายบรรทัด จะไม่ควรใช้

for(a;a<5;a++)Serial.println(a);
หรือ
while(1);

จะสังเกตว่า แม้ไม่มีคำสั่ง ก็ต้องใส่เพื่อแสดงว่าจบการทำงาน
ยกเว้น การประกาศฟังชั่น จะต้องใส่วงเล็บปีกกาเสมอ

เครื่องหมายลูกน้ำ หรือจุลภาค ( , )
นอกจากจะแยกข้อมูลที่รับเข้าในฟังก์ชันแล้ว ยังใช้รวมการดำเนินการไว้ในประเภทเดียวกันได้อีกด้วย
เช่น การประกาศตัวแปร
int a = 5,b =3,c = 16;
หรือ
int a ,b,c;

แบบนี้ ตัวแปร a b c จะเป็นตัวแปร int ทั้งหมด

หรือใช้รวมคำสั่งเป็นชุดเดียว

 if(a)Serial.println(a),Serial.println("xx");
เนื่องจาก if ที่ไม่มีปีกกา จะทำงานตามคำสั่งชุดเดียว แต่การคั่นด้วยลูกน้ำ ก็สามารถรวมคำสั่งไว้เป็นชุดเดียวกันได้ แต่ก็ต้องมี ( ; ) ปิดท้ายคำสั่ง

"แต่เพื่อความง่ายก็ ใส่ปีกกาเถอะครับ "

และนอกจากจะมีเครื่องหมาย ++ , -- ที่เอาไว้เพิ่มลดค่าตัวแปรทีละหนึ่งแล้ว ยังมีเครื่องหมาย += , -= , *= ,  / =  ด้วย โดยกลุ่มตัวดำเนินการนี้จะมีลักษณะการใช้งานคล้ายกันคือ

a += b  หมายถึง a = a+b;

ก็จบแล้วสำหรับบทนี้ ถ้าตรงไหนมีข้อสงสัยสามารถโพสถามไว้ได้เลยนะครับ

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

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