52
การเขียนโปรแกรมคอมพิวเตอร์ 1 Computer Programming I ฟังก์ชัน (โปรแกรมย่อย) สัปดาห์ที10 ภิญโญ แท้ประสาทสิทธิEmails : pinyotae+111 at gmail dot com, pinyo at su.ac.th Web : http://www.cs.su.ac.th/~pinyotae/compro1/ Facebook Group : ComputerProgramming@CPSU ภาควิชาคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยศิลปากร

การเขียนโปรแกรมคอมพิวเตอร 1 Computer ...webserv.cp.su.ac.th/lecturer/pinyotae/compro1/slides/...ฟงกช น (Function) หร

  • Upload
    lamthu

  • View
    221

  • Download
    0

Embed Size (px)

Citation preview

การเขยนโปรแกรมคอมพวเตอร 1

Computer Programming I

ฟงกชน (โปรแกรมยอย)

สปดาหท 10

ภญโญ แทประสาทสทธ

Emails : pinyotae+111 at gmail dot com, pinyo at su.ac.th

Web : http://www.cs.su.ac.th/~pinyotae/compro1/

Facebook Group : ComputerProgramming@CPSU

ภาควชาคอมพวเตอร คณะวทยาศาสตร มหาวทยาลยศลปากร

หวขอเนอหา• ฟงกชน (Function) หรอ โปรแกรมยอยคออะไร• ประเภทและตวอยางของฟงกชน� ฟงกชนมาตรฐาน (Standard function)

� ฟงกชนสรางเอง (User-defined function)

• โครงสรางของฟงกชนและตวอยางการใชงาน• ฟงกชนคอมพวเตอรกบฟงกชนคณตศาสตร• กฎเหลกของฟงกชน� กฎของการเรยกใชฟงกชน และวธจดวางฟงกชน

� ฟงกชนกบการรบคา (parameter) และการสงผลลพธใหผเรยก

• การประกาศและนยามฟงกชนแยกจากกน• ประเภทของฟงกชนสรางเอง

12 มกราคม 2556 2ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร

ฟงกชน (Function) หรอ โปรแกรมยอยคออะไร• ฟงกชนหรอโปรแกรมยอยคอสงทสามารถถกเรยกงานใชซา ๆ ไดจาก

โปรแกรมสวนอน ๆ

� ทผานมาเราใช main ซงเปนโปรแกรมหลกในการเรยกใชฟงกชน printf และ scanf

� สงเกตดวยวาใน main ของเราเรยกใช printf ไดหลายครงเรยกใช scanf ไดหลายครงดวย จะวนลปเรยกใชซากยงได

• ฟงกชนเปนเหมอนพนกงานทรบงานอยางใดอยางหนงไปทาแทน

� เชน รบหนาทไปหาทางเอาตวหนงสอขนบนหนาจอคอมพวเตอร

� เชน รบหนาทอานคาจากคยบอรดแลวนามาเกบไวในตวแปร x ใหเรา

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 312 มกราคม 2556

มโนภาพของการเรยกใชงานฟงกชน

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 412 มกราคม 2556

นาย scanf

นส. printf

คณ scanf ไปถามผใชมาหนอยสวาอยากใสตวเลข

อะไรเขามา

ไดครบ

คณ main

(เจานายใหญ)

คณ printf เอาผลลพธไปใหผใชด

หนอยสไดคะ

ประโยชนของฟงกชน

• ทาใหเกดการแบงโคดเปนสวน ๆ ทมเปาหมายการทางานชดเจน

� เหมอนมพนกงานประจาตาแหนงทาหนาทอยางใดอยางหนง

� โคดจะเปนระเบยบขนมาก จากฟงกชน main เราใหฟงกชน main ทาหนาทแบงงานใหพนกงานประจาตาแหนงรบหนาทแทน

• การแบงงานจะทาใหโคดไมยงเหยงดซบซอนจนเกนเหต

� เปรยบเหมอนกบทคนสวนใหญไมตองปลกขาวและทอผาเองแตกระจายงานใหเกษตรกรและโรงงานจดการใหผานการวาจาง

� ถาเราตองปลกขาวหรอทอผาเองชวตคงวนวายมาก

• การแบงงานทาใหโคดดเขาใจงาย เชน การแบงงานใหพนกงานชอ printfทาใหเราเขาใจไดโดยงายวาเราจะแสดงผลออกทางจอภาพ

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 512 มกราคม 2556

ประเภทของฟงกชน

• ฟงกชนมอยสองประเภทคอ ฟงกชนมาตรฐานและฟงกชนสรางเอง

• ฟงกชนมาตรฐานคอฟงกชนทไดมากจากการ #include

