ภาษาซี function สุวิชยะ รัตตะรมย์ สานักวิชาเทคโนโลยีสารสนเทศและการสื่อสาร เนื้อหาที่สอนในวันนี้  by dekdektum

VIEWS: 811 PAGES: 29

									function
สุวิชยะ รัตตะรมย์ สานักวิชาเทคโนโลยีสารสนเทศและการสื่อสาร

เนื้อหาที่สอนในวันนี้


     

ฟังก์ชันคืออะไร ? ส่วนประกอบของฟังก์ชัน โครงสร้างของการเขียนฟังก์ชัน Parameters (ตัวแปรที่รับมา) Return Value (ค่าที่ต้องส่งกลับ) function prototyping local variable & call by value
2

 กลุ่มของคาสั่งที่ทางานเป็นอิสระจากคาสั่งกลุ่มอื่นๆ

ฟังก์ชันคืออะไร ?

ตัวฟังก์ชันเขียนอยู่นอกบล็อกใดๆ  มีตัวแปรของตัวเอง (local variable) รู้จักเฉพาะในฟังก์ชันนั้น  ติดต่อกับ main program , ฟังก์ชันอื่นผ่าน parameter  ทาไมต้องเขียนเป็นฟังก์ชัน  โปรแกรมขนาดใหญ่เกิดข้อผิดพลาดได้ง่าย  ง่ายในการเขียน, การตรวจสอบแก้ไข (debug)  นากลับมาใช้ใหม่ได้ (reusable)

3

โปรแกรมปกติ
#include stdio.h void main() { … (บล็อกของ main) }

เขียนเป็นฟังก์ชัน
#include stdio.h int fn2 ( void ) { … (บล็อกของ fn2) } void main() { … (บล็อกของ main) result = fn2(y); }

4

 ขั้นตอนการเรียกใช้ฟังก์ชัน

เรียกใช้งานฟังก์ชัน พร้อมทั้งส่งค่าให้ฟังก์ชัน  ย้ายไปทางานฟังก์ชันที่ถูกเรียกใช้จนจบ  ฟังก์ชันคืนค่าผลลัพธ์ให้ผู้ที่เรียกใช้ Boss asks worker to complete task Worker gets information, does task, returns result Information hiding: boss does not know details


 เช่น

ฟังก์ชัน fabs() ใน math.h ซึ่งเป็นฟังก์ชันในการหา ค่าสัมบูรณ์ของตัวเลขจานวนจริง

5

 ตัวอย่าง

ฟังก์ชัน fabs() ใน math.h ซึ่งเป็นฟังก์ชันในการ หาค่าสัมบูรณ์ของตัวเลขจานวนจริง  เมื่อต้องการหาค่าสัมบูรณ์ : เรียกใช้งานฟังก์ชัน fabs() โดยส่งตัวเลขที่ต้องการหาค่าสัมบูรณ์ให้ฟังก์ชัน  ฟังก์ชั น fabs() รับตัว เลข , ค านวณค่าสัม บูรณ์ , ส่ ง ผลลัพธ์กลับ  ได้ผลลัพธ์จากฟังก์ชันเป็นค่าสัมบูรณ์ของตัวเลขที่ส่งไป  ต้องการหาค่ าสัมบูร ณ์อีกครั้ง : เรียกใช้ฟัง ก์ชัน fabs() โดยส่งค่าใหม่ให้แก่ฟังก์ชัน ผลลัพธ์ที่ได้จะเปลี่ยนแปลง ตามค่าที่ส่งไป
6

ตัวอย่าง function
main start
r1 = fabs(4.5) … …

r2 = fabs(-3.1)
…

stop

4.5 -3.1 3.1

4.5

function fabs()

คานวณหาค่าสัมบูรณ์
stop
7

start

ฟังก์ชันจากไลบรารี่ (Library function)
ที่เราเรียกใช้ได้จากคาสั่ง #include ก็เป็นฟังก์ชัน เช่น printf() , clrscr() , scanf() , getch() , getche() , getchar() , fabs()  เรียกว่าฟังก์ชันมาตรฐาน หรือฟังก์ชันจากไลบรารี่ (Library function)  ซึ่งผู้ใช้สามารถนาไปใช้ในโปรแกรมใดๆ ก็ได้  โดยส่วนของตัวฟังก์ชันจะอยู่ใน header file ที่ได้ include มานั่นเอง
8

 จริงๆ แล้วคาสั่งต่างๆ

ส่วนประกอบของฟังก์ชัน
 function name

: ชื่อของฟังก์ชันที่ส่วนอื่นๆ จะใช้ในการ

