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

关键字(保留字)

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

absolute  and  array  asm  begin  case  const  constructor  destructor  div  do  downto  else  end  file  for  function  goto  if  implementation  in  inherited  inline  interface  label  mod  nil  not  object  of  operator  or  packed  procedure  program  record  reintroduce  repeat  self  set  shl  shr  string  then  to  type  unit  until  uses  var  while  with  xor  as  class  dispinterface  except  exports  finalization  finally  initialization  inline  is  library  on  out  packed  property  raise  resourcestring  threadvar  try  

正常情况写不能定义和关键字一样的标识符.有时必须为之(比如调用了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;//赋值方式

函数和过程

函数有返回值,过程没有.其它都一样

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 example

for 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.

你可能感兴趣的