Computer Programming I โดย อ.วิมลศรี เกตุโสภณ สาขาวิชาระบบสารสนเทศ บทที่ 6 ฟังก์ชัน Computer Programming I โดย อ.วิมลศรี เกตุโสภณ สาขาวิชาระบบสารสนเทศ
จุดประสงค์การเรียนรู้ 1 รู้เกี่ยวกับหลักการทำงานฟังก์ชั่น 1.1 บอกความหมายของฟังก์ชัน 1.2 อธิบายการทำงานของฟังก์ชัน 1.3 บอกประเภทของฟังก์ชัน 2 มีทักษะการสร้างฟังก์ชัน 2.1 เขียนคำสั่งสำหรับสร้างฟังก์ชัน 2.2 เขียนคำสั่งสำหรับฟังก์ชันที่มี Input Parameter 2.3 เขียนคำสั่งสำหรับฟังก์ชันที่มี การคืนค่ากลับ(Return) 2.4 เขียนคำสั่งเรียกใช้ฟังก์ชัน
เนื้อหาสาระ ความหมายของฟังก์ชัน การทำงานของฟังก์ชัน ประเภทของฟังก์ชัน 1. หลักการทำงานฟังก์ชั่น
เนื้อหาสาระ รูปแบบการเขียนฟังก์ชัน Input Parameter การคืนค่ากลับ(Return) การเรียกใช้ฟังก์ชัน 2. การสร้างฟังก์ชัน
1. หลักการทำงานของฟังก์ชั่น ภาษาซีเป็นโปรแกรมแบบมีโครงสร้าง (Structured programming หรือ modular programming) การเขียนโปรแกรมแบบมีโครงสร้าง คือ แบ่งโปรแกรมทั้งหมดออกเป็นส่วนย่อยหลายๆ ส่วน เรียกส่วนย่อยนั้นว่า โปรแกรมย่อย (subroutines) แต่ละส่วนจะทำงานเพียงอย่างเดียว เพื่อความสะดวกและรวดเร็ว ในการพัฒนาและแก้ไขโปรแกรม การเขียนโปรแกรมในภาษา C แบบมีโครงสร้าง แบ่งโปรแกรมทั้งหมด ออกเป็นโปรแกรมย่อยๆ เรียกว่า ฟังก์ชัน จะต้องมีฟังก์ชันอย่างน้อย 1 ฟังก์ชันเสมอ main( ) โปรแกรมจะเริ่มที่ main( ) เสมอ main( ) เป็นฟังก์ชันหลักของโปรแกรมภาษา C
1.1 ความหมายของฟังก์ชั่น ฟังก์ชัน คือ ชุดการทำงานที่ถูกเขียนขึ้นให้โปรแกรมเมอร์สามารถเรียกใช้งานได้โดยง่าย ส่วนหัวของโปรแกรมภาษา C ฟังก์ชัน main( ) คำสั่งเรียกใช้ฟังก์ชัน ฟังก์ชัน A B C ฟังก์ชัน printf ฟังก์ชัน scanf ( ) ฟังก์ชัน sqrt (x)
1.1 ความหมายของฟังก์ชั่น ปัญหาที่เกิดขึ้นในการพัฒนาโปรแกรมที่ซับซ้อน โปรแกรมเมอร์ไม่สามารถทราบการทำงานของระบบโดยละเอียดได้ เช่น ไม่ทราบกระบวนการส่งข้อมูลผ่านเครือข่าย แต่จำเป็นต้องเขียนโปรแกรมเพื่อเชื่อมต่อกับระบบเครือข่าย โปรแกรมเมอร์ไม่สามารถทราบขั้นตอนการทำงานของคอมพิวเตอร์ทั้งหมดได้ เช่น ทำอย่างไรตัวอักษรจึงปรากฏในจอภาพได้ โปรแกรมบางโปรแกรมมีการทำงานที่ซับซ้อนและการทำงานที่ซับซ้อนนั้นถูกเรียกใช้บ่อยครั้ง เช่น การหาผลลัพธ์ทางวิทยาศาสตร์ เป็นต้น
1.1 ความหมายของฟังก์ชั่น โปรแกรมเมอร์เรียกใช้ฟังก์ชันโดยทราบเพียงวิธีการใช้งานและผลลัพธ์ที่เกิดขึ้นหลังเรียกใช้ฟังก์ชันเท่านั้น เช่น โปรแกรมเมอร์ไม่ทราบว่าทำอย่างไรตัวอักษรจึงจะไปปรากฏบนหน้าจอ สามารถใช้คำสั่ง printf() ได้เลย
1.2 หลักการทำงานของฟังก์ชั่น main() printf() clrscr() function1() function2() Function1-1()
1.3 ชนิดของฟังก์ชัน ฟังก์ชันที่มาพร้อมกับ compiler หรือ Library Functions - ฟังก์ชันที่ถูกเขียนไว้แล้วใน Header file ต่างๆ เช่น printf( ) , scanf( ) - สามารถเรียกใช้ได้ทันที เมื่อมีการ include แล้ว ฟังก์ชันที่ผู้ใช้สร้างขึ้นเอง (User-defined functions) - ฟังก์ชันที่ผู้ใช้เขียนขึ้นเองเพื่อทำงานอย่างหนึ่งอย่างใดโดยเฉพาะ
1.3.1 Library Functions (stdio.h) I/O Functions printf() แสดงผลข้อมูล scanf() รับค่าข้อมูล
1.3.1 Library Functions (string.h) String Functions char strcpy() สำหรับคัดลอกข้อความ int strcmp() เปรียบเทียบข้อความ 2 ข้อความ int strlen() หาขนาดข้อความ char strcat() ต่อข้อความ 2 ข้อความเข้าด้วยกัน char gets() รับค่าข้อความ char puts() ใช้แสดงผลข้อความ
1.3.1 Library Functions (math.h) Math Functions float sqrt() หารากที่สอง(root) ของจำนวนเต็ม float ceil() หาค่าปัดเศษทศนิยม float floor() หาค่าตัดเศษทศนิยมทิ้ง
1.3.1 Library Functions (conio.h) I/O Functions getchar() รับค่า 1 อักขระ โดยกด Enter getche() รับค่า 1 อักขระ โดยไม่ต้องกด Enter getch() รับค่า 1 อักขระ โดยไม่แสดงค่าที่รับบนจอภาพ putchar() แสดงผลออกทางจอภาพทีละ 1 ตัวอักษร
1.3.1 การเรียกใช้ Library Function ทราบว่าโปรแกรมที่เขียนต้องการทำงานอะไร การทำงานดังกล่าวคือฟังก์ชันชื่ออะไร ทราบ header file ทำการ include header file เข้ามา เรียกใช้ฟังก์ชันในโปรแกรม
1.3.1 Library Function str_len(String) หาจำนวนตัวอักษรหรือขนาดข้อความ SOURCECODE OUTPUT #include<stdio.h> #include<string.h> void main(){ int num; num = strlen("RMUTI_Khonkaen"); printf("%d",num); } 14
1.3.1 Library Function str_len(String) หาจำนวนตัวอักษรหรือขนาดข้อความ SOURCECODE OUTPUT #include<stdio.h> #include<string.h> void main(){ int num; char name[15]="RMUTI_Khonkaen"; num = strlen(name); printf("%d",num); } 14
ฟังก์ชันหาขนาดข้อความ 1.3.1 Library Function ฟังก์ชันหาขนาดข้อความ int strlen ( const char * str1); int num; num = strlen(“ABCDEFG”); printf("str1 = %d",num); 7
1.3.1 Library Function (String function) char strcpy( destination , source ) ฟังก์ชั่นคัดลอกข้อความ #include<stdio.h> #include<string.h> void main(){ char str1[100]="RMUTI"; char str2[100]=""; printf("%s",str2); strcpy(str2,str1); } ค่าว่าง RMUTI
1.3.1 Library Function (String function) int strcmp( str1 , str2 ) ฟังก์ชั่นเปรียบเทียบข้อความ #include<string.h> void main(){ char str1[100]="RMUTI"; char str2[100]=“RMUTI“; char str3[100]=“RMUTA”; char str4[100]=“RMUTK”; printf("%s",strcmp(str1,str2)); printf("%s",strcmp(str1,str3)); printf("%s",strcmp(str1,str4)); } Output = 0 ( i > a ) Output = 1 ( i < k ) Output = -1
1.3.1 Library Function (String function) str1 = “AB” Str2 = “AB” 2 “ABCC” “ABCCAB”
1.3.1 Library Function (I/O function) getchar() รับค่า 1 อักขระ โดยกด Enter SOURCECODE OUTPUT #include<stdio.h> #include<conio.h> void main(){ char grade; grade = getchar(); printf("%c",grade); } รับค่า 4 กด Enter แสดงผล 4
1.3.1 Library Function (I/O function) getche() รับค่า 1 อักขระ โดยไม่ต้องกด Enter SOURCECODE OUTPUT #include<stdio.h> #include<conio.h> void main(){ char grade; grade = getche(); printf("%c",grade); } รับค่า 4 แสดงผล 4
1.3.1 Library Function (I/O function) getch() รับค่า 1 อักขระ โดยไม่แสดงค่าที่รับบนจอภาพ SOURCECODE OUTPUT #include<stdio.h> #include<conio.h> void main(){ char grade; grade = getch(); printf("%c",grade); } รับค่า แสดงผล 4
1.3.1 Library Function (I/O function) putchar() แสดงผลออกทางจอภาพทีละ 1 ตัวอักษร SOURCECODE OUTPUT #include<stdio.h> #include<conio.h> void main(){ char grade = ‘a’; putchar(garde); putchar(‘b’); } รับค่า แสดงผล 4
1.3.1 Library Function (Math function)
1.3.1 Library Function (Math function) #include<stdio.h> #include<math.h> main( ) { float x,y; printf(“Enter number :”); scanf(“%f”,&x); y = sqrt(x); printf(“square root of x = %f”,y); } Enter number : 4.0 Square root of x = 2.0
2. การสร้างฟังก์ชั่น ( User-defined functions ) 1. การกำหนดนิยามฟังก์ชัน (Function Definition) 2. การกำหนดต้นแบบของฟังก์ชัน (Function Prototype) 3. ขอบเขตของตัวแปร (Variable Scope) 4. ตัวแปรแบบ Automatic และ Static (Automatic and Static Variables) 5. การผ่านค่าระหว่างฟังก์ชัน (Passing Values) 6. การผ่านตัวแปร array ระหว่างฟังก์ชัน
2. การสร้างฟังก์ชั่น ( User-defined functions ) การกำหนดต้นแบบของฟังก์ชัน (Function Prototype) เพื่อบอกให้ Compiler ตรวจสอบความถูกต้องในการเรียกใช้ฟังก์ชันนั้นๆ วิธีการประกาศคล้ายกับการนิยามฟังก์ชัน แต่ในส่วนของรายการพารามิเตอร์ ไม่ต้องมีตัวแปรก็ได้ กำหนด function prototype ณ จุดใดก็ได้ ก่อนที่จะมีการเรียกใช้ฟังก์ชัน แต่นิยมกำหนด ณ ส่วนต้นโปรแกรม (หลัง #include หรือ #define) int mySum (int, int); int mySum (int x, int y) { int sum; sum = x + y; return sum; } Function Prototype
ตัวอย่างการกำหนด function prototype #iinclude <stdio.h> void prt_head( ); /* หรือ void prt_head(void); */ int maximum( int, int); /* หรือ int maximum(int i, int j); */ void prt_head( ) { printf(“************************\n”); return; } int maximum(int i, int j) { int max; if (i > j) max = i; else max = j; return max; ************************ main( ) { int max, i = 5, j = 10; prt_head( ); max = maximum(i, j); printf(“maximum is %d\n”, max); return 0; } max = 10 ************************ Maximum is 10
2.1 รูปแบบการเขียนฟังก์ชั่น การกำหนดนิยามฟังก์ชัน (Function Definition) การสร้างหรือเขียนฟังก์ชันขึ้นมา เราเรียกว่า การกำหนดนิยามฟังก์ชัน การสร้างฟังก์ชันในภาษา c มีรูปแบบดังนี้ return_type function_name (parameters_list) { declaration; statement; return return_value; } int mySum (int x, int y) { int sum; sum = x + y; return sum; }
2.1 รูปแบบการเขียนฟังก์ชั่น function_name: ชื่อของฟังก์ชัน มีกฎเกณฑ์การตั้งเช่นเดียวกับ ชื่อตัวแปร ตัวอักษร, ตัวเลข และเครื่องหมาย _ ต้องขึ้นต้นด้วยตัวอักษร ยาวไม่เกิน 32 ตัวอักษร และ Case- Sensitive parameters_list: รายการของข้อมูลที่รับเข้ามาในฟังก์ชัน declaration: การประกาศตัวแปรของฟังก์ชัน เช่น int i, int sum statement(s): ชุดคำสั่งต่างๆ ที่ฟังก์ชันนั้นกระทำ เช่น printf() return_value: ค่าที่คืนจากฟังก์ชัน ถ้ากำหนด return_type เป็น void ก็ไม่ต้องมีการคืนค่า
2.1 รูปแบบการเขียนฟังก์ชั่น function_name : ชื่อของฟังก์ชัน มีกฎเกณฑ์การตั้งเช่นเดียวกับชื่อตัวแปร ตัวอักษร, ตัวเลข และเครื่องหมาย _ ต้องขึ้นต้นด้วยตัวอักษร ยาวไม่เกิน 32 ตัวอักษร และ Case - Sensitive void prt_hello( ) { printf(“hello world\n”); return; } int maximum(int i, int j) { int max; if (i > j) max = i; else max = j; return max; }
2.1 รูปแบบการเขียนฟังก์ชั่น declaration : การประกาศตัวแปรของฟังก์ชัน เช่น int i, int sum int maximum(int i, int j) { int max; if (i > j) max = i; else max = j; return max; } Function block
2.2 Input Parameter parameters_list : รายการของข้อมูลที่รับเข้ามาในฟังก์ชัน void prt_hello( ) { printf(“hello world\n”); return; } int maximum(int i, int j) { int max; if (i > j) max = i; else max = j; return max; }
2.3 การคืนค่ากลับ (Return Value) return_type : ชนิดของการคืนค่ากลับ เช่น int float char void void prt_hello( ) { printf(“hello world\n”); return; } int maximum(int i, int j) { int max; if (i > j) max = i; else max = j; return max; } void เป็นการกำหนดว่าฟังก์ชันนี้ไม่มีการคืนค่า
2.3 การคืนค่ากลับ (Return Value) 5 i j return_type : ชนิดของการคืนค่ากลับ เช่น #include<stdio.h> void main(){ int i=2,j=5; amt = sum(i,j); printf(“sum of x,y = ”) } int sum(int x,int y){ snum = x+y; return snum; amt = sum(2,5) main amt = 7 x y 2 5 7 snum = 2+5 return snum sum
2.3 การคืนค่ากลับ (Return Value) การส่งข้อมูลกลับจากฟังกชัน ฟังก์ชันที่ไม่มีการส่งข้อมูลกลับ void prt_hello( ) { printf(“hello world\n”); return; } int maximum(int i, int j) { int max; if (i > j) max = i; else max = j; return max; }
2.4 การเรียกใช้งานฟังก์ชั่น include header file MyProgram.c Preprocessor directive header file Library Function Main function Call Function Return Return Call Function (parameter) User defined function 1 User defined function 2 Call Function ( )
2.4 การเรียกใช้งานฟังก์ชั่น include header file #include<math.h> MyProgram.c #include <stdio.h> … Library Function pow(double,double) float num = 3*3; float result = area_circle(3.0); printf(“Result: %f”,result); Call pow(3,2) Function Return 9 Call Function area_circle(3) Return 28.26 . float area_circle(float r){ ac = 3.14*pow(r,2); return ac; } Call pow(3,2) . Return 9 User defined function 2
2.4.1 ขอบเขตของตัวแปร (Variable Scope) คือ การระบุให้ตัวแปรนั้นถูกใช้งานได้ที่ไหน (มองเห็นหรือเข้าถึง) ณ จุดในโปรแกรม ( ณ ฟังก์ชันใดในโปรแกรม) ได้บ้าง แบ่งได้เป็น 2 ประเภทใหญ่ คือ 1. ตัวแปรแบบ local (ท้องถิ่น) ถูกมองเห็นหรือเข้าถึง ได้เฉพาะภายในฟังก์ชันที่ประกาศตัวแปรนั้นเท่านั้น 2. ตัวแปรแบบ global คือ ถูกมองเห็นหรือเข้าถึงจาก ทุกฟังก์ชันภายในโปรแกรม ที่อยู่หลังการประกาศตัวแปรแบบ global
2.4.2 ตัวแปรแบบ local ประกาศ ณ จุดเริ่มต้นของฟังก์ชัน เช่น main( ) { int i; } ตัวแปรจะถูกมองเห็นได้เฉพาะภายใน block หรือ ฟังก์ชันที่ประกาศเท่านั้น ตัวแปรจะถูกสร้างขึ้นเมื่อเข้าสู่ block ( พบ { ) ตัวแปรจะถูกทำลาย (หายไปจากหน่วยความจำ) เมื่อออกจาก block ( พบ } )
ดูโปรแกรมนี้หน่อยซิ ว่าค่าที่ได้คืออะไร void main( void) { int i = 10; printf(“%d”, i); { int i = 15; { int i = 20; }
2.4.3 ตัวแปรแบบ global ประกาศก่อนชื่อฟังก์ชันใดๆ เช่น int i = 5; main( ) { printf(“%d”, i); } ตัวแปรจะถูกมองเห็นได้จากทุกฟังก์ชัน ที่อยู่หลังการประกาศตัวแปรแบบ global
ลองดูโปรแกรมนี้ซิ แล้วตอบ (อาจมี error ได้) void f_1( ); /* Function Prototype */ void f_2( ); /* Function Prototype */ main( ) { int i = 5; printf(“%d”, i); // 1 printf(“%d”, j); // 2 printf(“%d”, k); // 3 f_1( ); f_2( ); return 0; } int j = 10; void f_1( ) { printf(“%d”, i); // 4 printf(“%d”, j); // 5 printf(“%d”, k); // 6 return; } int k = 15; void f_2( ) { printf(“%d”, i); // 7 printf(“%d”, j); // 8 printf(“%d”, k); // 9
2.4.3 ตัวแปรแบบ global มีข้อเสียคือ ที่จริง ควรใช้ตัวแปรแบบ local ดีกว่า เพื่อให้ตัวแปรนั้นสามารถถูกเข้าถึงได้เฉพาะฟังก์ชันที่ประกาศมันเท่านั้น หากต้องการให้ข้อมูลในตัวแปรแบบ local ที่ประกาศในฟังก์ชันหนึ่ง สามารถถูกใช้ในอีกฟังก์ชันหนึ่งได้ ก็สามารถทำได้โดยการ ผ่านค่าตัวแปร
2.4.4 การผ่านค่าตัวแปรจากฟังก์ชันหนึ่ง ไปยังอีกฟังก์ชันหนึ่ง 5 ตัวอย่าง #include <stdio.h> void prt_int(int); /* Fuction Prototype */ main( ) { int i = 5; /* i = local var. ของ main( ) */ prt_int(i); printf(“%d”, i); i++; return 0; } void prt_int(int i) /* i = local var. ของ prt_int( ) */ { printf(“%d”, i); return; 5 6 6 // prt_int(5) // prt_int(6)
2.4.5 ตัวแปรแบบ Automatic และ Static (Automatic and Static Variables) ตัวแปร local แบ่งออกเป็น 2 ประเภท 1. ตัวแปร local แบบ Automatic(อัตโนมัติ): ค่าตัวแปรที่ประกาศในฟังก์ชันใดๆ จะถูกทำลายเมื่อออกจากฟังก์ชันนั้น กำหนดโดยใช้คำว่า auto หน้าตัวแปร เช่น auto int i; หรือ auto float x; แต่ default แล้วจะไม่ใส่ก็ได้ เช่น int i; หรือ float x; 2. ตัวแปร local แบบ Static(คงที่); ค่าตัวแปรที่ประกาศในฟังก์ชันใดๆ จะไม่ถูกทำลายเมื่อออกจากฟังก์ชันนั้น กำหนดโดยใช้คำว่า static หน้าตัวแปร เช่น static int i; static float x; เมื่อมีการประกาศตัวแปรแบบ static ค่าเริ่มต้นของตัวแปรจะเป็น 0 เสมอ
void f_1( ) { static int i; printf("%d\n", ++i); return; } ดูผลลัพธ์ของค่า i ในแต่ละครั้งที่มีการเรียกใช้ f_1() #include <stdio.h> #include <conio.h> void f_1( ); main( ) { f_1( ); getch(); return 0; } 1 2 3 4 void f_1( ) { static int i; printf("%d\n", ++i); return; }
2.4.4.1 การผ่านค่าระหว่างฟังก์ชัน (Passing Values) คือการส่งค่าตัวแปรข้ามฟังก์ชันไปให้ฟังก์ชันการทำงานที่อื่น เพื่อให้ฟังกชันอื่นได้ใช้ค่าในตัวแปรนั้น ส่งโดยใช้รายการพารามิเตอร์ ในภาษา C มี 2 วิธี ขึ้นอยู่กับว่าต้องการค่าที่ส่งไปนั้นถูกเปลี่ยนแปลง หรือไม่ 1. การผ่านโดยใช้ค่า (Passing by value หรือ Passing by copy) 2. การผ่านโดยใช้ตำแหน่ง (Passing by address หรือ Passing by reference)
2.4.4.1 การผ่านโดยใช้ค่า (Passing by value หรือ Passing by copy) 5 ส่งค่าไปเฉย ๆ ไม่มีการรับค่าการเปลี่ยนแปลงค่ากลับ ฟังก์ชันที่รับค่ามา ฟังก์ชันที่ส่งค่าไป main( ) { int i = 5; prt_int(i); printf(“%d”,i); return 0; } void prt_int(int i) { printf(“%d”,i); i++; return ; } Prt_int(5)
2.4.4.2 การผ่านโดยใช้ตำแหน่ง (Pass by address หรือ Pass by reference) ส่งค่าไป หากมีการแก้ไข มีการรับค่ากลับ การส่ง จะส่งโดยใช้ตำแหน่ง (&) การรับ จะใช้พอยน์เตอร์ (*) 5 6 ฟังก์ชันที่ส่งค่าไป ฟังก์ชันที่รับค่ามา main( ) { int i = 5; prt_int(&i); printf(“%d”,i); return 0; } void prt_int(int *i) { printf(“%d”,*i); *i=*i+1; return ; }