� การ #include มหลายแบบทเปนไปได ไมวาจะเปน #include <stdio.h>,#include <stdlib.h>, #include <math.h> และ #include <string.h>

� การ #include จะทาใหโปรแกรมเราสามารถเรยกใชโปรแกรมยอยทอยในหมวดหมทเรา #include เขามาได

� เชน เมอเรา #include <stdio.h> เรากจะเรยกใช printf และ scanfซงเปนฟงกชนภายใตหมวดหมน

• ฟงกชนสรางเอง (user-defined function) คอ ฟงกชนทเราเขยนขนมาเอง

� เปรยบเหมอนกบเราฝกพนกงานขนมาเอง แทนทจะจางคนนอกมาทางานให

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 612 มกราคม 2556

เรองนารเกยวกบฟงกชน

• ฟงกชนตวแรกทเรารจกคอฟงกชนหลก ซงตองมชอตายตววา main

• ฟงกชนมาตรฐานตวแรก ๆ ทเรารจกคอฟงกชน printf และ scanf

� ฟงกชนมาตรฐานจะมชอทตายตวเชนกน

• ฟงกชนสรางเองจะมการทางานเปนไปตามทเราอยากใหเปน

� เราจะเขยนใหมนทาอะไรกได จะใหมนเรยกฟงกชนอนตอ ๆ กนไปกได

� ฟงกชนสรางเองจะเรยกฟงกชนมาตรฐานกได

� ชอของมนไมตายตว ขนอยกบเราตง แตโดยสวนมากจะตงชอตามหนาทเชน คนมกใชชอวา max เปนชอฟงกชนการหาคาสงสด

• อยาไปคดวาตงชอเสรจแลวฟงกชนสรางเองจะทางานตามชอทตงเราตองเขยนโปรแกรมยอยเองทกอยางเพอระบงานทมนตองทา

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 712 มกราคม 2556

โครงสรางของฟงกชน

ฟงกชนมโครงสรางดงนชนดขอมลทเปนคาตอบ ชอฟงกชน( ชนดขอมลทรบเขามา ชอตวแปรทรบเขามา ) {….

}

ตวอยาง

int max( int x, int y ) {

}

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 812 มกราคม 2556

ชนดขอมลทเปนคาตอบ

ชอฟงกชนชนดขอมลทรบเขามา

ชอตวแปรทรบเขามา

ฟงกชนมชนดขอมลทเปนคาตอบไดแคตวเดยว แตชนดขอมลทรบเขามามมากกวาหนงตวได

ตวอยางการใชงานตวอยาง จงเขยนโปรแกรมทรบคาตวเลขจานวนเตมมาสามคตามลาดบดงนx1 y1, x2 y2, และ x3 y3 จากนนใหโปรแกรมพมพคาตวเลขทมคามากทสดของแตละคออกมาทางจอภาพ

เชน

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 912 มกราคม 2556

ขอมลเขา ผลลพธ ขอมลเขา ผลลพธ

5 9

0 -5

2 1

9

0

2

9 5

7 7

2 0

9

7

2

5 0

4 -1

-5 -1

5

4

-1

0 2

5 7

-2 0

2

7

0

วธดงเดมแบบแรก

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 1012 มกราคม 2556

int x1, x2, x3, y1, y2, y3, result;scanf("%d %d", &x1, &y1);scanf("%d %d", &x2, &y2);scanf("%d %d", &x3, &y3);

if(x1 > y1) result = x1;else result = y1;printf("%d\n", result);

if(x2 > y2) result = x2;else result = y2;printf("%d\n", result);

if(x3 > y3) result = x3;else result = y3;printf("%d\n", result);

เราเขยนโคดเปรยบเทยบคาซาซากรวมสามรอบ

วธดงเดมแบบทสอง

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 1112 มกราคม 2556

int x1, x2, x3, y1, y2, y3;scanf("%d %d", &x1, &y1);scanf("%d %d", &x2, &y2);scanf("%d %d", &x3, &y3);

if(x1 > y1) printf("%d\n", x1);else printf("%d\n", y1);

if(x2 > y2) printf("%d\n", x2);else printf("%d\n", y2);

if(x3 > y3) printf("%d\n", x3);else printf("%d\n", y3);

ถงจะเลยงการเกบคาผลลพธไวในตวแปร เรากตองเขยนโคดเปรยบเทยบซาซากสามรอบอยด

วธใชฟงกชนแบบทหนง

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 1212 มกราคม 2556

int max(int x, int y) {if(x > y) return x;else return y;

}

