PowerPoint - ee.eng.cmu.ac.th

Download Report

Transcript PowerPoint - ee.eng.cmu.ac.th

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()
• เมือ
่ โปรแกรมมีขนาด
ใหญ่ขน
ึ้ การเขียนโค ้ดทุก
อย่างไว ้ภายใต ้ main()
อาจทาให ้เกิดความ
ผิดพลาดได ้ง่าย
• การตรวจสอบความ
ผิดพลาดทีเ่ กิดจาก
โปรแกรมทาได ้ยาก
้ ม
• มักมีการใชกลุ
่ คาสงั่ เพือ
่
ทางานเฉพาะเจาะจงแบบ
เดียวกัน (Task) หลาย
ครัง้
้
• เกิดความซ้าซอน
• หากมีข ้อผิดพลาด ต ้อง
3
Program with functions
• ปั ญหาทีม
่ ข
ี นาดใหญ่ โดยทั่วไปสามารถแบ่ง
ออกเป็ นปั ญหาทีม
่ ข
ี นาดเล็กลงได ้หลายๆปั ญหา
(divide and conquer)
่ น
• โปรแกรมขนาดใหญ่โดยทั่วไปสามารถแบ่งสว
ออกเป็ นโปรแกรมขนาดเล็ก (module) หลายๆสว่ นได ้
่ กัน
เชน
• การเขียนและการทดสอบโปรแกรมทีม
่ ข
ี นาดเล็กทาได ้
function
call
ง่าClient
ยกว่าcode
statements
statements…
้าซอนในการเขี
้
้
• ลดความซ
ยนโค
้ดทีใ่ ชประมวลผลอย่
าง
…
เดียTask-A()
วกัน
statements…
Task-B()
Task-A()
statements…
main()
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(), …
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
ื่ ของฟั งก์ชน
ั (function name) เป็ นไปตามกฎ
identifier: ชอ
ื่
การตัง้ ชอ
ั เพือ
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
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
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)
ฟั งก์ชน
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
เป็ นตัวแปรภายนอก (global
variable) เนือ
่ งจาก ถูกประกาศไว ้
ั
นอกทุกๆฟั งก์ชน
main() สามารถเรียกใช ้ ans ได ้โดยที่
ไม่ต ้องประกาศตัวแปรอีก
ans
เป็ นตัวแปรภายใน (local v
ั inc_one() จึงเป็ นทีร่
ของฟั งก์ชน
ั นี้
เฉพาะภายในฟั งก์ชน
ั นี้ เป
ans ทีป
่ ระกาศภายในฟั งก์ชน
ตัวแปรกับ ans ทีป
่ ระกาศไว ้ภายน
เกีย
่ วข ้องกัน
x, ans
18
Scope of Variables
• Example 10.8
ื่ ans ทีแ
มีตวั แปรชอ
่ ตกต่างกัน
ทัง้ หมดกีต
่ วั ?
19
Summary
ั (Function) คือกลุม
• ฟั งก์ชน
่ ของชุดคาสงั่ ทีต
่ ้อง
ทางานด ้วยกัน เพือ
่ ให ้เกิดผลลัพธ์ทต
ี่ ้องการ
ั ทีม
• ฟั งก์ชน
่ าพร ้อมกับ C++
ั ทีผ
• ฟั งก์ชน
่ ู ้พัฒนาโปรแกรมเขียนขึน
้ เอง
ั (Function Definition) คือการ
• การนิยามฟั งก์ชน
ื่ ให ้กับกลุม
สร ้างกลุม
่ ของชุดคาสงั่ และตัง้ ชอ
่ คาสงั่
ดังกล่าว
• สามารถกาหนด return type ได ้ตามชนิดข ้อมูลที่
ั จะสง่ ค่ากลับด ้วยคาสงั่ return โดยเมือ
ฟั งก์ชน
่ ทางาน
ั จะจบการทางานทันที
คาสงั่ นีฟ
้ ั งก์ชน
ั อาจมีการใชงานค
้
• แต่ละฟั งก์ชน
าสงั่ return ได ้มากกว่า
หนึง่ แห่งขึน
้ กับเงือ
่ นไข
ั ไม่มก
• หากฟั งก์ชน
ี ารสง่ ค่ากลับ ให ้ระบุชนิดเป็ น void และ
ไม่ต ้องมีคาสงั่ return
20
Summary
ั (Function Prototype)
• ต ้นแบบของฟั งก์ชน
ั (declaration) ให ้
• ทาหน ้าทีเ่ สมือนการประกาศฟั งก์ชน
้
ั
ตัวแปลภาษารู ้ว่าจะมีการใชงานและนิ
ยามฟั งก์ชน
้
(Function Definition) เพือ
่ ใชงานในภายหลั
ง
้ อ
ั ไว ้ทีบ
• ใชเมื
่ ต ้องการเขียนนิยามฟั งก์ชน
่ รรทัดซงึ่ อยูภ
่ าย
ั main()
หลังจากฟั งก์ชน
ั
• มีความคล ้ายคลึงกับบรรทัดแรกของการนิยามฟั งก์ชน
ื่ ตัวแปร
โดยทีไ่ ม่จาเป็ นต ้องมีการระบุชอ
้ วแปร (Scope of
• ขอบเขตในการเรียกใชตั
Variables) มี 2 ลักษณะ
้ ้เฉพาะ
• ตัวแปรภายใน (Local Variables) - เรียกใชได
ภายในขอบเขตทีป
่ ระกาศ
21
Lab
ั ชอ
ื่ reverseString เป็ นฟั งก์ชน
ั ทีร่ ับ
• Lab 10.1 – ฟั งก์ชน
พารามิเตอร์เป็ นข ้อความ (string) แล ้วแสดงข ้อความดังกล่าว
ั จบการทางานจะสง่ ค่า
แบบย ้อนกลับบนหน ้าจอ และเมือ
่ ฟั งก์ชน
่ เมือ
ความยาวของข ้อความทีไ่ ด ้รับกลับไปยังผู ้ทีเ่ รียกใช ้ เชน
่
ั โดยสง่ ข ้อความ “Computer” ให ้ ฟั งก์ชน
ั จะ
เรียกใชฟั้ งก์ชน
แสดงผล “retupmoC” และสง่ ค่าจานวนเต็ม 8 กลับให ้ผู ้เรียกใช ้
ั reverseString (function
• จงเขียนต ้นแบบของฟั งก์ชน
prototype)
ั นี้ reverseString (function definition)
• เขียนนิยามของฟั งก์ชน
ั ใชเฉพาะตั
้
• กาหนดให ้ฟั งก์ชน
วแปรภายในสาหรับการทางาน
เท่านัน
้
้
ั reverseString
• เขียนโปรแกรมเพือ
่ ทดลองเรียกใชงานฟั
งก์ชน
(function call)
้
• รับค่าข ้อความจากผู ้ใชโปรแกรม
1 ข ้อความ และสร ้าง
ข ้อความภายในโปรแกรม 1 ข ้อความ
• คานวณหาความยาวของข ้อความ และแสดงผลข ้อความ
ั reverseString
ย ้อนกลับด ้วยฟั งก์ชน
22
Lab
ั vowelCount ทีม
• Lab 10.2 –ให ้สร ้างฟั งก์ชน
่ ส
ี ามารถนับจานวน
อักขระทีเ่ ป็ นสระในภาษาอังกฤษแต่ละตัวได ้แก่ a, e, i, o, u
(นับตัวเล็กและตัวใหญ่รวมกัน) ทีป
่ รากฎอยูภ
่ ายในข ้อความทีไ่ ด ้รับ
ั จบการทางานจะสง่ ค่าจานวนสระรวมทีพ
และเมือ
่ ฟั งก์ชน
่ บทัง้ หมด
ในข ้อความทีไ่ ด ้รับกลับไปยังผู ้ทีเ่ รียกใช ้
ั vowelCount (function prototype)
• จงเขียนต ้นแบบของฟั งก์ชน
ั นี้ vowelCount (function definition)
• เขียนนิยามของฟั งก์ชน
้
• สามารถใชงานตั
วแปรภายนอกเพือ
่ เก็บค่าจานวนสระแยกแต่
ละตัว
้
ั vowelCount
• เขียนโปรแกรมเพือ
่ ทดลองเรียกใชงานฟั
งก์ชน
(function call)
้
• รับค่าข ้อความจากผู ้ใชโปรแกรม
1 ข ้อความ และสร ้าง
ข ้อความภายในโปรแกรม 1 ข ้อความ
• นับจานวนสระรวมทัง้ หมดทีพ
่ บ และจานวนสระแยกแต่ละตัวที่
พบในข ้อความด ้วย
ั vowelCount
ฟั งก์ชน
• แสดงข ้อความทีผ
่ ู ้ใชป้้ อนให ้โปรแกรม พร ้อมจานวนสระรวม
23
Lab
ั สาหรับการคานวณ
• Lab 10.3 – จงเขียนฟั งก์ชน
เกีย
่ วกับการเคลือ
่ นทีไ่ ด ้แก่
ั myDistance สาหรับคานวณหาระยะทางการ
• ฟั งก์ชน
1
เคลือ
่ นที่ (s) เมือ
่ ป้ อนค่า
s= ut + at 2
2
• ความเร็วต ้น (u) หน่วยเป็ น m/s
• ความเร่งคงทีใ่ นการเคลือ
่ นที่ (a) หน่วยเป็ น m/s2
• เวลาในการเคลือ
่ นที่ (t) หน่วยเป็ น s
ั myVelocity สาหรับคานวณหาความเร็
• ฟั งก์ชน
2
v2 =วuปลาย
+ 2as(v)
เมือ
่ ป้ อนค่า
• ความเร็วต ้น (u) หน่วยเป็ น m/s
• ความเร่งคงทีใ่ นการเคลือ
่ นที่ (a) หน่วยเป็ น m/s2
• ระยะทางในการเคลือ
่ นที่ (s) หน่วยเป็ น m
ั ทัง้ สองต ้องสามารถรับค่าทีเ่ ป็ นทศนิยมสาหรับการ
• ฟั งก์ชน
คานวณได ้
้ ยง 2
• เขียนโปรแกรมเพือ
่ แก ้ปั ญหาการเคลือ
่ นที่ โดยใชเพี
ั ข ้างต ้นเท่านัน
ฟั งก์ชน
้
• รถยนต์เคลือ
่ นทีด
่ ้วยความเร็ว 20 m/s แล ้วได ้เร่งเครือ
่ ง
24