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 | 有 |
数值默认是十进制,如果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.
推荐阅读
- Delphi动态创建MainMenu和PopupMenu菜单的方法
- delphi|Delphi编写网络程序的安全措施
- 发送手机短信代码
- Delphi中WebBrowser判断页面及JS是否加载完成
- delphi idhttpserver ajax 跨域
- Delphi中WebBrowser判断页面及JS ajax是否加载完成-转
- Delphi|APP 多张图片滑动显示 - 之二