void main() {int x1, x2, x3, y1, y2, y3, result;scanf("%d %d", &x1, &y1);scanf("%d %d", &x2, &y2);scanf("%d %d", &x3, &y3);

result = max(x1, y1) ;printf("%d\n", result);result = max(x2, y2) ;printf("%d\n", result);result = max(x3, y3) ;printf("%d\n", result);

}

เราสามารถแยกโคดหาคาสงสดมาเปนโปรแกรมยอยได

วธใชฟงกชนแบบทสอง

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 1312 มกราคม 2556

int max(int x, int y) {if(x > y) return x;else return y;

}

void main() {int x1, x2, x3, y1, y2, y3, result;scanf("%d %d", &x1, &y1);scanf("%d %d", &x2, &y2);scanf("%d %d", &x3, &y3);

printf("%d\n", max(x1, y1) );printf("%d\n", max(x2, y2) );printf("%d\n", max(x3, y3) );

}

ผลทไดจากฟงกชนจะทาตวเหมอนตวเลขหรอตวอกษรตามชนดขอมลของผลลพธทระบไว

เพราะฟงกชน max ถกกาหนดใหมชนดขอมลของผลลพธเปน int

เราจงเอามาใชคกบ %d ของ printf ไดเลย

ตวอยางฟงกชนยอดนยม : คานวณพนทวงกลม

ฟงกชนหาพนทวงกลมจากคารศมทใสเขาไป

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 1412 มกราคม 2556

double findCircleArea(double radius) {const double PI = 3.1415926535;return PI * radius * radius;

}

void main() {double radius;scanf("%lf", &radius);double circleArea = findCircleArea(radius);printf("Circle area = %lf\n", circleArea);

}

ฟงกชนคอมพวเตอรกบฟงกชนคณตศาสตร (1)

• เปนของทมความสมพนธกนโดยตรง เชน หากเรามองไปทฟงกชนคานวณพนทวงกลมในรปแบบคณตศาสตร เราจะไดฟงกชน

� � � ���

• ฟงกชนนม r เปนตวแปร และ คานวณพนทวงกลมไดผลลพธออกมาเปนตวเลข

• ยอนกลบมาดฟงกชนในภาษาซ

• เหนไดวาโคดภาษาซเหมอนฟงกชนคณตศาสตร คอมคารศมเปนตวแปร และคานวณพนทวงกลมเปนผลลพธมาเปนตวเลข (ชนด double)

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 1512 มกราคม 2556

double findCircleArea(double radius) {const double PI = 3.1415926535;return PI * radius * radius;

}

ฟงกชนคอมพวเตอรกบฟงกชนคณตศาสตร (2)

ฟงกชนทเราเหนมากอนหนา เชน max กเขยนบรรยายในรปคณตศาสตรไดเหมอนกน

� การแยกกรณในฟงกชนคณตศาสตรจะสมพนธกบการใช if ในภาษา C� เงอนไขในฟงกชนคณตศาสตรกบ if เปนเงอนไขอนเดยวกน

คาวา otherwise แปลวา ‘มฉะนน’ หรอ ‘หาไมแลว’ ซงในทางคณตศาสตรหรอภาษาโปรแกรมจะใสไวในอนดบสดทายเพอบอกวา ‘มฉะนนกจะทา …’ หรอ ‘มฉะนนกจะมคาเทากบ …’

� จดนตรงกบการใช else ในภาษาซ

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 1612 มกราคม 2556

int max(int x, int y) {if(x > y) return x;else return y;

}

� �, � � � �; � ��; otherwise

มาดฟงกชนคณตศาสตรทเราอตสาหทามาตอนตนเทอมฟงกชนปลากระปองแบบพนฐานโจทย ปลากระปองยหอหนงใชปลาซารดนสามตวและมะเขอเทศสองผลเพอผลตปลากระปองหนงกระปอง หากโรงงานผลตมปลาซารดนอย X ตวและมะเขอเทศอย Y ผล โรงงานจะผลตปลากระปองไดทงหมดกกระปอง

� �, � � � �3 ;�3 �2�2 ; otherwise� �, � � ��3 ;�3 �2�2 ;�2 � �3

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 1712 มกราคม 2556

แตกอนเราเขยนโปรแกรมวา …

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 1812 มกราคม 2556

void main() {int x, y;scanf("%d %d", &x, &y);

if(x / 3 < y / 2)printf("%d", x / 3);

elseprintf("%d", y / 2);

}

ถาเราจดเปนฟงกชนจะไดเปน …

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 1912 มกราคม 2556

int findCans(int x, int y) {if(x / 3 < y / 2)

return x / 3 ;else

return y / 2 ;}

