ฟังก์ชัน

54
1 1 ฟฟฟฟฟฟฟฟ ฟฟฟฟฟฟฟฟ ฟ.ฟฟฟฟ ฟฟฟฟฟฟฟ ฟฟฟฟฟฟฟฟฟฟฟฟฟฟฟ ฟฟฟฟฟฟฟฟฟฟฟ

Upload: howard

Post on 06-Jan-2016

41 views

Category:

Documents


1 download

DESCRIPTION

ฟังก์ชัน. อ.สุธน แซ่ว่อง ภาควิชาวิศวกรรมคอมพิวเตอร์. 1. function. ข้อมูล input. ผลลัพธ์ output. กล่องดำ. square root computation. ป้อนข้อมูล 16.0. ผลลัพธ์ที่ได้คือ 4.0. ฟังก์ชันคืออะไร. ฟังก์ชัน หรือ Procedure คือ ชุดของ statement ที่ทำงานอย่างใดอย่างหนึ่ง และมีชื่อเรียก - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: ฟังก์ชัน

1

1

ฟั�งก์�ชั�นฟั�งก์�ชั�น

อ.สุ�ธน แซ่�ว่�องภาคว่�ชัาว่�ศว่ก์รรมคอมพิ�ว่เตอร�

Page 2: ฟังก์ชัน

ฟั�งก์�ชั�นค�ออะไรฟั�งก์�ชั�น หร�อ Procedure ค�อ

ชั�ดของ statement ที่#$ที่%างานอย่�างใดอย่�างหน($ง และม#ชั�$อเร#ย่ก์

สุ�ว่นอ�$นของโปรแก์รมสุามารถเร#ย่ก์ใชั-งานฟั�งก์�ชั�นได-

2

functionข-อม.ลinput

ผลล�พิธ�output

กล่�องดำ��เชั�น

square rootcomputation

ผลล�พิธ�ที่#$ได-ค�อ 40.ป0อนข-อม.ล160.

Page 3: ฟังก์ชัน

