Upload
ira
View
53
Download
0
Embed Size (px)
DESCRIPTION
886201 หลักการ โปรแกรม 1. Lecture 4 : โปรแกรมย่อย. โปรแกรม. โปรแกรมภาษา C++ ประกอบด้วย โปรแกรมหลัก - มีเพียงโปรแกรมเดียว และกำหนดให้มีชื่อเป็น main เท่านั้น เมื่อ โปรแกรมมีขนาดใหญ่ขึ้น มีความจำเป็นต้องแบ่งโปรแกรมออกเป็นส่วนย่อย - PowerPoint PPT Presentation
Citation preview
886201 หลั�กการโปรแกรม 1Lecture 4: โปรแกรมย่ อย่
โปรแกรมโปรแกรมภาษา C++ ประกอบด้�วย
โปรแกรมหลั�ก - ม�เพี�ย่งโปรแกรมเดี�ย่ว แลัะก�าหนดีให�ม�ชื่��อเป�น main เท่ าน��น เม��อโปรแกรมม�ขนาดีใหญ่ ข"�น ม�ความจำ�าเป�นต้�องแบ่ งโปรแกรมออกเป�นส่ วนย่ อย่ เร�ย่กว าโปรแกรมย่ อย่ เพี��อให�ส่ามารถท่�าความเข�าใจำไดี�ง าย่, พี�ฒนาไดี�ง าย่, แลัะ ส่ามารถน�าโปรแกรมย่ อย่ท่��พี�ฒนาแลั�วไปใชื่�ในโปรแกรมอ��นต้ อไปไดี�
โปรแกรมย�อย (subprogram) - ม�จำ�านวนไม จำ�าก�ดี แต้ ลัะโปรแกรม ม�หน�าท่��ในการ ท่�างานเพี�ย่งอย่ างเดี�ย่ว
โปรแกรมย�อยโปรแกรมย่ อย่ ม�ส่องชื่น+ดีค�อ ฟั-งก.ชื่�นแลัะกระบ่วนความ
- ฟั�งก�ชั�น (function) – เข�ย่นข"�นต้ามน+ย่ามของฟั-งก.ชื่�นท่างคณิ+ต้ศาส่ต้ร. ต้�องร�บ่ค าจำากผู้2�เร�ย่กเพี��อน�าไปดี�าเน+นการ แลัะต้�องค�นผู้ลัลั�พีธ์. หร�อ "ค า" ให�แก ผู้2�เร�ย่ก แลัะส่ามารถค�นค าไดี�เพี�ย่งค าเดี�ย่ว เชื่ น การเร�ย่กใชื่�ฟั-งก.ชื่�น sine ผู้2�เร�ย่กต้�องส่ งม4มในหน วย่ Radian เชื่ น x ให�แก ฟั-งก.ชื่�น แลัะฟั-งก.ชื่�นค�นค า sin(x) ให�แก ผู้2�เร�ย่ก
- กระบวนความ (procedure) - ไดี�แก โปรแกรมย่ อย่ท่��ใชื่�ท่�างานใดีงานหน"�ง แลัะไม ใชื่ ฟั-งก.ชื่�น ภาษาบ่างภาษาเชื่ น Pascal (Delphi) ม�การแย่กฟั-งก.ชื่�นแแลัะกระบ่วนความออกจำากก�นโดีย่เดี7ดีขาดี ม�ค�าส่��งแลัะม�ว+ธ์�เข�ย่นแต้กต้ างก�น แต้ ภาษา C แลัะ C++ ก�าหนดีให�ฟั-งก.ชื่�นแลัะกระบ่วนความม�ร2ปแบ่บ่เดี�ย่วก�น แลัะเร�ย่กรวมว า "ฟั-งก.ชื่�น" ดี�งน��นค�าว าฟั-งก.ชื่�นในภาษา C จำ"งอาจำหมาย่ถ"ง ฟั-งก.ชื่�น หร�อ กระบ่วนความก7ไดี�
ฟั�งก�ชั�นฟั-งก.ชื่�นในภาษา c++ แบ่ งออกไดี�เป�นส่องชื่น+ดีค�อ 1. ไลับ่ราลั��ฟั-งก.ชื่�น (Library Function) 2. ฟั-งก.ชื่�นท่��ผู้2�เข�ย่นโปรแกรมก�าหนดีข"�นเอง (User Defined Function)
Library Function• เป�นฟั-งก.ชื่�นมาต้รฐานจำากคลั�ง • ก อนจำะน�าฟั-งก.ชื่�นใดีมาใชื่�งานต้�องประกาศร2ปแบ่บ่การใชื่�งานของฟั-งก.ชื่�นน��นก อน ส่�าหร�บ่ฟั-งก.ชื่�นมาต้รฐานจำากคลั�งท่�าไดี�โดีย่การโดีย่การ include ชื่��อ header file ท่��ต้�องการ เชื่ น #include <iostream>
• การร�บ่ข�อม2ลัเข�าแลัะแส่ดีงผู้ลัข�อม2ลั cin, cout, แลัะ cerr ก�าหนดีใน <iostream>
• ฟั-งก.ชื่�นเก��ย่วก�บ่การค�านวณิ เชื่ น sin(), cos(), tan(), sqrt(), pow(), log() ก�าหนดีใน <cmath>
• ฟั-งก.ชื่�นเก��ย่วก�บ่การท่�างานก�บ่กลั4 มอ�กขระ เชื่ น strcat(), strcpy(), strcmp(), strlen() ก�าหนดีใน <cstring>
FunctionName
MathName Value Example
abs(x) absolute value |x| abs(-1) returns 1
sqrt(x) square root x0.5 sqrt(2.0) returns 1.414…
exp(x) exponential ex exp(1.0) returns 2.718…
log(x) natural logarithm ln x log(2.718…) returns 1.0
log10(x) common logarithm log x log10(100.0) returns 2.0
sin(x) sine sin x sin(3.14…) returns 0.0
cos(x) cosine cos x cos(3.14…) returns -1.0
tan(x) tangent tan x tan(3.14…) returns 0.0
ceil(x) ceiling ┌ x ┐
ceil(2.5) returns 3.0
floor(x) floor└
x ┘
floor(2.5) returns 2.0
User Defined Function
• ฟั-งก.ชื่�นจำากคลั�งเป�นฟั-งก.ชื่�นส่�าหร�บ่ใชื่�งานท่��วไป ไม เฉพีาะเจำาะจำงก�บ่งานใดีงานหน"�ง เม��อเข�ย่นโปรแกรมประย่4กต้.แลัะต้�องการฟั-งก.ชื่�นเฉพีาะงาน ผู้2�ใชื่�เข�ย่นข"�นเองไดี�
• ข�อก�าหนดีของการเข�ย่นฟั-งก.ชื่�นข"�นใชื่�เอง• การก�าหนดีร2ปแบ่บ่การใชื่�งาน (function prototype)
• การเร�ย่กใชื่�งาน (function invocation)
การก�าหนด้ร�ปแบบการใชั�งาน (Function Prototype)
ส่ วนประกอบ่หลั�ก 3 ส่ วนของ function header
type function_name (param 1, …,param n)
ชื่น+ดีของข�อม2ลัท่��ส่ งกลั�บ่ (function return type)
ชื่��อฟั-งก.ชื่�น(function name)
พีาราม+เต้อร. (parameter list)
การก�าหนด้ร�ปแบบการใชั�งาน (Function Prototype)
double sin(double x);
ชัน ด้ข้�อม�ลัที่#$จะส่�งค'น
ชั'$อฟั�งก�ชั�น
ชัน ด้ข้องตั�วแปรร�บค�า
ชั'$อตั�วแปรร�บค�า
ชัน ด้ข้องข้�อม�ลัที่#$ส่�งกลั�บ ( function return type)ชื่น+ดีของข�อม2ลัท่��ส่ งกลั�บ่ (function return type) ส่ามารถใชื่�ชื่น+ดีของข�อม2ลั(type) ในภาษา C++ ชื่น+ดีใดีก7ไดี�เชื่ น char, int, long, float, double
ต้�วอย่ าง:int func1(…) /* ค าท่��ส่ งกลั�บ่เป�นข�อม2ลัชื่น+ดี int */float func2(…) /* ค าท่��ส่ งกลั�บ่เป�นข�อม2ลัชื่น+ดี float */void func3 (…) /* ไม ม�การส่ งค ากลั�บ่ */
ชั'$อฟั�งก�ชั�น(function name) แลัะ พาราม เตัอร� (parameter list)
ชื่��อฟั-งก.ชื่�น(function name) ชื่��อฟั-งก.ชื่�นเป�นไปต้ามกฏการต้��งชื่��อในภาษา C++
พีาราม+เต้อร. (parameter list) ค�อ ค าท่��ถ2กส่ งไปย่�งฟั-งก.ชื่�นเม��อฟั-งก.ชื่�นถ2กเร�ย่กใชื่�ต้�วอย่ าง: float cube (float x) /* พีาราม+เต้อร. 1 ต้�วค�อ x */ void func1 (int x, float y, char z) /* พีาราม+เต้อร. 3 ต้�วค�อ x, y, z */ void func2 (void) /* ไม ม�พีาราม+เต้อร. */
การเร#ยกใชั�งาน (Function Invocation)เม��อผู้2�เร�ย่กต้�องการเร�ย่กใชื่�งานฟั-งก.ชื่�นใดีต้�องร2 �ร2ปแบ่บ่การใชื่�งานของฟั-งก.ชื่�นน��น เชื่ นหากต้�องการเร�ย่กใชื่�งานฟั-งก.ชื่�น sin ซึ่"�งม�ร2ปแบ่บ่การใชื่�งานเป�น double sin ( double x ); ซึ่"�งจำะท่�าให�ร2 �ว า "ค า" ท่��จำะส่ งเป�น argument หร�อ actual parameters น��นต้�องม�ชื่น+ดีเป�น double (หร�อเท่�ย่บ่เท่ า double) แลัะฟั-งก.ชื่�นค�นค าเป�น double จำะไดี�ประกาศต้�วแปรส่�าหร�บ่ร�บ่ค าท่��ฟั-งก.ชื่�นส่ งค�นไดี�อย่ างถ2กต้�อง เชื่ นม�การประกาศต้�วแปรเป�น double a = 5.87; double b; int c = 3; แลัะม�การเร�ย่กใชื่�ฟั-งก.ชื่�น sin ดี�งน�� b = sin(a); // ถู�กตั�อง argument แลัะตั�วแปรร�บค�าเป,น double b = sin(c); // ถู�กตั�องเพราะ int เป,นเซตัย�อยข้อง double c = sin(5.87); // ไม�ถู�กตั�องเพราะค�าที่#$ส่�งค'นเป,น double แตั�ตั�วแปรร�บค�าเป,น int หมาย่เหต้4: อย่ าลั�มว าค าท่��ส่ งให�ฟั-งก.ชื่�น sin เป�นม4มในหน วย่ radian
ฟั�งก�ชั�นที่�างานอย�างไร• โดีย่ปกต้+การประมวลัผู้ลัโปรแกรมจำะเร+�มจำาก ฟั-งก.ชื่�น หลั�ก (main)
• หาก ฟั-งก.ชื่�น หลั�กม�การเร�ย่กใชื่�ฟั-งก.ชื่�นอ��น (ในท่��น��ค�อ ฟั-งก.ชื่�น ท่��ผู้2�ใชื่�ก�าหนดีข"�น) ก7จำะม�การย่�าย่การท่�างานจำาก ฟั-งก.ชื่�น หลั�ก ไปย่�งฟั-งก.ชื่�นท่��ถ2กเร�ย่กใชื่�(called function) น��น (เร+�มท่�างานในส่ วนของ function definition)
• การท่�างานในฟั-งก.ชื่�นท่��ถ2กเร�ย่กใชื่�จำะส่+�นส่4ดีเม��อม�การเร�ย่กใชื่�ค�าส่��ง return หร�อ ท่�างาน จำน ค�าส่��ง ส่4ดีท่�าย่ส่+�นส่4ดีลัง (น��นก7ค�อพีบ่เคร��องหมาย่ ‘}’ ท่�าย่ส่4ดีฟั-งก.ชื่�น)
• หลั�งจำากน��น จำะม�การย่�าย่การท่�างาน จำากฟั-งก.ชื่�นท่��ถ2กเร�ย่กใชื่� (called function)กลั�บ่ไปย่�ง ฟั-งก.ชื่�น หลั�ก โดีย่จำะเร+�มประมวลัผู้ลัค�าส่��งถ�ดีไปจำากการเร�ย่กใชื่� ฟั-งก.ชื่�น
ฟั�งก�ชั�นที่�างานอย�างไรmain program
int main(void){ func1 ( ) func2 ( ) func3 ( )}
func1 ( ){}
func2 ( ){}
func3 ( ){}
การส่�งพาราม เตัอร�ไปย�งฟั�งก�ชั�น• Pass by value
ท่�าการ copy ค าส่ งไปย่�งฟั-งก.ชื่�น ไม ม�การเปลั��ย่นแปลังค าต้�วแปรท่างฝั่-� งของผู้2�เร�ย่ก
• Pass by referenceส่ งต้�วแท่นของต้�วแปรไปย่�งฟั-งก.ชื่�น (reference) ฟั-งก.ชื่�นร�บ่ "ต้�วแท่นของต้�วแปร" ไปดี�าเน+นการเปลั��ย่นแปลังต้�วแปร ส่ งผู้ลัต้ อค าของต้�วแปรท่างฝั่-� งของผู้2�เร�ย่ก
ตั�วอย�าง pass by value#include <iostream>using namespace std; // การประกาศร�ปแบบการใชั�งานข้องฟั�งก�ชั�นdouble square ( double x );
// การประกาศฟั�งก�ชั�น - การก�าหนด้รายลัะเอ#ยด้การที่�างาน double square ( double x ){
return x * x;}
int main ( ) // โปรแกรมหลั�ก{ double a; // การเร#ยกใชั�งานฟั�งก�ชั�น a = square(4); cout << "a = " << a << endl; return 0;}
ตั�วอย�าง pass by value#include <iostream>using namespace std; int larger_of(int a, int b); // การประกาศร�ปแบบการใชั�งานข้องฟั�งก�ชั�น// การประกาศฟั�งก�ชั�น - การก�าหนด้รายลัะเอ#ยด้การที่�างาน int larger_of(int a, int b){ if ( a > b ) return a; return b;}
int main ( ) // โปรแกรมหลั�ก{ int x, y; cin >> x >> y; cout << larger_of(x, y) << endl; // การเร#ยกใชั�งานฟั�งก�ชั�น return 0;}
Variable Scope
Which main?
Local and global variable
• Local variable (ต้�วแปรเฉพีาะท่��) เป�นต้�วแปรท่��ถ2กประกาศใชื่�เฉพีาะท่�� ในฟั-งก.ชื่�นใดีฟั-งก.ชื่�นหน"�ง การเปลั��ย่นแปลังค าของต้�วแปรชื่น+ดีน�� จำะเก+ดีข"�นภาย่ในฟั-งก.ชื่�นท่��ประกาศใชื่�ต้�วแปรเท่ าน��น การเปลั��ย่นแปลังภาย่นอกฟั-งก.ชื่�นจำะไม ม�ผู้ลัต้ อต้�วแปรดี�งกลั าว
• Global variable (ต้�วแปรส่ วนกลัาง) เป�นต้�วแปรท่��อย่2 นอกฟั-งก.ชื่�น ค าของต้�วแปรชื่น+ดีน��ส่ามารถถ2กเปลั��ย่นแปลังไดี�ต้ลัอดีเวลัาโดีย่ฟั-งก.ชื่�นอ��น
Local Variable
double cube_volume(double side_len)
{
double volume = side_len * side_len * side_len;
return volume;
}
int main()
{
double volume = cube_volume(2);
cout << volume << endl;
return 0;
}
?
Local Variable
double withdraw(double balance, double amount){ { double amount = 10;
... } ...} ?
Global Variableint balance = 10000; // A global variable
void withdraw(double amount){ if (balance >= amount) { balance = balance - amount; }}
int main(){ withdraw(1000); cout << balance << endl; return 0;}
ตั�วอย�างint x=1, y=2;
void demo( );
int main( )
{
cout << “Before calling demo( ), x = ” << x <<“ and y =” << y << endl;
demo( );
cout << “After calling demo( ), x = ” << x << “ and y = ” << y << endl;
return 0;
}
void demo( )
{
int x=88, y=99; /* declare and initialize two local variables */
cout << “Within the demo( ), x= ” << x << “ and y= ” << y << endl;
}
Result: Before calling demo( ), x=1 and y=2
Within the demo( ), x=88 and y=99
After calling demo ( ), x=1 and y=2
แบบฝึ1กห�ด้double f(double x) { return g(x) + sqrt(h(x)); }
double g(double x) { return 4 * h(x); }
double h(double x) { return x * x + k(x) - 1; }
double k(double x) { return 2 * (x + 1); }
a. double x1 = f(2); b. double x2 = g(h(2)); c. double x3 = k(g(2) + h(2)); d. double x4 = f(0) + f(1) + f(2); e. double x5 = f(-1) + g(-1) + h(-1) + k(-1);
แบบฝึ1กห�ด้void prevnext(int a, int& prv, int nxt)
{
prv = a - 1;
nxt = a + 1;
}
int main()
{
int a = 100; int b = 0; int c = 0;
prevnext(a, b, c);
cout << "Previous = ” << b << “Next = ” << c << endl;
return 0;
}
แบบฝึ1กห�ด้1 int a = 0;2 int b = 0;3 int f(int c)4 {5 int n = 0;6 7 a = c;8 9 n = a + b;10 11 return n;12 }13 14 int g(int c)15 {16 int n = 0;17 int a = c;18 19 a++;20 n = a + b;21 22 return n;23 }24
25 int main()26 {27 int i = 1;28 int b = g(i);29 cout << a + b + i << endl;30 return 0;31 }