void main() {int x, y;scanf("%d %d", &x, &y);printf("%d", findCans(x, y) );

}แยกการคานวณทซบซอนออกจากกนแลวจะทาใหดออกงายวา

โปรแกรมคดจะทาอะไร เพราะชอฟงกชนมกจะสอความหมายอยแลว

ฟงกชนทดสอบวาเปนเลขคหรอไม

จงเขยนฟงกชนทคนผลลพธเปนเลข 1 (คาจรง) เมอตวเลขทรบมาเปนอนพตเปนเลขค และคนเลข 0 (คาเทจ) เมอตวเลขทรบมาเปนเปนเลขค

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 2012 มกราคม 2556

int isEven(int x) {if(x % 2 == 0)

return 1 ;else

return 0 ;}

ฟงกชนทดสอบวาเปนเลขคหรอไม

จงเขยนฟงกชนทคนผลลพธเปนเลข 1 (คาจรง) เมอตวเลขทรบมาเปนอนพตเปนเลขค และคนเลข 0 (คาเทจ) เมอตวเลขทรบมาเปนเปนเลขค

แนวคด เราใชวธกลบคาความจรงจากฟงกชน isEven ทเขยนมาเมอสกครได

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 2112 มกราคม 2556

int isOdd(int x) {return !isEven(x);

}

การใช ! เปนการกลบคาความจรง เลขศนยซงแทนคาเทจจะถกกลบเปนเลขหนง และเลขหนงแทนคาจรงจะถกกลบเปนเลขศนย

ทดลองดวยตวเอง

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 2212 มกราคม 2556

int isEven(int x) {if(x % 2 == 0)

return 1;else

return 0;}

int isOdd(int x) {return !isEven(x);

}

void main() {int x;scanf("%d", &x);printf("isEven = %d\n", isEven(x));printf("isOdd = %d\n", isOdd(x));

}

สาคญมากเอากลบไปลองทาทบานดวย

หวขอเนอหา• ฟงกชน (Function) หรอ โปรแกรมยอยคออะไร• ประเภทและตวอยางของฟงกชน� ฟงกชนมาตรฐาน (standard function)

� ฟงกชนสรางเอง (User-defined function)

• โครงสรางของฟงกชนและตวอยางการใชงาน• ฟงกชนคอมพวเตอรกบฟงกชนคณตศาสตร• กฎเหลกของฟงกชน

� กฎของการเรยกใชฟงกชน และวธจดวางฟงกชน

� ฟงกชนกบการรบคา (parameter) และการสงผลลพธใหผเรยก

• การประกาศและนยามฟงกชนแยกจากกน• ประเภทของฟงกชนสรางเอง

12 มกราคม 2556 23ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร

กฎของการเรยกใชฟงกชน

• ฟงกชนจะถกเรยกได ณ จดเรยกใชทมาหลงการประกาศฟงกชน

� ดงนนหากเราประกาศฟงกชนไวกอน main ฟงกชนกจะถกเรยกใชไดใน main

� เพราะจดเรยกใชอยภายใน main ซงตามหลงฟงกชนทเราประกาศไว

• ฟงกชนสามารถถกเรยกตอ ๆ กนได

� ถา main เรยกฟงกชน A ฟงกชน A จะเรยกฟงกชน B ตออกทอดกได

� ฟงกชน B จะเรยกฟงกชนอน ๆ ตอไปอกกได

� ฟงกชนอนหนง (ทง main และฟงกชนยอย) เรยกฟงกชนอนมากกวาหนงกไดเชน main จะเรยกทง scanf และ printf กได

� ฟงกชนยอยจะเรยกฟงกชนมาตรฐานกได

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 2412 มกราคม 2556

วธจดวางฟงกชน

เพราะจดทมการเรยกฟงกชนตองมาหลงจากการประกาศฟงกชน

� การจดวางทถกตองกคอใหประกาศฟงกชนทจะถกเรยกไวดานบนและในฟงกชนททาการเรยก (เชน ฟงกชน main และ isOdd) ไวหลงฟงกชนทจะถกเรยก

� สงเกตวา main เรยกทง isEven และ isOdd ดงนนเราจงตองประกาศ isEven และ isOdd ไวกอน สวนการเรยกใชใน main จะมาหลงสด

� isOdd เรยก isEven ดงนนเราตองประกาศ isEven ไวกอนสวนการเรยกใชใน isOdd จะมาหลงสด

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 2512 มกราคม 2556

ฟงกชนกบการรบคา (parameter)

• ฟงกชนสามารถรบคาตวเลขหรอตวแปรไดดงทแสดงไวกอนหนา

• คาทรบสงกนมาระหวางฟงกชนเรยกวาพารามเตอร• ในมมมองของตวฟงกชนเองคาทรบมาจะอยในรปของตวแปร

