Transcript double x

886201
หลักการโปรแกรม 1
Lecture 4: โปรแกรมยอย
่
โปรแกรม
โปรแกรมภาษา C++ ประกอบดวย
้
โปรแกรมหลัก - มีเพียงโปรแกรมเดียว และ
กาหนดให้มีชอ
ื่ เป็ น main เทานั
่ ้น
เมือ
่ โปรแกรมมีขนาดใหญขึ
้ มี
่ น
ความจาเป็ นตองแบ
งโปรแกรมออกเป็
นส่วนยอย
้
่
่
เรียกวาโปรแกรมย
อย
เพือ
่ ให้
่
่
สามารถทาความเขาใจได
ง้ าย,
พัฒนาไดง้ าย,
้
่
่
และ สามารถนาโปรแกรมยอยที
่
่
่ ตอไปได
พัฒนาแลวไปใช
่
้ในโปรแกรมอืน
้
้
โปรแกรมยอย
(subprogram) - มีจานวนไมจ
่
่ ากัด
โปรแกรมยอย
่
โปรแกรมยอย
มีสองชนิดคือ ฟังกชั
่
์ นและกระบวนความ
- ฟังกชั
้ ตามนิยามของฟังกชั
์ น (function) – เขียนขึน
์ นทาง
คณิตศาสตร ์ ตองรั
บคาจากผู
่ นาไปดาเนินการ และตอง
้
่
้เรียกเพือ
้
คืนผลลัพธ ์ หรือ "คา"
เพี
่ ให้แกผู
่ ้เรียก และสามารถคืนคาได
่
้ ยง
คาเดี
่ ยว เช่น การเรียกใช้ฟังกชั
้
่ งมุมใน
์ น sine ผู้เรียกตองส
หน่วย Radian เช่น x ให้แกฟั
่ งกชั
์ น และฟังกชั
์ นคืนคา่
sin(x) ให้แกผู
่ ้เรียก
- กระบวนความ (procedure) - ไดแก
อยที
ใ่ ช้ทางาน
้ โปรแกรมย
่
่
ใดงานหนึ่ง และไมใช
่ ่ ฟังกชั
์ น
ภาษาบางภาษาเช่น Pascal (Delphi) มีการแยกฟังกชั
์ นแและ
กระบวนความออกจากกันโดยเด็ดขาด มีคาสั่ งและมีวธิ เี ขียน
แตกตางกั
น แตภาษา
C และ C++ กาหนดให้ฟังกชั
่
่
์ นและ
ฟังกชั
์ น
ฟังกชั
เป็
์ นในภาษา c++ แบงออกได
่
้ นสองชนิด
คือ
1. ไลบราลีฟ
่ ังกชั
์ น (Library Function)
2. ฟังกชั
่ เขี
ู้ ยนโปรแกรมกาหนดขึน
้ เอง
์ นทีผ
(User Defined Function)
Library Function
• เป็ นฟังกชั
์ นมาตรฐานจากคลัง
• กอนจะน
าฟังกชั
ปแบบการ
่
้
์ นใดมาใช้งานตองประกาศรู
ใช้งานของฟังกชั
สาหรับฟังกชั
่
์ นนั้นกอน
์ นมาตรฐาน
จากคลังทาไดโดยการโดยการ
include ชือ
่ header
้
file ทีต
่ องการ
เช่น #include <iostream>
้
• การรับขอมู
อมู
้ ลเขาและแสดงผลข
้
้ ล cin, cout, และ
cerr กาหนดใน <iostream>
• ฟังกชั
่ วกับการคานวณ เช่น sin(), cos(), tan(),
์ นเกีย
sqrt(), pow(), log() กาหนดใน <cmath>
• ฟังกชั
่ วกับการทางานกับกลุมอั
่ กขระ เช่น
์ นเกีย
strcat(), strcpy(), strcmp(), strlen() กาหนดใน
Function
Name
Math
Name
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
└x┘
floor(2.5)
returns 2.0
floor(x) floor
User Defined Function
• ฟังกชั
์ นจากคลังเป็ นฟังกชั
์ นสาหรับใช้งานทัว่ ไป
ไมเฉพาะเจาะจงกั
บงานใดงานหนึ่ง เมือ
่ เขียน
่
โปรแกรมประยุกตและต
องการฟั
งกชั
์
้
์ นเฉพาะงาน
ผูใช
้ เองได้
้ ้เขียนขึน
• ขอก
้ ใช้เอง
้ าหนดของการเขียนฟังกชั
์ นขึน
• การกาหนดรูปแบบการใช้งาน (function
prototype)
• การเรียกใช้งาน (function invocation)
การกาหนดรูปแบบการใช้งาน
(Function Prototype)
ส่วนประกอบหลัก 3 ส่วนของ function header
type function_name (param 1, …,param n)
ชื่อฟั งก์ชนั (function name) พารามิเตอร์ (parameter list)
ชนิดของข้ อมูลที่สง่ กลับ (function return type)
การกาหนดรูปแบบการใช้งาน
(Function Prototype)
ชนิดข้อมูลทีจ
่ ะ
ส่งคืน
ชือ
่ ฟังกชั
์ น
double sin(double
x);
ชนิดของตัวแปร
รับคา่
ชือ
่ ตัวแปรรับ
คา่
ชนิดของข้อมูลทีส
่ ่ งกลับ ( function
return type)
ชนิดของขอมู
่ ่ งกลับ (function return type)
้ ลทีส
สามารถใช้ชนิดของขอมู
้ ล(type) ในภาษา C++
ชนิดใดก็ไดเช
้ ่ น char, int, long, float, double
ตัวอยาง:
่
int func1(…)
int */
float func2(…)
float */
void func3 (…)
/* คาที
่ ่ งกลับเป็ นขอมู
่ ส
้ ลชนิด
/* คาที
่ ่ งกลับเป็ นขอมู
่ ส
้ ลชนิด
/* ไมมี
บ */
่ การส่งคากลั
่
ชือ
่ ฟังกชั
์ น(function name) และ
พารามิเตอร ์ (parameter list)
ชือ
่ ฟังกชั
์ น(function name)
ชือ
่ ฟังกชั
่
์ นเป็ นไปตามกฏการตัง้ ชือ
ในภาษา C++
พารามิเตอร ์ (parameter list)
คือ คาที
่ ก
ู ส่งไปยังฟังกชั
่ ฟังกชั
่ ถ
์ นเมือ
์ นถูก
เรียกใช้
ตัวอยาง:
่
float cube (float x)
/* พารามิเตอร ์
1 ตัวคือ x */
การเรียกใช้งาน (Function Invocation)
เมือ
่ ผู้เรียกตองการเรี
ยกใช้งานฟังกชั
รู
้
์ นใดตองรู
้
้ ปแบบการใช้
งานของฟังกชั
ยกใช้งานฟังกชั
์ นนั้น เช่นหากตองการเรี
้
์ น sin
ซึง่ มีรูปแบบการใช้งานเป็ น
double sin ( double x );
ซึง่ จะทาให้รูว
่ ะส่งเป็ น argument หรือ actual
้ า่ "คา"
่ ทีจ
parameters นั้นตองมี
ชนิดเป็ น double (หรือเทียบเทา่
้
double) และฟังกชั
วแปร
์ นคืนคาเป็
่ น double จะไดประกาศตั
้
สาหรับรับคาที
่ งั กชั
กตอง
เช่นมีการประกาศ
่ ฟ
์ นส่งคืนไดอย
้ างถู
่
้
ตัวแปรเป็ น
double
a = 5.87;
double
b;
int
c = 3;
และมีการเรียกใช้ฟังกชั
์ น sin ดังนี้
b = sin(a);
// ถูกต้อง argument และตัวแปรรับคา่
ฟังกชั
่
์ นทางานอยางไร
• โดยปกติการประมวลผลโปรแกรมจะเริม
่ จาก ฟังกชั
์ น
หลัก (main)
• หาก ฟังกชั
่ (ในทีน
่ ี้
์ น หลักมีการเรียกใช้ฟังกชั
์ นอืน
คือ ฟังกชั
่ ้ใช
ู ้กาหนดขึน
้ ) ก็จะมีการย้ายการ
์ น ทีผ
ทางานจาก ฟังกชั
่ ก
ู เรียกใช้
์ น หลัก ไปยังฟังกชั
์ นทีถ
(called function) นั้น (เริม
่ ทางานในส่วนของ
function definition)
• การทางานในฟังกชั
่ ก
ู เรียกใช้จะสิ้ นสุดเมือ
่ มีการ
์ นทีถ
เรียกใช้คาสั่ ง return หรือ ทางาน จน คาสั่ ง
้ นสุดลง (นั่นก็คอ
สุดทายสิ
ื พบเครือ
่ งหมาย ‘}’ ทายสุ
ด
้
้
ฟังกชั
์ น)
ฟังกชั
่
์ นทางานอยางไร
main program
int
main(void)
{
func1 ( )
func2 ( )
func3 ( )
}
func1 ( )
{
}
func2 ( )
{
}
func3 ( )
{
}
การส่งพารามิเตอรไปยั
งฟังกชั
์
์ น
• Pass by value
ทาการ copy คาส
ไมมี
่ ่ งไปยังฟังกชั
์ น
่ การ
เปลีย
่ นแปลงคาตั
่ วแปรทางฝั่งของผูเรี
้ ยก
• Pass by reference
ส่งตัวแทนของตัวแปรไปยังฟังกชั
์ น
(reference) ฟังกชั
์ นรับ "ตัวแทนของตัวแปร"
ไปดาเนินการเปลีย
่ นแปลงตัวแปร ส่งผลตอค
่ า่
ของตัวแปรทางฝั่งของผูเรี
้ ยก
ตัวอยาง
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;
ฟังกชั
์ น
// การเรียกใช้งาน
Variable Scope
Which main?
Local and global variable
• Local variable (ตัวแปรเฉพาะที)่ เป็ นตัวแปรที่
ถูกประกาศใช้เฉพาะที่ ในฟังกชั
์ นใดฟังกชั
์ น
หนึ่ง
การเปลีย
่ นแปลงคาของตั
วแปรชนิดนี้
่
จะเกิดขึน
้ ภายในฟังกชั
่ ระกาศใช้ตัวแปร
์ นทีป
เทานั
่ นแปลงภายนอกฟังกชั
่ ้น การเปลีย
์ นจะไม่
มีผลตอตั
่ วแปรดังกลาว
่
• Global variable (ตัวแปรส่วนกลาง) เป็ นตัว
แปรทีอ
่ ยูนอกฟั
งกชั
วแปรชนิดนี้
่
์ น คาของตั
่
สามารถถูกเปลีย
่ นแปลงไดตลอดเวลาโดย
้
ฟังกชันอืน
่
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 Variable
int 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
แบบฝึ กหัด
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.
b.
c.
d.
e.
double
double
double
double
double
x1
x2
x3
x4
x5
=
=
=
=
=
f(2);
g(h(2));
k(g(2) + h(2));
f(0) + f(1) + f(2);
f(-1) + g(-1) + h(-1) + k(-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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int a = 0;
int b = 0;
int f(int c)
{
int n = 0;
a = c;
n = a + b;
return n;
}
int g(int c)
{
int n = 0;
int a = c;
a++;
n = a + b;
return n;
}
25
26
27
28
29
30
31
int main()
{
int i = 1;
int b = g(i);
cout << a + b + i << endl;
return 0;
}