PowerPoint - ee.eng.cmu.ac.th

Report
Week 9
Functions
Outline
ั หาในการพัฒนาโปรแกรมขนาดใหญ่
• ปญ
• อะไรคือฟงั ก์ชนั
• การนิยามฟงั ก์ชนั (Function Definition)
• การใช้งานฟงั ก์ชนั (Function Call)
• การประกาศต้นแบบฟงั ก์ชนั (Function Prototype)
• ขอบเขตการใช้งานตัวแปร (Scope of Variables)
2
Program without functions
statements…
Task-A
statements…
Task-B
Task-A
statements…
• เมือ่ โปรแกรมมีขนาดใหญ่ขน้ึ การ
เขียนโค้ดทุกอย่างไว้ภายใต้ main()
อาจทาให้เกิดความผิดพลาดได้งา่ ย
• การตรวจสอบความผิดพลาดทีเ่ กิด
จากโปรแกรมทาได้ยาก
• มักมีการใช้กลุ่มคาสังเพื
่ อ่ ทางาน
เฉพาะเจาะจงแบบเดียวกัน (Task)
หลายครัง้
• เกิดความซ้าซ้อน
• หากมีขอ้ ผิดพลาด ต้องแก้ไขในทุกๆจุด
ทีม่ กี ารใช้กลุม่ คาสังนั
่ น้
main()
3
Program with functions
ั หาทีม่ ขี นาดใหญ่ โดยทัวไปสามารถแบ่
• ปญ
่
งออกเป็ นปญั หาทีม่ ขี นาด
เล็กลงได้หลายๆปญั หา (divide and conquer)
• โปรแกรมขนาดใหญ่โดยทัวไปสามารถแบ่
่
งส่วนออกเป็ นโปรแกรมขนาดเล็ก
(module) หลายๆส่วนได้เช่นกัน
• การเขียนและการทดสอบโปรแกรมทีม่ ขี นาดเล็กทาได้งา่ ยกว่า
• ลดความซ้าซ้อนในการเขียนโค้ดทีใ่ ช้ประมวลผลอย่างเดียวกัน
Client code
statements…
Task-A()
statements…
Task-B()
Task-A()
statements…
main()
function call
statements
…
Task-A()
statements
Task-C()
…
Task-B()
function call
statements
…
Task-C()
4
What is function?
• ฟงั ก์ชนั (function) คือโปรแกรมย่อย หรือกลุ่มของชุดคาสัง่ (statement)
ทีต่ อ้ งทางานด้วยกันเพือ่ ให้เกิดผลลัพธ์บางอย่างทีต่ อ้ งการ
• โปรแกรมในภาษา C++ ต้องมีอย่างน้อยหนึ่งฟงั ก์ชนั คือ main()
• เราสามารถแบ่งส่วนโค้ดทีเ่ ขียนอยูภ
่ ายใน main() ออกมาเป็ นฟงั ก์ชนั
ย่อยๆทีม่ ขี นาดเล็กลงมาได้
• การแบ่งส่วนโค้ดนี้สามารถทาได้หลายลักษณะขึน้ อยูก่ บั ผูเ้ ขียนโปรแกรม
• อย่างน้อยทีส่ ดุ ฟงั ก์ชนั ต้องสามารถทางานเฉพาะอย่างใดอย่างหนึ่งได้
• ฟงั ก์ชนั ทีม่ มี าพร้อมกับ C++ (built-in functions)
• printf(), strlen(), sqrt(), getline(), …
• ฟงั ก์ชนั ทีผ่ พ
ู้ ฒ
ั นาโปรแกรมเขียนขึน้ เอง (user-defined functions)
• myFunction(), myCalculation(), …
5
Defining a Function
• การนิยามฟงั ก์ชนั (Function Definition) คือการกาหนดและตัง้ ชือ่ ให้กบั กลุ่มของ
ชุดคาสังที
่ จ่ ะทางานร่วมกัน โดยจะอยูใ่ นรูปแบบต่อไปนี้
return_type identifier( parameter-list ) {
// body of function
statement 1;
statement 2;
...
return value;
}
: ชนิดของข้อมูลทีจ่ ะถูกส่งค่ากลับ (return) ให้แก่โค้ดทีเ่ รียกใช้งานฟงั ก์ชนั
(client code) เมือ่ ฟงั ก์ชนั ทางานเสร็จสิน้
• int, char, double, string, … (ตามชนิดข้อมูลของ value)
• หากฟงั ก์ชนั ไม่มกี ารส่งค่ากลับ ไม่จาเป็ นต้องมีคาสัง่ return และให้กาหนด
ค่า return_type เป็ น void
identifier: ชือ
่ ของฟงั ก์ชนั (function name) เป็ นไปตามกฎการตัง้ ชือ่
parameter-list: ข้อมูลต่างๆ ทีต
่ อ้ งส่งผ่านให้กบั ฟงั ก์ชนั เพือ่ ใหัฟงั ก์ชนั สามารถทางาน
ได้ โดยต้องส่งค่าให้ถกู ต้องทัง้ จานวน ชนิดข้อมูล และลาดับ
• return_type
•
•
6
Defining and Calling Function
• ตัวอย่างที่ 1
int mySquare(int x) {
int res = x*x;
return res;
}
int mySquare(int x) {
return x*x;
}
• ส่งค่ากลับเป็ นข้อมูลชนิด int - พิจารณาจากชนิดของข้อมูลทีส่ ง่ กลับด้วยคาสัง่
return ซึง่ ในทีน
่ ้ีคอื ตัวแปร res
ซึง่ มีชนิดข้อมูลเป็ น int
• ชือ่ ของฟงั ก์ชนั คือ mySquare
• เมือ่ เรียกใช้ฟงั ก์ชนั ต้องส่งพารามิเตอร์ 1 ตัว โดยมีชนิดข้อมูลเป็ น int เมือ่ ฟงั ก์ชนั
รับค่ามาแล้วจะเอาค่าไปเก็บไว้ทต่ี วั แปร x
• วิธกี ารเรียกใช้ฟงั ก์ชนั (function call) เช่นจากภายใน main()
int sqrt_result;
// sqrt_result will be 121 from next statement
sqrt_result = mySquare(11);
// This will print out “Result: 144” on screen
cout << “Result: “ << mySquare(12);
7
Defining and Calling Function
• ตัวอย่างที่ 2
void printMul(int x, int y) {
int res = x*y;
cout << “Multiply: “ << res << endl;
}
• ส่งค่ากลับเป็ นข้อมูลชนิด void – เมือ่ ฟงั ก์ชนั ทางานเสร็จสิน
้ จะไม่มกี ารส่งค่าข้อมูล
ใดๆกลับให้ผทู้ เ่ี รียกใช้ พิจารณาได้จากการทีไ่ ม่มคี าสัง่ return
• ชือ่ ของฟงั ก์ชนั คือ printMul
• เมือ่ เรียกใช้ฟงั ก์ชนั ต้องส่งพารามิเตอร์เป็ นข้อมูลชนิด int จานวน 2 ตัวโดยที่ ข้อมูล
ตัวแรกจะถูกส่งให้เก็บในตัวแปร x และตัวทีส่ องจะถูกส่งให้ตวั แปร y
• วิธกี ารเรียกใช้ฟงั ก์ชนั (function call) เช่นจากภายใน main()
int a=10, b=5;
// This will print “Multiply: 50” on screen
printMul(a,b);
// This will print “Multiply: 40” on screen
printMul(8,b);
8
Example: Passing parameters and Returns a value
• Example 10.1
Function return
return r;
คืนค่าจากฟงั ก์ชนั
z = myFunciton(x,y)
return
call
Calling function
int myFunction(int a, int b)
หากต้องการแก้ไขสมการทีใ่ ช้คานวณ
เป็ นสมการอื่นต้องทาอย่างไร?
Copy ค่าส่งให้ฟงั ก์ชนั
z = myFunciton(
x
,
y
)
9
Example: Passing parameters without Returning a value
• Example 10.2
cnt<=5
ch<=‘#’, cnt<=5
10
Example: No parameters and No return values
• Example 10.3
11
Example
• Example 10.4 ฟงั ก์ชนั สาหรับตัดเกรด
ฟงั ก์ชนั จะจบการทางาน และส่งค่าคืนให้กบั
ผูเ้ รียกใช้ทนั ที เมือ่ ทางานคาสัง่ return
myGrade() จะจบการทางานทีบ
่ รรทัดใดและ
ส่งค่าใดคืน ขึน้ อยูก่ บั ค่าตัวแปรภายใน score
12
Function Prototype
• โดยทัวไปตั
่ วแปลภาษา (compiler) จะต้องรูจ้ กั ฟงั ก์ชนั ทีจ่ ะถูกเรียกใช้
ก่อนทีจ่ ะมีการเรียกใช้
• หลักการเดียวกับทีต่ อ้ งประกาศตัวแปรก่อนทีจ่ ะใช้งานตัวแปรได้
• ดังนัน้ ในตัวอย่างก่อนหน้านี้ทงั ้ หมด จึงมีการนิยามฟงั ก์ชนั (function definition)
ไว้ในบรรทัดทีอ่ ยูก่ ่อนหน้าฟงั ก์ชนั main()
• ในทางปฏิบตั เิ รามักจะเขียนฟงั ก์ชนั main()ก่อนเพือ่ ความสะดวกในการเข้าถึง
แล้วจึงทาการนิยามฟงั ก์ชนั อื่นๆต่อท้าย
• ส่งผลให้มกี ารเรียกใช้ฟงั ก์ชนั อื่นๆ (ภายใน main()) ก่อนทีต่ วั แปลภาษาจะ
รูจ้ กั ฟงั ก์ชนั เหล่านัน้ ทาให้เกิด compilation error ได้
ั หานี้ได้โดยอาศัย ต้นแบบของฟงั ก์ชนั (function prototype)
• เราสามารถแก้ปญ
• ต้นแบบของฟงั ก์ชนั เป็ นการแจ้งให้ตวั แปลภาษาได้ทราบล่วงหน้าถึง
ฟงั ก์ชนั ทีจ่ ะมีการสร้างขึน้ ใช้งานในโปรแกรม
• บางครัง้ เรียกว่า การประกาศฟงั ก์ชนั (function declaration)
13
Function Prototype
• ต้นแบบของฟงั ก์ชนั จะแจ้งข้อมูลให้ตวั แปลภาษาทราบถึง
• ชนิดของข้อมูลทีจ่ ะส่งค่ากลับเมือ่ ฟงั ก์ชนั ทางานเสร็จสิน้ (return type)
• จานวนของพารามิเตอร์ทฟ
่ี งั ก์ชนั คาดว่าจะได้รบั
• ชนิด และลาดับของพารามิเตอร์แต่ละตัว
int myFunction(int x, double y);
หรือ
int myFunction(int, double);
• ข้อสังเกตุ
• ต้นแบบของฟงั ก์ชนั จะคล้ายกับบรรทัดแรกของการกาหนดฟงั ก์ชนั
• ต้นแบบของฟงั ก์ชนั ไม่จาเป็ นต้องมีช่อื ของตัวแปรทีจ่ ะใช้
14
Example: without Function Prototype
• Example 10.5
นิยามของฟงั ก์ชนั main() มาก่อนนิยาม
ของฟงั ก์ชนั ทีเ่ รียกใช้งาน
Call
ตัวแปลภาษาพบว่ามีการใช้งานฟงั ก์ชนั ใน
main() ก่อนทีจ่ ะมีการนิยามการทางาน
Definition
15
Example: with Function Prototype
• Example 10.6
Prototype
Call
ตัวแปลภาษาพบต้นแบบฟงั ก์ชนั ก่อนทีจ่ ะพบ
การใช้งานใน main() ดังนัน้ ฟงั ก์ชนั เหล่านี้จงึ
ถือว่าเป็ นทีร่ จู้ กั แล้ว
Definition
16
Scope of Variables
• ขอบเขตในการเรียกใช้งานตัวแปร ซึง่ เราได้ประกาศไว้ในทีต่ ่างๆของ
โปรแกรม โดยเราสามารถแบ่งออกได้เป็ น 2 ลักษณะ
• ตัวแปรภายใน (Local Variables)
• ถูกสร้างขึน้ ภายฟงั ก์ชนั หรือภายในขอบเขตของเครือ่ งหมาย {…}
• สามารถเรียกใช้งานได้เฉพาะภายในฟงั ก์ชนั หรือขอบเขตทีต่ วั แปรถูกประกาศ
• ถูกทาลายลงเมือ่ ฟงั ก์ชนั หรือขอบเขตนัน้ ๆสิน้ สุดการทางาน
• ตัวแปรภายนอก (Global Variables)
• ถูกสร้างขึน้ ภายนอกฟงั ก์ชนั ทุกๆฟงั ก์ชนั
• สามารถเรียกใช้งานได้ในทุกๆฟงั ก์ชนั ของโปรแกรมเดียวกัน
• ยกเว้นกรณีทภ่ี ายในฟงั ก์ชนั มีตวั แปรภายในชือ่ เดียวกัน
• คงอยูต่ ลอดการทางานของโปรแกรม
17
Scope of Variables
• Example 10.7
ans เป็ นตัวแปรภายนอก
(global variable)
เนื่องจาก ถูกประกาศไว้นอกทุกๆฟงั ก์ชนั
main() สามารถเรียกใช้ ans ได้โดยทีไ่ ม่ตอ
้ง
ประกาศตัวแปรอีก
x, ans เป็ นตัวแปรภายใน (local variable)
ของฟงั ก์ชนั inc_one() จึงเป็ นทีร่ จู้ กั
เฉพาะภายในฟงั ก์ชนั นี้
ans ทีป
่ ระกาศภายในฟงั ก์ชนั นี้ เป็ นคนละ
ตัวแปรกับ ans ทีป่ ระกาศไว้ภายนอกและไม่
เกีย่ วข้องกัน
18
Scope of Variables
• Example 10.8
มีตวั แปรชือ่ ans ทีแ่ ตกต่างกันทัง้ หมดกีต่ วั ?
19
Summary
• ฟงั ก์ชนั (Function) คือกลุ่มของชุดคาสังที
่ ต่ อ้ งทางานด้วยกัน เพือ่ ให้เกิด
ผลลัพธ์ทต่ี อ้ งการ
• ฟงั ก์ชนั ทีม่ าพร้อมกับ C++
• ฟงั ก์ชนั ทีผ่ พ
ู้ ฒ
ั นาโปรแกรมเขียนขึน้ เอง
• การนิยามฟงั ก์ชนั (Function Definition) คือการสร้างกลุ่มของชุดคาสัง่
และตัง้ ชื่อให้กบั กลุ่มคาสังดั
่ งกล่าว
• สามารถกาหนด return type ได้ตามชนิดข้อมูลทีฟ
่ งั ก์ชนั จะส่งค่ากลับด้วย
คาสัง่ return โดยเมือ่ ทางานคาสังนี
่ ้ฟงั ก์ชนั จะจบการทางานทันที
• แต่ละฟงั ก์ชนั อาจมีการใช้งานคาสัง่ return ได้มากกว่าหนึ่งแห่งขึน
้ กับเงือ่ นไข
• หากฟงั ก์ชนั ไม่มกี ารส่งค่ากลับ ให้ระบุชนิดเป็ น void และไม่ตอ้ งมีคาสัง่
return
• การส่งค่าใหักบั ฟงั ก์ชนั จะต้องเป็ นไปตามทีก่ าหนดโดย parameter list ซึง่
จะระบุจานวน ชนิดของข้อมูล และลาดับของพารามิเตอร์
20
Summary
• ต้นแบบของฟงั ก์ชนั (Function Prototype)
• ทาหน้าทีเ่ สมือนการประกาศฟงั ก์ชนั (declaration) ให้ตวั แปลภาษารูว้ า่ จะมีการ
ใช้งานและนิยามฟงั ก์ชนั (Function Definition) เพือ่ ใช้งานในภายหลัง
• ใช้เมือ่ ต้องการเขียนนิยามฟงั ก์ชนั ไว้ทบ
่ี รรทัดซึง่ อยูภ่ ายหลังจากฟงั ก์ชนั main()
• มีความคล้ายคลึงกับบรรทัดแรกของการนิยามฟงั ก์ชนั โดยทีไ่ ม่จาเป็ นต้องมีการ
ระบุช่อื ตัวแปร
• ขอบเขตในการเรียกใช้ตวั แปร (Scope of Variables) มี 2 ลักษณะ
• ตัวแปรภายใน (Local Variables) - เรียกใช้ได้เฉพาะภายในขอบเขตทีป
่ ระกาศ
• ตัวแปรภายนอก (Global Variables) - เรียกใช้ได้ทุกแห่งในโปรแกรม
• ยกเว้นกรณีทข่ี อบเขตดังกล่าวมีตวั แปรภายในทีช่ ่อื เดียวกัน
21
Lab
• Lab 10.1 – ฟงั ก์ชนั ชือ่ reverseString เป็ นฟงั ก์ชนั ทีร่ บั พารามิเตอร์เป็ นข้อความ
(string) แล้วแสดงข้อความดังกล่าวแบบย้อนกลับบนหน้าจอ และเมือ่ ฟงั ก์ชนั จบการทางานจะ
ส่งค่าความยาวของข้อความทีไ่ ด้รบั กลับไปยังผูท้ เ่ี รียกใช้ เช่น เมือ่ เรียกใช้ฟงั ก์ชนั โดยส่ง
ข้อความ “Computer” ให้ ฟงั ก์ชนั จะแสดงผล “retupmoC” และส่งค่าจานวนเต็ม 8
กลับให้ผเู้ รียกใช้
• จงเขียนต้นแบบของฟงั ก์ชนั reverseString (function prototype)
• เขียนนิยามของฟงั ก์ชนั นี้ reverseString (function definition)
• กาหนดให้ฟงั ก์ชนั ใช้เฉพาะตัวแปรภายในสาหรับการทางานเท่านัน้
• เขียนโปรแกรมเพือ่ ทดลองเรียกใช้งานฟงั ก์ชนั reverseString (function call)
• รับค่าข้อความจากผูใ้ ช้โปรแกรม 1 ข้อความ และสร้างข้อความภายในโปรแกรม 1
ข้อความ
• คานวณหาความยาวของข้อความ และแสดงผลข้อความย้อนกลับด้วยฟงั ก์ชนั
reverseString
• แสดงข้อความทีผ่ ใู้ ช้ป้อนให้โปรแกรม พร้อมขนาดความยาวของข้อความในวงเล็บ
22
Lab
• Lab 10.2 –ให้สร้างฟงั ก์ชนั vowelCount ทีม่ สี ามารถนับจานวนอักขระทีเ่ ป็ นสระใน
ภาษาอังกฤษแต่ละตัวได้แก่ a, e, i, o, u (นับตัวเล็กและตัวใหญ่รวมกัน) ทีป่ รากฎอยู่
ภายในข้อความทีไ่ ด้รบั และเมือ่ ฟงั ก์ชนั จบการทางานจะส่งค่าจานวนสระรวมทีพ่ บทัง้ หมดใน
ข้อความทีไ่ ด้รบั กลับไปยังผูท้ เ่ี รียกใช้
• จงเขียนต้นแบบของฟงั ก์ชนั vowelCount (function prototype)
• เขียนนิยามของฟงั ก์ชนั นี้ vowelCount (function definition)
• สามารถใช้งานตัวแปรภายนอกเพือ่ เก็บค่าจานวนสระแยกแต่ละตัว
• เขียนโปรแกรมเพือ่ ทดลองเรียกใช้งานฟงั ก์ชนั vowelCount (function call)
• รับค่าข้อความจากผูใ้ ช้โปรแกรม 1 ข้อความ และสร้างข้อความภายในโปรแกรม 1
ข้อความ
• นับจานวนสระรวมทัง้ หมดทีพ
่ บ และจานวนสระแยกแต่ละตัวทีพ่ บในข้อความด้วย
ฟงั ก์ชนั vowelCount
• แสดงข้อความทีผ่ ใู้ ช้ป้อนให้โปรแกรม พร้อมจานวนสระรวมทัง้ หมดทีพ
่ บในวงเล็บ
• แสดงจานวนสระแยกแต่ละตัวทีพ
่ บ โดยดึงข้อมูลจากตัวแปรภายนอกทีใ่ ช้เก็บข้อมูลนี้
23
Lab
• Lab 10.3 – จงเขียนฟงั ก์ชนั สาหรับการคานวณเกีย่ วกับการเคลื่อนทีไ่ ด้แก่
• ฟงั ก์ชนั myDistance สาหรับคานวณหาระยะทางการเคลื่อนที่ (s) เมือ่ ป้อนค่า
• ความเร็วต้น (u) หน่วยเป็ น m/s
1
• ความเร่งคงทีใ่ นการเคลื่อนที่ (a) หน่วยเป็ น m/s2
s = ut + at 2
2
• เวลาในการเคลื่อนที่ (t) หน่วยเป็ น s
• ฟงั ก์ชนั myVelocity สาหรับคานวณหาความเร็วปลาย (v) เมือ่ ป้อนค่า
• ความเร็วต้น (u) หน่วยเป็ น m/s
• ความเร่งคงทีใ่ นการเคลื่อนที่ (a) หน่วยเป็ น m/s2
v 2 = u2 + 2as
• ระยะทางในการเคลื่อนที่ (s) หน่วยเป็ น m
• ฟงั ก์ชนั ทัง้ สองต้องสามารถรับค่าทีเ่ ป็ นทศนิยมสาหรับการคานวณได้
ั หาการเคลื่อนที่ โดยใช้เพียง 2 ฟงั ก์ชนั ข้างต้นเท่านัน้
• เขียนโปรแกรมเพือ่ แก้ปญ
• รถยนต์เคลื่อนทีด่ ว้ ยความเร็ว 20 m/s แล้วได้เร่งเครือ่ งให้รถมีความเร่ง 3 m/s เป็ น
เวลา 5 s จงหาระยะทาง และความเร็วเมือ่ สิน้ สุดวินาทีท่ี 5
24

similar documents