เรียกใช้งาน  function body : กลุ่มคาสั่งที่เขียนขึ้นเพื่อให้ฟังก์ชัน ทางานตามที่ต้องการ  parameters : ค่าที่ส่งให้กับฟังก์ชัน  อาจไม่มีก็ได้ เช่น ฟังก์ชัน clrscr()  return value : ค่าที่ฟังก์ชันส่งกลับให้กับส่วนที่เรียกใช้  อาจไม่มีก็ได้ เช่น ฟังก์ชัน clrscr()
9

 ตัวอย่าง

printf ( “You are %d years old” , year ) ;  function name : printf  function body : กลุ่มคาสั่งในการพิมพ์ตัวอักษรออกทาง หน้าจอ (อยู่ในไฟล์ stdio.h)  parameters : format ในการพิมพ์ข้อความ (ข้อความ ภายใต้เครื่องหมายคาพูด ) + ผลลัพธ์ของ expression ที่ ต้องการพิมพ์ออกมา  parameters ที่ส่งให้ฟังก์ชันจะอยู่ภายใต้วงเล็บ  return value : ไม่มี (ความจริงมี แต่ไม่จาเป็นต้องใช้)

10

โครงสร้างของการเขียนฟังก์ชัน
return-value-type function-name ( parameter-list ) { function-body ; return (expression); // ค่าที่ต้องการส่งกลับ
}

ตัวอย่าง

int user_abs ( int n ) { if ( n < 0) { n = -1 * n ; } return ( n ) ; }

11

Parameters (ค่าที่ได้รับมา)
 ส่วนที่กาหนดตัวแปรเพื่อรับค่าที่ส่งให้กับฟังก์ชัน

โดยจะ

กาหนดในวงเล็บที่อยู่หลังจากชื่อของฟังก์ชัน  ชนิดของข้อมูลที่ผู้เรียกใช้จะส่งมาเมื่อเรียกใช้ฟังก์ชันนี้ ต้องเป็นชนิดเดียวกัน กับที่กาหนดไว้ในส่วน parameters  ฟังก์ชันรับค่าเพียงค่าเดียว หรือหลายค่าก็ได้  ถ้าไม่ต้องการรับค่า : ใช้คาสั่ง void int single_para ( int n ) int multi_para ( float x , int a ) int no_para ( void )

12

 ส่ ว นที่ ก าหนดค่ า ที่ ฟั ง ก์ ชั น จะส่ ง กลั บ ให้ ส่ ว นที่ เ รี ย กใช้

Return Value (ค่าที่ส่งกลับ)

ต้องกาหนด 2 ตาแหน่งที่ สัมพันธ์ กัน คือ  ส่ ว นที่ อ ยู่ ห น้ า ชื่ อ ฟั ง ก์ ชั น (return-value-type) ชนิ ด ข้อมูลของค่าที่จะส่งกลับ เช่น int, float, long เป็นต้น  ส่วนที่อยู่ห ลังคาสั่ง return (ใน body of function) ตัว แปรหรือ expression ที่ต้องการส่งกลับ ต้องมีผ ลลัพธ์ เ ป็น ข้อ มูลชนิด เดียวกัน กับชนิดของ return-value-type  ส่งค่ากลับจากฟังก์ชันได้ เพียง 1 ค่า เท่านั้น
13

 ถ้าไม่ต้องการส่งค่ากลับ

ในส่วน return-value-type ใช้คาสั่ง void  ใน function body ไม่ต้องมีคาสั่ง return

int return1 ( int n ) { … … return ( n ) ; } double return3 ( int n ) { double yyy; … return ( yyy * 3.0 ) ; } float return2 ( int n ) { float xxx; … return ( xxx ) ; } void no_return (int n ) { float xxx; … }
14

#include <stdio.h> double fac(double x) { int i; double r=1; for (i=1;i<=x;i++) r=r*i; return r; } void main( ) { double x , r ; printf(“input number : ”) ; scanf(“ %f ”,&x) ; r = fac(x) ; printf(“ %.f! = %.f ”, x, r); }

ตัวอย่าง #1
ฟังก์ชัน fac ใช้ในการคานวณหา factorial ของค่าที่รับมา โดยรับค่าเป็น ตัวแปรชนิด double และเมื่อคานวณ เสร็จจึงส่งผลลัพธ์กลับให้ส่วนที่ เรียกใช้ โดยส่งค่ากลับเป็นตัวแปร ชนิด double เช่นกัน

เรียกใช้งานฟังก์ชัน fac โดยส่งค่าเป็น ตัวแปรชนิด double และค่าที่รับกลับ จากฟังก์ชันเป็นตัวแปรชนิด double
15

