บทที่ 5: โปรแกรมย่อย function

Download Report

Transcript บทที่ 5: โปรแกรมย่อย function

บทที่ 5
โปรแกรมย่อย
Part II Function
1
ั (Function)
ฟังก์ชน
• เป็นชุดคำสง่ ั ย่อยทีม
่ ห
ี น้ำทีเ่ ฉพำะอย่ำงใดอย่ำงหนึง่ เหมือนก ับ
procedure
ั ับ
่ ค่ำข้อมูล (parameter) ระหว่ำงฟังก์ชนก
• สำมำรถมีกำรร ับสง
้ ง
ั
่ ผ่ำน
โปรแกรมสว่ นอืน
่ ๆทีเ่ รียกใชฟ
ั ก์ชนหรื
อไม่ก็ได้ และกำรสง
parameter ก็สำมำรถทำได้ทงแบบ
ั้
pass by value และแบบ pass by
่ เดียวก ันก ับ procedure
variable เชน
ั ำงจำก procedure ตรงทีฟ
ั องมีกำรสง
่ ค่ำผลล ัพธ์
• ฟังก์ชนต่
่ ง
ั ก์ชนต้
ั ำนชอ
ื่
ของกำรทำงำน 1 ค่ำกล ับไปย ังคำสง่ ั ทีเ่ รียกใชง้ ำนฟังก์ชนผ่
ั วย
ฟังก์ชนด้
2
ั
ประเภทฟังก์ชน
ั
• Built-in function เป็นฟังก์ชนมำตรฐำนที
ป
่ ำสคำลมีให้
่ sqrt( ), exp( ), round( ) เป็นต้น
เชน
ั ผ
• User defined function เป็นฟังก์ชนที
่ เู ้ ขียนโปรแกรม
ออกแบบเอง
3
Built-in procdure
ClrScr
- สำหร ับลบภำพบนจอทงจอภำพ
ั้
และให้เคอร์เซอร์ (cursor)
ไปอยูท
่ ม
ี่ ม
ุ บนซำ้ ย (ตำแหน่งแถวที่ 1 และคอล ัมน์ท ี่ 1)
- เป็น procedure ทีไ่ ม่มก
ี ำรร ับค่ำ paramter
GotoXY(x,y) สำหร ับย้ำยเคอร์เซอร์ไปย ังตำแหน่งแถว(row)ที่
่ Gotoxy(1,1) จะทำให้
y และคอล ัมน์(column)ที่ x เชน
เคอร์เซอร์ยำ้ ยไปอยูท
่ ม
ี่ ม
ุ บนซำ้ ยของจอภำพ และ
Gotoxy(80,25) คือมุมล่ำงขวำ
- เป็น procedure ทีม
่ ก
ี ำรร ับค่ำ paramter เป็นเลขจำนวนเต็ม
2 ค่ำ
4
Built-in function
ั ค
• upcase() ฟังก์ชนที
่ น
ื ค่ำเป็นอ ักขระต ัวพิมพ์ใหญ่
ั
ั รณ์ (Absolute value) ของ
• abs() ฟังก์ชนให้
คำ่ สมบู
จำนวน n ทีเ่ ป็นไปได้ตำมแบบข้อมูลของ n
ั
• sqr() ฟังก์ชนยกก
ำล ังสอง
ั
• sqrt() ฟังก์ชนหำค่
ำรำกทีส
่ อง
ั
• exp() ฟังก์ชนหำค่
ำ exponential
• ln()
ั
ฟังก์ชนหำค่
ำ log ธรรมชำติ
ั
่ ไปหำค่ำไซน์ตอ
• sin() ฟังก์ชนหำค่
ำไซน์ โดยค่ำทีส
่ ง
้ ง
เป็นค่ำเรเดียน
• cos() , tan(), acos() ,….
5
Program mySecond_101;
ต ัวอย่ำงกำรใช ้
built-in function
uses wincrt;
var a : integer; x,y : real;
ch : char;
begin
a := -9; x := 1.2; ch := 'a';
y := sqr(x);
writeln('sqr(1.2) = ', y:1:3);
writeln('sqr(-9) = ',sqr(-9));
writeln('sqrt(2) = ',sqrt(2) : 1:3);
writeln('abs(-9) = ',abs(a));
writeln('pi/2 = ', Pi/2 : 1:3);
writeln('sin(pi/2) = ', sin( Pi/2 ) :1:3);
writeln('Uppercase (a) = ', upcase(ch) );
ผลล ัพธ์ของโปรแกรม
้ อ
นีค
ื
sqr(1.2) = 1.440
sqr(-9) = 81
sqrt(2) = 1.414
abs(-9) = 9
Pi/2 = 1.571
sin(pi/2) = 1.000
Uppercase (a) = A
Uppercase (5) = 5
writeln('Uppercase (5) = ', upcase('5') );
end.
ั ไ่ ม่ตอ
หมำยเหตุ Pi เป็นฟังก์ชนที
้ งกำร parameter
6
ั
User defined function : กำรเขียนฟังก์ชน
ร ับค่ำ parameter
ั
เข้ำฟังก์ชน
ั
ฟังก์ชน
่ ค่ำกล ับ
สง
ั
รูปแบบกำรเขียนฟังก์ชน
ื่ ( formal parameter list: ชนิดของข้อมูล): ชนิดของ function;
function ชอ
่
เชน
formal parameter คือ a,b ซงึ่ เป็น pass by
value เพรำะไม่มค
ี ำว่ำ var นำหน้ำ a,b
function fnEllipseArea (a,b :real) : real;
var area : real;
ั
ประกำศต ัวแปรสำหร ับภำยในฟังก์ชน
begin
area := 3.1416*a*b;
ชนิดของ function real
fnEllipseArea := area;
ด ังนนค
ั้ ำสง่ ั กำรกำหนดค่ำให้
end;
ั (เพือ
ื่ ฟังก์ชน
่ ค่ำกล ับ)
ทีช
่ อ
่ สง
ต้องมีชนิดเป็น real ด้วย
7
ั้ ส
ต ัวอย่ำงที่ 1 : ร ับค่ำ parameter ร ัศมีทย
ี่ ำวทีส
่ ด
ุ และร ัศมีทส
ี่ นที
่ ด
ุ ของวงรีจำก main
้ ทีข
้ ทีใ่ นสว่ นของ main program
เพือ
่ คำนวณพืน
่ องวงรีในfunction และแสดงค่ำพืน
program ExFunc1;
uses wincrt;
function fnEllipseArea (a,b :real) : real;
var area : real;
begin
area := 3.1416*a*b;
fnEllipseArea := area;
end;
var a1,a2,x, y : real;
begin
x := 0.5; y := 20.0;
a1 := fnEllipseArea(x,10); {First Calling}
writeln(a1:5:2);
เป็น function
-แบบ pass by value
่ ค่ำกล ับเป็นชนิด real
-สง
สำมำรถเรียกใชง้ ำน
function ได้ทงั้ 3 แบบ
a2 := fnEllipseArea(x,10); {Second Calling}
writeln(a2:5:2);
เรียกใชง้ ำน function โดยไม่ม ี
fnEllipseArea(x,y); {the last Calling}
end.
กำรร ับค่ำทีค
่ น
ื มำจำก function
แบบนีไ้ ม่ได้ !
8
ั้ ส
ต ัวอย่ำงที่ 1 : ร ับค่ำ parameter ร ัศมีทย
ี่ ำวทีส
่ ด
ุ และร ัศมีทส
ี่ นที
่ ด
ุ ของวงรีจำก main
้ ทีข
้ ทีใ่ นสว่ นของ main program
เพือ
่ คำนวณพืน
่ องวงรีใน function และแสดงค่ำพืน
program ExFunc1;
uses wincrt;
function fnEllipseArea (a, b :real) : real;
var area : real;
begin
area := 3.1416*a*b;
fnEllipseArea := area;
end;
var a1,a2,x, y : real;
begin
x := 0.5; y := 20.0;
จำกคำสง่ ั writeln(a1:5:2); ใน main
program จะแสดงผลล ัพธ์คำ่ 31.42
ซงึ่ ได้มำจำก
1)คำสง่ ั a1 := fnEllipseArea (x,y);
่ ค่ำ
ใน main program จะมีกำรสง
actual parameter x,y ( 0.5 และ
20) มำ ให้ formatal parameter a
ั
และ b ของฟังก์ชน
ั กำรคำนวณค่ำ area
2)ในฟังก์ชนมี
เท่ำก ับ 3.1416*a*b ได้ 31.416 และ
ั
ื่ ฟังก์ชน
้ ำ่ นชอ
คืนค่ำ area นีผ
a1 := fnEllipseArea (x,y); {First Calling} 3)ใน main program จะร ับค่ำคืนมำ
ั ็ น 31.416 และ
จำกฟังก์ชนเป
writeln(a1:5:2);
กำหนดค่ำนีใ้ ห้ก ับต ัวแปร a1
a2 := fnEllipseArea (x,10);
writeln(a2:5:2);
end.
 เมือ
