820 likes | 1.03k Views
Structure Programming การเขียน โปรแกรม เชิงโครงสร้าง. สัปดาห์ที่ 12 ฟังก์ชัน (Function). objectives. เพื่อให้นิสิตรู้จักและเข้าใจ การนิยามและการเขียนฟังก์ชัน ในภาษาซี สามารถเขียน ฟังก์ชันร่วมกับคำสั่งทำซ้ำ อาเรย์ ตัวแปรชี้ตำแหน่ง ตัวแปรชนิดโครงสร้าง ในภาษาซีได้อย่างมีประสิทธิภาพ
E N D
Structure Programmingการเขียนโปรแกรมเชิงโครงสร้าง สัปดาห์ที่ 12 ฟังก์ชัน (Function)
objectives • เพื่อให้นิสิตรู้จักและเข้าใจการนิยามและการเขียนฟังก์ชันในภาษาซี • สามารถเขียนฟังก์ชันร่วมกับคำสั่งทำซ้ำ อาเรย์ ตัวแปรชี้ตำแหน่ง ตัวแปรชนิดโครงสร้างในภาษาซีได้อย่างมีประสิทธิภาพ • สามารถนำความรู้เรื่องฟังก์ชันไปประยุกต์เพื่อแก้ไขโจทย์ปัญหาในชีวิตประจำวันได้ได้อย่างถูกต้องเหมาะสม
Outline 1 Function 2 User-Defined Function p 3 Function Format Passing Parameters 4 5 Assignment
What is function? • ฟังก์ชัน คือ ชุดคำสั่งของการทำงานที่ถูกเขียนขึ้นให้โปรแกรมเมอร์สามารถเรียกใช้งานได้โดยง่าย ** ฟังก์ชัน คือ ชุดของการทำงาน ** ฟังก์ชัน ถูกเรียกใช้งานได้
Why the function is essential? ปัญหาที่เกิดขึ้นในการพัฒนาโปรแกรมที่ซับซ้อน • โปรแกรมเมอร์ไม่สามารถทราบการทำงานของระบบโดยละเอียดได้เช่น ไม่ทราบกระบวนการส่งข้อมูลผ่านเครือข่าย แต่ต้องเขียนโปรแกรมเพื่อเชื่อมต่อระบบเครือข่าย • โปรแกรมเมอร์ไม่สามารถทราบขั้นตอนการทำงานของคอมพิวเตอร์ทั้งหมดได้เช่น ทำอย่างไรตัวอักษรจึงปรากฏในหน้าจอภาพได้ • โปรแกรมบางโปรแกรมมีการทำงานที่ซับซ้อน และการทำงานซับซ้อนนั้นถูกเรียกใช้งานบ่อยครั้งเช่น การหาผลลัพธ์ทางวิทยาศาสตร์ การวิเคราะห์ข้อมูลขนาดใหญ่เป็นต้น
Solution วิธีการแก้ไข • เพื่อให้โปรแกรมเมอร์สามารถทำงานได้โดยไม่จำเป็นต้องทราบรายละเอียดการทำงานทั้งหมดของระบบ จะให้โปรแกรมเมอร์ที่ทราบการทำงานโดยละเอียดของกระบวนการต่างๆ จะเขียนชุดคำสั่งในรูปแบบของ ฟังก์ชันแล้วแจกจ่ายให้โปรแกรมเมอร์อื่นๆ ได้ใช้งาน • โปรแกรมเมอร์สามารถเรียกใช้ฟังก์ชันโดยทราบเพียงวิธีการใช้งาน และผลลัพธ์ที่เกิดขึ้นหลังจากเรียกใช้งานฟังก์ชันเท่านั้น • เช่น โปรแกรมเมอร์ที่ไม่ทราบว่าทำอย่างไรตัวอักษรจึงจะปรากฎหน้าจอ สามารถใช้คำสั่ง printfได้เลย โดยโปรแกรมเมอร์จะทราบเพียงแค่ การเรียก printfจะทำให้มีตัวอักษรปรากฎบนหน้าจอได้เท่านั้น
The Advantage of 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 ก่อน • Include directive คือคำสั่งที่เป็นการนำเอา header file มารวมไว้กับไฟล์ที่เขียน • การ include directives จะเป็นเหมือนการประกาศให้กับ compiler ทราบว่าจะใช้คำสั่ง ใน Library นั้นๆ เช่น การใช้คำสั่ง sin() ซึ่งอยู่ใน math.hจะต้องมีการประกาศ Library ก่อนเสมอ ดังตัวอย่าง • #include <math.h>
How to use Standard Library Function? • การเรียกใช้ Standard Library Function มีขั้นตอนดังนี้ • ทราบว่าโปรแกรมที่เขียนต้องการการทำงานอะไร • การทำงานดังกล่าวคือฟังก์ชันชื่ออะไร • ทราบ header file ที่เป็นสารบัญของคำสั่ง • Include header file นั้นๆ • เรียกใช้ฟังก์ชันในโปรแกรม
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; }
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
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 //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; } #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"); printf("%s\n", string); //strcmp and strcmpi printf("%d\n",strcmp(str, "abc")); printf("%d\n",strcmpi(str, "abc")); //ผลลัพธ์ Abc AbcDef -1 0 6 aBcDef
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
Outline 1 Function 2 User-Defined Function p 3 Function Format Passing Parameters 4 5 Assignment
User-Defined Function • เนื่องจาก Standard Library Function ทั้งหมด เป็นฟังก์ชันมาตรฐานที่มีเฉพาะการทำงานพื้นฐานต่างๆ เท่านั้น • หากต้องการฟังก์ชันที่มีการทำงานเฉพาะกิจ โปรแกรมเมอร์ต้องเขียนฟังก์ชันขึ้นมาเอง
User-Defined Function (cont.) ข้อกำหนดพื้นฐานของ User-defined Function • ต้องมีการประกาศ 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; } typefunction_name(type variable) { statement-1; ... statement-n; return(var); } ส่วนหัวโปรแกรม ฟังก์ชันโพรโทรไทพ์ ตัวแปรชนิดโกบอล ตัวแปรชนิดโลคอล ฟังก์ชันหลัก คำสั่ง ส่วนตัวโปรแกรม ฟังก์ชันย่อย
User-Defined Function (cont.) • ฟังก์ชัน : กลุ่มคำสั่งทำงานที่มีการรับค่าแล้วทำตามคำสั่งในฟังก์ชั่น และมีการส่งค่ากลับ (return) Process (ทำงาน) ส่งค่ากลับ รับค่ามา Function Return_TypeFunction_name(Type variable)
User-Defined Function (cont.) • Function • การเขียนฟังก์ชันโดยที่ไม่ต้องมีการประกาศก่อน • สามารถประกาศตัวแปรไว้ใช้งานเฉพาะในฟังก์ชันได้ • ฟังก์ชันประกอบไปด้วย • คำสั่ง (Statement): การทำงานอย่างหนึ่ง เรียงกันไป • Return : การคืนค่าที่เป็นผลลัพธ์การทำงานของฟังก์ชัน • Function Main • ฟังก์ชันที่ทุกโปรแกรมที่เรียกทำงานได้ต้องมี • โปรแกรมจะเริ่มทำงานจากฟังก์ชัน main ก่อน • ฟังก์ชัน main จะมีการเรียกการทำงานของฟังก์ชั่นอื่นๆ
Main Function • ส่วนนี้ทุกโปรแกรมจะต้องมี โดยโปรแกรมหลักจะเริ่มต้นด้วย main() และตามด้วยเครื่องหมายปีกกาเปิด ‘{’ และปีกกาปิด ‘}’ • ระหว่างปีกกาจะประกอบไปด้วยคำสั่ง(Statement) ต่างๆ ที่จะให้โปรแกรมทำงาน • แต่ละคำสั่งจะต้องจบด้วยเซมิโคลอน ‘;’ (Semicolon) #include <stdio.h> void main(void) { ... Statement ; }
Main Function (cont.) ตัวอย่าง #include <stdio.h> intfeet,inches; void main() { feet = 6; inches = feet * 12; printf("Height in inches is %d",inches); } ผลการทำงาน Height in inches is 72
Main Function • ตัว Main Function จะมีสามารถรับค่าจากภายนอกเข้ามาในโปรแกรมได้ โดยรูปแบบการเขียนจะเป็นดังนี้ • argcคือ จำนวนของข้อความที่ส่งเข้ามาในโปรแกรม • argvคือ กลุ่มของข้อความที่ส่งเข้ามาในโปรแกรม (array of char pointer) • การ return ของ main function เป็นการส่งค่ากลับไปหาระบบปฏิบัติการ #include <stdio.h> intmain(intargc, char *argv[]) { ... Statement ; return 0; }
User-Defined Function (cont.) • สร้างฟังก์ชันหรือคำใหม่ขึ้นมาใช้งานตามที่เราต้องการ • ระหว่างปีกกาจะประกอบด้วยคำสั่ง(Statement) ต่างๆ ที่จะให้ฟังก์ชันทำงาน • สามารถเรียกใช้ภายใน โปรแกรมได้ทุกที่ #include <stdio.h> int function() void main(void) { ... Statement ; } int function() { Statement ; ... return (int value); }
Example 4 ตัวอย่าง #include <stdio.h> int Feet2Inch(int); intfeet,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 ); intsumm; int main() { adder(20, 30); // จุดที่เรียกใช้ฟังก์ชันโพรโตไทป์ printf(“summary = %d”,summ) return 0; } void adder(int a, int b) { summ = a+b; }
Outline 1 Function 2 User-Defined Function p 3 Function Format Passing Parameters 4 5 Assignment
Function Declaration • เป็นการประกาศการใช้งานฟังก์ชั่นที่อยู่หลัง main() typeคือ ชนิดของฟังก์ชัน ว่าฟังชันที่ทำการสร้างจะส่งข้อมูลชนิดใดกลับ function_nameคือ ชื่อฟังก์ชันที่จะสร้างขึ้น type-nคือ ชนิดของข้อมูลที่จะส่งให้ฟังก์ชัน typefunction_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() { type variable; statement-1; ... statement-n; return 0; }
Function Declaration(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) { statement-1; ... statement-n; return(var); }
Function Format #1 • แบบที่ 1:ฟังก์ชันแบบไม่มีการส่งค่ากลับและไม่มีพารามิเตอร์ • เป็นฟังก์ชันที่ไม่มีการส่งค่ากลับไปให้กับฟังก์ชันที่เรียกมา และไม่มีการส่งค่าจากฟังก์ชันที่เรียกมาให้ด้วย void main() { my_print(); } voidmy_print() { printf(“Hello world”); }
Function Format #2 • แบบที่ 2 ฟังก์ชันแบบไม่มีการส่งค่ากลับแต่มีพารามิเตอร์ • เป็นฟังก์ชันที่จะไม่มีการส่งค่ากลับไปให้ฟังก์ชันที่เรียกขึ้นมา แต่มีการส่งค่าจากฟังก์ชันที่เรียกมาให้ด้วย • void main() • { • my_print(‘a’, 5); • } • voidmy_print(char ch, int x) • { • while (x > 0) • { • printf(“%c”, ch); • x--; • } • } void main() { my_print(2); } voidmy_print(int x) { printf(“%d”, x); }
Function Format #3 • แบบที่ 3 ฟังก์ชันแบบมีการส่งค่ากลับและไม่มีพารามิเตอร์ • เป็นฟังก์ชันที่จะมีการส่งค่ากลับไปให้ฟังก์ชันที่เรียกมา แต่ไม่มีการส่งค่าจากฟังก์ชันที่เรียกมาให้ด้วย void main() { printf(“%d”,my_func()); } intmy_func() { int a; scanf(“%d”,&a); return (a*5); }
Function Format #4 • แบบที่ 4 ฟังก์ชันแบบมีการส่งค่ากลับและมีพารามิเตอร์ • เป็นฟังก์ชันที่จะมีการส่งค่ากลับไปให้กับฟังก์ชันที่เรียกมา แต่มีการส่งค่าจากฟังก์ชันที่เรียกมาให้ด้วย • void main() • { • char ch; • ch = my_print(5); • printf(“%c\n”, ch); • } • charmy_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
Test yourself จากโปรแกรมตัวอย่างจงอธิบาย • ฟังก์ชันชื่ออะไร ? • มีการรับค่าหรือไม่ ถ้ามี มีกี่พารามิเตอร์ ? • ฟังก์ชันรับค่าเป็นตัวแปรชนิดใด ? • ฟังก์ชันมีการส่งค่ากลับหรือไม่ ถ้ามี ส่งค่ากลับเป็นตัวแปรชนิดใด ? • ถ้าต้องการตัดบรรทัด /*Function Prototype*/ ออกต้องปรับเปลี่ยนโปรแกรมอย่างไร ? • โปรแกรมทำงานอะไร ?
Variable & Scope of Function • ตัวแปร global เป็นตัวแปรที่ฟังก์ชันใดก็สามารถเรียกใช้ได้โดยจะประกาศสร้างตัวแปรต่อจาก พรีโปรแซสเซอร์ไดเร็คทีฟ • ตัวแปร local เป็นตัวแปรที่สามารถเรียกใช้ได้ภายในเฉพาะฟังก์ชันที่ประกาศสร้างตัวแปรนั้นโดยจะประกาศสร้างตัวแปรภายในแต่ละฟังก์ชัน