Computer Programming การเขียนโปรแกรมคอมพิวเตอร์ สัปดาห์ที่ 11 ฟังก์ชัน (Function)
objectives เพื่อให้นิสิตรู้จักและเข้าใจการนิยามและการเขียนฟังก์ชันในภาษาซี สามารถเขียนฟังก์ชันร่วมกับคำสั่งทำซ้ำ อาเรย์ ตัวแปรชี้ตำแหน่ง ตัวแปรชนิดโครงสร้างในภาษาซีได้อย่างมีประสิทธิภาพ สามารถนำความรู้เรื่องฟังก์ชันไปประยุกต์เพื่อแก้ไขโจทย์ปัญหาในชีวิตประจำวันได้ได้อย่างถูกต้องเหมาะสม
User-Defined Function Outline 1 Function 2 p User-Defined Function 3 Function Format 4 Variable & Scope of Function 5 Passing Parameters
** ฟังก์ชัน คือ ชุดของการทำงาน ** ฟังก์ชัน ถูกเรียกใช้งานได้ What is function? ฟังก์ชัน คือ ชุดคำสั่งของการทำงานที่ถูกเขียนขึ้นให้โปรแกรมเมอร์สามารถเรียกใช้งานได้โดยง่าย ** ฟังก์ชัน คือ ชุดของการทำงาน ** ฟังก์ชัน ถูกเรียกใช้งานได้
Why the function is essential? ปัญหาที่เกิดขึ้นในการพัฒนาโปรแกรมที่ซับซ้อน โปรแกรมเมอร์ไม่สามารถทราบการทำงานของระบบโดยละเอียดได้ เช่น ไม่ทราบกระบวนการส่งข้อมูลผ่านเครือข่าย แต่ต้องเขียนโปรแกรมเพื่อเชื่อมต่อระบบเครือข่าย โปรแกรมเมอร์ไม่สามารถทราบขั้นตอนการทำงานของคอมพิวเตอร์ทั้งหมดได้ เช่น ทำอย่างไรตัวอักษรจึงปรากฏในหน้าจอภาพได้ โปรแกรมบางโปรแกรมมีการทำงานที่ซับซ้อน และการทำงานซับซ้อนนั้นถูกเรียกใช้งานบ่อยครั้ง เช่น การหาผลลัพธ์ทางวิทยาศาสตร์ การวิเคราะห์ข้อมูลขนาดใหญ่เป็นต้น
Solution วิธีการแก้ไข เพื่อให้โปรแกรมเมอร์สามารถทำงานได้โดยไม่จำเป็นต้องทราบรายละเอียดการทำงานทั้งหมดของระบบ จะให้โปรแกรมเมอร์ที่ทราบการทำงานโดยละเอียดของกระบวนการต่างๆ จะเขียนชุดคำสั่งในรูปแบบของ ฟังก์ชัน แล้วแจกจ่ายให้โปรแกรมเมอร์อื่นๆ ได้ใช้งาน โปรแกรมเมอร์สามารถเรียกใช้ฟังก์ชันโดยทราบเพียงวิธีการใช้งาน และผลลัพธ์ที่เกิดขึ้นหลังจากเรียกใช้งานฟังก์ชันเท่านั้น เช่น โปรแกรมเมอร์ที่ไม่ทราบว่าทำอย่างไรตัวอักษรจึงจะปรากฎหน้าจอ สามารถใช้คำสั่ง printf ได้เลย โดยโปรแกรมเมอร์จะทราบเพียงแค่ การเรียก printf จะทำให้มีตัวอักษรปรากฎบนหน้าจอได้เท่านั้น
The Advantage of Function ข้อดีของฟังก์ชัน ทำให้โปรแกรมเมอร์สามารถพัฒนาโปรแกรมได้โดยง่าย โดยโปรแกรมเมอร์ไม่จำเป็นต้องทราบว่าการทำงานของฟังก์ชันทำงานอย่างไรทราบเพียงผลลัพธ์ของการทำงานเท่านั้น โปรแกรมเมอร์สามารถเขียนโปรแกรมให้มีการทำงานที่ซับซ้อนได้ โดยไม่จำเป็นต้องเขียนโปรแกรมส่วนที่ซับซ้อนนั้นหลายๆ ครั้ง โปรแกรมเมอร์สามารถออกแบบฟังก์ชันได้ตามความต้องการของโปรแกรมเมอร์
PROGRAMMER DEFINED FUNCTION Type of Function FUNCTIONS IN C C STANDARD LIBRARY PROGRAMMER DEFINED FUNCTION
Type of Function (cont.) กลุ่มฟังก์ชันมาตรฐาน (Standard Library Functions) เป็นฟังก์ชันที่มีอยู่ใน Library มาตรฐานของภาษาซี มาตรฐาน ANSI C มี 15 ประเภท ใช้ Preprocessor #include อ้างถึง Library ที่เก็บฟังก์ชันมาตรฐาน เช่น #include <stdio.h> ฟังก์ชันที่ผู้ใช้กำหนดเอง (User-defined Functions) เป็นฟังก์ชันที่ programmer เขียนขึ้นมาเอง เพื่อทำงานเฉพาะเรื่อง ถ้าอยู่ในไฟล์อื่นต้องใช้ preprocessor #include เช่นเดียวกัน แต่อยู่ใน “ ” แทน < > เช่น #include “mylib.h” ถ้าไม่กำหนด Path จะหมายถึงไฟล์ mylib.h อยู่ใน directory เดียวกันกับโปรแกรม ของเรา
Standard Library Function ฟังก์ชันไลบรารีมาตรฐาน (Standard Library Function) เป็นฟังก์ชันที่มีอยู่แล้วเก็บไว้ใน Library ในการใช้งานต้อง include directives ก่อน directive คือสารบัญของกลุ่มฟังก์ชัน เช่น stdio.h , conio.h , string.h , math.h เป็นต้น การ include directives จะเป็นเหมือนการประกาศให้กับ compiler ทราบว่าจะใช้คำสั่ง ในกลุ่มของ directive นั้นๆ เช่น การใช้คำสั่ง sin() ซึ่งอยู่ใน math.h จะต้องมีบรรทัด include math.h เสมอ ดังตัวอย่าง
Standard Library Function (cont.) ชื่อไฟล์ส่วนหัว การทำงานของฟังก์ชัน assert.h ประกาศมาโครและข้อมูลที่ใช้ในการตรวจสอบ และช่วยการแก้ไขข้อผิดพลาดของโปรแกรม (debugging) ctype.h ประกาศตัวแบบของฟังก์ชัน ที่ใช้ในการตรวจสอบชนิดของตัวอักษร และแปลงตัวอักษรระหว่างตัวพิมพ์เล็กกับตัวพิมพ์ใหญ่ errno.h ประกาศค่าคงที่และตัวแปรภายนอกที่ใช้ในการรายงานข้อผิดพลาด float.h ประกาศมาโครและค่าคงที่สำหรับการกำหนดขนาดและการจัดการกับเลขทศนิยม limits.h ประกาศมาโครและค่าคงที่สำหรับการกำหนดขนาดและการจัดการกับเลขจำนวนเต็ม locale.h ประกาศตัวแบบของฟังก์ชันและข้อมูลที่ใช้ในการกำหนดค่าข้อมูลในท้องถิ่น เช่น ระบบวัน เวลา และ สกุลเงิน เป็นต้น math.h ประกาศตัวแบบของฟังก์ชันที่เกี่ยวกับการคำนวณทางคณิตศาสตร์ time.h ประกาศตัวแบบของฟังก์ชันและข้อมูลที่เกี่ยวกับการจัดการวันที่และเวลา
Standard Library Function (cont.) ชื่อไฟล์ส่วนหัว การทำงานของฟังก์ชัน setjump.h ประกาศตัวแบบของฟังก์ชันและข้อมูลที่เกี่ยวกับการกระโดดไปทำงาน ที่ส่วนของโปรแกรมแทนการเรียกใช้ฟังก์ชันแบบปกติ signal.h ประกาศตัวแบบของฟังก์ชัน มาโครและค่าคงที่ สำหรับการจัดการกับสัญญาณที่ส่งมาให้กับซีพียูระหว่างการทำงาน stdarg.h ประกาศมาโครที่ใช้จัดการกับลำดับของอาร์กิวเมนต์ที่ส่งให้กับฟังก์ชัน ในกรณีที่ไม่รู้จำนวนของอาร์กิวเมนต์ที่แน่นอน stddef.h ประกาศค่าคงที่และตั้งชื่อชนิดข้อมูลแทนชนิดข้อมูลแบบปกติ สำหรับการทำงานเฉพาะเรื่อง stdio.h ประกาศตัวแบบของฟังก์ชันและข้อมูลที่เกี่ยวกับการรับและแสดงผลแบบมาตรฐาน stdlib.h ประกาศตัวแบบของฟังก์ชันและข้อมูลที่เกี่ยวกับการทำงานในด้านอื่นๆ นอกเหนือจากกลุ่มฟังก์ชันที่กล่าวมา เช่น การแปลงระหว่างค่าตัวเลขและข้อความ และ การสุ่มค่าตัวเลข เป็นต้น string.h ประกาศตัวแบบของฟังก์ชันที่ใช้ในการจัดการกับสตริง
How to use Standard Library Function? ทราบว่าโปรแกรมที่เขียนต้องการการทำงานอะไร การทำงานดังกล่าวคือฟังก์ชันชื่ออะไร ทราบ directive ที่เป็นสารบัญของคำสั่ง Include directive นั้นๆ เรียกใช้ฟังก์ชันในโปรแกรม
Example 1 #include<stdio.h> #include<conio.h> #include<math.h> int main() { double rad = -1.0; do { printf ( "Sine of %f is %f\n", rad, sin(rad)); rad += 0.1; } while (rad <= 1.0); return 0; }
#include<math.h> Mathematics Function #include<math.h> sin(var); cos(var); tan(var); sqrt(var); pow(var1,var2); log(var); log10(var); exp(var); fabs(var);
Mathematics Function (cont.) Function Description sin(x) sine ของ x, x มีหน่วยเป็นเรเดียน cos(x) cosine ของ x, x มีหน่วยเป็นเรเดียน tan(x) tangent ของ x, x มีหน่วยเป็นเรเดียน sqrt(x) รากที่สองของ x, x>=0 pow(x,y) x ยกกำลัง y log(x) logarithm ฐาน e ของ x, x>=0 log10(x) logarithm ฐาน 10 ของ x, x>=0 exp(x) e ยกกำลัง x abs(x) ค่าสัมบูรณ์ของ x, x เป็นเลขจำนวนเต็ม fabs(x) ค่าสัมบูรณ์ของ x, x เป็นเลขจำนวนจริง
Example 2 #include<stdio.h> #include<math.h> int main(){ float a = 3.14; float b = -123.456; float c = 2.7; int d = -2000; printf ("%.3f \n", sin(a)); printf ("%.3f \n", cos(a)); printf ("%.3f \n", tan(a)); printf ("%.3f \n", sqrt(a)); printf ("%.3f \n", pow(a,c)); printf ("%.3f \n", log(a)); printf ("%.3f \n", log10(a)); printf ("%.3f \n", exp(a)); printf ("%.3f \n", fabs(b)); printf ("%d \n", abs(d)); return 0; } //ผลลัพธ์ 0.002 -1.000 -0.002 1.772 21.964 1.144 0.497 23.104 123.456 2000
#include<string.h> #include<ctype.h> String Function #include<string.h> strcpy(str1, str2); strcat(dest1, src2); strcmp(dest1, src2); strcmpi(str1, str2); strlen(str); #include<ctype.h> tolower(ch); toupper(ch);
String Function (cont.) Function Description ฟังก์ชันสำหรับอักขระ – string.h strcpy(str1, str2) คัดลอกข้อความจาก str2 ไปเก็บที่ str1 strcat(str1, str2) ต่อข้อความใน str1 ด้วย str2 strcmp(str1, str2) เปรียบเทียบตัวอักษรในข้อความ ถ้า str1 = str2 จะได้ 0 strlen(str) หาความยาวข้อความ ฟังก์ชันสำหรับอักขระ – ctype.h tolower(ch) เปลี่ยนอักขระเป็นตัวพิมพ์เล็ก toupper(ch) เปลี่ยนอักขระเป็นตัวพิมพ์ใหญ่
Example 3 //ผลลัพธ์ Abc AbcDef -1 6 aBcDef #include <stdio.h> #include <string.h> #include <ctype.h> int main(void) { char string[10]; char *str = "Abc"; //strcpy strcpy(string, str); printf("%s\n", string); //strcat strcat(string, "Def"); //strcmp and strcmpi printf("%d\n",strcmp(str, "abc")); printf("%d\n",strcmpi(str, //strlen printf("%d\n",strlen (string)); //tolower and toupper string[0] = tolower(string[0]); string[1] = toupper(string[1]); printf("%s\n", string); return 0; } //ผลลัพธ์ Abc AbcDef -1 6 aBcDef
Monitor Management Function Function Description ฟังก์ชันสำหรับจัดการหน้าจอ – conio.h clrscr() ลบหน้าจอ clreol() ลบข้อความตั้งแต่ตำแน่ง cursor จนจบบรรทัด gotoxy(x,y) ย้าย cursor ไปตำแหน่งที่ต้องการ (x : column 1-80 | y : row 1-25) delline() ลบบรรทัดที่ cursor อยู่แล้วเลื่อนบรรทัดล่างขึ้น insline() แทรกบรรทัดว่างเข้ามาก่อนบรรทัดที่ cursor อยู่ getch() หยุดคอยให้กดคีย์ใดก็ได้ 1 ครั้ง
Size of Variable Function sizeof(x) หาขนาดพื้นที่ในหน่วยความจำที่เก็บตัวแปร มีหน่วยเป็น byte, x คือตัวแปรที่ต้องการหาขนาด ไม่ต้องมี include ใดๆ เพิ่ม #include <stdio.h> #include <conio.h> void main() { int age = 14; float grade = 4.00; char song[] = "More than word"; printf("size of age = %d bytes\n", sizeof(age)); printf("size of grade = %d bytes\n", sizeof(grade)); printf("size of song = %d bytes\n", sizeof(song)); printf("size of double = %d bytes\n", sizeof(double)); } size of age = 2 bytes size of grade = 4 bytes size of song = 15 bytes size of double = 8 bytes
User-Defined Function Outline 1 Function 2 p User-Defined Function 3 Function Format 4 Variable & Scope of Function 5 Passing Parameters
User-Defined Function เนื่องจาก Standard Library Function ทั้งหมด เป็นฟังก์ชันมาตรฐานที่มีเฉพาะการทำงานพื้นฐานต่างๆ เท่านั้น หากต้องการฟังก์ชันที่มีการทำงานเฉพาะกิจ โปรแกรมเมอร์ต้องเขียนฟังก์ชันขึ้นมาเอง
User-Defined Function (cont.) ต้องมีการประกาศ function prototype ที่ต้นโปรแกรมเสมอ จึงจะเรียกใช้งาน function นั้นๆ ได้ (เป็นการบอก Compiler ว่าคำสั่งดังกล่าวคือฟังก์ชัน ไม่ใช่ syntax error) ต้องมีการเขียนฟังก์ชันตามโครงสร้างที่ได้ประกาศไว้ใน function prototype เท่านั้น
User-Defined Function (cont.) #include<file.h> type function_name(type); type variable int main() { type variable; statement-1; ... statement-n; return 0; } type function_name(type variable) return(var); พรีโปรเซสเซอร์ไดเร็คทีฟ ฟังก์ชันโพรโทรไทพ์ ส่วนหัวโปรแกรม ตัวแปรชนิดโกบอล ตัวแปรชนิดโลคอล ฟังก์ชันหลัก คำสั่ง ส่วนตัวโปรแกรม ฟังก์ชันย่อย
User-Defined Function (cont.) ฟังก์ชัน : กลุ่มคำสั่งทำงานที่มีการรับค่าแล้วทำตามคำสั่งในฟังก์ชั่น และมีการส่งค่ากลับ (return) Process (ทำงาน) ส่งค่ากลับ รับค่ามา Function Return_Type Function_name(Type variable)
User-Defined Function (cont.) การเขียนฟังก์ชันโดยที่ไม่ต้องมีการประกาศก่อน สามารถประกาศตัวแปรไว้ใช้งานเฉพาะในฟังก์ชันได้ ฟังก์ชันประกอบไปด้วย คำสั่ง (Statement) : การทำงานอย่างหนึ่ง เรียงกันไป Return : การคืนค่าที่เป็นผลลัพธ์การทำงานของฟังก์ชัน Function Main ฟังก์ชันที่ทุกโปรแกรมที่เรียกทำงานได้ต้องมี โปรแกรมจะเริ่มทำงานจากฟังก์ชัน main ก่อน ฟังก์ชัน main จะมีการเรียกการทำงานของฟังก์ชั่นอื่นๆ
ระหว่างปีกกาจะประกอบไปด้วยคำสั่ง(Statement) ต่างๆ ที่จะให้โปรแกรมทำงาน Main Function ส่วนนี้ทุกโปรแกรมจะต้องมี โดยโปรแกรมหลักจะเริ่มต้นด้วย main() และตามด้วยเครื่องหมายปีกกาเปิด ‘{’ และปีกกาปิด ‘}’ ระหว่างปีกกาจะประกอบไปด้วยคำสั่ง(Statement) ต่างๆ ที่จะให้โปรแกรมทำงาน แต่ละคำสั่งจะต้องจบด้วยเซมิโคลอน ‘;’ (Semicolon) #include <stdio.h> void main(void) { ... Statement ; }
Main Function (cont.) ตัวอย่าง ผลการทำงาน Height in inches is 72 #include <stdio.h> int feet,inches; void main() { feet = 6; inches = feet * 12; printf("Height in inches is %d",inches); } ผลการทำงาน Height in inches is 72
User-Defined Function (cont.) สร้างฟังก์ชันหรือคำใหม่ขึ้นมาใช้งานตามที่เราต้องการ ระหว่างปีกกาจะประกอบด้วยคำสั่ง(Statement) ต่างๆ ที่จะให้ฟังก์ชันทำงาน สามารถเรียกใช้ภายใน โปรแกรมได้ทุกที่ #include <stdio.h> int function() void main(void) { ... Statement ; } return (int value);
Example 4 ตัวอย่าง ผลการทำงาน Height in inches is 72 #include <stdio.h> int Feet2Inch(int); int feet,inches; void main() { feet = 6; inches = Feet2Inch(feet); printf("Height in inches is %d",inches); } int Feet2Inch(int f) return f*12; ผลการทำงาน Height in inches is 72
Example 5 #include <stdio.h> void adder(int , int ); int summ; int main() { adder(20, 30); // จุดที่เรียกใช้ฟังก์ชันโพรโตไทป์ printf(“summary = %d”,summ) return 0; } void adder(int a, int b) summ = a+b;
How to process function?
User-Defined Function Outline 1 Function 2 p User-Defined Function 3 Function Format 4 Variable & Scope of Function 5 Passing Parameters
Function Declaration เป็นการประกาศการใช้งานฟังก์ชั่นที่อยู่หลัง main() type คือ ชนิดของฟังก์ชัน ว่าฟังชันที่ทำการสร้างจะส่งข้อมูลชนิดใดกลับ function_name คือ ชื่อฟังก์ชันที่จะสร้างขึ้น type-n คือ ชนิดของข้อมูลที่จะส่งให้ฟังก์ชัน type function_name(type-1,type-2,...,type-n);
Function Declaration(cont.) การเขียนโปรแกรมโดยมีฟังก์ชันที่สร้างขึ้นเองมี 2 รูปแบบ สร้างฟังก์ชัน ก่อน ฟังก์ชันหลัก ฟังก์ชันหลักสามารถเรียกใช้งานฟังก์ชันที่สร้างขึ้นได้ สร้างฟังก์ชัน หลัง ฟังชันหลัก ต้องประกาศ Function Prototype ก่อนเพื่อให้ฟังก์ชันหลักรู้ว่ามีฟังก์ชันที่สร้างขึ้น
Function Declaration(cont.) #include<file.h> type variable; type function_name(type variable) { statement-1; ... statement-n; return(var); } int main() return 0;
Function Declaration(cont.) #include<file.h> type function_name(type); type variable; int main() { statement-1; ... statement-n; return 0; } type function_name(type variable) return(var);
Function Format #1 แบบที่ 1: ฟังก์ชันแบบไม่มีการส่งค่ากลับและไม่มีพารามิเตอร์ เป็นฟังก์ชันที่ไม่มีการส่งค่ากลับไปให้กับฟังก์ชันที่เรียกมา และไม่มีการส่งค่าจากฟังก์ชันที่เรียกมาให้ด้วย void main() { my_print(); } void my_print() printf(“Hello world”);
Function Format #2 แบบที่ 2 ฟังก์ชันแบบไม่มีการส่งค่ากลับแต่มีพารามิเตอร์ เป็นฟังก์ชันที่จะไม่มีการส่งค่ากลับไปให้ฟังก์ชันที่เรียกขึ้นมา แต่มีการส่งค่าจากฟังก์ชันที่เรียกมาให้ด้วย void main() { my_print(‘a’, 5); } void my_print(char ch, int x) while (x > 0) printf(“%c”, ch); x--; void main() { my_print(2); } void my_print(int x) printf(“%d”, x);
Function Format #3 แบบที่ 3 ฟังก์ชันแบบมีการส่งค่ากลับและไม่มีพารามิเตอร์ เป็นฟังก์ชันที่จะมีการส่งค่ากลับไปให้ฟังก์ชันที่เรียกมา แต่ไม่มีการส่งค่าจากฟังก์ชันที่เรียกมาให้ด้วย void main() { printf(“%d”,my_func()); } int my_func() int a; scanf(“%d”,&a); return (a*5);
Function Format #4 แบบที่ 4 ฟังก์ชันแบบมีการส่งค่ากลับและมีพารามิเตอร์ แบบที่ 4 ฟังก์ชันแบบมีการส่งค่ากลับและมีพารามิเตอร์ เป็นฟังก์ชันที่จะมีการส่งค่ากลับไปให้กับฟังก์ชันที่เรียกมา แต่มีการส่งค่าจากฟังก์ชันที่เรียกมาให้ด้วย void main() { char ch; ch = my_print(5); printf(“%c\n”, ch); } char my_print(int x) { char lch; printf(“Enter your character: ”); scanf(“%c”, &lch); while (x > 0) printf(“%c”, lch); x--; } printf(“\n”); return lch;
Example 4 START show_star(n) ********* * EE-UP * ********* num=9 i=1 show_star(num) T i<=n kmitl F * i++ show_star(num) end END
Example 4 (cont.)
Example 5
Test yourself จากโปรแกรมตัวอย่างจงอธิบาย ฟังก์ชันชื่ออะไร ? มีการรับค่าหรือไม่ ถ้ามี มีกี่พารามิเตอร์ ? ฟังก์ชันรับค่าเป็นตัวแปรชนิดใด ? ฟังก์ชันมีการส่งค่ากลับหรือไม่ ถ้ามี ส่งค่ากลับเป็นตัวแปรชนิดใด ? ถ้าต้องการตัดบรรทัด /*Function Prototype*/ ออกต้องปรับเปลี่ยนโปรแกรมอย่างไร ? โปรแกรมทำงานอะไร ?
User-Defined Function Outline 1 Function 2 p User-Defined Function 3 Function Format 4 Variable & Scope of Function 5 Passing Parameters
Variable & Scope of Function ตัวแปร global เป็นตัวแปรที่ฟังก์ชันใดก็สามารถเรียกใช้ได้โดยจะประกาศสร้างตัวแปรต่อจาก พรีโปรแซสเซอร์ไดเร็คทีฟ ตัวแปร local เป็นตัวแปรที่สามารถเรียกใช้ได้ภายในเฉพาะฟังก์ชันที่ประกาศสร้างตัวแปรนั้นโดยจะประกาศสร้างตัวแปรภายในแต่ละฟังก์ชัน
Example 6
Example 7
User-Defined Function Outline 1 Function 2 p User-Defined Function 3 Function Format 4 Variable & Scope of Function 5 Passing Parameters
Passing Parameters (Arguments Passing) การส่งค่าตัวแปรให้กับฟังก์ชันมีสองแบบคือ การส่งค่าที่เก็บอยู่ในตัวแปรให้กับฟังก์ชัน (pass by value) การส่งค่า Address ของตัวแปรให้กับฟังก์ชัน (pass by reference)
Passing by Value ในการส่งผ่านค่าแบบ pass by value ค่าที่ส่งเข้าไปในฟังก์ชัน อาจเป็นค่าคงที่โดยตรง หรืออาจส่งเป็นค่าจากตัวแปรก็ได้ เช่น result = add( a, b ); หรือ result = add( 5, 10); โปรแกรมจะนำค่าคงที่ หรือค่าที่คัดลอกมาจากตัวแปร ณ จุดที่เรียกใช้ ส่งผ่านให้กับพารามิเตอร์ซึ่งเป็นตัวแปรภายในฟังก์ชันที่ถูกเรียกใช้เท่านั้น หากค่าที่ส่งเข้าไปทำงานภายในฟังก์ชันมีการเปลี่ยนแปลงไปจากเดิมจะไม่มีผลกระทบกับค่าของตัวแปรที่ส่งผ่านค่ามาให้จากภายนอกฟังก์ชัน
Example 8 ในการเรียกใช้ฟังก์ชัน swap เราอาจมีการเปลี่ยนแปลงค่าอาร์กิวเมนต์ a และ b ภายในฟังก์ชัน void swap(int a, int b) { int temp; printf(“swap: a = %d, b = %d\n”, a, b); temp = a; a = b; b = temp; }
Example 8 (cont.) int main() { int x = 5, y = 10; printf(“main: x = %d, y = %d\n”, x, y); swap(x, y); return 0; } main: x = 5, y = 10 swap: a = 5, b = 10 swap: a = 10, b = 5
Pass by Reference การส่งผ่านค่าแบบ pass by reference เป็นการส่งผ่านค่าตำแหน่ง (address) ของตัวแปร แทนการส่งค่าของข้อมูลที่เก็บอยู่ในตัวแปร การส่งค่าแบบนี้จะทำให้ตำแหน่งของข้อมูลที่ทำงานภายในฟังก์ชัน เป็นตำแหน่งเดียวกับข้อมูลที่ฟังก์ชันส่งผ่านเข้ามาให้ เมื่อมีการเปลี่ยนแปลงค่าของข้อมูลที่ส่งผ่านเข้าไปทำงานในฟังก์ชัน ค่าของตัวแปรที่อยู่นอกฟังก์ชันก็จะเปลี่ยนตามไปด้วย
Pass by Reference (cont.) ภาษาซีใช้วิธีการส่งผ่านค่าตำแหน่งของตัวแปร โดยใช้ชนิดข้อมูลแบบพอยน์เตอร์ (pointer) เข้ามาช่วย การประกาศชนิดข้อมูลแบบตัวชี้ ใช้ตัวดำเนินการ * (Dereferencing operator) การกำหนดตำแหน่งข้อมูลให้ตัวชี้ใช้ตัวดำเนินการ & (Referencing operator)
Dereferencing Operator วิธีการประกาศชนิดข้อมูลแบบพอยน์เตอร์ เราจะใช้ตัวดำเนินการ * (derefercing operator) ตามหลังชื่อชนิดข้อมูล แต่ก่อนหน้าชื่อตัวแปร data type * var_name; int *iPtr; /* pointer to integer */ char *cPtr; // pointer to character float *fPtr; /* pointer to floating point */
Dereferencing Operator (cont.) int no = 1, *iPtr = NULL; char grade = ‘A’, *cPtr = NULL; float score = 97.25f, *fPtr = NULL; iPtr = &no; /* iPtr points to value of no */ cPtr = &grade; /* cPtr points to value of grade */ fPtr = &score; /* fPtr points to value of score */
Pointer Variable Declaration
Dereferencing Operator (cont.) การอ้างถึงค่าของข้อมูลที่อยู่ในตำแหน่งที่ระบุ ให้ใช้ตัวดำเนินการ *(Deferencing operator) เช่นเดียวกับตอนประกาศตัวแปรแบบตัวชี้ int no = 1, *iPtr = NULL; iPtr = &no; /* iPtr points to value of no */ printf(“no = %d\n”, no); *iPtr = 2; /* value of no is also changed to 2 */ no = 1 no = 2
Pass by Reference (cont.) นำฟังก์ชัน swap จากตัวอย่างข้างต้นมาปรับใหม่ โดยใช้การส่งผ่านค่าแบบ pass by reference เพื่อให้ข้อมูลของตัวแปรที่ส่งผ่านเข้าไปมีการเปลี่ยนแปลงตามค่าที่ถูกเปลี่ยนภายในฟังก์ชันด้วย
Example 9 1: /* Program: case2.c 2: swap values using pass by reference 3: */ 4: #include <stdio.h> 5: 6: /* function prototypes */ 7: void swap(int *a, int *b); 8: 9: int main() 10: { 11: int x = 5, y = 10; 12: 13: printf(“main: x = %d, y = %d\n”, x, y); 14: swap(&x, &y); 15: printf(“main: x = %d, y = %d\n”, x, y); 16: 17: return 0; 18: } 19:
Example 9 (cont.) 20: /* swap values of a and b */ 21: void swap(int *a, int *b) 22: { 23: int temp; 24: 25: printf(“swap: a = %d, b = %d\n”, *a, *b); 26: 27: temp = *a; 28: *a = *b; 29: *b = temp; 30: 31: printf(“swap: a = %d, b = %d\n”, *a, *b); 32: }
Result main: x = 5, y = 10 swap: a = 5, b = 10 swap: a = 10, b = 5 main: x = 10, y = 5 จากผลการทำงานของโปรแกรม แสดงให้เห็นผลของการส่งผ่านค่าแบบ pass by reference ซึ่งทำให้ค่าของตัวแปรที่ส่งผ่านให้กับฟังก์ชันที่เรียกใช้ มีผลตามการเปลี่ยนแปลงของค่านั้นภายในฟังก์ชันด้วย
Pass by Reference Analysis เราเคยใช้การส่งผ่านค่าแบบ pass by reference มาก่อนในฟังก์ชัน scanf สังเกตได้ว่าส่วนอาร์กิวเมนต์ของฟังก์ชัน scanf มีลักษณะเหมือนกัน โดยใช้ตัวดำเนินการ & กำหนดตำแหน่งของตัวแปร ที่จะรับค่าเข้ามาจากคีย์บอร์ด เช่น scanf(“%d”, &no); scanf(“%c”, &choice);
Example 10
Example 10 (cont.)
Result
Example 11
Example 12
Example 13
Summary Passing Parameters การเลือกใช้วิธีการส่งผ่านค่าให้กับฟังก์ชัน ขึ้นอยู่กับวัตถุประสงค์การใช้ ปกติการส่งค่าให้กับฟังก์ชัน จะใช้วิธีแบบ pass by value เพราะการทำงานภายในฟังก์ชันไม่ควรจะมีผลกระทบต่อค่าของตัวแปรภายนอก ฟังก์ชันมีช่องทางในการส่งค่ากลับมาให้ตัวแปรภายนอกอยู่แล้ว โดยใช้ return แต่ค่าที่ส่งกลับจากประโยค return มีได้เพียงค่าเดียว หากต้องการผลลัพธ์กลับจากฟังก์ชันมากกว่า 1 ค่า ต้องใช้การส่งผ่านแบบ pass by reference
Assignment #11 1. โปรแกรมเก็บข้อมูลสินค้า 1 ชนิด ภายในโปรแกรมประกอบด้วย ฟังก์ชันต่างๆดังนี้ ฟังก์ชันใส่ข้อมูลสินค้า getdata() ฟังก์ชันเพิ่มจำนวนสินค้า 10 ชิ้น add10() ฟังก์ชันลดจำนวนสินค้า 10 ชิ้น sub10() และฟังก์ชันแสดงจำนวนรายละเอียดภายในสินค้า โปรแกรมนี้ยังไม่สมบรูณ์ดี ให้นักศึกษาเขียนคำประกาศฟังก์ชัน getdata() และ add10 และคำสั่งภายในให้สมบรูณ์
Assignment #11 (cont.)
Assignment #11 (cont.) 2. ให้นิสิตอธิบายการทำงานของโปรแกรมนี้ พร้อมกับชี้ให้เห็นว่าจุดผิดของโปร แกรมคือจุดใด Hint: มีที่ผิด 1 จุด
Assignment #11 (cont.) 3. โปรแกรมต่อไปนี้แสดงผลเลขอะไรจอภาพ ใช้เวลาคิดไม่เกิน 10นาที เมื่อคิดเสร็จแล้วให้ลองพิมพ์ code ดังกล่าวลงคอมพิวเตอร์ และตรวจสอบคำตอบ
Assignment #11 (cont.)
Assignment #11 (cont.) 4. จงวิเคราะห์โจทย์ วิเคราะห์การทำงาน เขียนขั้นตอนการทำงานอย่างละเอียด เขียนรหัส เทียม เขียนแผนภาพการไหลของข้อมูล (Flowchart) พร้อมทั้งเขียนโปรแกรมการเรียงลำ ดับตัวเลข (Bubble sort) 10 จำนวน จากน้อยไปมาก กำหนดให้มีการรับค่าตัวเลข 10 จำนวนจากแป้นพิมพ์ ให้เขียนฟังก์ชันในการเรียงลำดับตัวเลขชื่อฟังก์ชัน “Sort_function” โดยฟังก์ชันนี้จะส่งผลลัพธ์ของการเรียงลำดับตัวเลขมาแสดงผลในฟังก์ชันหลัก (main function) และมีข้อกำหนดให้ฟังก์ชันดังกล่าวมีการส่งค่าในสองรูปแบบคือ pass by reference และ pass by value ตามลำดับ