่ พิมพ์คำ่ a1 (จำกคำสง่ ั
writeln(a1:5:2); ใน main) จึงได้
ผลล ัพธ์เป็น 31.42
9
ั้ ส
ต ัวอย่ำงที่ 1 : ร ับค่ำ parameter ร ัศมีทย
ี่ ำวทีส
่ ด
ุ และร ัศมีทส
ี่ นที
่ ด
ุ ของวงรีจำก main
้ ทีข
้ ทีใ่ นสว่ นของ main program
เพือ
่ คำนวณพืน
่ องวงรีใน function และแสดงค่ำพืน
program ExFunc1;
uses wincrt;
function fnEllipseArea (a, b :real) : real;
var area : real;
begin
area := 3.1416*a*b;
fnEllipseArea := area;
end;
var a1,a2,x, y : real;
begin
x := 0.5; y := 20.0;
a1 := fnEllipseArea (x,y); {First Calling}
writeln(a1:5:2);
a2 := a1+ fnEllipseArea (x,10); {Second Calling}
writeln(a2:5:2);
end.
้ อ
ผลร ันของโปรแกรมนีค
ื
31.42
15.71
10
ั
่ ค่ำให้ฟง
ต ัวอย่ำงที่ 2 : ร ับค่ำเลขจำนวนเต็มจำกผูใ้ ช ้ แล้วสง
ั ก์ชนเพื
อ
่
คำนวณค่ำ Factorial โดยให้แสดงผลล ัพธ์ของค่ำ Factorial ที่
main program
function factorial(n:integer):integer;
var product, i :integer;
ั Factorial คำนวณ
ออกแบบฟังก์ชน
begin
ค่ำ n! (เก็บในต ัวแปร product)
product := 1;
่ คืนผลล ัพธ์คำ่ n! ทีค
และสง
่ ำนวณ
for i := 1 to n do
ั โดย
ื่ ฟังก์ชน
ได้ผำ
่ นชอ
product := product*i;
factorial := product;
n!  n  (n 1)  (n  2)   3  2 1
end;
ั ด ังนี้
ถ้ำร ับค่ำ formal parameter n เป็น 4 มีกำรทำงำนของฟังก์ชน
เริม
่ ต้น product = 1
เมือ
่ i=1 product = 1
เมือ
่ i=2 product = 1*2
เมือ
่ i=3 product = 2*3
เมือ
่ i=4 product = 6*4
่ คืนก ับไป
ด ังนนจะได้
ั้
คำ่ product = 24 แล้วสง
 ต ัวแปร product เป็นเลขจำนวนเต็ม ด ังนนชนิ