ตัวอย่าง #2
#include <stdio.h> #include <conio.h> int sum (int a , int b) { return a + b ; } void main( ) { int x; clrscr( ); x = sum(5,sum(4,5)); printf(“x = %d“ , x); }

ชื่อตัวแปรที่รับไม่จาเป็นต้องเป็นชื่อเดียวกับตัว แปรที่ส่ง แต่ต้องเป็นข้อมูลชนิดเดียวกัน

ค่าที่ส่งกลับโดยใช้คาสั่ง return จะเป็นตัวแปร หรือ expression ก็ได้ แต่จะต้องเป็นข้อมูลชนิด เดียวกับที่ตัวแปรใน main คอยรับอยู่ (x) การเรียกใช้ฟังก์ชันสามารถส่งค่า arguments เป็น ค่าคงที่ , expression หรือตัวแปรก็ได้ แต่ค่าที่ส่ง ไปต้องเป็นข้อมูลชนิดเดียวกับที่เรากาหนดไว้ใน ฟังก์ชัน
16

ตัวอย่าง #3
#include <stdio.h> #include <conio.h> void printMsg(void) { printf(“inside function \n”); } void main() { clrscr(); printf(“inside main \n”); printMsg(); printf(“inside main \n”); }

บางฟังก์ชันไม่จาเป็นต้องมีการ รับค่าหรือส่งค่ากลับ ขึ้นอยู่กับ จุดประสงค์ของแต่ละฟังก์ชัน

เมื่อไม่มีการรับหรือส่งค่ากลับ เวลาเรียกใช้งานฟังก์ชันก็ไม่ จาเป็นต้องมีส่วนที่ส่งค่าหรือ ตัวแปรเพื่อมารับค่ากลับ
17

function prototyping
จะต้องถูกประกาศก่อน การใช้งานเสมอ ( อยู่บรรทัดบนของส่วนที่จะเรียกใช้ )  การประกาศฟังก์ชัน เรียกว่า function prototyping  เหมือนกับการประกาศชื่อตัวแปรก่อนที่จะเรียกใช้งาน ตัวแปรนั้น  การเขียนฟังก์ชัน ที่สมบูรณ์ขึ้นมาถือว่าเป็นการทา function prototyping ไปในตัว  แต่ถ้าเรายังไม่เขียนฟังก์ชัน เราจาเป็นต้องประกาศให้ คนอื่นได้รับรู้ก่อน
18

 ชื่อของฟังก์ชันที่เราจะเรียกใช้

#include <stdio.h> double fac(double x) { int i; double r = 0 ; for (i=1;i<=x;i++) r=r*i; return r; } void main( ) { float x , r ; printf(“input number : ”) ; scanf(“ %f ”,&x) ; r = fac(x) ; printf(“ %.f! = %.f ”, x, r); }

#include <stdio.h> double fac(double x); void main( ) { float x , r ; printf(“input number : ”) ; scanf(“ %f ”,&x) ; r = fac(x) ; printf(“ %.f! = %.f ”, x, r); } double fac(double x) { int i; double r = 0 ; for (i=1;i<=x;i++) r=r*i; return r; }
19

#include <stdio.h> #include <conio.h> int sum (int a , int b) { return a + b ; } void main( ) { int x; clrscr( ); x = sum(5,sum(4,5)); printf(“x = %d“ , x); }

#include <stdio.h> #include <conio.h> int sum (int , int ); void main( ) { int x; clrscr( ); x = sum(5,sum(4,5)); printf(“x = %d“ , x); } sum (int a , int b) { return a + b ; }
20

#include <stdio.h> #include <conio.h> void printMsg(void) { printf(“inside function\n”); } main() { clrscr(); printf(“inside main \n”); printMsg(); printf(“inside main \n”); }

#include <stdio.h> #include <conio.h> void main() { void printMsg(void); clrscr(); printf(“inside main \n”); printMsg(); printf(“inside main \n”); } void printMsg(void) { printf(“inside function\n”); }
21

 เขียนโปรแกรมเพื่อคานวณหาผลลัพธ์ของเลขยกกาลัง xy

ex7_1.c

x และเลขชี้กาลัง y จากนั้น โปรแกรมจึงคานวณ และแสดงผลลัพธ์ออกทางหน้าจอ  ในส่วนของการคานวณ ให้เขียนเป็นฟังก์ชัน โดยมี function prototype ดังนี้ ฟังก์ชัน long find_pow ( long , long ) ; การทางาน ฟังก์ชันคานวณหาผลลัพธ์ของ xy ข้อมูลเข้า ค่าของ x และ y ที่จะนามาคานวณ ข้อมูลออก ผลลัพธ์ของ xy
22

 ผู้ใช้กรอกตัวเลขฐาน

