โปรแกรมย่อย อาจารย์สมเกียรติ ช่อเหมือน สาขาวิชาวิศวกรรมซอฟต์แวร์ คณะวิทยาศาสตร์และเทคโนโลยี (tko@webmail.npru.ac.th)
เนื้อหาที่สนใจ โปรแกรมย่อย (subprogram) โปรแกรมย่อยหรือฟังก์ชัน (function) รูปแบบการประกาศและเรียกใช้ฟังก์ชัน การแยกส่วนของโปรแกรมด้วยฟังก์ชัน การรับส่งค่าข้อมูลระหว่างฟังก์ชัน อาร์กิวเมนต์ของฟังก์ชัน (Function Arguments) ตัวชี้ (Pointer) การคืนค่าข้อมูลกลับของฟังก์ชัน การรับส่งข้อมูลหลายค่าระหว่างฟังก์ชัน การจัดเก็บค่าลงในหน่วยความจำโดยใช้ตัวชี้ http://1.bp.blogspot.com/-tw1caa8lBus/Vphe8RV3rwI/AAAAAAAAAKM/wAhp-ds7iQM/s1600/8.png
โปรแกรมย่อย (subprogram) โปรแกรมย่อยใช้ในการประมวลผลข้อมูล แล้วอาจมีการส่งค่ากลับไปยังโปรแกรม หลัก (main program) การรับส่งข้อมูลในการคำนวณของโปรแกรมย่อยมี 2 แบบคือ แบบฟังก์ชัน (function) ซึ่งจะส่งค่ากลับไปยังโปรแกรมหลักได้ทีละค่า แบบโพรซีเยอร์ (procedure) ซึ่งจะส่งค่าที่คำนวณ กลับไปโปรแกรมหลักได้ทีละหลายค่า
โปรแกรมย่อยหรือฟังก์ชัน (function) การแบ่งโปรแกรมออกเป็นส่วนเล็กๆ แล้วนำมาประกอบเข้ากัน เป็นแนวคิดจากบนลงล่างซึ่งอาจเกิดการทำงานที่ซ้ำซ้อนกันได้ โดยหลักการแยกและประกอบถือเป็นหลักการที่สำคัญในการเขียนโปรแกรมขนาดใหญ่ เพิ่มประสิทธิภาพในการนำโค้ดกลับมาใช้ใหม่ ในการแยกส่วนด้วยการสร้างฟังก์ชันในภาษา C สามารถกำหนดฟังก์ชันได้ การประกาศหรือนิยามฟังก์ชัน เพื่อให้ส่วนหลักสามารถใช้งานได้ http://mathinsight.org/function_examples
ส่วยย่อยหรือฟังก์ชัน(function) กระบวนการประมวลผลของฟังก์ชันขึ้นอยู่กับความต้องการของผู้ใช้ ในการเรียกใช้ฟังก์ชันอาจมีการส่งข้อมูลที่ใช้ผ่านชื่อฟังก์ชันได้ ผลลัพธ์ที่ได้จากการประมวลผลจะถูกส่งกลับไปยังโปรแกรมหลัก
รูปแบบการประกาศและเรียกใช้ฟังก์ชัน 1) การประกาศฟังก์ชัน function(); 2) ประกาศให้ฟังก์ชันหลักทราบ 3) เรียกใช้ ฟังก์ชัน แบบไม่ส่งและรับค่ากลับมาประมวลผล #include <stdio.h> #include <conio.h> void function(); //2 void main(){ function(); //3 function(); getch(); } void function(){ printf("test Function.\n"); } //1 2 3 1
การแยกส่วนของโปรแกรมด้วยฟังก์ชัน #include <stdio.h> #include <conio.h> void function1(); void function2(); void main(){ function1(); function2(); getch(); }
การรับส่งค่าข้อมูลระหว่างฟังก์ชัน การส่งค่าลำดับที่ 8 ไปยัง input_function() ผ่านตัวแปร no เพื่อแสดงผล void ส่งค่าว่างเปล่า #include <stdio.h> #include <conio.h> void input_function(int no); void main(){ input_function(8); getch(); } void input_function(int no){ printf("input no.%d",no); parameter agument
อาร์กิวเมนต์ของฟังก์ชัน (Function Arguments) อาร์กิวเมนต์ต้องประกาศตัวแปรที่รับค่า เรียกว่าพารามิเตอร์ของฟังก์ชัน พารามิเตอร์ทำหน้าที่เหมือนตัวแปรที่ใช้ภายในฟังก์ชัน ถูกสร้างขึ้นเมื่อเข้าสู่ฟังก์ชันและถูกทำลายเมื่อออก การเรียกใช้ฟังก์ชัน มีสองวิธีในการส่งผ่านอาร์กิวเมนต์ไปยังฟังก์ชัน Call by value วิธีนี้จะคัดลอกค่าที่แท้จริงของอาร์กิวเมนต์เป็นพารามิเตอร์ Call by reference วิธีนี้จะคัดลอกที่อยู่ของอาร์กิวเมนต์เป็นพารามิเตอร์ ค่าเริ่มต้นของภาษาซี ใช้วิธี Call by value https://eganenergy.com/industry-expertise/messaging/
Call by value int fn1(int x , int y) { y = x- 1 ; x*=10; #include <stdio.h> #include <conio.h> void main() { int x = 2 , y = 4; printf( "main x=%d y= %d\n",x,y); y = fn1(x,y); getch(); } int fn1(int x , int y) { y = x- 1 ; x*=10; printf("fn1 x=%d y=%d\n",x,y); return x ; }
ตัวชี้ (Pointer) ตัวแปรทุกตัวคือตำแหน่งหน่วยความจำ ทุกตำแหน่งของหน่วยความจำสามารถเข้าถึงได้โดยใช้เครื่องหมาย (&) ไม่ต้องประกาศตัวแปรเพิ่ม ช่วยให้ประหยัดหน่วยความจำ ใช้ตัวชี้ร่วมกับการส่งผ่านค่าแบบอ้างอิงกับหน่วยความจำ ทำให้ไม่ต้องคัดลอกค่า ทำให้ทำงานได้เร็วขึ้น ใช้ตัวชี้จองหน่วยความจำตามขนาดที่ต้องการในภายหลัง ตัวชี้จะใช้วิธีการที่เรียกว่า linked list ทำให้สามารถจองหน่วยความจำที่ว่างไม่ติดกัน
การเข้าถึงหน่วยความจำด้วยตัวชี้ (&) #include <stdio.h> #include <conio.h> int main() { int var1; char var2[10]; printf("Address of var1 variable: %x\n", &var1 ); printf("Address of var2 variable: %x\n", &var2 ); getch(); return 0; } https://www.tutorialspoint.com/cprogramming/c_pointers.htm
การประกาศตัวชี้ (*) ตัวชี้เป็นตัวแปรที่มีค่าเป็นที่อยู่ของตัวแปรคือ ที่อยู่หน่วยความจำ #include <stdio.h> #include <conio.h> void main() { int var = 20; // การประกาศตัวแปรทั่วไป int *ip; // การประกาศตัวชี้ ip = &var; // เก็บตำแหน่งที่อยู่ของ var ในตัวชี้ ip printf("Address of var variable: %x\n", &var ); // ตำแหน่งที่จัดเก็บในตัวชี้ ip printf("Address stored in ip variable: %x\n", ip ); // ค่าจริงที่ตัวชี้ ip ชี้อยู่ printf("Value of *ip variable: %d\n", *ip ); getch(); } http://cecilsunkure.blogspot.com/2010/11/pointers-basics.html
Call by reference #include <stdio.h> #include <conio.h> void fn1(int *px) { *px=20; printf("fn1 *px=%d\n" , *px); } void main() int x = 6 ; printf("main x=%d\n",x); fn1(&x); getch(); http://www.javawithus.com/tutorial/call-by-value-and-call-by-reference
การคืนค่าข้อมูลกลับของฟังก์ชัน เมื่อเรียกใช้ฟังก์ชัน output_func() จะคืนค่าตัวเลขระหว่าง 0-999 มาที่ฟังก์ชันหลัก เพื่อใช้แสดงผลรหัส 4 หลัก #include <stdio.h> #include <conio.h> #include <stdlib.h> int output_func(); void main(){ int id=output_func(); printf("id:%.4d",id); getch(); } int output_func(){ int r=rand()%1000; return r;
การรับส่งค่าข้อมูลและคืนค่าข้อมูลของฟังก์ชัน การส่งค่า f ไปยังฟังก์ชัน output_func และคืนค่า r เพื่อแสดง id 4 หลัก #include <stdio.h> #include <conio.h> #include <stdlib.h> int output_func(int f); void main(){ int id=output_func(23); printf("id:%.4d",id); getch(); } int output_func(int f){ int r; if(f>=500) r=rand() % 1000; else r=f; return r;
การรับส่งข้อมูลหลายค่าระหว่างฟังก์ชัน #include <stdio.h> #include <conio.h> void input_func(int no,char name[10]); void main(){ input_func(18,"somkiat"); getch(); } void input_func(int no,char name[10]){ printf("input no.%d name:%s",no,name);
การจัดเก็บค่าลงในหน่วยความจำโดยใช้ตัวชี้ ใช้การคืนข้อมูลเป็นชุด เช่น Array, struct, Union, Object ร่วมกับ ตัวชี้ #include <stdio.h> #include <conio.h> void fn1(int x , int y,int *r) { for(int i=x;i<=y;i++){ r[i]=i*6; } } void main() { int r[10]; int x = 1 , y = 4; fn1(x,y,r); printf("adress:%d | value: %d\n",&r[i],r[i]); } getch();
สรุป โปรแกรมย่อยเป็นการแบ่งโปรแกรมออกเป็นส่วนเล็กๆ แล้วนำมาประกอบเข้ากัน แบ่งเป็นฟังก์ชัน และโพรซีเยอร์ เพื่อให้สามารถนำกลับมาใช้ใหม่ได้ การสร้างโปรแกรมย่อยส่วนใหญ่จะมีการรับพารามิเตอร์และคืนค่ากลับ การเรียกใช้ฟังก์ชัน มีสองวิธีในการส่งผ่านอาร์กิวเมนต์ วิธีการคัดลอกค่า วิธีการอ้างอิงค่า วิธีการอ้างอิงค่าจะใช้ตัวชี้เพื่อระบุตำแหน่งของหน่วยความจำ ช่วยให้สามารถดำเนินการกับหน่วยความจำได้