Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
0
จดท ำโดย นำงพรพนำรตน ชมภนช ต ำแหนง คร
วชา การพฒนาโปรแกรม (ภาษาซ) รหสวชา ว31293
หนวยการเรยนรท 8 โปรแกรมโมดล
ผลการเรยนร
ออกแบบโปรแกรมแบบโมดลในรปแบบของฟงกชนยอย และสามารถเลอกใชงานตวแปรพอยนเตอรเพอประยกตใชงานในโปรแกรมไดอยางถกตองเหมาะสม
จดประสงคการเรยนร
1. เขาใจหลกการอารเรย และสามารถน าไปประยกตใชงานไดอยางถกตอง 2. เปรยบเทยบความแตกตางระหวางอารเรย 1 มต และอารเรย 2 มตได 3. สามารถเขยนโปรแกรมเพอจดเกบขอมลลงในตวแปรอารเรยได 4. สามารถเขยนโปรแกรมเพอจดการกบขอความหรอสตรงได 5. สามารถแปลงขอความทเปนตวเลข น าไปใชเพอการค านวณได
สาระการเรยนร 1. รจกกบฟงกชนภาษาซ 2. รปแบบการเขาถงฟงกชน 3. ฟงกชนตนแบบ (Protptype)
1
จดท ำโดย นำงพรพนำรตน ชมภนช ต ำแหนง คร
ใบความรท 8 เรอง โปรแกรมโมดล
จดท าโดย นางพรพนารตน ชมภนช
จากความรหลกการเขยนโปรแกรมในบทท 1 ทมการกลาววา ควรออกแบบโปรแกรมเปนสวน ๆ หรอทเรยกวา โมดล เพอใหแตละโมดลท างานในสวนเฉพาะสวนนน ๆ ซงสงเหลานจะชวยลดความซบซอนของโปรแกรมลงได อกทงยงชวยใหการตรวจสอบ และแกไขโปรแกรมท าไดงายขน และจากตวอยางโปรแกรมทผานมา ไมไดมการแตกกระบวนการออกเปนโมดลยอยเลย ซงจะพบชดค าสงท างานทงหมด จะอยภายในฟงกชน main() ทงสน กระบวนการท างานของโปรแกรม ลวนรวมอยทเดยวกน และหากมกระบวนการทตองท าซ า แทนทจะเรยกใชงานสวนทซ าได กลบตองเขยนโปรแกรมสวนนนซ าอก สงผลใหเกดความซ าซอน และนบวาเปนแนวทางทไมถกตองนก
ฟงกชนจงเปนสวนของโปรแกรมทมความสมบรณภายในตวเอง ในภาษาซจะประกอบดวยฟงกชนหนงฟงกชนหรอหลายฟงกชน โดยในแตละโปรแกรมจะตองมอยางนอย 1 ฟงกชน คอ ฟงกชน main() สวนฟงกชนอน ๆ จะเปนสวนยอยทอยในฟงกชน main() หรออาจเปนสวนยอยของฟงกชนอน ๆ กได ฟงกชนในภาษาซจะมลกษณะคลายโปรแกรมยอย หรอทเรยกวา สบรทน (Subrutine Funchtion)
ฟงกชนเปนองคประกอบพนฐานของโปรแกรมในภาษาซ การท างานตาง ๆ ของโปรแกรมจะตองเขยนอยในรปฟงกชน โดยทฟงกชน main() ซงเปนฟงกชนแรกของโปรแกรมภาษาซทจะถกเรยกใหท างาน และนกเขยนโปรแกรมกสามารถเขยนฟงกชนทมขนาดเลกเพอใหท างานเฉพาะเจาะจงบางอยาง และยงสามารถน าฟงกชนเหลานมาใชไดอกในภายหลง ความสามารถของภาษาซเหลานจงท าใหเกดความสะดวกในการท าโปรแกรมขนาดใหญ และชวยใหการตรวจสอบความถกตองของโปรแกรม หรอการแกไขโปรแกรมในภายหลงท างานไดงายขน ดงนน ในการเขยนโปรแกรมภาษาซทดจงจ าเปนตองออกแบบโปรแกรมใหเปนโมดลหรอทเรยกวาฟงกชนยอย ๆ กเพราะวา
1. เพอเปนไปตามหลกการเขยนโปรแกรมเชงโครงสราง 2. เพองายตอการตรวจสอบและการบ ารงรกษา 3. เพอหลกเลยงการเขยนชดค าสงเดม ทท างานซ า ๆ 4. เพอสรางกลมค าสงประมวลผลเฉพาะงาน
2
จดท ำโดย นำงพรพนำรตน ชมภนช ต ำแหนง คร
ดงนนในบทน จงมจดประสงคเพอฝกแนวคดการเขยนโปรแกรมแบบใหม ดวยการแตกการท างานออกเปนโมดล ซงในภาษาซเรยกวา ฟงกชน (Funchtion) ซงโปรแกรมเมอรจะตองจะตองสรางขนเอง โดยรปแบบการเขาถงฟงกชนกจะมหลายวธดวยกน อกทงภาษาซยงอนญาตใหสรางฟงกชนเพอใชงานไดโดยไมจ ากด
รจกกบฟงกชนภาษาซ
ฟงกชนภาษาซ สามารถแบงไดเปน 2 ประเภท คอ
ฟงกชนมาตรฐาน หรอ ไลบรารฟงกชน (Library Funchtion)
ฟงกชนทผใชสรางขนเอง (User defined funchtion)
1. ฟงกชนมาตรฐาน (standard functions)
ฟงกชนมาตรฐานในภาษาซ ซงจะอยในไลบรารภาษาซมาตรฐาน (C Standard Library) ไลบรารภาษาซมาตรฐานประกอบดวยฟงกชนตางๆมากมาย ไมวาจะใชส าหรบการค านวณทางคณตศาสตร การจดการกบขอความ การจดการกบ input/output และอนๆ ซงจะท าใหงานของโปรแกรมเมอรงายขน โดยการใชงานฟงกชนประเภทนจะตองรวม (include) ไลบรารทตองการใชงาน เพอใหตวแปลภาษารวาฟงกชนทโปรแกรมเมอรตองการใชอยในไลบรารมาตรฐานตวใด ตวอยางเชน หากตองการใชฟงกชน printf() หรอ scanf() ซงอยในไลบรารมาตรฐานส าหรบเกยวกบอนพตและเอาตพต (standard input/output) ทชอ stdio.h 1.1 ฟงกชนทางคณตศาสตร (mathematic functions) เปนฟงกชนทใชส าหรบการค านวณทางคณตศาสตร และกอนทจะใชฟงกชนประเภทน จะตองใชค าสง #include <math.h> แทรกอยตอนตนของโปรแกรม และตวแปรทจะใชฟงกชนประเภทนจะตองมชนด (type) เปน double เนองจากผลลพธทไดจากฟงกชนประเภทนจะไดคาสงกลบของขอมลเปน double เชนกน ฟงกชนทางคณตศาสตรทส าคญ เชน ฟงกชน acos(x) เปนฟงกชนทใชค านวณหาคา arc cosine ของ x โดยท x เปนคามมในหนวยเรเดยน (radian) ฟงกชน exp(x) เปนฟงกชนทใชหาคา ex โดยท x เปนคาคงทหรอตวแปรทจะใชเปนคายกก าลงของ e โดยท e มคาประมาณ 2.718282 ฟงกชน log10(x) เปนฟงกชนทใชหาคา log ฐาน 10 ของคาคงทหรอตวแปร x โดยท x เปนคาคงทหรอตวแปรทมคาเปนลบไมได
3
จดท ำโดย นำงพรพนำรตน ชมภนช ต ำแหนง คร
1.2 ฟงกชนเกยวกบตวอกษร (character functions) เปนฟงกชนทใชกบขอมลทมชนดเปน single char (ใชเนอท 1 byte) เทานน และกอน ทจะใชฟงกชนประเภทนจะตองใชค าสง #include <ctype.h> แทรกอยตอนตนของโปรแกรม จงจะสามารถเรยกใชฟงกชนประเภทนได ฟงกชนเกยวกบตวอกษรทส าคญ เชน isalnum(ch), isalpha(ch), isdigit(ch) , islower(ch) , isupper(ch) , tolower(ch) , toupper(ch) , isspace(ch) , isxdigit(ch)
1.3 ฟงกชนเกยวกบสตรง (string functions) เปนฟงกชนทใชกบขอมลชนดสตรง (string) โดยกอนทจะใชฟงกชนประเภทนจะตองใชค าสง #include<string.h> แทรกอยตอนตนของโปรแกรมเสยกอน จงจะเรยกใชฟงกชนประเภทนได ฟงกชนเกยวกบสตรงทส าคญ เชน strlen(s), strcmp(s1,s2), strcpy(s), strcat(s1,s2) กจกรรมเสรมทกษะ
ใหนกเรยนทดลองเขยนโปรแกรมทมโครงสรางโปรแกรมแบบมฟงกชน ในการแสดงขอความออกทางหนาจอ ใหบนทกไฟลชอ ex08_1.cpp
1 2 3 4 5 6 7 8 9
10
#include <stdio.h> #include<conio.h> main() { int x; for (x = 1; x <= 10; x++) printf(“%d “, x * x); printf(“\n”); return 0; }
รปภาพ แสดงผลลพธทไดจากการท างานของโปรแกรม
ex08_1.exe
2. ฟงกชนทเขยนขนเอง (user defined functions)
ฟงกชนทเขยนขนหรอบางครงเราเรยกวาโปรแกรมยอย คอ สวนของโปรแกรมทเขยนขนเพอใหสามารถท างานไดอยางใดอยางหนงตามความตองการ ส าหรบผเขยนโปรแกรมภาษา C นยมเรยกโปรแกรมยอยวา ”ฟงกชน” สวนผทเขยนโปรแกรมภาษาปาสคาล โคบอล ฟอรแทรน เบสก นยมเรยกวา ”โปรแกรมยอย” อยางไรกตามโปรแกรมยอยหรอฟงกชนกมลกษณะการท างานเหมอนกน
4
จดท ำโดย นำงพรพนำรตน ชมภนช ต ำแหนง คร
เพยงแตเรยกชอตางกนเทานนส าหรบในเอกสารนจะเรยกวา ฟงกชน ซงในเนอหาสวนนจะเปนการเรยนรเกยวกบฟงชนทเขยนขน (user define functions : UDF) ตงแตการประกาศรปแบบฟงกชน การเขยนตวฟงกชนและการเรยกใชฟงกชนเพอใหสามารถใชฟงกชนทเขยนขนในโปรแกรมภาษา C
ไดอยางถกตอง
รปท 7.1 แสดงโครงสรางการสงคาของฟงกชน
รปแบบการเขาถงฟงกชน ในการเขยนฟงกชนขนมาใชงานอยางใดอยางหนง เราสามารถจ าแนกฟงกชนทเขยนขนตามลกษณะการสงคาไปและรบคากลบได 4 แบบ คอ
1. ฟงกชนทไมมการสงคาไปและรบคากลบ 2. ฟงกชนทมการสงคาไปแตไมมรบคากลบ 3. ฟงกชนทมทงการสงคาไปและรบคากลบ 4. ฟงกชนทไมมการสงคาไปแตมการสงคากลบ
ซงฟงกชนแตละแบบกเหมาะกบงานแตละอยาง ดงนนผเขยนฟงกชนจงจ าเปนทจะตองศกษาท าความเขาใจฟงกชนแตละแบบ เพอจะไดมาประยกตใชกบงานไดอยางเหมาะสม และการสรางฟงกชนขนมาใชงาน ตองเขยนค าสงใหถกตองตามรปแบบของภาษาซ ก าหนดไว
5
จดท ำโดย นำงพรพนำรตน ชมภนช ต ำแหนง คร
type เปนประเภทของฟงกชนทตองการประกาศ ซงขนกบคาผลลพธของฟงกชนเปนอะไร คณสามารถประกาศ function type ไดเหมอนกบ primitive datatype เชน int, float, char และอนๆ ส าหรบฟงกชนทไมมการสงคากลบจะม type เปน void name เปนชอของฟงกชนทคณตองการสราง ในการตงชอฟงกชนมนมกฏเชนเดยวกนเหมอนกบการตงชอตวแปร ชอของฟงกชนเปนสงทเราจะใชเมอตองการใชงานฟงกชน argument เปนตวแปรทสงเขามาในฟงกชน พารามเตอรเปนทางเลอกซงสามารถมหรอไมกได statement เปนค าสงของโปรแกรมเพอทจะใหฟงกชนท างานและไดผลลพธทตองการ
1. ฟงกชนทไมมการสงผานคาไปและรบคากลบ
จดเปนฟงกชนทมงเนนใหท างานใด ๆ จนส าเรจเทานน โดยไมมการสงคาผานคาใด ๆ ลงไป และไมมการคนคาใด ๆ กลบไปยงฟงกชน ทงนภาษาซจะใชค าวา void โดยใหระบลงไปตรงสวนชนดขอมลทคนคา และระบ void ลงไปในอากวเมนตทอยเครองหมายวงเลบ โดยค าวา void เปนตวแจงใหคอมไพลเลอรทราบวา ฟงกชนนจะไมมการคนคา หรอไมมการสงผานขอมลใด ๆ ทงสน
รปแบบ void function (void) { statement_1; statement_2; … statement_n; } ตวอยางท 1 ฟงกชนทไมรบผานคาตวแปร และไมสงผานคากลบ
void main() { my_print(); } void my_print() { printf(“Hello world”); }
main my_print
1. ท างาน! 2. พมพ
3. เสรจแลวครบ
6
จดท ำโดย นำงพรพนำรตน ชมภนช ต ำแหนง คร
กจกรรมเสรมทกษะ
ใหนกเรยนทดลองเขยนโปรแกรมทมโครงสรางโปรแกรมแบบมฟงกชน ในการแสดงขอความออกทางหนาจอ ใหบนทกไฟลชอ ex08_2.cpp
1 2 3 4 5 6 7 8 9
10 11 12 13 14
#include <stdio.h> #include<conio.h> void prtline(void) { puts("========================="); } main() { prtline(); printf("\t Heading \n"); prtline(); getche(); }
รปภาพ แสดงผลลพธทไดจากการท างานของ
โปรแกรม ex08_2.exe
2. ฟงกชนทมการสงผานคาทางเดยว
เปนฟงกชนทมการสงผานคาผานอารกวเมนต และภายหลงเสรจสนการท างานของตวฟงกชนแลว จะไมมการคนคาใด ๆ กลบไป ดงนนอารกวเมนตภายในวงเลบ จงตองระบชนดขอมลลงไป ซงจะมกตวกได ในขณะทชนดขอมลทคนคากลบ ใหระบเปน void
รปแบบ void function (type arg1 , type arg2 , …) { statement_1; statement_2; … statement_n; }
7
จดท ำโดย นำงพรพนำรตน ชมภนช ต ำแหนง คร
ตวอยาง
กรณท 1 ฟงกชนทมการรบผานคาตวแปร แตไมสงผานคากลบ
รปแบบท 1.1
void main() { my_print(2); } void my_print(int x) { printf(“%d”, x); }
รปแบบท 1.2
void main() {
my_print(‘a’, 5); } void my_print(char ch, int x) { while (x > 0) { printf(“%c”, ch); x--; } }
กรณท 2 ฟงกชนทไมมการสงคาไปแตมการสงคากลบ
เปนรปแบบฟงกชนทไมมการสงผานคาไปยงฟงกชน ยงมการคนคากลบไปดวยพจารณาจากตวอยางจะพบวา ฟงกชน add() จะมอารกวเมนตอย 2 ตวแปรและมการคนคากลบดวยตวเลขจ านวนเตม
main my_print
1. ท างาน (ดวย 2) ! 2. พมพ
3. เสรจแลวครบ
main my_print
1. ท างาน (ดวย ‘a’ และ 5) ! 2. พมพ
3. เสรจแลวครบ
8
จดท ำโดย นำงพรพนำรตน ชมภนช ต ำแหนง คร
ตวอยางท 4
ฟงกชนทไมมการรบผานคา และแตมการสงผานคากลบ
void main() { char ch; ch = my_print(); printf(“%c\n”, ch); } char my_print(void) { char lch; printf(“Enter your character: ”); scanf(“%c”, &lch); printf(“\n”); return (lch);
}
main my_print
1. ท างาน ! 2. รบคาจากผใช
3. เสรจแลวครบ ผลคอ lch
9
จดท ำโดย นำงพรพนำรตน ชมภนช ต ำแหนง คร
กจกรรมเสรมทกษะ
ใหนกเรยนทดลองเขยนโปรแกรมทมโครงสรางโปรแกรมแบบมฟงกชน ในการแสดงขอความออกทางหนาจอ ใหบนทกไฟลชอ ex08_3.cpp
1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18
#include <stdio.h> #include<conio.h> void square (int); main() { int w; printf("Input width : "); scanf("%d",&w); square(w); return 0; } void square (int y) { float ans; ans=y*y; printf("Area is : %.2f ", ans ); getche(); }
รปภาพ แสดงผลลพธทไดจากการท างานของโปรแกรม
ex08_3.exe
3. ฟงกชนทสงผานคาและคนคากลบ
เปนรปแบบฟงกชนทนอกจากจะมการสงผานคาแลว ยงมการคนคากลบไปดวยพจารณาจากตวอยางจะพบวา ฟงกชน add() จะมอารกวเมนตอย 2 ตวแปรและมการคนคากลบดวยตวเลขจ านวนเตม
รปแบบ data_type function (type arg1,type arg2,…) { statement_1; statement_2; … statement_n; return(expression); }
10
จดท ำโดย นำงพรพนำรตน ชมภนช ต ำแหนง คร
ตวอยางท 3
ฟงกชนทมทงการรบผานคา และสงผานคากลบ
void main() { char ch; ch = my_print(5); printf(“%c\n”, ch); } char my_print(int x) { char ans; printf(“Enter your character: ”); scanf(“%c”, &ans); while (x > 0) { printf(“%c”, ans); x--; } printf(“\n”); return ans; }
main my_print
1. ท างาน (ดวย 5) ! 2. รบคาแลวพมพ
3. เสรจแลวครบ ผลคอ ans
11
จดท ำโดย นำงพรพนำรตน ชมภนช ต ำแหนง คร
กจกรรมเสรมทกษะ
ใหนกเรยนทดลองเขยนโปรแกรมทมโครงสรางโปรแกรมแบบมฟงกชน ในการแสดงขอความออกทางหนาจอ ใหบนทกไฟลชอ ex08_4.cpp
1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16
#include <stdio.h> #include <conio.h> int square(int); main() { int x; for (x = 1; x <= 10; x++) printf(“%d “, square(x)); printf(“\n”); return 0; } int square(int y) { return y*y; }
รปภาพ แสดงผลลพธทไดจากการท างานของโปรแกรม
ex08_4.exe
ฟงกชนตนแบบ (Protptype)
จากโปรแกรมการสรางฟงกชนใชงานเอง จะพบวาไดมการวางต าแหนงฟงกชนทสรางขนไวกอนฟงกชน main() ทงนกเพอใหคอมไพเลอรไดแปลชดค าสงของฟงกชนทสรางขนเองกอน แตอยางไรกตามกรณตองการวางต าแหนงฟงกชน main() ไวกอนฟงกชนอน ๆ ทสรางขนเอง จ าเปนตองประกาศฟงกชนตนแบบไวทสวนหวของโปรแกรม (กอนฟงกชน main()) เพอใหคอมไพลเลอรไดรจกกบฟงกชนเหลานนกอน
การใชวธสรางฟงกชนตนแบบ (Function Prototype) กคอ ฟงกชนตนแบบจะเปนตวบอกใหตวแปลภาษารถงชนดของขอมลทจะสงคากลบ จ านวนของตวแปรพารามเตอร ทฟงกชนคาดหวงวาจะไดรบ ชนดของพารามเตอรแตละตว และล าดบของพารามเตอรเหลานน ตวแปลภาษาสามารถทจะน าขอมลเหลานในการตรวจสอบความถกตองของการเรยกใชฟงกชน ลองคดถงปญหาทตามมา หากตว
12
จดท ำโดย นำงพรพนำรตน ชมภนช ต ำแหนง คร
แปลภาษายอมใหมการเรยกใชฟงกชนทมพารามเตอรไมครบ หรอสลบชนดของพารามเตอร เมอเกดความผดพลาดขณะรนโปรแกรม จะตรวจสอบหาความผดพลาดไดยาก การใชตนแบบของฟงกชนสามารถหลกเลยงความไรประสทธภาพเหลานได
ตามปกตถาตองการใหตวแปรภาษา C แปลความหมายโปรแกรมไดอยางถกตอง เราจะตองเขยนฟงกชนอนๆ ไวกอนฟงกชน main() แตการเขยนโปรโตไทปจะท าใหเราสามารถยายต าแหนงของฟงกชนไปไวทสวนใดของโปรแกรมกได โดยไมจ าเปนตองเขยนไวกอนฟงกชน main() ซงรปแบบการเขยนโปรโตไทปหรอฟงกชนตนแบบ จะเหมอนกบการเขยนบรรทดแรกของฟงกชน ดงตอไปน
รปแบบ data_type function (type-1 ,type-2 , … , type-n);
ตวอยาง #include <stdio.h> #include <conio.h> Int maximum(int , int , int); main() { int a, b, c; printf(“Enter three integers: “); scanf(“%d %d %d”, &a, &b, &c); printf(“Maximum is: %d\n”, maximum(a, b, c); return 0; }
int maximum(int x , int y, int z) { int max = x; if (y > max) max = y; if (z > max) max = z; return max; }
ประกำศฟงกชนตนแบบ (Function Prototype)
ประกำศตวแปรทใชในกำรรบคำในฟงกชนทชอวำ maximum
(Function Prototype)