关于delphi:Pascal基础语法一

44次阅读

共计 3968 个字符,预计需要花费 10 分钟才能阅读完成。

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.

正文完
 0