#include <stdio.h> void test_var(int a) { a=5; } main() { int a = 3 ; printf( “a = %d\n” , a ); test_var(a); printf( “a = %d\n” , a ); }

ผลการรันโปรแกรม
a=3 a=3

23

local variable & call by value
local variable  ตั ว แปรที่ ป ระกาศภายใต้ ฟั ง ก์ ชั น ทุ ก ฟั ง ก์ ชั น (รวมถึ ง ฟังก์ชัน main) เป็นตัวแปรชนิด local variable
 ตัวแปรจะรู้จักและใช้งานได้เฉพาะในฟังก์ชันที่ประกาศ

ตัวแปรนั้นเท่านั้น ฟังก์ชันอื่นไม่สามารถรู้จักและใช้งาน ตัวแปรของอีกฟังก์ชันหนึ่งได้
 ตั ว แปรที่ มี ชื่ อ ซ้ ากั น ในคนละฟั ง ก์ ชั น

จึ ง ถื อ ว่า เป็ น ตั ว
24

แปรคนละตัวกัน

call by value  ในการเรี ยกใช้ง านฟั งก์ ชั นในภาษาซี ปกติแ ล้วค่ าที่ ส่ ง ให้กับฟังก์ชันจะใช้การส่งค่าแบบ call by value
 คือ การ

copy ค่าที่ผู้เรียกใช้ฟังก์ชันส่งให้กับฟังก์ชัน ไป ยังตัวแปรแบบ local ในฟังก์ชัน


ส่วน parameter list ของฟังก์ชันจริงๆ แล้วก็คือการ ประกาศตัวแปรแบบ local สาหรับฟังก์ชันนั้น และนา ตัวแปรแบบ local ที่ประกาศมา copy ค่าตัวแปรที่ส่ง ให้กับฟังก์ชัน
25

#include <stdio.h> void test_var(int a) { a=5; } main() { int a = 3 ; printf( “a = %d\n” , a ); test_var(a); printf( “a = %d\n” , a ); }

4

ผลการรันโปรแกรม a=3 2 a=3 5 main 1 a 2 5 3 3

1

3

test_var

4

a

5 3
26

#include <stdio.h> int test_var(int x) { int y = 10 ; x=5; printf( “%d %d\n” , x , y ); return y ; } main() { int x = 3 , y = 6; printf( “%d %d\n” , x , y ); y = test_var(x); printf( “%d %d\n” , x , y ); }

4

6

5

ผลการรันโปรแกรม 3 6 2 5 10 5 3 10 7 main 1 x 3 y 10 6 6 3

1

3

2 7

test_var x 5 3 4 y 10

27

พ.ท. ของสี่เหลี่ยมคางหมู  ผู้ใช้กรอกความสูง, ความยาวด้านคู่ขนานทั้ง 2 จากนั้น โปรแกรมจึงคานวณ และแสดงผลลัพธ์ออกทางหน้าจอ  ในส่วนของการคานวณ ให้เขียนเป็นฟังก์ชัน โดยมี function prototype ดังนี้ ฟังก์ชัน double area (double h, double L1, double L2) ;
การทางาน ฟังก์ชันคานวณหา พ.ท. สี่เหลี่ยมคางหมู ข้อมูลเข้า ความสูง และความยาวของด้านคูขนานทั้ง 2 ่ ข้อมูลออก พ.ท. ของสี่เหลี่ยมคางหมูที่คานวณได้
28

 เขียนโปรแกรมเพื่อคานวณหา

ex7_2.c

(*) ออกมาที่ หน้าจอเป็นจานวนแถวและสดมภ์ตามแต่ผู้ใช้จะกาหนด  ผู้ใช้จะกรอกข้อมูลแถวและสดมภ์ที่ต้องการพิมพ์  ในส่วนของการพิมพ์ ให้เขียนเป็นฟังก์ชัน โดยมี function prototype ดังนี้ ฟังก์ชัน void print_star ( int row, int col) ; การทางาน พิมพ์เครื่องหมายดอกจันตามแถวและสดมภ์ ข้อมูลเข้า ข้อมูลจานวนแถวและสดมภ์ที่ต้องการพิมพ์ ข้อมูลออก 29

 เขียนโปรแกรมเพื่อพิมพ์เครื่องหมายดอกจัน

ex7_3.c


								
To top