ฟั�งก์�ชั�นในภาษา C โปรแก์รมภาษา C ประก์อบไปด-ว่ย่หน($งฟั�งก์�ชั�น

(main ) หร�อมาก์ก์ว่�า แต�ละฟั�งก์�ชั�นประก์อบไปด-ว่ย่หน($ง statement หร�อ

มาก์ก์ว่�า ภาษา C แบ�งฟั�งก์�ชั�นเป3น 2 แบบ

ฟั�งก์�ชั�นมาตรฐานใน C ฟั�งก์�ชั�นที่#$สุร-างโดย่ผ.-เข#ย่นโปรแก์รม

3

FUNCTIONS IN CFUNCTIONS IN C

PROGRAMMER DEFINEDFUNCTION

PROGRAMMER DEFINEDFUNCTION

C STANDARDLIBRARY

C STANDARDLIBRARY

Page 4: ฟังก์ชัน

เน�5อหา ก์ารเร#ย่ก์ใชั-งานฟั�งก์�ชั�น ก์ารเข#ย่นฟั�งก์�ชั�นเอง ราย่ละเอ#ย่ดเก์#$ย่ว่ก์�บฟั�งก์�ชั�น ก์ารสุ�งผ�านอาเรย่�ไปย่�งฟั�งก์�ชั�น

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 4

Page 5: ฟังก์ชัน

ก�รเร�ยกใช�ฟั งก�ช�น

น�พิจน�ฟั�งก์�ชั�นม# Type เหม�อนน�พิจน�เร#ย่ก์ใชั-ฟั�งก์�ชั�นอย่�างถ.ก์ต-อง

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 5

Page 6: ฟังก์ชัน

ฟั�งก์�ชั�นม# Type (เหม�อนน�พิจน�ที่�$ว่ไป) น�พิจน�ม# Type สุามารถ

น%าไปก์%าหนดค�าให-ก์�บต�ว่แปร หร�อ เข#ย่นที่�5งไว่-เฉย่ๆ

ก์ารเร#ย่ก์ใชั-ฟั�งก์�ชั�นแต�ละคร�5งม# Type สุามารถน%าไปก์%าหนดค�าให-ต�ว่แปร หร�อ เข#ย่นที่�5งไว่-เฉย่ๆ

x = 1;

1;

a = f(1);

f(1);

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 6

ข-อสุ�งเก์ต�: ก์ารเร#ย่ก์ใชั-ฟั�งก์�ชั�นจะข(5นต-นด-ว่ย่ชั�$อของฟั�งก์�ชั�นตามด-ว่ย่( และ ) โดย่ภาย่ในว่งเล9บเป3น พิาราม�เตอร� ประก์อบก์ารที่%างานของฟั�งก์�ชั�นน�5นๆ

Page 7: ฟังก์ชัน

ก์ารเร#ย่ก์ใชั-ฟั�งก์�ชั�น ต-องร. -ต-นแบบของฟั�งก์�ชั�น

ก์ารเร#ย่ก์ใชั-ฟั�งก์�ชั�นม# Type เป3น int

ก์ารเร#ย่ก์ใชั-ฟั�งก์�ชั�นม# Type เป3น double

เร#ย่ก์ใชั-ด-ว่ย่ชั�$อ และตามด-ว่ย่พิาราม�เตอร�ที่#$ม# Type ถ.ก์ต-อง จ%านว่นพิาราม�เตอร� และ

ล%าด�บจะต-องถ.ก์ต-อง ฟั�งก์�ชั�นม�ก์ให-ผลล�พิธ� โดย่

น%าผลล�พิธ�มาใชั- โดย่ให-ด. Type ให-ถ.ก์ต-อง

/* prototype samples */

int add(int, int);

double abs(double);

add(3, 2)

abs(2.0)

int x;

x = add(3,2);

printf("%.1f", abs(2.0));

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 7

Page 8: ฟังก์ชัน

ก์ารเร#ย่ก์ใชั-ฟั�งก์�ชั�น อ�นไหนถ.ก์อ�นไหนผ�ด?/* given prototypes */

double foo(int);

double a;

int x;

/* right or wrong? */

foo(3);

foo(x);

a = foo(2);

a = foo(x) + 1

foo(3, 1)

foo(3 + 1)

/* given prototypes */

int foo(int);

int x;

/* right or wrong? */

foo(3);

x = foo(3);

x + foo(3);

foo(foo(2));

foo(foo + 2);

foo(2) = x;

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 8

Page 9: ฟังก์ชัน

C Standard Library ฟั�งก์�ชั�นพิ�5นฐานที่#$ม#ให-เร#ย่ก์ใชั-อย่.�แล-ว่ในภาษา C ประก์อบด-ว่ย่ฟั�งก์�ชั�นเก์#$ย่ว่ก์�บ

disk I/O (input/output) ex. printf(), scanf(), … string manipulation ex. strlen(), strcpy(), … mathematics ex. sqrt(), sin(), cos(), … etc..

สุามารถเร#ย่ก์ใชั-งานได-เลย่ แต�ต-องม#ก์าร include header file

ที่#$น�ย่ามฟั�งก์�ชั�นน�5นๆไว่- เชั�นจะใชั- printf(), scanf() ต-องเข#ย่น #include "stdio.h"จะใชั- sqrt(), sin(), cos() ต-องเข#ย่น #include "math.h" etc.

9

Page 10: ฟังก์ชัน

ต�ว่อย่�างก์ารหาค�าราก์ที่#$สุองโปรแก์รมหาค�าราก์ที่#$สุอง โดย่ใชั-ฟั�งก์�ชั�น sqrt() ใน

math.hต-นแบบ double sqrt(double num); ให-ค�า num

#include <stdio.h>

#include <math.h>

int main()

{

printf("%f", sqrt(16.0));

}

10

Page 11: ฟังก์ชัน

ต�ว่อย่�างก์ารค%านว่ณเลขย่ก์ก์%าล�งโปรแก์รมแสุดง 10 ย่ก์ก์%าล�ง 1 ถ(ง 5 โดย่เร#ย่ก์ใชั-ฟั�งก์�ชั�น

pow() ใน math.hต-นแบบ double pow(double base, double exp); ให-ค�า baseexp

#include <stdio.h>#include <math.h>int main() { double x=10.0, y =1.0;

do { printf("%f", pow(x,y)); y++; } while (y < 6);}

11

Page 12: ฟังก์ชัน

ร. -หร�อไม�ว่�า … ภาษา C สุามารถแปลง

ข-อม.ล Type ต�างๆ ไปมาได- ใชั-อย่�างระม�ดระว่�งใน

ก์รณ#ที่#$แปลง Type ที่#$ม#ขนาดใหญ่�ก์ว่�า เป3น Type ที่#$ม#ขนาดเล9ก์ลง อาจม#ป�ญ่หา

ในก์รณ#ที่#$แปลงจาก์ Type เล9ก์เป3น Type ใหญ่� สุามารถที่%าได- และม�ก์จะไม�ก์�อให-เก์�ดป�ญ่หา

/* it’s work */

/* but this is bad */

float foo(int);

char c;

c = foo(10);

foo(10.0);

/* this is ok */

foo('a');

double d;

d = foo(10);

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 12

Page 13: ฟังก์ชัน

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 13

EXCERCISE

Page 14: ฟังก์ชัน

ไขค%าถามในใจ ??? ปก์ต�เราจะเร#ย่ก์ใชั-ฟั�งก์�ชั�น ต-องเข#ย่นต-นแบบก์�อน

หร�อไม�

เราจะร. -ได-อย่�างไร ว่�า ต-นแบบของฟั�งก์�ชั�น เชั�น printf เป3นอย่�างไร

พิาราม�เตอร�ของฟั�งก์�ชั�นเป3นอย่�างอ�$นได-อ#ก์หร�อไม� นอก์เหน�อจาก์ char, int, long, float, double

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 14

Page 15: ฟังก์ชัน

ก�รเข�ยนฟั งก�ช�นดำ�วิยตนเอง

สุามสุ�ว่นของฟั�งก์�ชั�นน�ย่ามฟั�งก์�ชั�นว่งจรชั#ว่�ตของฟั�งก์�ชั�น

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 15

Page 16: ฟังก์ชัน

3 สุ�ว่นของฟั�งก์�ชั�น ต-นแบบของฟั�งก์�ชั�น

ชั�$อ พิาราม�เตอร� ต�5งแต�จ%านว่น

ล%าด�บ และชัน�ด ชัน�ดของก์ารเร#ย่ก์ใชั-ฟั�งก์�ชั�น

น�ย่ามของฟั�งก์�ชั�น สุ�ว่นห�ว่จะเหม�อนต-นแบบ

ของฟั�งก์�ชั�น แต�ม#ก์ารระบ�ชั�$อต�ว่แปรสุ%าหร�บพิาราม�เตอร�แต�ละต�ว่

หล�งสุ�ว่นห�ว่จะตามด-ว่ย่ { และ } โดย่ภาย่ในบรรจ�ค%าสุ� $งต�างๆ ไว่-

ก์ารเร#ย่ก์ใชั-ฟั�งก์�ชั�น

int foo(int, int);

name => foo

parameters => int, int

expression type => int

int foo(int a, int b){

...statments...

}

int x;

x = foo(2, 5);

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 16

Page 17: ฟังก์ชัน

ต-นแบบของฟั�งก์�ชั�น ร.ปแบบ

return-type หร�อชัน�ดข-อม.ลที่#$จะสุ�งค�าก์ล�บได-แก์� void, int, double, char, ...

function-name ชั�$อของฟั�งก์�ชั�น parameter-list จ%านว่นพิาราม�เตอร�ที่#$ฟั�งก์�ชั�นต-องก์าร

แต�ละพิาราม�เตอร�ประก์อบด-ว่ย่ ชัน�ดต�ว่แปรและชั�$อต�ว่แปร แต�ละพิาราม�เตอร�แย่ก์ด-ว่ย่เคร�$องหมาย่ " , "

ต�วิอย��ง int add (int a, int b) ;

17

return-type function-name (parameter-list) ;

Page 18: ฟังก์ชัน

น�ย่ามของฟั�งก์�ชั�น สุ�ว่นห�ว่จะม#ล�ก์ษณะคล-าย่

ต-นแบบ เพิ#ย่งแต�ม#ก์ารระบ�ชั�$อต�ว่แปรในพิาราม�เตอร� ก์ารระบ�ชั�$อ จะก์ระที่%าตามไว่ย่ก์

รณ�ของก์ารประก์าศต�ว่แปร พิาราม�เตอร�ที่%าต�ว่เหม�อน

ต�ว่แปรที่#$ถ.ก์แที่นค�า เม�$อฟั�งก์�ชั�นถ.ก์เร#ย่ก์ใชั- a แที่นค�าด-ว่ย่ 2 a แที่นค�าด-ว่ย่ 7 a แที่นค�าด-ว่ย่ 5

ค�าของก์ารเร#ย่ก์ใชั-งานฟั�งก์�ชั�น ค�อค�าที่#$ก์%าหนดไว่-ก์�บ return

int foo(int);

int foo(int a){

int x;

x = a + 3;

return x;

}

int c;

c = foo(2);

c = foo(7);

c = foo(5);

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 18

Page 19: ฟังก์ชัน

น�ย่ามของฟั�งก์�ชั�น น�ย่ามฟั�งก์�ชั�นเป3นก์ารเข#ย่นราย่ละเอ#ย่ดก์ารที่%างานของ

ฟั�งก์�ชั�นน�5นๆ ประก์อบด-ว่ย่สุ�ว่นของ header และ algorithm

header จะม#ก์ารเข#ย่นเหม�อน ต-นแบบฟั�งก์�ชั�น แต�ไม�ม# ;

algorithm เข#ย่นอย่.�ภาย่ใน { } ร.ปแบบ

ถ-า return-type ไม�ใชั� void ต-องม#ก์ารสุ�งค�าก์ล�บโดย่ใชั-ค%าสุ�$ง return ตามด-ว่ย่ค�าที่#$จะสุ�งก์ล�บ

19

return-type function-name (parameter-list) { ราย่ละเอ#ย่ดก์ารที่%างาน }

Page 20: ฟังก์ชัน

ค%าสุ�$ง return ใชั-เพิ�$อสุ�$งให-ฟั�งก์�ชั�นจบก์าร

ที่%างาน หาก์ค%าสุ�$ง return อย่.�ในบรรที่�ด

สุ�ดที่-าย่ของฟั�งก์�ชั�น และไม�ม#ก์ารก์%าหนดค�าให-ก์�บก์ารเร#ย่ก์ใชั-ฟั�งก์�ชั�น ค%าสุ�$งน#5สุามารถละได-

หาก์ก์ารเร#ย่ก์ใชั-ฟั�งก์�ชั�นม#ชัน�ด ค�าของก์ารเร#ย่ก์ใชั-จะเที่�าก์�บ ค�าที่#$ก์%าหนดไว่-ก์�บค%าสุ�$ง return

ค�าที่#$ก์%าหนดไว่-ก์�บค%าสุ�$ง return สุามารถเป3นน�พิจน�แบบใดก์9ได- เพิ#ย่งแต�ม#ชัน�ดตามที่#$ก์%าหนดไว่-ในสุ�ว่นห�ว่ของฟั�งก์�ชั�น

void foo(){

return;

}

int bar(){

return 3;

}

int daa(){

int x = 3;

return x;

}

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 20

Page 21: ฟังก์ชัน

21

ต�ว่อย่�างฟั�งก์�ชั�นที่#$ไม�ม# return

void check(int result) { if(result < 0) printf("negative"); else if(result == 0) printf("zero"); else printf("positive");}

ต�ว่อย่�างฟั�งก์�ชั�นที่#$ม# return

int add (int a, int b) { int result; result = a + b; return result;}

Page 22: ฟังก์ชัน

ก์ารใชั-งาน 3 สุ�ว่นในโปรแก์รม ต-นแบบของฟั�งก์�ชั�น เข#ย่น

ไว่-ในสุ�ว่นห�ว่ของโปรแก์รม อาจไม�ต-องเข#ย่นต-นแบบ

ของฟั�งก์�ชั�น หาก์เข#ย่นน�ย่ามของฟั�งก์�ชั�นไว่-ในสุ�ว่นห�ว่ แต�จะที่%าให-โค-ดอ�านย่าก์

ก์ารเร#ย่ก์ใชั-จะต-องก์ระที่%าหล�งก์ารเข#ย่นต-นแบบหร�อน�ย่ามเที่�าน�5น คอมไพิเลอรจ%าเป3นต-อง

ที่ราบข-อม.ลเก์#$ย่ว่ก์�บฟั�งก์�ชั�นตามที่#$ได-ระบ�ไว่-ในต-นแบบ เพิ�$อตรว่จสุอบคว่ามถ.ก์ต-องของก์ารเร#ย่ก์ใชั-

#include<stdio.h>

//prototype

int add(int, int);

main(){

int x;

//invoking

x = add(3, 2);

printf("%d\n", x);

}

//definition

int add(int a, int b){

return a + b;

}

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 22

Page 23: ฟังก์ชัน

ต�ว่อย่�าง 57. ชั�$อต�างๆเก์#$ย่ว่ก์�บฟั�งก์�ชั�น

23

#include <stdio.h>int square(int x);int main(){ int a=2,b; b = square(a); printf("b = %d \n",b); return 0;}

int square(int x){ int y; y = x*x; return y;}

น�ย่ามฟั�งก์�ชั�นfunction definition

พิาราม�เตอร�

อาก์�ว่เมนต�

ต-นแบบฟั�งก์�ชั�นfunction prototypeเร#ย่ก์ใชั-งานฟั�งก์�ชั�นcall function

Page 24: ฟังก์ชัน

24

ต�ว่อย่�างจงเข#ย่นโปรแก์รมสุ%าหร�บหาค�าศ�ก์ย่�ไฟัฟั0าซ่($งม#สุมก์ารด�งน#5

V = I*R

โดย่ที่#$ V ค�อ ค�าศ�ก์ย่�ไฟัฟั0า , I ค�อ ค�าก์ระแสุไฟัฟั0า สุ�ว่น R ค�อ ค�าคว่าม

ต-านที่าน และที่�5งสุามค�าน#5เป3นจ%านว่นจร�ง โดย่ก์%าหนดให-สุ�ว่นที่#$ค%านว่ณ ค�า V อย่.�ในฟั�งก์�ชั�น get_volt สุ%าหร�บสุ�ว่นที่#$ร �บค�า I และ R จาก์ผ.-

ใชั- รว่ม ที่�5งสุ�ว่นที่#$แสุดงผลล�พิธ�ของค�า V ให-อย่.�ในฟั�งก์�ชั�น main

main get_voltI, R

V

Page 25: ฟังก์ชัน

#include <stdio.h>

float get_volt(float i, float r);

int main(){ float i,r,v; printf("Enter I : "); scanf("%f", &i); printf("Enter R : "); scanf("%f", &r); printf("V = %.1f\n", get_volt(i, r)); return 0;}

float get_volt(float i, float r){ float v = i * r; return v;}

Page 26: ฟังก์ชัน

ว่งจรชั#ว่�ตของฟั�งก์�ชั�น น�ย่ามของฟั�งก์�ชั�นเป3น

เหม�อนพิรหมล�ข�ตที่#$ถ.ก์เข#ย่นอย่.�ในหน�งสุ�อ

เม�$อม#ก์ารเร#ย่ก์ใชั-ฟั�งก์�ชั�น จะเก์�ดชั#ว่�ตใหม� ที่#$จะด%าเน�นชั#ว่�ตตามพิรหมล�ข�ต

เม�$อด%าเน�นไปถ(งเป0าหมาย่ ชั#ว่�ตก์9จะสุ�5นสุ�ดลง

ต�ว่อย่�างด-านขว่า ม#ฟั�งก์�ชั�น 3 ชั#ว่�ต ชั#ว่�ตที่#$ 1 ม# a=2, x=5 และจะ

สุลาย่หาย่ไป เม�$อชั#ว่�ตน#5จบสุ�5น เหล�อเพิ#ย่งผลล�พิธ�จาก์ค%าสุ� $ง return

int foo(int);

int foo(int a){

int x;

x = a + 3;

return x;

}

int c;

c = foo(2); // born&die

c = foo(7); // born&die

c = foo(5); // born&die

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 26

Page 27: ฟังก์ชัน

ร. -หร�อไม�ว่�า … ต�ว่แปรในภาษา C เม�$อ

ถ.ก์ประก์าศข(5น จะม#ก์ารจองหน�ว่ย่คว่ามจ%าเพิ�$อเก์9บข-อม.ล ชั�$อของต�ว่แปรเป3นเพิ#ย่งชั�$อเล�นเอาไว่-อ-างอ�งถ(งหน�ว่ย่คว่ามจ%าที่#$ถ.ก์จองเที่�าน�5น ต�ว่แปรที่#$ถ.ก์ประก์าศใน

ฟั�งก์�ชั�น ชั�$อของม�นจะร. -จ�ก์เฉพิาะในฟั�งก์�ชั�นน�5นเที่�าน�5น

void foo(){

int x;

}

void bar(){

x = 3; //***wrong

}

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 27

Page 28: ฟังก์ชัน

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 28

EXCERCISE

Page 29: ฟังก์ชัน

ไขค%าถามในใจ ??? ต�นแบบของฟั�งก์�ชั�น และสุ�ว่นห�ว่ของน�ย่ามของ

ฟั�งก์�ชั�นคล-าย่ก์�น ที่%าไมต-องเข#ย่นที่�5งสุองอย่�าง

เราระบ�ชั�$อต�ว่แปรของพิาราม�เตอร�ของฟั�งก์�ชั�น ที่#$ต-นแบบของฟั�งก์�ชั�นได-หร�อไม�

ที่%าไมต�ว่แปรที่#$ประก์าศในฟั�งก์�ชั�น ต-องร. -จ�ก์เพิ#ย่งในฟั�งก์�ชั�นน�5นเที่�าน�5น

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 29

Page 30: ฟังก์ชัน

ร�ยล่ะเอ�ยดำเพิ�#มเต�มเก�#ยวิก�บฟั งก�ช�น

ที่%าไมต-องเข#ย่นฟั�งก์�ชั�นProcedural Programmingขอบเขตของต�ว่แปร

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 30

Page 31: ฟังก์ชัน

โปรแก์รมที่#$ไม�ม#ก์ารจ�ดระเบ#ย่บโครงสุร-าง

31

#include <stdio.h>main(){ int first, second, third; printf("\n f(X) = 3X + 10 if X > 0\n"); printf("\n f(X) = 10 if X = 0\n"); printf("\n Enter 3 values:"); scanf("%d %d %d", &first, &second, &third);if (first > 0) printf("f(%d) is %d", first, 3*first + 10);else printf("f(%d) is 10", first); if (second > 0) printf("f(%d) is %d", second, 3*second + 10);else printf("f(%d) is 10", second);if (third > 0) printf("f(%d) is %d", third, 3*third + 10);else printf("f(%d) is 10", third);}

ค%านว่ณ first

ค%านว่ณ second

ค%านว่ณ third

Code program ซ่%5าซ่-อน

Page 32: ฟังก์ชัน

32

แนวิค�ดำเพิ&#อปร�บปร(ง (แนวิค�ดำเร&#องฟั งก�ช�น) : ชั�ด statement เด#ย่ว่ก์�นอาจม#ก์ารใชั-งานหลาย่แห�งในโปรแก์รม ที่%าให-ต-อง copy หลาย่คร�5ง จ(งเก์�ดแนว่ค�ดที่#$จะรว่บรว่มชั�ด statement น#5เข-าไว่-ที่#$เด#ย่ว่ก์�นและม#ก์ารเร#ย่ก์ใชั-งานเม�$อต-องก์าร เก์�ดเป3น Procedure

Page 33: ฟังก์ชัน

โปรแก์รมที่#$จ�ดระเบ#ย่บโครงสุร-างแล-ว่

33

#include <stdio.h>void fx(int x);main(){ int first, second, third; printf("\n F(X) = 3X + 10 if X > 0\n"); printf("\n F(X) = 10 if X = 0\n"); printf("\n Enter 3 values:"); scanf("%d %d %d", &first, &second, &third); fx(first); fx(second); fx(third);}

void fx(int x){ if (x > 0) printf("f(%d) is %d\n", x, (3*x) + 10); else printf("f(%d) is 10\n", x);}

• รว่มก์ารที่%างานแบบเด#ย่ว่ก์�นไว่-ด-ว่ย่ก์�น

• เปล#$ย่นแปลงต�ว่แปร xในก์ารเร#ย่ก์ใชั-งานแต�ละคร�5ง

Page 34: ฟังก์ชัน

โปรแก์รมที่#$จ�ดระเบ#ย่บโครงสุร-างอย่�างด#แล-ว่

34

#include <stdio.h>void fx(int x);main(){ int first, second, third; printf("\n F(X) = 3X + 10 if X > 0\n"); printf("\n F(X) = 10 if X = 0\n"); printf("\n Enter 3 values\n"); scanf("%d %d %d", &first, &second, &third); printf("f(%d) is %d\n", fx(first)); printf("f(%d) is %d\n", fx(second)); printf("f(%d) is %d\n", fx(third));}

void fx(int x){ if (x > 0) return (3*x) + 10; else return 10;}

• โปรแก์รมที่%าหน-าที่#$ค%านว่ณ แย่ก์ออก์จาก์ก์ารแสุดงผล

Page 35: ฟังก์ชัน

Procedural Programmingร)ปแบบ : ชั�ด statements สุามารถรว่มไว่-ในที่#$ที่#$หน($งแย่ก์จาก์

สุ�ว่นของ main และม#ก์ารใชั- procedure call เพิ�$อเร#ย่ก์ใชั-งาน ชั�ด statements น�5น

ข�อดำ� : ซ่�อนราย่ละเอ#ย่ดซ่�บซ่-อนไว่-ในฟั�งก์�ชั�น ที่%าให-โปรแก์รม main ง�าย่ใน

ก์ารที่%าคว่ามเข-าใจ ลดคว่ามซ่%5าซ่-อนของสุ�ว่นโปรแก์รมที่#$เหม�อนๆก์�นไว่-ในฟั�งก์�ชั�น ก์ารหาข-อผ�ดพิลาดของโปรแก์รมง�าย่ข(5น โดย่แย่ก์ระหว่�างสุ�ว่น

main หร�อว่�า procedures ใด35

Program

main programmain programprocedureprocedure

ล%าด�บก์ารที่%างานจ�ดที่#$เร#ย่ก์ใชั-งาน

Page 36: ฟังก์ชัน

ขอบเขตของต�ว่แปรต�วิแปรภ�ยใน - ต�ว่แปรที่#$ประก์าศในฟั�งก์�ชั�นใด จะร. -จ�ก์

เฉพิาะในฟั�งก์�ชั�นน�5นๆต�วิแปรภ�ยนอก - ต�ว่แปรที่#$ประก์าศนอก์ฟั�งก์�ชั�น (รว่มถ(ง

ฟั�งก์�ชั�น main ) จะร. -จ�ก์ในที่�ก์ฟั�งก์�ชั�นที่#$เข#ย่นถ�ดจาก์ก์ารประก์าศต�ว่แปร

36

Page 37: ฟังก์ชัน

ขอบเขตของต�ว่แปรภาย่ในฟั�งก์�ชั�น#include <stdio.h>void my_func();int main(){ double x = 1.1; my_func(); printf("In main, x = %d \n",x); return 0;}void my_func(){ double x; x = 2.5; printf("In my_func, x = %d \n",x);}

37

ผล่ล่�พิธ์�In my_func, x = 2.5In main, x = 1.1

Page 38: ฟังก์ชัน

ขอบเขตของต�ว่แปรภาย่นอก์ฟั�งก์�ชั�น#include <stdio.h>double x; void my_func();int main(){ x = 1.1; my_func(); printf("In main, x = %d \n",x); return 0;}void my_func(){ x = 2.5; printf("In main, x = %d \n",x);}

38

ผล่ล่�พิธ์�In my_func, x = 2.5In main, x = 2.5

Page 39: ฟังก์ชัน

#define MAX 950

void one(int anarg, double second)

{

int onelocal;

}

#define LIMIT 200

int fun_two(int one, char anarg)

{

int localvar;

}

int main(void)

{

int localvar;

}

ฟั�งก์�ชั�น ร. -จ�ก์ในone

ร. -จ�ก์ในfun_two

ร. -จ�ก์ในmain

one (function)

fun_two

ต�ว่แปร ร. -จ�ก์ในone

ร. -จ�ก์ในfun_two

ร. -จ�ก์ในmain

MAX

anarg(int)

second

onelocal

LIMIT

one (parameter)

anarg(char)

localvar(fun_two)

localvar(main)

สุร�ปขอบเขตของสุร�ปขอบเขตของต�ว่แปรต�ว่แปร

Page 40: ฟังก์ชัน

ภาคว่�ชัาว่�ศว่ก์รรมคอมพิ�ว่เตอร�มหาว่�ที่ย่าล�ย่สุงขลานคร�นที่ร� 40

EXCERCISE

Page 41: ฟังก์ชัน

ไขค%าถามในใจ ??? ที่%าไม ฟั�งก์�ชั�นที่#$เข#ย่นข(5น ต-องค�นค�าก์ล�บมาพิ�มพิ�ใน

ฟั�งก์�ชั�น main ที่�5งๆ ที่#$สุามารถพิ�มพิ�ในฟั�งก์�ชั�นน�5นได-เลย่

ถ-าเราใชั-ต�ว่แปรภาย่นอก์ได- ใชั-แต�ต�ว่แปรภาย่นอก์ได-ไหม ง�าย่ด# ฟั�งก์�ชั�นอ�$นสุามารถใชั-งานได-เลย่ ไม�ต-อง return ให-ย่��งย่าก์

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 41

Page 42: ฟังก์ชัน

ก�รส�งอ�เรย�ไปย�งฟั งก�ช�น

ก์ารสุ�งอ#ล#เมนต�ของอาเรย่�ไปย่�งฟั�งก์�ชั�นก์ารสุ�งที่�5งอาเรย่�ไปย่�งฟั�งก์�ชั�นก์ารสุ�งอาเรย่�สุองม�ต� หร�อมาก์ก์ว่�า ไปย่�งฟั�งก์�ชั�น

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 42

Page 43: ฟังก์ชัน

ก์ารสุ�งอ#ล#เมนต�ของอาเรย่�ไปย่�งฟั�งก์�ชั�น อาร�ก์�ว่เมนต�ของฟั�งก์�ชั�น จะ

ถ.ก์หาค�า (evaluate) ก์�อนที่#$จะสุ�งค�าน�5นให-ก์�บฟั�งก์�ชั�น หาก์สุ�งค�าคงที่#$ เชั�น 1 ซ่($งเรา

ที่ราบค�าอย่.�แล-ว่ ก์9สุามารถสุ�งค�าน�5นไปย่�งฟั�งก์�ชั�นได-เลย่

หาก์สุ�งค�าเป3นต�ว่แปร เชั�น x ค�าของ x จะถ.ก์ evaluate ก์�อนสุ�ง

เชั�นเด#ย่ว่ก์�นก์�บอ#ล#เมนต�ของอารย่�ที่#$ต-องถ.ก์ evaluate ก์�อน

ไม�ม#อะไรพิ�เศษเก์#$ย่ว่ก์�บก์ารสุ�งอ#ล#เมนต�ของอาเรย่�ไปย่�งฟั�งก์�ชั�น

void foo(int f);

main(){

int x = 3;

int a[2] = {5, 7};

foo(1);

//f = 1

foo(x);

//f = 3, not f = x

foo(a[1]);

//f = 7, not f = a[1]

}

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 43

Page 44: ฟังก์ชัน

ร. -หร�อไม�ว่�า … เม�$อประก์าศอาเรย่�ข(5นมา

แล-ว่ สุ�$งที่#$จะถ.ก์จดจ%าไว่- จะม#เพิ#ย่งจ�ดอ-างอ�งของอาเรย่�เที่�าน�5น

จ�ดอ-างอ�งจะถ.ก์จดจ%าไว่-ผ�านต�ว่แปร

อ#ล#เมนต�ต�างๆ ของอาเรย่� จะถ.ก์ค%านว่ณจาก์จ�ดอ-างอ�งเสุมอ

#include<stdio.h>

main(){

int d[3] = {0,2,8};

int e[2] = {5,6};

printf("%d\n", d[3]);

}

/* What is the output???? */

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 44

Page 45: ฟังก์ชัน

ก์ารสุ�งที่�5งอาเรย่�ไปย่�งฟั�งก์�ชั�น เม�$อประก์าศอาเรย่�ข(5น เรา

สุามารถเข-าถ(งอ#ล#เมนต�ต�างๆ ด-ว่ย่เคร�$องหมาย่ [ ]

ถ-าไม�ใสุ�เคร�$องหมาย่ [ ] จะหมาย่ถ(งต%าแหน�งเร�$มต-น (reference) ของอาเรย่�

เราไม�สุามารถสุ�งที่�ก์อ#ล#เมนต�ไปย่�งฟั�งก์�ชั�นพิร-อมๆ ก์�น เราจ(งต-องสุ�งต%าแหน�งอ-างอ�งไปแที่น เพิ�$อให-ฟั�งก์�ชั�นสุามารถประมว่ลผลที่�ก์อ#ล#เมนต�ในอาเรย่�ได-

int d[3] = {0, 2, 8};

printf("%d\n", d[0]);

printf("%d\n", d[1]);

printf("%d\n", d[2]);

printf("%p\n", d);

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 45

Page 46: ฟังก์ชัน

ก์ารสุ�งต�ว่อ-างอ�งของอาเรย่�ไปย่�งฟั�งก์�ชั�น ก์ารสุ�งที่�5งอาเรย่�ไปย่�ง

ฟั�งก์�ชั�น จร�งๆ ค�อ ก์ารสุ�งต�ว่อ-างอ�งของอาเรย่�ไปย่�งฟั�งก์�ชั�น a เก์9บต�ว่อ-างอ�งของอาเรย่�

ที่#$ม#สุมาชั�ก์สุามต�ว่ ม#ค�า 4 , 7, 2

เม�$อเร#ย่ก์ใชั-ฟั�งก์�ชั�น poo โดย่ก์ารสุ�งค�าของ a เป3นพิาราม�เตอร� ต�ว่แปร d จ(งเก์9บต�ว่อ-างอ�งของอาเรย่�เด#ย่ว่ก์�น

d[1] เป3นก์ารหาสุมาชั�ก์ต�ว่ที่#$สุองน�บจาก์จ�ดอ-างอ�ง

main(){

int a[3] = {4, 7, 2};

poo(a);

}

int poo(int d[]){

printf("%d\n", d[1]);

}

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 46

Page 47: ฟังก์ชัน

ก์ารเปล#$ย่นแปลงค�าของต�ว่แปรในฟั�งก์�ชั�น a เก์9บจ�ดอ-างอ�งของอาเรย่�

ที่#$เก์9บข-อม.ล 2 และ 7 ในก์ารเร#ย่ก์ใชั-ฟั�งก์�ชั�น bar

ได-สุ�งจ�ดอ-างอ�งของอาเรย่�ไปให-ก์�บก์ารที่%างานของฟั�งก์�ชั�น bar

b เก์9บจ�ดอ-างอ�งเด#ย่ว่ก์�บอาเรย่�ของ a

ก์ารเปล#$ย่นแปลงโดย่ใชั- b ในฟั�งก์�ชั�น bar ก์9เหม�อนก์�บก์ารเปล#$ย่นแปลงโดย่ใชั- a ที่�5ง a และ b อ-างอ�งไปที่#$

เด#ย่ว่ก์�น

main(){

int a[2] = {2, 7};

bar(a);

printf("%d\n", a[0]);

}

void bar(int b[]){

b[0] = 5;

}

##OUTPUT##

5

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 47

Page 48: ฟังก์ชัน

ก์ารเปล#$ย่นแปลงค�าของต�ว่แปรในฟั�งก์�ชั�นmain(){

int a = 10;

foo(a);

printf("%d\n", a);

}

void foo(int b){

b = 11;

}

##OUTPUT##

11

main(){

int a[2] = {2, 7};

bar(a);

printf("%d\n", a[0]);

}

void bar(int b[]){

b[0] = 5;

}

##OUTPUT##

5

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 48

Page 49: ฟังก์ชัน

ก์ารเปล#$ย่นแปลงค�าของต�ว่แปรในฟั�งก์�ชั�น

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 49

1

0

a

10

b

main

foo

7

a

b

main

bar

2

Page 50: ฟังก์ชัน

ต�ว่อย่�างก์ารหาค�าเฉล#$ย่ของสุมาชั�ก์ในอาเรย่�#include<stdio.h>

float avg(int[], int);

main(){

int d[5] = {2, 3, 1, 5, 6};

printf("%.1f\n", avg(d, 5));

}

float avg(int d[], int len){

int i;

int toal = 0;

for(i = 0; i < len; i++)

total += d[i];

return (float)total/len;

}

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 50

Page 51: ฟังก์ชัน

ก์ารสุ�งอาเรย่�สุองม�ต�ไปย่�งฟั�งก์�ชั�น อาเรย่�สุองม�ต� จร�งๆ

แล-ว่เป3นอาเรย่�ม�ต�เด#ย่ว่ ก์ารสุ�งอาเรย่�สุองม�ต�ไป

ย่�งฟั�งก์�ชั�น ม�ต�ด-านขว่าต-องระบ�ขนาดของม�ต�ไว่-ในต�ว่แปรพิาราม�เตอร�ของฟั�งก์�ชั�น

void foo(int[][3]);

main(){

int d[2][3] = {{1,2,3},{4,5,6}};

foo(d);

}

void foo(int x[][3]){

printf("%d\n", x[1][1]);

}

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 51

Page 52: ฟังก์ชัน

ก์ารสุ�งอาเรย่�สุองม�ต�ไปย่�งฟั�งก์�ชั�น จะเก์�ดอะไรข(5นหาก์ขนาด

ของม�ต�ที่#$ก์%าหนดไว่-ในพิาราม�เตอร�ผ�ดจาก์คว่ามเป3นจร�ง

ย่%5า!! ก์ารสุ�งผ�านอาเรย่�ไปย่�งฟั�งก์�ชั�น เป3นก์ารสุ�งจ�ดอ-างอ�งไป ก์ารต#คว่ามอ#ล#เมนต�จะเก์�ดข(5นที่#$ฟั�งก์�ชั�นเองตามคว่ามเข-าใจของฟั�งก์�ชั�นน�5น

void bar(int[][4]);

main(){

int d[2][3] = {{1,2,3},{4,5,6}};

bar(d);

}

void bar(int x[][4]){

printf("%d\n", x[1][1]);

}

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 52

Page 53: ฟังก์ชัน

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 53

EXCERCISE

Page 54: ฟังก์ชัน

ไขค%าถามในใจ ??? ในต-นแบบหร�อสุ�ว่นน�ย่าม เราสุามารถก์%าหนดขนาด

ของอาเรย่�ได-หร�อไม� หาก์ที่%าได- ที่%าไมปก์ต�เราถ(งไม�ก์%าหนด

สุ%าหร�บอาเรย่�สุามม�ต� เราต-องก์%าหนดขนาดม�ต�ของอาเรย่�อย่�างไร

ภ�ควิ�ช�วิ�ศวิกรรมคอมพิ�วิเตอร� มห�วิ�ทย�ล่�ยสงขล่�นคร�นทร� 54