ในตวอยางนคอ ตวแปร x, y และ radius

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 2612 มกราคม 2556

int max( int x, int y ) {if(x > y) return x;else return y;

}

double findCircleArea( double radius ) {const double PI = 3.1415926535;return PI * radius * radius;

}

พารามเตอรในมมมองของผเรยกฟงกชน (1)

สงเกตตวอยางน

• ในตวอยางนฟงกชน main มองพารามเตอรเปนตวเลขธรรมดา แตฟงกชน max มองพารามเตอรเปนตวแปรตลอดเวลา

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 2712 มกราคม 2556

int max( int x, int y ) {if(x > y) return x;else return y;

}

void main() {int max_val = max( 1, 2 );printf("max value = %d", max_val);

}

พารามเตอรในมมมองของผเรยกฟงกชน (2)

• ในตวอยางนฟงกชน main มองพารามเตอร x เปนตวแปร สวนพารามเตอรอกตวเปนตวเลขธรรมดา

• แตฟงกชน max มองพารามเตอรเปนตวแปรตลอดเวลา

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 2812 มกราคม 2556

int max(int x, int y) {if(x > y) return x;else return y;

}

void main() {int x;scanf("%d", &x);int max_val = max( x, 2);printf("max value = %d", max_val);

}

พารามเตอรในมมมองของผเรยกกบของฟงกชน (1)

• จะเหนไดวาผเรยกจะปฏบตกบพารามเตอรเปนคา ๆ หนงซงคานนจะเปนคาคงทหรอตวแปรกได

• สวนตวฟงกชนจะมองพารามเตอรเปนตวแปรตลอด

• เหมอนตอนเขยนฟงกชนคณตศาสตร เรากเขยนตดตวแปรตลอด

• แตตอนทเราจะหาคาฟงกชนเราจะพจารณาเปนคาทใสเขาไป เชน� 300, 100 หรอ � 200, 100 เปนตน

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 2912 มกราคม 2556

� �, � � ��3 ;�3 � �2�2 ;�2 � �3

พารามเตอรในมมมองของผเรยกกบของฟงกชน (2)

• ผเรยกฟงกชนเปนคนสงคาเขาไปเพราะตองการผลลพธดงนนผเรยกตองเตรยมคาไวกอนเปนคาใดคาหนง

• การเตรยมคาพารามเตอรของผเรยกฟงกชนจะกาหนดไวเปนคาคงทตายตวในโปรแกรม หรอใหผใชใสเขามาในตวแปรกได

• สวนฟงกชนทถกเรยกตองเตรยมวธคานวณเอาไวเพอใหคานวณผลลพธจากคาตาง ๆ ไดอยางถกตอง

� ฟงกชนมองพารามเตอรเปนตวแปรตลอดทาใหมความยดหยนในการจดการคาทแตกตางกนไป

� ถาผเรยกใสคาคงทเขามา ฟงกชนกเพยงนาคาคงทนนไปใสไวในตวแปรทเปนพารามเตอร (เชนใสคา y ใหเทากบ 2 ในตวอยางทผานมา)

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 3012 มกราคม 2556

ชอตวแปรพารามเตอรของผเรยกและของฟงกชน

ชอตวแปรพารามเตอรของผเรยกและของฟงกชนไมจาเปนตองเหมอนกน

� เพราะแทจรงแลวผเรยกสนใจแควาคาทจะสงไปมคาเทาไหรและชนดขอมลตรงกนหรอไม

� ฟงกชนทถกเรยกจะดงคาทถกสงมาไปเกบไวในตวแปรไมไดสนใจวาคาทสงมาเปนตวแปรหรอคาคงท

� แตกสนใจวาชนดขอมลตรงกนหรอเปลา

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 3112 มกราคม 2556

void main() {int a, b;scanf("%d %d", &a, &b);int max_val = max( a, b );printf("max value = %d", max_val);

}

ชอตวแปรใน main กบของฟงกชน max ไมเหมอนกนกได

โปแกรมนใหผลลพธเปนอยางไร

เราสงตวแปร x และ y จาก main ไปให sub สองครง

ผลลพธทไดจะเปนอยางไรและเหมอนกนทงสองครงหรอไม

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 3212 มกราคม 2556

int sub(int x, int y) {return x - y;

}

void main() {int x = 5;int y = 2;

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

printf("%d\n", sub(y, x));}

การสงพารามเตอรสาคญทลาดบคาไมใชชอตวแปร

• มอใหมมกจะหลงคดวาตองทาชอตวแปรของผเรยกใหตรงกบชอตวแปรพารามเตอรในฟงกชน แตนนเปนความคดทผด