ั้
ด function ก็เป็น integer
11
ั
่ ค่ำให้ฟง
ต ัวอย่ำงที่ 2 : ร ับค่ำเลขจำนวนเต็มจำกผูใ้ ช ้ แล้วสง
ั ก์ชนเพื
อ
่
คำนวณค่ำ Factorial โดยให้แสดงผลล ัพธ์ของค่ำ Factorial ที่
main program
program ExFunc2;
uses wincrt;
function factorial(n:integer):integer;
var product, i :integer;
begin
product := 1;
for i := 1 to n do
product := product*i;
factorial := product;
end;
var number,result : integer;
begin
ต ัวอย่ำงผลร ัน ของโปรแกรม
write('Input number : ' );
Input number : 5 
readln(number);
Factorial is 120
result := factorial(number);
writeln('Factorial is ',result );
end.
12
ต ัวอย่ำงที่ 3:
ั
่ ค่ำให้ฟง
ร ับค่ำเลขจำนวนเต็มจำกผูใ้ ช ้ แล้วสง
ั ก์ชนตรวจสอบ
ว่ำเป็นเลขคูห
่ รือเลขคี่ แล้วแสดงผลล ัพธ์ท ี่ main program
ว่ำเป็น 'odd number' หรือ 'even number'
function isEven(n : integer) : boolean;
var temp :integer; result : boolean;
begin
temp := n mod 2;
if temp = 0 then
result := true
else
result := false;
isEven := result;
end;
ั isEven ทำหน้ำทีต
ออกแบบฟังก์ชน
่ รวจสอบว่ำค่ำ n ว่ำเป็นเลขคูห
่ รือไม่
- โดยถ้ำค่ำ formal parameter n เป็นเลขคูจ
่ ริง (หำร 2 แล้วเหลือเศษศูนย์)
ั
ฟังก์ชนจะคื
นค่ำ True
ั
- แต่ถำ้ n ไม่ใชเ่ ลขคูฟ
่ ง
ั ก์ชนคะคื
นค่ำ False
ด ังนนชนิ
ั้
ดของ function ต้องเป็น boolean
13
ต ัวอย่ำงที่ 3:
ั
่ ค่ำให้ฟง
ร ับค่ำเลขจำนวนเต็มจำกผูใ้ ช ้ แล้วสง
ั ก์ชนตรวจสอบ
ว่ำเป็นเลขคูห
่ รือเลขคี่ แล้วแสดงผลล ัพธ์ท ี่ main program
ว่ำเป็น 'odd number' หรือ 'even number'
program ExFunc3;
uses wincrt;
function isEven(n : integer) : boolean;
var temp :integer; result : boolean;
begin
temp := n mod 2;
if temp = 0 then
result := true
else
result := false;
isEven := result;
end;
ต ัวอย่ำงผลร ัน ของโปรแกรม
var number : integer;
Input number : 5 
begin
Odd number
write('Input number : ' );
readln(number);
if isEven(number) then
writeln('Even number')
else
writeln('Odd number');
14
end.
ข้อควรระว ังเกีย
่ วก ับ function
ั อย่ำลืมกำหนดชนิดของ function
1. ในกำรเขียนฟังก์ชน
function fnEllipseArea (a,b :real) : real;
ต้องกำรคืนค่ำไปเป็นต ัวเลขชนิด real
ั ต้องมีคำสง่ ั ในกำรนำค่ำทีฟ
ั องกำรสง
่ คืน มำ
2. ภำยในฟังก์ชน
่ ง
ั ก์ชนต้
ื่ function และต้องมีชนิดแบบเดียวก ันก ับชนิดของ
กำหนดให้ก ับชอ
ั วย
ฟังก์ชนด้
fnEllpseArea := area;
ั นกล ับไป
่ ค่ำ area ทีค
 ต้องกำรสง
