710130 12 function

Page 1

โปรแกรมย่อย อาจารย์สมเกียรติ ช่อเหมือน สาขาวิชาวิศวกรรมซอฟต์แวร์ คณะวิทยาศาสตร์และเทคโนโลยี (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 2 void main(){ function(); //3 function(); function(); getch(); } void function(){ printf("test Function.\n"); } //1

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> parameter #include <conio.h> void input_function(int no); void main(){ agument input_function(8); getch(); } void input_function(int no){ printf("input no.%d",no); }


อาร์กิวเมนต์ของฟังก์ชัน (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; printf("fn1 x=%d y=%d\n",x,y); return x ; }

#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); printf( "main x=%d y= %d\n",x,y); getch(); }


ตัวชี้ (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); printf("main x=%d\n",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); for(int i=x;i<=y;i++){ printf("adress:%d | value: %d\n",&r[i],r[i]); } getch(); }


สรุป • โปรแกรมย่อยเป็นการแบ่งโปรแกรมออกเป็นส่วนเล็กๆ แล้วนามา ประกอบเข้ากัน แบ่งเป็นฟังก์ชัน และโพรซีเยอร์ เพื่อให้สามารถนา กลับมาใช้ใหม่ได้ • การสร้างโปรแกรมย่อยส่วนใหญ่จะมีการรับพารามิเตอร์และคืนค่ากลับ • การเรียกใช้ฟังก์ชัน มีสองวิธีในการส่งผ่านอาร์กิวเมนต์ – วิธีการคัดลอกค่า – วิธีการอ้างอิงค่า

• วิธีการอ้างอิงค่าจะใช้ตัวชี้เพื่อระบุตาแหน่งของหน่วยความจา – ช่วยให้สามารถดาเนินการกับหน่วยความจาได้


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.