• เรองนดออกงายเพราะถาตองทาชอใหเหมอนกน เรากคงจะสงคาคงทไปเปนพารามเตอรไมได

• ดงนนเราตองคอยดเปนอนดบแรกเลยวาลาดบคาทสงไปตรงกบลาดบทฟงกชนบอกใหเปนหรอเปลา ชนดขอมลตรงกนทกลาดบหรอเปลา

• ถาไมใสใจเรองลาดบ โปรแกรมมกจะผด โดยเฉพาะตอนทพารามเตอรมชนดขอมลทเหมอนกนหมด

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 3312 มกราคม 2556

ฟงกชนทสลบลาดบพารามเตอรกไมมผล

ฟงกชนบางอยางกใหผลลพธโดยไมขนอยกบลาดบของพารามเตอร เชน

� การหาคาสงสดของพารามเตอรทงสอง

� การหาคาสมบรณของผลตางของพารามเตอรทงสอง

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 3412 มกราคม 2556

int max(int x, int y) {if(x > y) return x;else return y;

}

int absoluteDiff(int x, int y) {if(x > y) return x - y;else return y - x;

}

การเปลยนคาตวแปรพารามเตอรในฟงกชน

• จากหนาทแลว เรากลาววา “ฟงกชนทถกเรยกจะดงคาทถกสงมาไปเกบไวในตวแปรไมไดสนใจวาคาทสงมาเปนตวแปรหรอคาคงท”

� พดงาย ๆ กคอคนเรยกใชจะสงคาตวแปรหรอคาคงทมาใหมนกเปนเพยงคาคาหนงทฟงกชนจะนาไปเกบไวในตวแปรของมนเอง

� หากฟงกชนทาการเปลยนคาตวแปรพารามเตอรผลกเกดแตขางในฟงกชน ไมไดเปลยนอะไรทผเรยกเลย

• พดงาย ๆ กคอผเรยกฟงกชนไมไดรบผลกระทบใด ๆ จากการเปลยนคาตวแปรพาราในฟงกชน ตวแปรทสงไปมคาเทาใดกลบมากมคาเทานน

� เรองนสมเหตสมผลด เพราะถาผเรยกสงคาคงทเขาไปจะใหฟงกชนมนเปลยนคาคงทไดกคงเปนเรองประหลาด

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 3512 มกราคม 2556

ตวอยางการเปลยนคาตวแปรพารามเตอร

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 3612 มกราคม 2556

int add_mult(int x, int y) {x = x + y;x = x * y;return x;

}

void main() {int x, y, result;x = 5; y = 2;result = add_mult(x, y);

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

printf("%d\n", result);}

ไดเลข 5 เหมอนตอนตน

ไดเลข 14

การสงผลลพธใหผเรยก

• ตอนเรยกผใชตองใหความสาคญกบชอฟงกชนและคาของพารามเตอร

• สวนตอนทรบคากลบมาผเรยกจะมองฟงกชนวาเปนเพยงคาคงท

� จะเอาคาคงทนนไปเกบไวในตวแปรกได

� จะเอาคาคงทนนไปแสดงผลกได

• ผเขยนโปรแกรมจงตองเขาใจลาดบการพจารณา

� เปนไปตามลาดบการทางานจรงของโปรแกรม คอเตรยมคาพารามเตอร � เรยกฟงกชน � ฟงกชนคนผลลพธกลบมา

� ตอนเตรยมคาเราเลอกกอนวาจะเปนคาคงทธรรมดาหรอเปนตวแปร

� ตอนเรยกเรามองวาชอฟงกชนกบลาดบพารามเตอรตรงกนหรอไม

� ตอนกลบมาตองดวาชนดขอมลตรงกบตวแปรทจะเกบคาไวหรอเปลา

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 3712 มกราคม 2556

ตวอยางการสงผลลพธและรบคาผลลพธจากฟงกชน

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 3812 มกราคม 2556

double findCircleArea(double radius) {const double PI = 3.1415926535;return PI * radius * radius;

}

void main() {double radius = 1.2;

double area1 = findCircleArea(radius);

int area2 = findCircleArea(radius);}

เพราะวา findCircleArea แทจรงคอ double ดงนนเราจงควรใชตวแปรประเภท double มาเกบผลลพธไว ถาใช area2 มาเกบผลลพธจะคลาดเคลอน

ลาดบการคานวณทชวนงง

ลาดบการทางานทแทจรงกคอวา ฟงกชน findCircleArea จะรบพารามเตอรไปคดผลลพธกอน จากนนจงคอยคนผลลพธมาไวท area1