่ ำนวณได้ภำยในฟังก์ชนคื
้ ง
ั จะไม่เหมือน procedure เพรำะ
3. ในกำรเรียกใชฟ
ั ก์ชน
ั เ่ รียกใช ้
ื่ ฟังก์ชนที
• ควรมีต ัวแปรมำร ับผลล ัพธ์ทค
ี่ น
ื มำพร้อมก ับชอ
่
เชน
x := fnEllipseArea(3.0,b);
โดย x ต้องมีกำรประกำศชนิดต ัวแปร เป็นชนิดเดียวก ันก ับชนิดของ
ั วย
ฟังก์ชนด้
15
procedure และ function
procedure power3proc(x:integer; var x3: integer );
begin
x3 : = x*x*x;
end;
function power3function(x : integer) : integer;
begin
power3function : = x*x*x;
end;
โปรแกรมย่อย
สำหร ับคำนวณ
ค่ำ x3
จุดทีแ
่ ตกต่ำง
กำรเรียกใช ้ Procedure
กำรเรียกใช ้ Function
กำรร ับค่ำทีค
่ ำนวณจำกโปรแกรม
้ ำรสง
่ parameter
ย่อยต้องใชก
กำรร ับค่ำทีค
่ ำนวณจำกโปรแกรมย่อยจะ
ั
ื่ ฟังก์ชนได้
ร ับผ่ำนชอ
power3proc(x,x3);
X3 := power3func(x);
16
แบบฝึ กห ัด
โปรแกรม Grading สำหร ับร ับค่ำคะแนนจำกผูใ้ ช ้ เพือ
่ คำนวณเกรดใน
่ เกรดไปแสดงผลที่ main program
function แล้วสง
program Grading;
Function ComputeGrade(score:real ) : char;
Var grade : char;
โปรแกรมย่อยคำนวณเกรด
begin
(แต่ไม่แสดงผล)
if score >= 80 then
grade := 'A'
else if score >= 65 then
grade := 'B'
else
ข้อ 1. จำกโปรแกรม Grading ใน
if score >= 50 then
grade := 'C'
ข้อ 1 พ ัฒนำเพิม
่ เติมให้
else
grade := 'F';
สำมำรถร ับคะแนนและคำนวณ
end;
ค่ำเกรดของน ักเรียน N คนได้
var score:real;
grd:char;
begin
writeln('Input score : '); readln(score);
grd := Grading(score);
แสดงผลที่ main program
writeln('Your grade is ',grd);
end.
17
แบบฝึ กห ัด
ั ับค่ำ parameter N เพือ
ข้อ 2. จงเขียนฟังก์ชนร
่ คำนวณผลรวมของเลขคี่
่ ง 1 ถึง N เชน
่
ทงหมดที
ั้
อ
่ ยูใ่ นชว
ถ้ำ N เป็น 20 ค่ำทีต
่ อ
้ งคำนวณคือ 1 + 3 + 5 + 7 + 9 + … 19 = 100
ถ้ำ N เป็น 15 ค่ำทีต
่ อ
้ งคำนวณคือ 1 + 3 + 5 + 7 + 9 + … 15 = 64
ั
ข้อ 3. จงเขียนโปรแกรมร ับจำนวนชว่ ั โมงทำงำนต่อสปดำห์
และอ ัตรำค่ำจ้ำง
เพือ
่ คำนวณค่ำจ้ำงสุทธิหล ังห ักภำษี ณ ทีจ
่ ำ่ ยให้ก ับลูกจ้ำง ( 1 คน) โดย
ั
ในกำรคำนวณค่ำจ้ำง หำกทำงำนเกิน 40 ชว่ ั โมงต่อสปดำห์
ชว่ ั โมงทีเ่ กินจะ
้ ำมเงือ
ได้คำ่ ล่วงเวลำ 1.5 ของค่ำจ้ำง โดยกำรคำนวณภำษีใชต
่ นไขต่อไปนี้
–
1-1000 บำท คิดภำษี 2% ของค่ำจ้ำง
–
1001 - 4000 บำท คิดภำษี 3%ของค่ำจ้ำง
–
ี 5% ภำษีของค่ำจ้ำง
เกิน 4000 เสย
กำหนดให้โปรแกรมคำนวณค่ำจ้ำงสุทธิน ี้ โดยมี
1)
โมดูลคำนวณภำษี
2)
โมดูลคำนวณค่ำจ้ำงสุทธิหล ังห ักภำษี
18