พื้นฐานปาสคาลพื้นฐาน rapidqเว็บภาษาไทยเว็บภาษาอังกฤษ

procedure กับ function

Procedure
procedure ที่ compiler เตรียมไว้ให้แล้ว

            ในการเขียน program ด้วยภาษาปาสคาล
      compiler ได้จัดเตรียม procedure ที่มีการใช้บ่อยๆ ไว้ให้แล้ว
      เช่น   write()  read()  inc()  dec() ซึ่งถูกบรรจุไว้ในยูนิต system
      ผู้เขียนโปรแกรมสามารถนำ procedure ดังกล่าว
      มาใช้ได้ในทันที โดยไม่ต้องเรียกใช้ยูนิต

            แต่ในบาง procedure จะถูกบรรจุแยกไว้ในยูนิตอื่นๆ
      เช่น clrscr  gotoxy()  delay() ซึ่งถูกเก็บไว้ในยูนิต crt
      ผู้เขียนโปรแกรมจึงต้องเรียกใช้ยูนิตก่อน จึงจะสามารถ
      นำ procedure ที่บรรจุไว้ในยูนิตนั้นๆ  มาใช้งานได้

procedure ที่ผู้เขียนโปรแกรมออกแบบขึ้นมาใหม่

            การเขียนโปรแกรมโดยใช้เพียง procedure ที่ compiler เตรียมไว้
      จะทำให้ โครงสร้างของโปรแกรมมีลักษณะยาวติดต่อกัน
      ใช้งานไม่สะดวก ทำให้แก้ไขโปรแกรมได้ช้า
      ผู้เขียนปาสคาล จำเป็นต้องเขียน procedure ขึ้นมา ด้วยตัวเอง
      เพื่อแบ่งการทำงานให้เป็นระเบียบ ง่ายต่อการแก้ไขโปรแกรมในภายหลัง

            นอกจากนี้ บางครั้ง procedure ที่ compiler จัดหามาให้มี
      ลักษณะที่ทำงานแบบกะทัดรัด จึงไม่ครอบคลุมการทำงานบางอย่าง
      การเขียน procedure ขึ้นมาเองนั้น สามารถสร้าง
      คำสั่งขึ้นมาใหม่ เพื่อให้ทำงานตรงกับความต้องการอีกด้วย
วิธีการสร้าง procedure ขึ้นมาด้วยตัวเอง

            การสร้าง procedure ขึ้นมาเองในภาษาปาสคาล
      จะเป็นการนำเอา procedure ที่มีอยู่แล้วมาออกแบบ-
      ขั้นตอนการทำงาน  เพื่อให้ทำงานตรงกับความต้องการ

            นอกจากนี้  ในการเขียนโปรแกรมในระดับลึก การออกแบบ
      โพรซีเจอร์จะมีการนำเอาภาษา assembly มาเชื่อมต่อ
      กับภาษาปาสคาล เพื่อสร้างโพรซีเจอร์ใหม่ได้


การเขียน procedure ขึ้นมาใช้เอง ที่จะศึกษากันในที่นี้
         เป็นการนำเอา procedure ที่มีอยู่มาออกแบบ
         ให้เป็น procedure ใหม่   มีโครงสร้างดังนี้ครับ
โครงสร้างหลัก ของการประกาศ procedure
procedure ชื่อของโพรซีเจอร์ ;
 begin
    คำสั่งที่ compiler จัดเตรียมไว้
    และ โครงสร้างการทำงานต่างๆ 
    ( if then, repeat until เป็นต้น )
 end;


โครงสร้างหลักๆ ของโพรซีเจอร์ เป็นอย่างนี้ครับ
uses
       crt ;

procedure DivLine;
 begin
        writeln('==========================');
 end;

begin
       clrscr ;
          writeln(' sawasdeekrab kunkru ');
          DivLine;
          writeln(' sawasdeeka  nakrean ');
          DivLine;
       readln ;
end.
เป้าหมายทั่วไปของ procedure ก็เพื่อลด
การเสียเวลากับ การเขียนคำสั่งที่ซ้ำๆ กัน

ดังนั้น  โพรซีเจอร์ จึงทำงานได้เหมือนกับ
คำสั่งที่เราเขียนไว้ในส่วนทำงาน
(begin..end.)
เพียงแต่เป็น คำสั่งถูกแบ่งเป็นส่วนๆ
เพื่องานต่อการแก้ไข

เช่นสมมุติ ผมอยากจะเปลี่ยนเส้นแบ่ง
ให้เป็นรูป ------------------------------
ก็จะแก้ไขที่ส่วนประกาศ procedure
ก็จะทำให้ procedure ที่เขียนไว้ในส่วน
(begin..end.) เปลี่ยนการทำงานไปเป็น
รูป ------------------------------- ทุกคำสั่ง

sawasdeekrab kunkru
==========================
sawasdeeka  nakrean
==========================

หลังจากทำการเปลี่ยนแปลง
ที่ส่วนประกาศ procedure
sawasdeekrab kunkru
-------------------------------
sawasdeeka  nakrean
-------------------------------




