หน่วยการเรียนรู้ที่ 16 โปรแกรมย่อย (Subprogram)
โปรแกรมย่อย (Procedure)
การเขียนโปรแกรมคอมพิวเตอร์นั้นสามารถสร้างคำใหม่ขึ้นมาได้ และสามารถเรียกใช้ได้เมื่อต้องการ โดยคำใหม่ที่สร้างขึ้นจะประกอบด้วยคำสั่งต่างๆ รวมกันอยู่ ถ้าหากคำใหม่ที่สร้างขึ้นนี้ไม่มีการคืนค่าออกมา การทำงานจะทำงานเป็นโปรแกรมย่อยหรือที่เรียกกันในภาษาปาสคาลว่า "โพรซีเยอร์"
โครงสร้างโพรซีเยอร์
ในการเขียนโปรแกรมทุกโปรแกรมจะต้องมีโปรแกรมหลักที่อยู่ใน Begin กับ End. แต่ถ้ามีการสร้างโพรซีเยอร์หรือโปรแกรมย่อยขึ้น จะต้องเขียนโพรซีเยอร์หรือโปรแกรมย่อยไว้นอกโปรแกรมหลัก โครงสร้างของโพรซีเยอร์เป็นดังนี้
รูปแบบ
procedure Procedure_Name;
begin
statement;
end;
จะเห็นได้ว่าโพรซีเยอร์นั้นมีโครงสร้างคล้ายกับโปรแกรม จะเริ่มด้วยคำว่า Procedure และตามด้วยชื่อโพรซีเยอร์ โดยชื่อนี้จะต้องเป็นไปตามกฎการตั้งชื่อที่ได้ศึกษามา ส่วนการทำงานต่างๆ ภายในโพรซีเยอร์จะเป็นสเตตเมนต์ที่อยู่ภายใน begin กับ end; ในโพรซีเยอร์นั้นจะต้องไม่มี uses เมื่อโปรแกรมหลักต้องการเรียกโพรซีเยอร์ขึ้นมาทำงานก็ทำเพียงเรียกชื่อโพรซีเยอร์ขึ้นมาเท่านั้น
ในการเขียนโปรแกรมที่มีขนาดใหญ่ โครงสร้างแบบโพรซีเยอร์จะช่วยทำให้โปรแกรมดูง่ายขึ้น สามารถแยกโปรแกรมออกเป็นส่วนๆ ได้ อย่างเช่น ถ้าหากต้องการให้คอมพิวเตอร์วาดรูปหน้าคน เราอาจแบ่งเป็นส่วนที่วาดหัว ส่วนที่วาดตา ส่วนที่วาดปาก ส่วนที่วาดจมูก จากนั้นให้โปรแกรมหลักนำแต่ละส่วนมารวมกัน ดังตัวอย่าง เช่น
ตัวอย่างที่ 1
โปรแกรมนี้จะให้เลือกเลข 1 หรือ 2 ถ้าหากเลือกเลข 1 คอมพิวเตอร์จะวาดรูปคนยิ้ม ถ้าเป็นเลข 2 จะเป็นรูปคนหน้าดุ การทำงานของโปรแกรมจะสร้างโปรแกรมย่อยสำหรับวาดรูปส่วนต่างๆ ของใบหน้า และให้โปรแกรมหลักเรียกส่วนต่างๆ มาทำงาน
program Faces;
uses crt;
var choice : integer;
procedure DRAW_TOP; {วาดผม}
begin
writeln('|^^^^|');
end;
procedure DRAW_EYES; {วาดรูปตา}
begin
writeln(' @ @ ');
end;
procedure DRAW_NOSE; {วาดรูปจมูก}
begin
writeln(' \ / ');
end;
procedure DRAW_SMILE; {วาดปากหน้ายิ้ม}
begin
writeln(' \ _/ ');
end;
procedure DRAW_FROWN; {วาดปากหน้าดุ}
begin
writeln(' __ ');
writeln(' / \ ');
end;
begin {โปรแกรมหลัก}
clrscr; { ลบจอภาพ }
write('Enter 1 for happy face or 2 for sad face ');
readln(choice);
writeln;
DRAW_TOP; { เรียกโปรแกรมย่อยวาดผม }
DRAW_EYES; { เรียกโปรแกรมย่อยวาดตา }
DRAW_NOSE; { เรียกโปรแกรมย่อยวาดจมูก }
if choice = 1
then DRAW_SMILE
else DRAW_FROWN
end.