• เรองนทาใหบางคนชอบเขยนอะไรผด ๆ วาdouble area1;findCircleArea(radius) = area1;

ขางบนนผดเพราะการกาหนดคาตวแปรนนมกฎเหลกอยวาตวแปรทเราจะเปลยนคาจะตองอยทางดานขวาของเครองหมายเทากบ

• ลาดบการคดเกดขนทางดานขวาของเครองหมายเทากบกอนเสมอเชน int x = a + b; สงเกตวาแตกอนเรากคดคานวณทางขวาใหเสรจกอน

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 3912 มกราคม 2556

double radius = 1.2;double area1 = findCircleArea(radius);

หวขอเนอหา• ฟงกชน (Function) หรอ โปรแกรมยอยคออะไร• ประเภทและตวอยางของฟงกชน� ฟงกชนมาตรฐาน (standard function)

� ฟงกชนสรางเอง (User-defined function)

• โครงสรางของฟงกชนและตวอยางการใชงาน• ฟงกชนคอมพวเตอรกบฟงกชนคณตศาสตร• กฎเหลกของฟงกชน� กฎของการเรยกใชฟงกชน และวธจดวางฟงกชน

� ฟงกชนกบการรบคา (parameter) และการสงผลลพธใหผเรยก

• การประกาศและนยามฟงกชนแยกจากกน

• ประเภทของฟงกชนสรางเอง

12 มกราคม 2556 40ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร

การประกาศและนยามฟงกชน

• แทจรงแลวคาวาการประกาศ (declare) กบการนยาม (define) ฟงกชนเปนสงทแตกตางกน

• ในตวอยางกอนหนาทงหมดเราทาการ declare และ define พรอมกน

• แลวอะไรทเรยกวา declare อะไรทเรยกวา define

� การระบชนดขอมล ชอฟงกชน และ พารามเตอร คอการ declare(คอการประกาศวามฟงกชนนอย)

� การระบวาฟงกชนทางานอยางไร (โคดขางในฟงกชน) คอการ define(การนยามคอการระบรายละเอยดทางการคานวณ)

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 4112 มกราคม 2556

ตนแบบฟงกชน

• เราเรยกฟงกชนทถกประกาศไววา ตนแบบของฟงกชน (function

prototype)

• วธประกาศตนแบบกคอใหเราระบชนดขอมล ชอฟงกชน และ พารามเตอรจากนนใหปดการประกาศดวยเครองหมาย semicolon เลย เชน

� int max( int x, int y );

� double findCircleArea( double radius );

� int add_mult( int x, int y );

• จดแตกตางจากเดมมเพยงวา เราไมเปดวงเลบปกกาเพอเขยนวธคานวณ แตเราปดการประกาศดวยเซมโคลอนทนท

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 4212 มกราคม 2556

การประกาศและนยามฟงกชนแยกออกจากกน

ทาไดตามขนตอนดงน

1. ใหเราระบตนแบบไวดานบนกอน

2. ณ จดทเราตองการนยามฟงกชน ใหเราเขยนซาตนแบบอกครง แต

i. แทนทเราจะปดตนแบบดวยเซมโคลอน เราจะเปดวงเลบปกกา

ii. เราระบวธคานวณของฟงกชนไวภายในวงเลบปกกาเหมอนกบทเราทามากอนหนาน

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 4312 มกราคม 2556

ตวอยางint max( int x, int y );

int max(int x, int y) {

if(x > y) return x;

else return y;

}

ผลทไดจะเหมอนกบวาเราเขยนทกอยางเหมอนเดม แตม function prototype เพมขนมาจากเดม

แลวจะเขยนแยกกนไปทาไมเนย?

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 4412 มกราคม 2556

prototype

Definition

ประโยชนของการประกาศและนยามฟงกชนแยกกน

1. ทาใหเราสามารถนยามฟงกชนไวดานใตของจดททาการเรยกใชได

2. สามารถประกาศ prototype กบนยามตวฟงกชนไวคนละไฟลได

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 4512 มกราคม 2556

int max( int x, int y );

void main() {int x, y;printf("%d\n", max(x, y) );

}

int max(int x, int y) {if(x > y) return x;else return y;

}

ประโยชนทสาคญทสดของการประกาศและนยามแยกกน

1. กระจายการใชงานฟงกชนไปหลาย ๆ ไฟลไดดวยการเขยนเฉพาะ prototype ใหม ไมตองเขยนนยามใหม

2. ทาใหฟงกชนสองอนเรยกใชงานกนเองได เพราะจดเรยกใชอยภายใตการประกาศฟงกชนดวยกนทงค

