======Syntax======
=====Syntax เบื้องต้น=====
สำหรับคนที่มีความรู้เกี่ยวกับภาษา Pascal บ้างแล้ว ผมขอสรุป Syntax ไว้ใน Hidden Blog ข้างล่างนี้ เพื่อความสะดวกในการเข้ามาดูครับ
^ Topic ^ Format ^
|Comments styles (3 forms)|
//This is line comment;
{ This is block
comment#1 }
(* This is block
comment#2 *)
|
|Type declaration|
TYPE
//Enumerated Type
TWeekDay = (Mon,Tue,Wed,Thu,Fri);
//Record type
TMyRecord = record
Name:string;
Age:integer;
end;
//Static Array
TStArr1D = array[1..10] of integer;
TStArr2D = array[1..3] of array[1..5]
of real;//Array (3 x 5)
//Static Array with initial values
TStArr1D: array[1..3] of integer = (14,25,36);
//DynamicArray
TDyArr1D = array of boolean;
TDyArr2D = array of array of string;
//Object
TMyObject = object
private
length, width: integer;
public
procedure setlength(l: inteter);
function getlength: integer;
end;
//Class
TMyClass = class
private
length, width: integer;
public
constructor create(l, w: integer);
destructor destroy; override;
procedure setlength(l: integer);
function getlength: integer;
end;
|
|Variable declaration|
var MyInt:integer; MyReal:real;
x,y,z:boolean; //Multi-declaration
MyDay:TWeekDay;
Arr1:TStArr1D;
Arr2:TStArr2D;
MyObject:TMyObject;
MyClass:TMyClass;
MyInt:integer = 10; //initialize value
|
|Variable assignment|
MyInt := 10;
MyReal := 2.521;
x:=True; y:=false; z:=true;
Arr1[1] := 10; //Array 1-D
Arr2[1,3] :=22.85; //Array 2-D
|
|Numeric operator|
z := x + y; //Plus
z := x - y; //Minus
z := x / y; //Divide
z := x div y; //Divide, result: integer type
z := x * y; //Multiply
z := x % y; //modulus
|
|Relational operator|
A = B //Equal
A <> B //Not Equal
A > B //Greater than
A < B //Less than
A >= B //Greater than or equal
A <= B //Less than or equal
|
|Boolean operator|
X and Y //And
X or Y //Or
not X //Not
|
\\ \\
=====Program Structure=====
โครงสร้างของโปรแกรม Pascal โดยทั่วไป จะมีรูปแบบดังนี้
PROGRAM ProgramName ;
USES
{include units (external .pas files)}
CONST
{Constant declarations}
TYPE
{Type declarations}
VAR
{Variable declarations}
{Sub-programs declarations & Implementations}
BEGIN
{Executable statements (Main)}
END.
การเขียนโปรแกรมตามโครงสร้างดังกล่าว มีข้อสังเกตเพิ่มเติมดังนี้
*ในส่วนไหนที่ไม่ได้ใช้งาน ให้ตัดออก เช่น ถ้าไม่ได้ใช้ส่วนของ TYPE ก็ให้ตัดออกไป (ดู Example-1)
*โปรแกรมย่อย ([[tutorial:ProcedureAndFunction|Procedure/Function]]) โดยปกติจะประกาศหลังจากการประกาศตัวแปร VAR แต่ในความเป็นจริงแล้ว Function/Procedure สามารถประกาศได้ทุกที่ ที่อยู่หลังจากการประกาศ USES
*ส่วนประกาศ (Declaration scope) สามารถนำมาใส่ในโปรแกรมย่อยจำพวก [[tutorial:ProcedureAndFunction|Procedure/Function]] ได้ (ยกเว้น uses) โดยส่วนประกาศเหล่านี้ จะกลายเป็น local Scope ของโปรแกรมย่อยนั้น (ดู Example-2)
**ตัวอย่าง** การเขียนโปรแกรมหาพื้นที่วงกลม\\
__ข้อสังเกต__: ไม่มีการใช้การประกาศ TYPE จึงตัดคำว่า TYPE นี้ออกจากโครงสร้าง
PROGRAM CircularAreaCalculator ;
CONST
PI = 3.14159;
VAR
Din:real;
Dex:real;
CArea:real;
BEGIN
writeln('Please insert internal diameter');
readln(Din);
writeln('Please insert external area');
readln(Dex);
CArea:= PI*(Dex*Dex-Din*Din);
writeln('Circular area is: ', CArea);
END.
**ตัวอย่าง** การเขียนโปรแกรมหาพื้นที่วงกลม\\
__ข้อสังเกต__: มีการประกาศ subprogram ที่เป็น procedure showcalcarea ซึ่งจะเห็นว่าภายใน showcalcarea มีส่วนประกาศย่อยคือ const, type, var และ function squrevalue อยู่ภายใน
PROGRAM CircularAreaCalculator ;
VAR
Din:real;
Dex:real;
CName:string;
procedure showcalcarea(nameCircle:string, Din,Dex:real);
const PI = 3.14159;
type TMyCircular = record
name:string;
din,dex:real;
area_in,area_ex,area_tot:real;
end;
var Ain,Aex:real; MyCircular:TMyCircular;
function squrevalue(x:real):real;
begin
result:=x*x;
end;
begin
with MyCircular do
begin
name:=nameCircle;
din:=Din;
dex:=Dex;
area_in:=PI*squrevalue(Din)/4;
area_ex:=PI*squrevalue(Dex)/4;
area_tot:=area_ex-area_in;
end;
writeln('Total area is: ',MyCircular.area_tot);
end;
BEGIN
writeln('Please insert name of circle');
readln(CName);
writeln('Please insert internal diameter');
readln(Din);
writeln('Please insert external area');
readln(Dex);
showcalcarea(CName,Din,Dex);
END.
\\ \\
=====Unit Structure=====
บางครั้งการแยกโค๊ดออกเป็นโมดูลย่อยแล้วค่อยเรียกใช้เข้ามาในโปรแกรมหลัก จะทำให้เราสะดวกในการค้นหาและแก้ไข อีกทั้งโค๊ดส่วนนี้ยังสามารถเอาไปใช้ในหลายๆโปรแกรมในภายหน้าได้อีก เราเรียกโมดูลที่เก็บโค๊ดเหล่านี้ว่า Unit \\
Unit คือไฟล์ .pas ที่มีส่วนประกาศหรือตัวแปรต่างๆ (uses, const, type, var) หรือโปรแกรมย่อย (functions/procedures) อยู่ภายใน ประกอบไปด้วยส่วนที่เป็น Public Scope และ Private Scope โดยโครงสร้าง Unit ของ Pascal จะมีรูปแบบดังนี้
unit unitname;
//public scope -----
interface
{uses, const, type, var, function, procedure ... declaration}
//private scope -----
implementation
{function and procedure details}
end.
\\
*__**Public Scope**__ คือ ส่วนที่อยู่ใต้คำว่า interface ลงมา แต่อยู่เหนือคำว่า implementation ทุกครั้งที่มี Program อื่น หรือ Unit อื่น เรียกใช้ Unit ดังกล่าวนี้ (ใช้ใน uses) จะเห็น Variables หรือ Sub-program หรืออะไรก็ตามที่ประกาศไว้ในเฉพาะส่วนนี้เท่านั้น \\
*__**Private Scope**__ คือ ส่วนที่อยู่ใต้คำว่า implementation เป็นส่วนที่ Program อื่น หรือ Unit อื่น ที่เรียกใช้ Unit ดังกล่าวนี้ ไม่สามารถเข้าถึงโดยตรงได้ จะเรียกใช้งานได้ก็ต่อเมื่อเรียกผ่านการ Declaration ในส่วนของ Public Scope เท่านั้น
ที่เป็นแบบนี้เพราะ ส่วนของ implementation นั้นมักจะประกอบไปด้วย source code หลายบรรทัด แถมยังมีการเรียกใช้ Variables หรือ Sub-program ซ้ำกันเต็มไปหมด จะเป็นการยากที่จะให้ Compiler มาหา Variables หรือ Sub-program หรืออะไรก็ตาม ในสถานที่นี้
\\ \\
=====ความรู้พื้นฐานก่อนเริ่มเขียน Pascal=====
====Declaration and Implementation====
การเขียนโปรแกรมนอกเหนือจากต้องรู้จักโครงสร้างของโปรแกรมแล้ว ยังต้องทำความเข้าใจกับสองคำนี้ คือ Declaration กับ Implementation ซึ่งนอกจากจะเกี่ยวข้องกับการเขียน Main Program แล้ว ยังเกี่ยวข้องกับ Sub-program ด้วย (Sub-program คือ Procedure/Function หรือเรียกอีกอย่างว่า Method นั่นเอง เพื่อไม่ให้ดูซับซ้อนมากเกินไป ในหัวข้อนี้ จะขอเรียกพวกนี้สั้นๆว่า Sub-program แทน)\\
__**Declaration**__ คือ การประกาศ เป็นส่วนที่ใช้บอก Compiler ว่า Program หรือ Sub-program ดังกล่าว ชื่ออะไร รับ Input หรือส่ง Output อะไรบ้าง เป็นต้น แต่ยังไม่ได้บอกถึงรายละเอียดว่าทำอะไรได้บ้าง
__**Implementation**__ คือ ส่วนที่บ่งบอกว่า Program หรือ Sub-program นั้นทำอะไรบ้าง มีขั้นตอนอะไรบ้าง
ย้อนกลับไปดูที่โครงสร้างของ Main Program จะแบ่งแยกพื้นที่ได้ดังนี้
* Declaration คือ ส่วนแรก คือ บรรทัดที่ 1-16
* Implementation คือ ระหว่างคำว่า BEGIN ... END. หรือ บรรทัดที่ 18-20
PROGRAM ProgramName ;
USES
{include units (external .pas files)}
CONST
{Constant declarations}
TYPE
{Type declarations}
VAR
{Variable declarations}
{Sub-programs declarations & Implementations}
BEGIN
{Executable statements (Main)}
END.
\\
ทีนี้ลองมาดูที่โครงสร้างของ Sub-Program ที่อยู่ภายใน Main Program กันบ้าง ขอยกตัวอย่าง Procedure SubProg และ Function SubFunc ข้างล่างนี้ เราจะแบ่งพื้นที่ของ Sub-Program Declaration กับ Implementation ได้ดังนี้
* Declaration คือ ส่วนแรก ในบรรทัดที่ 6-7 (เป็นการประกาศแบบล่วงหน้า หรือ Forward Declaration ซึ่งจากตัวอย่างนี้ จะมีหรือไม่มีก็ได้)
* Implementation คือ บรรทัดที่ 9-17 บ่งบอกว่า Sub Program พวกนี้ ทำอะไรได้บ้าง
PROGRAM ProgramName ;
VAR
{Variable declarations}
program SubProg; forward;
function SubFunc(inp:string):string; forward;
program SubProg;
begin
writeln('This is subProgram');
end;
function SubFunc(inp:string):string;
begin
result:= inp;
end;
BEGIN
SubProg; //Call SubProg;
writeln('Call SubFunc : ',SubFunc('Hello!');
END.
สำหรับ Unit เราสามารถแบ่งพื้นที่ได้แบบนี้
* Declaration คือ ส่วนแรก คือ บรรทัดที่ 1-5
* Implementation คือ ระหว่างคำว่า implementation ... end. หรือ บรรทัดที่ 7-9 (สังเกตว่ามันจะคล้ายกับ BEGIN...END. ของ Main Program แค่เปลี่ยนคำแรกเป็น implementation แค่นั้นเอง)
unit unitname;
interface
{uses, const, type, var, procedures/functions ... declaration}
implementation
{Procedures/Functions implementation here}
end.
\\
สำหรับ Sub-Program ที่อยู่ภายใต้ Unit จะแบ่งพื้นที่ได้ดังนี้
* Declaration คือ ส่วนแรก ในบรรทัดที่ 6-7 (ส่วนนี้บังคับว่าต้องมี และถือเป็นการ Forward Declaration เหมือนกัน แต่ไม่ต้องใส่คำว่า forward;)
* Implementation คือ บรรทัดที่ 10-18 บ่งบอกว่า Sub Program พวกนี้ ทำอะไรบ้าง
unit unitname;
interface
{uses, const, type, var, procedures/functions ... declaration}
program SubProg;
function SubFunc(inp:string):string;
implementation
program SubProg;
begin
writeln('This is subProgram');
end;
function SubFunc(inp:string):string;
begin
result:= inp;
end;
end.
\\
\\
====Built-in Functions ที่ควรทราบ====
ก่อนการฝึกทำตัวอย่าง หรือเขียนโปรแกรมพื้นฐานง่ายๆ เราควรทำความรู้จักกับ Built-in Function ต่อไปนี้เสียก่อน
^ Functions ^ Descriptions ^
|writeln(string) หรือ writeln(string,value)| แสดงข้อความและค่าของตัวแปร แล้วลงไปบรรทัดถัดไป|
|write(string)| แสดงข้อความและค่าของตัวแปร แล้วอยู่บรรทัดเดิม|
|readln(variable)| รับค่าใส่ Variable จากการพิมพ์ข้อมูลหน้าจอแล้วกด Enter บางครั้งเราใช้ readln() เฉยๆเพื่อเบรคโปรแกรมไว้ไม่ปิดตัวเอง|
**ตัวอย่าง** โปรแกรมคำนวณ Body Mass Index (BMI)\\
__**ข้อสังเกต**__ - readln() (หรือ readln) ในบรรทัดที่ 20 นั้น ถูกใช้เพื่อเบรคหน้าจอไม่ให้ปิดตัวเองลง และผู้ใช้สามารถกด Enter เพื่อผ่านคำสั่งนี้ได้ (จบโปรแกรม)
program BMI_Calculation;
uses SysUtils; //for function: Format()
var Mass,Height,BMI:real;
begin
write('Please insert your mass (kg): ');
readln(Mass); //Get input: Mass
write('Please insert your Height (cm): ');
readln(Height); //Get input: Height
//Calculate
BMI:=Mass/(Height*Height/1e4);
writeln('----Result----');
writeln('Your BMI is = ',Format('%.2f',[BMI]));
readln(); // or readln;
end.
Compiled Results:
Please insert your mass (kg): 60
Please insert your Height (cm): 170
----Result----
Your BMI is = 20.76
\\