บทที่ 5: โปรแกรมย่อย procedure
Download
Report
Transcript บทที่ 5: โปรแกรมย่อย procedure
บทที่ 5
โปรแกรมย่อย
1
โปรแกรมย่อย
1. การเขียนโปรแกรมแบบโมดูล
2. โปรแกรมย่อยในภาษาปาสคาล
3. Procedure
่ ผ่าน parameter
4. การสง
- Value parameter
- Variable parameter
5. Function
2
1. การเขียนโปรแกรมแบบโมดูล
ปัญหาของการเขียนชุดคาสง่ ั ทงหมดอยู
ั้
ใ่ นสว่ นโปรแกรมหล ัก(main)
− แก้ไขและปร ับปรุงยากเมือ
่ โปรแกรมมีขนาดใหญ่
้ า้ ได้
− ชุดคาสง่ ั ทีท
่ างานเหมือนก ันไม่สามารถนามาใชซ
แก้ปญ
ั หาด้วยการเขียนโปรแกรมแบบ Module
− แยกสว่ นการทางานออกเป็นสว่ นย่อยหรือโปรแกรมย่อย
(subprogram) หรือทีเ่ รียกว่า module
3
1. การเขียนโปรแกรมแบบโมดูล
ประเภทของโปรแกรมย่อย
1. Procedure
• เป็นชุดคาสง่ ั ย่อยทีม
่ ห
ี น้าทีเ่ ฉพาะอย่างใดอย่างหนึง่
่ ค่าข้อมูล(parameter)ระหว่าง
• สามารถมีการร ับสง
procedure ก ับโปรแกรมสว่ นอืน
่ ๆทีเ่ รียกใช ้ procedure
หรือไม่ก็ได้
่ ค่าผลล ัพธ์ของการทางานกล ับไปย ังคาสง่ ั ที่
• จะไม่มก
ี ารสง
ื่ procedure
เรียกใชง้ าน procedure ผ่านชอ
2. Function
ั องมีการสง
่ ค่าผลล ัพธ์
• เหมือน procedure ต่างก ันทีฟ
่ ง
ั ก์ชนต้
ั านชอ
ื่
ของการทางานกล ับไปย ังคาสง่ ั ทีเ่ รียกใชง้ านฟังก์ชนผ่
ั วย
ฟังก์ชนด้
4
โปรแกรมย่อยในภาษาปาสคาล
โปรแกรมย่อย (subprogram) คือสว่ นหนึง่ ของโปรแกรมมีหน้าที่
เฉพาะ (บางครงเรี
ั้ ยกว่าโมดูล)
โปรแกรมย่อยวางหล ังสว่ น Heading Header ของโปรแกรมหล ัก
(main program) ก่อน BEGIN ของโปรแกรมหล ัก
• โครงสร้างของโปรแกรมย่อยประกอบด้วยสว่ นห ัว สว่ นประกาศ
่ เดียวก ับโปรแกรมหล ัก แตกต่างที่
และสว่ นคาสง่ ั เชน
้ ต้นด้วย PROCEDURE หรือ FUNCTION
• สว่ นห ัวขึน
• จบด้วย END; แทน END.
• โปรแกรมย่อยทางานเองไม่ได้ ต้องถูกเรียกโดยโปรแกรมอืน
่ ๆ ที่
เรียกใชง้ านโปรแกรมย่อยนน
ั้
5
โปรแกรมย่อยในภาษาปาสคาล
ขนตอน
ั้
1.
ระบุ “ปัญหาย่อย” ทีต
่ อ
้ งการแก้ในโปรแกรม
2.
แก้ปญ
ั หาย่อย โดยการเขียนชุดคาสง่ ั เพือ
่ แก้ไขปัญหาย่อย
ื่ ให้ก ับชุดคาสง่ ั นน
เพียงครงเดี
ั้ ยว แล้วกาหนดชอ
ั้ และให้
กาหนดประเภทชุดคาสง่ ั นนด้
ั้ วยว่าเป็น “procedure” หรือ
“function”
3.
ื่
เมือ
่ ต้องการแก้ปญ
ั หาย่อย สามารถทาได้โดยเรียกชอ
“procedure” หรือ “function” เพือ
่ นาชุดคาสง่ ั มาใชง้ าน
และในกรณีพบปัญหาย่อยทีซ
่ า้ ก ัน ให้เรียกใชง้ านอีกครงั้
โดยไม่ตอ
้ งเขียนชุดคาสง่ ั ใหม่
6
โปรแกรมย่อยในภาษาปาสคาล
PROGRAM Ex1;
USES wincrt;
BEGIN
writeln(‘****’);
writeln(‘* *’);
writeln(‘* *’);
writeln(‘****’);
writeln(‘****’);
writeln(‘* *’);
writeln(‘* *’);
writeln(‘****’);
writeln(‘****’);
writeln(‘* *’);
writeln(‘* *’);
writeln(‘****’);
END.
1. ระบุ “ปัญหาย่อย”
PROGRAM ModuleDesignEx1;
USES wincrt;
PROCEDURE Box4;
BEGIN
writeln(‘****’);
writeln(‘* *’);
writeln(‘* *’);
writeln(‘****’);
END;
BEGIN
Box4;
Box4;
Box4;
END.
2. แก้ปญ
ั หาย่อย โดยการเขียนชุดคาสง่ ั
ื่
เพียงครงเดี
ั้ ยว และกาหนดชอ
procedure (procedure) ให้ก ับชุดคาสง่ ั
นีว้ า
่ Box4
3. ที่ main program สามารถ
ื่ procedure เพือ
เรียกชอ
่ นา
ชุดคาสง่ ั มาใชง้ านได้หลายครงั้
7
โปรแกรมย่อยในภาษาปาสคาล
ร ับค่า parameter
เข้าโปรแกรมย่อย
โปรแกรมย่อย
แสดงผล
่ ผ่านค่าข้อมูล (อาจเป็นต ัวอ ักษร ต ัวเลข ต ัวแปรหรือ
การติดต่อเพือ
่ สง
นิพจน์) ระหว่างโปรแกรมย่อยและโปรแกรมอืน
่ ๆ ทีเ่ รียกใชโ้ ปรแกรม
ั
ย่อยนนท
ั้ าได้โดยอาศยพารามิ
เตอร์ (parameter)
1.Formal parameter คือพารามิเตอร์ทป
ี่ ระกาศในโปรแกรมย่อย
• กรณีมห
ี ลาย formal parameter ให้คน
่ ั ด้วย ; (semicolon)
2.Actual parameter คือพารามิเตอร์ในคาสง่ ั ทีเ่ รียกใชโ้ ปรแกรมย่อย
• กรณีมห
ี ลาย actual parameter ให้คน
่ ั ด้วย , (comma)
8
โปรแกรมย่อยในภาษาปาสคาล
่ ผ่านพารามิเตอร์ตอ
การเขียนโปรแกรมย่อยทีม
่ ก
ี ารสง
้ งเพิม
่ สงิ่
ต่อไปนี้
ื่ และ
– ในสว่ นห ัวของโปรแกรมย่อยต้องเพิม
่ การกาหนดชอ
ชนิดข้อมูลของต ัวแปรทีท
่ าหน้าทีเ่ ป็น formal parameter
ด ังต ัวอย่าง
PROCEDURE MyProc(x:real; n:integer);
่ ผ่าน
– คาสง่ ั ในโปรแกรมทีเ่ รียกใชโ้ ปรแกรมย่อยต้องสง
ื่ ต ัวแปรทีท
ข้อมูลผ่านชอ
่ าหน้าทีเ่ ป็น actual parameter
ด ังต ัวอย่าง
MyProc(a,b);
• Actual parameter สามารถใชเ้ ป็นต ัวเลข หรือ นิพจน์ ก็ได้
่ MyProc(4.5,10); หรือ MyProc(0.55,a+b);
เชน
9
Procedure : กรณีไม่ม ี parameter
ื่ โปรแกรมหล ัก;
PROGRAM ชอ
USES wincrt;
{รูปแบบ กรณีไม่ม ี parameter}
ื่ ;
PROCEDURE ชอ
VAR สว่ นประกาศต ัวแปรของprocedure
BEGIN
คาสง่ ั ต่าง ๆ ใน procedure
END;
VAR สว่ นประกาศต ัวแปรต่างๆของ main
BEGIN
คาสง่ ั ต่างๆ ของโปรแกรมหล ัก
END.
ต ัวอย่างที่ 1
PROGRAM ModuleDesignEx1;
USES wincrt;
PROCEDURE Box4;
BEGIN
writeln(‘****’);
writeln(‘* *’);
writeln(‘* *’);
writeln(‘****’);
END;
BEGIN
Box4;
Box4;
Box4;
END.
Block ของ main program
(มีคาสง่ ั เรียกใช ้ procedure)
Block ของ procedure
10
Procedure : กรณีม ี parameter
ร ับค่า parameter
เข้าโปรแกรมย่อย
Procedure
แสดงผล
รูปแบบ (กรณีม ี parameter)
ื่ (formal parameters);
PROCEDURE ชอ
ื่
ชอ
Formal parameters
PROCEDURE MyProc(var x:real; n:integer);
VAR n,m:integer;
z:real;
สว่ นประกาศต ัวแปรของ
procedure
BEGIN
คาสง่ ั ต่างๆ ใน procedure…
END;
Block ของ
procedure
สว่ น statement
ของ procedure
้ ด้วย begin ลง
ขึน
ท้ายด้วย end;
11
ต ัวอย่างที่ 2 : ร ับค่า parameter จาก main ถ้าเป็น 1 ให้พม
ิ พ์ “Press any key
to continue.” ถ้าไม่ใช่ 1 ให้พม
ิ พ์ขอ
้ ความ “Program terminate. Goodbye”
ร ับค่า parameter
เป็นเลขจานวนเต็ม 1 ต ัว
PROGRAM Ex2;
USES wincrt;
ื่
procedure ชอ
print_msg
พิมพ์ขอ
้ ความ
Header ของ main program
Block ของ procedure
{ This subprogram has one formal parameter}
procedure print_msg(input : integer);
begin
if (input = 1) then
writeln(‘Press Any Key to Continue.’)
Block ของ
else
main program
(มีคาสง่ ั เรียกใช ้
writeln(‘Program Terminate. Good Bye.’);
procedure)
end;
ต ัวแปรของ main program
var n : integer;
BEGIN
write(‘Input n : ’); readln(n);
print_msg(n); {Calling the procedure with one actual parameter }
END.
12
ต ัวอย่างที่ 2 : ร ับค่า parameter จาก main ถ้าเป็น 1 ให้พม
ิ พ์ “Press any key to
continue.” ถ้าไม่ใช่ 1 ให้พม
ิ พ์ขอ
้ ความ “Program terminate. Goodbye”
PROGRAM Ex2;
USES wincrt;
{ This subprogram has one formal parameter}
procedure print_msg(input : integer);
begin
if (input = 1) then
writeln(‘Press Any Key to Continue.’)
else
writeln(‘Program Terminate. Good Bye.’);
end;
var n : integer;
BEGIN
write(‘Input n : ’);
print_msg(n);
END.
readln(n);
ต ัวอย่างผลร ันที่ 2 ของโปรแกรม
Input n : 1
Press Any Key to Continue.
ต ัวอย่างผลร ันที่ 1 ของโปรแกรม
Input n : 10
Program Terminate. Good Bye.
- จากคาสง่ ั readln(n) ใน main มีการ
ร ับค่า actual parameter n เป็น 10
- และการทาคาสง่ ั print_msg(n); จะ
่ ค่า 10 นีใ้ ห้ก ับ formal parameter
สง
input จึงทาให้เงือ
่ นไข if เป็นเท็จ
- จากคาสง่ ั readln(n) ใน main มีการร ับ
ค่า actual parameter n เป็น 1
่
- และการทาคาสง่ ั print_msg(n); จะสง
ค่า 1 นีใ้ ห้ก ับ formal parameter input
จึงทาให้เงือ
่ นไข if เป็นจริง
13
ั้ ส
ต ัวอย่างที่ 3 : ร ับค่า parameter ร ัศมีทย
ี่ าวทีส
่ ด
ุ และร ัศมีทส
ี่ นที
่ ด
ุ ของวงรี
้ ทีข
จาก main เพือ
่ คานวณและแสดงค่าพืน
่ องวงรีใน procedure
a
program Ex3;
uses wincrt;
b
Header ของ main program
้ ทีว่ งรี = * a * b
พืน
ั้ ส
- a แทนค่าร ัศมีทส
ี่ นที
่ ด
ุ
- b แทนค่าร ัศมีทย
ี่ าวทีส
่ ด
ุ
procedure EllipseArea(a,b :real); {two formal parameters }
const pi = 3.1416;
ต ัวแปรและค่าคงทีข
่ อง Procedure
var area : real;
Block ของ
begin
procedure
area := pi*a*b;
writeln(‘a= ’,a:5:2, ‘ b= ’,b:5:2,‘ area= ’,area:5:2);
end;
ต ัวแปรของ main program
var x, y : real;
begin
two actual parameters
x := 1.5; y := 10.0;
EllipseArea(x,y);
{First Calling}
EllipseArea(2.0,x+y); {Second Calling}
end.
Block ของ
main program
14
ั้ ส
ต ัวอย่างที่ 3 : ร ับค่า parameter ร ัศมีทย
ี่ าวทีส
่ ด
ุ และร ัศมีทส
ี่ นที
่ ด
ุ ของวงรีจาก
้ ทีข
main เพือ
่ คานวณและแสดงค่าพืน
่ องวงรีใน procedure
a
b
Two formal parameters
ั้ ส
- a แทนค่าร ัศมีทส
ี่ นที
่ ด
ุ
- b แทนค่าร ัศมีทย
ี่ าวทีส
่ ด
ุ
ในการทางานของ First Calling
program Ex3;
uses wincrt;
procedure EllipseArea(a , b :real);
const pi = 3.1416;
var area : real;
begin
area := pi*a*b;
่ ค่า
เนือ
่ งจากการทาคาสง่ ั EllipseArea(x,y); เป็นการสง
ของ actual parameter x และ y (1.5 และ10.0) ให้
formal parameter a และ b ตามลาด ับ
้ ทีว่ งรี(area) := 3.1416*1.5*10.0
ด ังนน
ั้ การคานวณพืน
จะได้คา่ area เท่าก ับ 47.124 จึงทาให้ได้ผลร ันด ังต ัวอย่าง
writeln(‘a= ’,a:5:2, ‘ b= ’,b:5:2,‘ area= ’,area:5:2);
end;
var x, y : real;
begin
x := 1.5; y := 10.0;
EllipseArea(x,y); {First Calling}
EllipseArea(2.0 , x+y);{Second Calling}
end.
้ อ
ต ัวอย่างผลร ันของโปรแกรมนีค
ื
a= 1.50 b= 10.00 area= 47.12
a= 2.00 b= 11.50 area= 72.26
15
่ ผ่าน parameter
การสง
่ ผ่านพารามิเตอร์ มี 2 แบบ คือ
การสง
่ ผ่านพารามิเตอร์แบบสง
่ ค่า 2.การสง
1.การสง
่ ผ่านพารามิเตอร์แบบสง
่ ต ัวแปร
(Pass by value)
(Pass by variable)
่ ผ่านค่า (value)
• เป็นการสง
่ ผ่านตาแหน่งทีอ
• เป็นการสง
่ ยูใ่ น
ของ actual parameter
หน่วยความจา(address) ของ
ให้แก่ formal parameter
actual parameter ให้แก่ formal
parameter
• หากมีการเปลีย
่ นแปลงค่าของ
formal parameter ใน
โปรแกรมย่อย จะไม่มผ
ี ลต่อ
ค่า actual parameter
• หากมีการเปลีย
่ นแปลงค่าของ
formal parameter ในโปรแกรม
ย่อย จะมีผลต่อค่า actual
parameter เปลีย
่ นแปลงด้วย
• ค่าของ actual parameter
จะเป็นค่าของต ัวแปร ค่านิพจน์
หรือค่าคงทีโ่ ดยตรงก็ได้
• ค่าของ actual parameter จะเป็น
ค่าของต ัวแปรเท่านน
ั้
16
่ ผ่าน parameter
การสง
1.
Pass by value
รูปแบบการเขียน procedure
ื่ procedure ( ชอ
ื่ พารามิเตอร์ : ชนิดข้อมูล; …);
procedure ชอ
่
เชน
procedure EllipseArea(a,b:real);
2. Pass by Variable
รูปแบบการเขียน procedure ต้องมีคาว่า var นาหน้าต ัวแปรทีจ
่ ะ pass
by variable เสมอ ด ังนี้
ื่ procedure (var ชอ
ื่ พารามิเตอร์ :ชนิดข้อมูล; …);
procedure ชอ
่
เชน
procedure Swap(var x,y:real);
17
่ ผ่าน parameter
การสง
1. ต ัวอย่าง pass by value
program Ex41;
uses wincrt;
procedure one(x : integer);
begin
x := x+1;
writeln(‘x =’ , x);
end;
var a : integer;
begin
a := 10 ;
writeln(‘a =’ , a);
one(a) ;
writeln(‘a =’ , a);
end.
่ ผ่านข้อมูลแบบ pass by
การสง
่ เฉพาะค่า (ค ัด
value จะมีการสง
สาเนา) จาก actual parameter
(ของต ัวแปร a) ให้ formal
parameter (ต ัวแปร x)ใน
Procedure
ผลล ัพธ์
a = 10
x = 11
a = 10
ค่า actual parameter a
ของ main ก่อนเรียกใช ้
procedure one
ค่า a ของ main หล ัง
เรียกใช ้ procedure one
การเปลีย
่ นแปลงค่าของ formal parameter
ไม่มผ
ี ลต่อ actual parameter
18
่ ผ่าน parameter
การสง
2. ต ัวอย่าง pass by variable
program Ex42;
uses wincrt;
procedure two(var x : integer);
begin
x := x+1;
writeln(‘x =’ , x);
end;
var a : integer;
begin
a := 10 ;
writeln(‘a =’ , a);
two(a) ;
writeln(‘a =’ , a);
end.
่ ผ่านข้อมูลแบบ pass by
การสง
variable จะมีผลให้actual parameter
(ของต ัวแปร a) และ formal
parameter (ต ัวแปร x)ใน Procedure
เสมือนเป็นต ัวแปรเดียวก ันชว่ ั คราว
เนือ
่ งจากอ้างอิงทีอ
่ ยูใ่ นหน่วยความจา
ตาแหน่งเดียวก ัน
ผลล ัพธ์
a = 10
x = 11
a = 11
ค่า actual parameter a
ของ main ก่อนเรียกใช ้
procedure two
ค่า a ของ main หล ัง
เรียกใช ้ procedure two
การเปลีย
่ นแปลงค่าของ formal parameter
จะทาให้คา่ actual parameter เปลีย
่ นแปลงด้วย
19
่ ผ่าน parameter
การสง
้ ารสง
่ ผ่าน parameters แบบไหนให้พจ
จะเลือกใชก
ิ ารณาด ังนี้
่ มาให้เพือ
1. ถ้า procedure ต้องการเฉพาะค่าข้อมูลทีส
่ ง
่ มา
ใชง้ านใน procedure เพียงอย่างเดียว
้ ารสง
่ ผ่านแบบ pass by value
• ให้ใชก
่ ผลล ัพธ์การ
2. ถ้ามี parameter ที่ procedure ต้องการสง
ทางานกล ับไปย ังโปรแกรมทีเ่ รียกใช ้ procedure ผ่านต ัว
แปรทีเ่ ป็นพารามิเตอร์นน
ั้
้ ารสง
่ ผ่านแบบ pass by variable
• ให้ใชก
3. ถ้ามี parameter ที่ procedure ต้องการทงค่
ั้ าข้อมูลของ
่ มาให้ และต้องการสง
่ ผลล ัพธ์กล ับผ่านต ัวแปร
ต ัวแปรทีส
่ ง
นนด้
ั้ วย
้ ารสง
่ ผ่านแบบ pass by variable
• ให้ใชก
20
ต ัวอย่างที่ 5 : ร ับค่า parameter ความยาวฐานและความสูงของ
้ ทีข
สามเหลีย
่ มจาก main เพือ
่ คานวณและแสดงค่าพืน
่ อง
สามเหลีย
่ มใน procedure
่ ผ่านแบบ pass by
เลือกการสง
program Ex51;
่ เฉพาะ
value เพราะต้องการสง
uses wincrt;
“ค่า” ของต ัวแปรความยาวฐาน
(base) และความสูง(high) ให้
procedure TriangleArea(h,b :real);
้ ที่
procedure คานวณค่าพืน
var area:real;
สามเหลีย
่ ม
begin
area := 0.5*b*h;
writeln(‘base= ’,b:5:2, ‘ High= ’,h:5:2,‘ area= ’,area:5:2);
end;
var high, base : real;
begin
write(‘input high : ’ ); readln(high);
write(‘input base : ’ ); readln(base);
TriangleArea(high,base);
end.
21
ต ัวอย่างที่ 5 : ร ับค่า parameter ความยาวฐานและความสูงของสามเหลีย
่ มจาก
้ ทีข
main เพือ
่ คานวณและแสดงค่าพืน
่ องสามเหลีย
่ มใน procedure
program Ex51;
uses wincrt;
ต ัวอย่างผลร ันที่ 1 ของโปรแกรม
Input high : 1.5
Input base : 10
base= 10.00 high= 1.50 area= 7.50
procedure TriangleArea(h,b :real);
var area:real;
begin
area := 0.5*b*h;
writeln(‘base= ’,b:5:2, ‘ high= ’,h:5:2,‘ area= ’,area:5:2);
end;
var high, base : real;
begin
write(‘input high : ’ ); readln(high);
write(‘input base : ’ ); readln(base);
TriangleArea(high,base);
end.
ต ัวอย่างผลร ันที่ 2 ของโปรแกรม
Input high : 20
Input base : .5
base= 0.50 high= 20.00 area= 5.00
22
ต ัวอย่างที่ 5 (version 2): ร ับค่า parameter ความยาวฐานและความ
้ ทีข
สูงของสามเหลีย
่ มจาก main เพือ
่ คานวณพืน
่ องสามเหลีย
่ มใน
้ ทีส
procedure แต่ตอ
้ งการแสดงค่าพืน
่ ามเหลีย
่ มที่ main
program Ex52;
uses wincrt;
procedure TriangleArea(h,b :real; var area : real);
begin
เฉพาะต ัวแปร area ทีเ่ ลือก
area := 0.5*b*h;
่ ผ่านแบบ pass by
การสง
end;
variable เพราะต้องการ
่ ผลล ัพธ์คา่ พืน
้ ทีก
สง
่ ล ับไป
var high, base, area : real;
้ ที่
ย ัง main เพือ
่ พิมพ์คา่ พืน
begin
write(‘input high : ’ ); readln(high);
write(‘input base : ’ ); readln(base);
TriangleArea(high,base,area);
writeln(‘base= ’,base:5:2, ‘ High= ’,high:5:2,‘ area= ’,area:5:2);
end.
23
ต ัวอย่างที่ 5 (version 2) : ร ับค่า parameter ความยาวฐานและความสูง
้ ทีข
ของสามเหลีย
่ มจาก main เพือ
่ คานวณพืน
่ องสามเหลีย
่ มใน
้ ทีส
procedure แต่ตอ
้ งการแสดงค่าพืน
่ ามเหลีย
่ มที่ main
program Ex52;
uses wincrt;
procedure TriangleArea(h,b :real; var area : real);
begin
ต ัวอย่างผลร ัน ของโปรแกรม
area := 0.5*b*h;
end;
Input high : 1.5
Input base10 : 10
base= 10.00 high= 1.50 area= 7.50
var high, base, area : real;
begin
write(‘input high : ’ ); readln(high);
write(‘input base : ’ ); readln(base);
TriangleArea(high,base,area);
writeln(‘base= ’,base:5:2, ‘ High= ’,high:5:2,‘ area= ’,area:5:2);
end.
24
ต ัวอย่างที่ 6 : ให้เขียน procedure swap สาหร ับสล ับค่าข้อมูลระหว่างต ัวแปร
x และ y
1. Pass by value
program Ex61;
uses wincrt;
var x,y : integer;
procedure Swap(a , b:integer);
var temp:integer;
begin
temp := a;
a := b;
b := temp;
end;
begin
x := 2; y := 3;
Swap(x , y);
writeln(‘x =’ , x ,‘ y =’ , y);
end.
2. Pass by variable
program Ex62;
uses wincrt;
var x,y : integer;
procedure Swap(var a,b : integer);
var temp : integer;
begin
temp := a;
a := b;
b := temp;
end;
begin
x := 2; y := 3;
Swap(x , y);
writeln(‘x =’ , x ,‘ y =’ , y);
end.
จากโปรแกรม Ex61 และ Ex62 ให้ผลล ัพธ์ตา่ งก ันหรือไม่เพราะอะไร ?
25
ข้อควรระว ัง
1. จานวนและลาด ับของ actual parameter ต้องตรงก ับของ formal
parameter
จากโปรแกรมย่อย procedure EllipseArea(a,b :real); ของ
ต ัวอย่าง 3 ใน slide หน้า 14
ถ้าก่อนการเรียกใชง้ าน procedure มีการกาหนด x := 2; y := 0.5;
การเรียกใชง้ าน procedure EllipseArea จะให้ผลล ัพธ์เป็นด ังนี้
–
้ ว้ ยคาสง่ ั EllipseArea(x,y); ผลล ัพธ์คอ
กรณีเรียกใชด
ื
a= 2.00 b= 0.50 area= 3.14
–
้ ว้ ยคาสง่ ั EllipseArea(y,x); ผลล ัพธ์คอ
กรณีเรียกใชด
ื
a= 0.50 b= 2.00 area= 3.14
26
ข้อควรระว ัง
2. ชนิดต ัวแปรของทงั้ actual และ formal parameter ต้องเหมือนก ัน
จากโปรแกรมย่อย procedure EllipseArea(a,b :real); ในต ัวอย่าง
ที่ 3 หน้า 14 การเรียกใชง้ าน EllipseArea(x,y); จะทาได้เมือ
่
–actual parameter x และ y มีการประกาศชนิดต ัวแปรเป็น real หรือ
integer ก็ได้ ทงนี
ั้ เ้ พราะ integer และ real เป็นชนิดต ัวเลขทงคู
ั้ ่ และ
real เป็นชนิดต ัวเลขทีม
่ ข
ี อบเขตข้อมูลใหญ่กว่า integer ซงึ่ การ
่ ก ัน
เรียกใชง้ าน EllipseArea(2,0.5); ก็สามารถทาได้เชน
แต่ถา้ เขียนโปรแกรมย่อยเป็น procedure EllipseArea(a,b:integer);
–การเรียกใชโ้ ปรแกรมย่อยด้วยคาสง่ ั EllipseArea(x,y); จะต้องมีการ
ประกาศชนิดต ัวแปรของ actual parameter x และ y เป็นชนิด
integer เท่านน
ั้ และการเรียกใชง้ าน EllipseArea(2,0.5); ก็ไม่
สามารถทาได้ดว้ ย
27
สรุปข้อดีของการแยกงานเป็นโปรแกรมย่อย
• ทาให้โปรแกรมขนาดใหญ่ทม
ี่ ช
ี ุดคาสง่ ั มีความยาวมาก
้
เข้าใจได้งา
่ ยขึน
้ นในการเขียนโปรแกรมในสว
่ นทีท
• ลดความซา้ ซอ
่ างาน
้ า้ ๆ มาทาเป็น
่ นทีต
อย่างเดียวก ัน ถ้านาโปรแกรมสว
่ อ
้ งใชซ
โปรแกรมย่อย ทาให้ โปรแกรมมีขนาดเล็ก และเข้าใจง่าย
• นาโปรแกรมทีส
่ ร้างไปใชง้ านในโปรแกรมอืน
่ ได้ ถ้าใน
ั
โปรแกรมนนต้
ั้ องการฟังก์ชนในการท
างานทีเ่ หมือนก ัน
28
แบบฝึ กห ัด
program Drawing;
uses wincrt;
1. จงหาผลล ัพธ์ของโปรแกรม Drawing
procedure DrawRec(w,h:integer);
var i,j:integer;
begin
for i :=1 to h do
begin
for j :=1 to w do
write(‘*’);
writeln;
end;
end;
var n,m:integer;
begin
n := 4; m := 2;
DrawRec(n,m);
DrawRec(5,5);
DrawRec(m, m*n);
end.
29
แบบฝึ กห ัด
ิ ค้าทีล
2. จงเขียน procedure เพือ
่ คานวณและแสดงค่าสน
่ ก
ู ค้าต้อง
โดยให้คด
ิ สว่ นลดตามเงือ
่ นไขต่อไปนี้
้ื ของราคาตงแต่
้ ไป
– 12 % สาหร ับผูซ
้ อ
ั้
10,000 บาทขึน
ื้ ตงแต่
– 10 % ถ้ายอดซอ
ั้
5,000 บาท แต่ตา
่ กว่า 10,000 บาท
ื้ ตา
– 7% ถ้ายอดซอ
่ กว่า 5,000 บาท
ิ ค้า และ
หมายเหตุ กาหนดให้ procedure มีการร ับค่าจานวนสน
ราคาต่อหน่วยจาก main program
30