Pascal基础语法(一)

Pascal基础语法(一) 序言 有时无聊,翻看pascal,奈何看完即忘.于是记录之
pascal听说将被NOIP停用,我没有去验证.管他呢,本来只是好奇
环境 用的免费的编译器 fpc [https://www.freepascal.org/]
编辑器随便找个自己喜欢的就行, IDE 可以选 lazarus[https://www.lazarus-ide.org/],跨平台
pascal版本有更迭,支持的方言很多,基于目前的最佳实践,所有代码里使用 ${mode objfpc } {$H+}{$J-}{$I+}{$R+}
{$H+} 开启AnsiString
{$J-} const常量不可修改
{$I+} i/o错误检测
{$R+} 开启越界检查
注: {$mode objfpc}也可改为{$mode delphi}
此编译指令需要写在uses之前
pascal不区分大小写,习惯使然,则采用和C#类似的编码规范
注释 pascal的注释有多种可选,前两种支持多行,最后一行是单行注释,pascal的注释允许嵌套,但是tp和delphi不支持,为了可移植,建议注释不要嵌套

(* some comments *) { some comments } // some comments

关键字(保留字) 语言内置的具有特殊含义的标识符,关键字列表如下
absoluteandarrayasmbegincaseconstconstructordestructordivdodowntoelseendfileforfunctiongotoifimplementationininheritedinlineinterfacelabelmodnilnotobjectofoperatororpackedprocedureprogramrecordreintroducerepeatselfsetshlshrstringthentotypeunituntilusesvarwhilewithxorasclassdispinterfaceexceptexportsfinalizationfinallyinitializationinlineislibraryonoutpackedpropertyraiseresourcestringthreadvartry

正常情况写不能定义和关键字一样的标识符.有时必须为之(比如调用了c语言开发的dll)则可以在前面加上&符号
var &var : integer; begin &var:=1; Writeln(&var); end.

标识符 标识符可以使用字母,数字,下划线(_), 不能用数字开头, 长度1-127
数据类型概览 以下分类参考freepascal的文档
基本类型
类型 sizeof 符号位
byte 1
word 2
longword 4
Cardinal 4
qword 8
shortint 1
smallint 2
longint 4
int64 8
integer 2 or 4
整型: byte,shortint,smallint,word,integer,longint,int64...
数值默认是十进制,如果16进制使用$前缀, 8进制使用&前缀,2进制使用%前缀. TP(Turbo Pascal)和delphi不支持 8进制和2进制的前缀形式
浮点型: real,single,double,extended,comp,currency
布尔型:boolean
字符串类型
字符串: shortstring,ansistring,widestring,unicodestring,pchar
字符串使用单引号, 不支持类似C语言的\r\n\t等形式的转义.而是使用类似下面的方法
使用LINEENDING常量可以跨平台的换行.
var a:string; begin a := 'contain tab '#9' example '; a:='contain new line '#13#10' example'; a:='contain new line '+LINEENDING+' example'; end.

结构类型
子界,枚举,数组,集合,类,文件
具体使用见后续
指针
var i:integer; p: ^integer; //定义
p:=@i; i=p^; //取地址,取值
看起来不如c语言的指针操作流畅,应该是不鼓励使用指针吧
基本结构
program {程序名} uses {逗号分隔使用的Unit} const {常量定义} var {全局变量定义}//函数定义 function foo(); boolean; { 局部变量定义 } begin ... end; //过程定义 procedure bar(); { 局部变量定义 } begin ... end; begin { 主程序开始} ... end. { 主程序结束 }

这个可执行程序的结构,dll的创建见后续
下面是Unit的结构,大同小异
unit {Unit名称}; interface//函数声明 function foo(); boolean; //过程声明 procedure bar(); implementation //函数实现 function foo(); boolean { 局部变量定义 } begin end; //过程实现 procedure bar(); { 局部变量定义 } begin end; end.

var a:integer; //变量定义方式
a:=10; //赋值方式
函数和过程
【Pascal基础语法(一)】函数有返回值,过程没有.其它都一样
function 函数名(变量名1:变量类型; 变量名2:变量类型...):返回类型; var 变量名3:变量类型; 变量名4:变量类型; begin 函数定义result := 返回值 end;

返回值也可以使用 函数名:= 返回值, 个人喜欢用result:=返回值,另外result可以用于递归调用
function 过程名(变量名1:变量类型; 变量名2:变量类型...); var 变量名3:变量类型; 变量名4:变量类型; begin 过程定义 end;

循环结构
while-do 循环
while (condition) do S; //for example while i<10 do begin i := i-1; writeln(i); end;

for 循环
for < variable-name > := < initial_value > to [down to] < final_value > do S; //for examplefor i:=1 to 10 do writeln(i); for i:=10 downto 1 do writeln(i);

until循环
repeat S until condition; // for example repeat sum := sum+ i; i := i-1 until i=0;

break,continue用于跳出循环这个和C语言都一样
当然还有goto语句,个人几乎不用
分支结构
if condition then S; if condition then S1 else S2;

注意没有else if
case (expression) of L1 : S1; L2: S2; ... ... Ln: Sn; end; case (expression) of L1 : S1; L2,L3 : S2; ... ... Ln: Sn; else Sm; end;

代码示例
//仅作语法演示,无具体需求
demo01.pas
Program demo01; ${mode objfpc } {$H+}{$J-}{$I+}{$R+}Uses SysUtils,Common; Const PI = 3.14; Function FactTail(n,a:integer): longint; Begin If n < 0 Then result := 0 Else Begin If n<=2 Then result := a Else result := FactTail(n-1,n*a); End End; Function Sum(n:integer): integer; Var s: integer; i: integer; Begin s := 0; For i:=1 To n Do s := s+i; result := s; End; Function Mean(n:integer): real; Var s: integer; i:integer; Begin s := 0; i := n; Repeat s := s + n; i := i-1; Until i=0; result := s*1.0/n; End; Var a,b,c: integer; Begin a := 10; b := 20; c := 10; Swap(a,b); writeln(FactTail(5,1), ', ',Sum(c),', ',Mean(c)); End.

common.pas
Unit common; ${mode objfpc } {$H+}{$J-}{$I+}{$R+}Interface Function RectangleArea(l,w :real ): real; Function CircleArea(r :real ): real; Function TriangleArea(a,b,c :real ): real; Procedure Swap(Var a:integer; Var b:integer); Implementation Procedure Swap(Var a:integer; Var b:integer); Var temp: integer; Begin temp := a; a := b; b := temp; End; Function RectangleArea(l,w :real ): real; Begin result := l*w; End; Function CircleArea(r :real ): real; Const PI =3.14; Begin result := PI*r*r; End; Function TriangleArea(a,b,c :real ): real; Var s : real; Begin s := (a+b+c)/2.0; result := sqrt(s*(s-a)*(s-b)*(s-c)); End; End.

    推荐阅读