Computer Programming การเขียนโปรแกรมคอมพิวเตอร์ สัปดาห์ที่ 11 ฟังก์ชัน
objectives เพื่อให้นิสิตรู้จักและเข้าใจการนิยามและการเขียนฟังก์ชันในภาษาซี สามารถเขียนฟังก์ชันร่วมกับคำสั่งทำซ้ำ อาเรย์ ตัวแปรชี้ตำแหน่ง ตัวแปรชนิดโครงสร้างในภาษาซีได้อย่างมีประสิทธิภาพ สามารถนำความรู้เรื่องฟังก์ชันไปประยุกต์เพื่อแก้ไขโจทย์ปัญหาในชีวิตประจำวันได้ได้อย่างถูกต้องเหมาะสม
User-Defined Function Outline 1 Function 2 p User-Defined Function 3 Function Format 4 Variable & Scope of Function 5 Passing Parameters
function What? ฟังก์ชัน คือ ชุดคำสั่งของการทำงานที่ถูกเขียนขึ้นให้โปรแกรมเมอร์สามารถเรียกใช้งานได้โดยง่าย Why? โปรแกรมบางโปรแกรมมีการทำงานที่ซับซ้อน และการทำงานซับซ้อนนั้นถูกเรียกใช้งานบ่อยครั้ง เช่น การหาผลลัพธ์ทางวิทยาศาสตร์ การวิเคราะห์ข้อมูลขนาดใหญ่เป็นต้น
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<math.h> int main(void) { double rad = -1.0; do { printf ( "Sine of %f is %f\n", rad, sin(rad)); rad += 0.1; } while (rad <= 1.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 เป็นตัวแปรที่สามารถเรียกใช้ได้ภายในเฉพาะฟังก์ชันที่ประกาศสร้างตัวแปรนั้นโดยจะประกาศสร้างตัวแปรภายในแต่ละฟังก์ชัน ตัวแปร static เป็นตัวแปรแบบ local โดยค่าของตัวแปรจะมีค่าต่อเนื่องจากค่าครั้งหลังสุดในฟังก์ชันนั้น
Global Variable Example 6
Local Vs Global Example 7
Static Variable Example 7 ผลลัพธ์ a = 15, sa = 15 a = 15, sa = 20 a = 15, sa = 25 a = 15, sa = 30 a = 15, sa = 35 a = 15, sa = 40 a = 15, sa = 45 a = 15, sa = 50 a = 15, sa = 55 a = 15, sa = 60
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 (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
Dereferencing Operator วิธีการประกาศชนิดข้อมูลแบบพอยน์เตอร์ เราจะใช้ตัวดำเนินการ * (derefercing operator) ตามหลังชื่อชนิดข้อมูล แต่ก่อนหน้าชื่อตัวแปร data type function_name(data type *var); int main(void){ data type new_var = function_name(&variable); } void function_name(data type *var); int main(void){ function_name(&variable); }
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
แบบฝึกหัด แบบฝึกหัด
Flowchart โปรแกรมแสดงผลตัวเลขโดยการเขียนโปรแกรมแบบมีเงื่อนไขและวนรอบ 2.1 แสดงเลข 0 2.2 แสดงเลข 1 ... 2.10 แสดงเลข 9 โปรแกรม แสดงผลรูปสามเหลี่ยม โดยมีความกว้างฐาน 51* และความสูง 26* โดยบังคับว่าการเขียนโปรแกรมต้องเป็นแบบมีเงื่อนไขและวนรอบ(if else,loop) ************ * * *** ***** ******* ********* *********** ICT, University of Phayao
โปรแกรม แสดงผลรูปสามเหลี่ยม โดยมีความกว้างฐาน 51. และความสูง 26 โปรแกรม แสดงผลรูปสามเหลี่ยม โดยมีความกว้างฐาน 51* และความสูง 26* โดยบังคับว่าการเขียนโปรแกรมต้องเป็นแบบมีเงื่อนไขและวนรอบ(if else,loop) ooooxoooo : i = 1 (2*i-1) oooxxxooo : i = 2 (2*i-1) ooxxxxxoo : i = 3 (2*i-1) oxxxxxxxo : i = 4 (2*i-1) xxxxxxxxx : i = 5 (2*i-1) * *** ***** ******** ********** ************ j = 1 – 9 x เริ่มต้นที่ 1+(9 – (2*i-1)) / 2 จำนวน x มี 2*i-1 ตัว ICT, University of Phayao
ตัวอย่างการสร้างตัวเลขจากฟังก์ชัน เราสามารถพิมพ์ข้อความ ขนาดกว้าง 10 x 10 เช่น โดยการวนรอบ หรือ i = 1 – 10 รอบที่ j = 1 i = 1 - 10 ---------- ---------- ---------- ---------- i = 1 – 10 รอบที่ j = 2 j = 1 - 10 ---------- i = 1 – 10 รอบที่ j = 3 ---------- i = 1 – 10 รอบที่ j = … ---------- i = 1 – 10 รอบที่ j = 10 ICT, University of Phayao
ตัวอย่างการสร้างตัวเลขจากฟังก์ชัน * ********** * * * ********** * * * ********** * ********** * ********** * ********** * * * * * * ********** * * * ********** * * * * * * ********** * * * * * * * ICT, University of Phayao
ตัวอย่างการสร้างตัวเลขจากฟังก์ชัน * ********** * * * ********** * * * ********** * ********** * ********** * ********** * * * * * * ********** * * * ********** * * * * * * ********** * * * * * * * ICT, University of Phayao
********** * * ********** * * * ส่วนที่ 1 ********** * * ส่วนที่ 2 G1 * * * * ส่วนที่ 2 ********** G1 G2 * * * G3 G4 * * * * ส่วนที่ 3 * * * * ส่วนที่ 4 * * * * ส่วนที่ 5 ********** ICT, University of Phayao
ตัวอย่างการสร้างตัวเลขจากฟังก์ชัน * ********** * * * ********** * * * ********** * ********** * ********** * * * * * * ********** * * * ********** * * * * * * ********** * * * * * * * ********** * ********** G1 G2 * * * G3 G4 ICT, University of Phayao
ตัวเลข G1 G2 G3 G4 1 2 3 4 5 6 7 8 9 ********** * * * * G1 G2 G3 G4 1 2 3 4 5 6 7 8 9 G1 ********** G2 * * G3 * G4 * ICT, University of Phayao
********** * * * * G1 G2 G3 G4 ตัวเลข ส่วนที่ 1 ส่วนที่ 2 ส่วนที่ 3 ส่วนที่ 4 ส่วนที่ 5 G1 G2G2G2 G2 1 G4 G4G4G4 2 G3G3G3 3 4 5 6 7 8 9 G1 ********** G2 * * G3 * G4 * ICT, University of Phayao
ตัวอย่างการสร้างตัวเลขจากฟังก์ชัน function G1 function G2 function G3 function G4 function main( ) ICT, University of Phayao