Function
      function ก็เหมือนกับ procedure ตรงที่ compiler จัดเตรียมไว้ให้แล้ว
และบาง function ก่อนจะใช้ต้องเรียก ยูนิตที่บรรจุ function ก่อน
และผู้เขียนโปรแกรม ก็สามารถเขียน function ขึ้นมาเองได้อีกด้วย

      ความแตกต่างของ function กับ procedure ก็คือ function จะมีการคืนค่า เป็นข้อมูลชนิดต่างๆ
อย่างเช่น ฟังค์ชั่น chr() จะคืนค่ามาเป็น ข้อมูลตัวแปรชนิด char (ตัวอักษร 1 ตัว)
      ในการใช้ฟังค์ชั่น chr() เมื่อป้อนค่าตัวเลขไปเช่น chr(65) จะมีคืนค่ามาเป็นตัวอักษร 'A'
ถ้าเขียนโปรแกรมว่า write( chr(65) ); จะพบตัวอักษร 'A' บนหน้าจอ
จากตัวอย่างเราจะเรียก 65 ว่า argument ซึ่งจะส่งผ่านค่า
ไปให้ยัง parameter ที่อยู่ในส่วนประกาศ function
( parameter คือตัวแปรที่อยู่ในส่วน ประกาศ procedure หรือ function
ซึ่งสามารถเปลี่ยนแปลงค่าต่างๆ โดยกำหนดที่ argument)

ตัวอย่างโปรแกรมที่มีการเขียน function ด้วยตัวเอง
uses
       crt ;

Function gramToKilogram( gram: longint ): real;
begin
      gramToKilogram:=gram/1000;
end;

var
    weight : longint;
begin
    clrscr ;
        write('insert weight(gram)='); readln(weight);
        write('weight(kilogram)=', gramToKilogram(weight):0:2);
    readln ;
end.
ตัวแปร gram ที่อยู่ตรง
ส่วนประกาศ function นั้นเรียกว่า parameter
เป็นตัวแปรที่จะต้องกำหนดค่า ผ่านทาง argument
(argument : ค่า หรือ ค่าของตัวแปรใน function
ที่เขียนไว้ใน ส่วนทำงาน (begin..end.))
อย่างเช่น
     gramTokilogram( 500 ) หรือ
     gramTokilogram( weight )
* 500, weight เราจะเรียกว่า argument

จากตัวอย่าง โปรแกรมจะทำงาน ดังนี้


insert weight(gram)=
หากใส่ค่าว่า 1200 จะได้ผล
weight(kilogram)=1.20

ในโปรแกรมนี้มี parameter (ตัวแปร gram)
เป็นตัวแปรชนิด longint

ดังนั้นตัวแปรที่เป็น argument
ก็จะต้องใช้ชนิด longint เช่นกัน
จึงต้องกำหนดตัวแปร weight เป็นชนิด longint
(argument : ตัวแปรที่ใช้กำหนดค่าให้ parameter )

และเมื่อตัวแปรสำหรับรับค่า (ตัวแปร weight)
มีชนิดเป็น longint
ก็จะกรอกค่าเกิน 2147483647 ไม่ได้
( สองพันหนึ่งร้อยสี่สิบเจ็ดล้านสี่แสน
แปดหมื่นสามพันหกร้อยสี่สิบเจ็ด )

เราสามารถใช้ function โดยเปรียบเสมือนเป็นค่า ค่าหนึ่งดังนี้
uses
       crt ;

Function gramToKilogram( gram: longint ): real;
begin
      gramToKilogram:=gram/1000;
end;

var
    weight : longint;
    weightkilo : real;
begin
    clrscr ;
        write('insert weight(gram)='); readln(weight);

        weightkilo:= gramToKilogram( weight );

        write('weight(kilogram)=', weightkilo:0:2);
    readln ;
end.
ที่เรากำหนดค่าให้กับ weightkilo ด้วย function ได้
เพราะว่าฟังค์ชั่น gramToKilogram นั้น
มีการคืนค่าเป็นตัวแปรชนิด real
ซึ่งเป็น ชนิดเดียวกับตัวแปร weightkilo


จากตัวอย่าง โปรแกรมจะทำงาน ดังนี้

insert weight(gram)=
หากใส่ค่าว่า 1200 จะได้ผล
weight(kilogram)=1.20


เรื่อง อากิวเมนท์ และ พารามิเตอร์ เป็นเรื่องที่ผมสับสนอยู่พักใหญ่
เพราะไม่เข้าใจว่า พารามิเตอร์ กับ อากิวเมนท์คืออะไรกันแน่
แต่จากที่สังเกตโดยอ่านหนังสือ และข้อมูลเกี่ยวกับปาสคาลอยู่ 2-3 แห่ง
ผมก็สรุปความได้ว่า อากิวเมนท์ คือค่าที่จะส่งให้กับ
ตัวแปรที่เป็น พารามิเตอร์ใน procedure หรือใน function

ในเรื่อง procedure กับ function และการส่งค่า
ให้ parameter นั้นจะนำมาอธิบายอย่างละเอียด
ในการ update ครั้งหน้าครับ
best view with ie 5.0++, screen 600x800