ถาเปนแบบขางลางน จะมแคฟงกชนเดยวทจะเรยกฟงกชนอกอนได

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 4612 มกราคม 2556

int A(int x);int B(int y);

int A(int x) { … B(5); … }int B(int y) { … A(0); … }

int A(int x) { … B(5); … }int B(int y) { … A(0); … }

ประเภทของฟงกชนสรางเอง

1. ฟงกชนทรบคาเขามาและคานวณผลลพธกลบไปใหผเรยก

2. ฟงกชนทไมรบคาเขามา แตคานวณผลลพธกลบไปใหผเรยก

3. ฟงกชนทไมรบคาเขามา และไมคานวณผลลพธกบไปใหผเรยก(subroutine หรอ procedure อกแบบหนง)

4. ฟงกชนทรบคาเขามา แตไมคานวณผลลพธกลบไปใหผเรยก(subroutine หรอ procedure แบบหนง)

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 4712 มกราคม 2556

ตวอยางฟงกชนทไมรบคาเขามาแตคานวณผลกลบไป

ฟงกชนทไมรบคาเขามา แตคานวณผลลพธกลบไปใหผเรยก

ตรงทเปนพารามเตอรจะวาง แตกตองมวงเลบไว

(ไมอยางนนเราจะแยกไมออกเลยวามนเปนฟงกชนหรอตวแปรธรรมดา)

ถาเราจะเขยน prototype กจะยงวนเขาไปอก

ตรงวงเลบเปลาเราสามารถใสคาวา void เขาไปกได

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 4812 มกราคม 2556

int random() { … }

int random { … } แบบน �ผด

int random; ทน �หนาตากลายเปนตวแปร int ธรรมดา

int random( void ) { … }

เทคนคบางอยางเกยวกบการสงขอมลเขาใหฟงกชน

• ในบางทเราไมสงขอมลเขาใหกบฟงกชนผานพารามเตอร

• เราอาจจะใชตวแปรแบบ global ในการสงขอมลเขาใหกบฟงกชน

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 4912 มกราคม 2556

int array[10];

float average() {float sum = 0;int i;for(i = 0; i < 10; ++i) {

sum += array[i];}

return sum / 10;}

ตวอยางฟงกชนทไมรบคาเขามาและไมคานวณผลกลบไป

• เชน ฟงกชนทมการทางานและแสดงผลลพธแลวเสรจในฟงกชน

• เราเหนมากอนหนาแลวในฟงกชน void main( ) { … }

• นนคอ หากเราไมตองการคนผลลพธกลบไปหาผเรยก � เราใช void มาเปนชนดขอมลของผลลพธฟงกชนvoid ตรงนแปลวา ‘ไมม’

• สรปไดวาเราสามารถใช void ไดอยางนอยสองแบบในการกาหนดชนดขอมล คอ ใชระบวา

� ฟงกชนไมมพารามเตอร

� ฟงกชนไมมผลลพธคนกลบไปใหผเรยก

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 5012 มกราคม 2556

void main() { … }

ตวอยางฟงกชนทรบคาเขามาแตไมคานวณผลกลบไป

เชน ฟงกชนทมการทางานและแสดงผลลพธแลวเสรจในฟงกชน

ฟงกชนทเขยนผลลพธลงไฟลบางทกเปนจาพวกนเหมอนกน

หรอฟงกชนทสงผลลพธกลบไปผาน

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 5112 มกราคม 2556

void order_numbers(int x, int y) {if(x < y) {

printf("%d %d", x, y);} else {

printf("%d %d", y, x);}

}

เรองนารเกยวกบฟงกชนทไมคนผลลพธกลบไป

• บางภาษาเชน ภาษาเบสค และภาษาปาสคาล จะเรยกฟงกชนทไมคนผลลพธกลบไปวาเปน subroutine หรอ procedure ซงแปลวา ขนตอนการทางานยอย หรอ ขนตอนการทางานทวไป

• เพราะจากตวคณตศาสตร ฟงกชนจะมการคานวณคาตอบกลบมาเสมอ

• บางภาษาเครงครดกบสงทเปนไปในคณตศาสตรจงเรยกโปรแกรมยอยทไมคนผลลพธกลบไปเปนชออนแทน (subroutine หรอ procedure)

• แตทางภาษาซ และภาษาจานวนมากไมสนใจทจดนและเรยกโปรแกรมยอยทกอยางเปนฟงกชนไปหมด

� ขอเพยงโปรแกรมเมอรเปลยนชนดขอมลใหถกกพอ

� ภาษาทใหความสนใจในจดนจะมคาสาคญมาแยกประเภทโปรแกรมยอย

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 5212 มกราคม 2556