1、FP 的技巧与数据类型FreePascal 中的基本数据类型预定义整型类型 范围 长度(字节)Byte 0 255 1 Shortint -128 127 1 Smallint -32768 32767 2 Word 0 65535 2 Integer either smallint, longint or int64 size 2,4 or 8 Cardinal either word, longword or qword size 2,4 or 8 Longint -2147483648 2147483647 4 Longword 04294967295 4 Int64 -92233720
2、36854775808 9223372036854775807 8 QWord 0 18446744073709551615 8 支持的实型 类型 范围 有效宽度 长度(字节)Real platform dependant ? 4 or 8Single 1.5E-45 3.4E38 7-8 4Double 5.0E-324 1.7E308 15-16 8Extended 1.9E-4951 1.1E4932 19-20 10 Comp -2E64+1 2E63-1 19-20 8MAXINT 和 MAXLONGINT 分别代表最大的 INTEGER 和 LONGINT,则最小的就分别为 MAX
3、INT-1 和 MAXLONGINT-1Free Pascal 和 Turbo Pascal 的主要区别 虽然 Free Pascal 尽量设计得和 Turbo Pascal 接近,但是由于以下的两个原因,两者之间还是有一些区别的:1 Free Pascal 是一个 32 位的编译器,而 Turbo Pascal 只是 16 位编译器;2 Free Pascal 是一个跨平台的编译器,而 Turbo Pascal 只在 windows 上使用。如果你的代码是遵守 ANSI Pascal 的,那么代码从 Turbo Pascal 移植到 Free Pascal 是没有问题的。下面是在 Turbo
4、 Pascal 上可以使用,但是在 Free Pascal 就不能使用的一些语言特性:1 函数和过程在使用时,参数的类型必须和定义时完全一致。原因是在 Free Pascal 中添加了函数重载功能。2 PROTECTED,PUBLIC,PUBLISHED,TRY,FINALLY,EXCEPT,RAISE 成为了关键字,因此不能作为函数和过程的名字。3 FAR,NEAR 不再是关键字了。原因是 Free Pascal 是 32 位系统,不再需要这些关键字。4 布尔表达式不一定要全部进行计算。只要最终结果已经能够确定,就不再计算其它还没有计算的部分了。比如布尔表达式 exp1 AND exp2 A
5、ND exp3,如果已知exp1 的结果是 false,那么怎么表达式的结果肯定是 false,exp2 和 exp3 就不用进行计算了。5 在 Free Pascal 中,集合中的元素都是 4 个字节长的。6 表达式执行的顺序是不确定的。比如对于表达式 a:=g(2)+f(3); 不保证 g(2)一定在 f(3)之前执行。7 如果用 Rewrite 打开文件,那么文件就只能被写入了。如果需要读取这个文件,要对文件执行 Reset。8 Free Pascal 在程序结束之前一定要关闭输出文件,否则输出文件可能不能被正确的写入。9 Free Pascal 理论上可以使用 4GB 的内存,因此实际
6、上几乎可以使用系统中的所有剩余内存(除非赛题中有内存限制)。这是 Free Pascal 由于 32 位的编译器。但是对于 Turbo Pascal 来说,由于是 16 位的编译器,因此不能定义大小超过64KB 的数据类型和变量,并且在 DOS 实模式下可以使用的内存总数只有 640KB。下面是 Free Pascal 相对于 Turbo Pascal 扩充的一些功能:1 函数可以返回复杂的类型,比如记录和数组。2 在函数中,函数的返回值可以作为一个变量来处理。比如:function a : longint;begina:=12;while a4 dobegin.end;end;这个例子在 T
7、urbo Pascal 中,a4 会被认为是函数的递归调用,但是在 Free Pascal 中会认为 a 只是一个变量。如果想在 Free Pascal 中实现递归调用,就要写成下面的形式:function a : longint;begina:=12; this is the recursive call if a()4 thenbegin.end;end;3 exit 可以接受一个参数作为函数的返回值。比如:function a : longint;begina:=12;if a4 thenbeginexit(a*67); 函数的返回值就是 a*67 end;end;4 Free Pasc
8、al 支持函数重载。可以用相同的名字定义不同的函数,只要这些函数的参数不同,就是不同的函数。比如:procedure DoSomething (a : longint);begin.end;procedure DoSomething (a : real);begin.end;可以使用不同的参数类型 longint 或者 real 来调用不同的 DoSomething 过程。由于这个功能,函数的提前声明必须有完整的参数声明:procedure x (v : longint); forward;.procedure x; 这里定义的过程 x 重载了前面声明的过程 x。因此这里的两个 x 是不同的b
9、egin.end;5 Free Pascal 容许运算符重载。比如,可以自己为矩阵运算定义一个 “+”运算。6 Free Pascal 在 windows 95 及其以上的 windows 版本上支持长文件名。对于文件名,由于 windows 系统对大小写不敏感,因此在程序中,文件名的大小写是无关的。但是对于其它大小写敏感的系统,比如 linux,程序中用到的文件名必须和系统中的文件名完全一致。但是由于信息学竞赛的评测系统一般是 linux,因此要求程序中的文件名和系统中的文件名一样。(注:以上内容主要参考了参考文献1)参考文献:1 Users manual for Free Pascal,
10、version 1.9.6, Document version 2.0, December 2004Micha?l Van Canneyt, Florian Kl?mpflfunction binstr(value:longint;cnt:byte):string;将 value 转二进制,取后 cnt 个字符所成字串function lowercase(c:char or string):char or string;upcase 的反函数procedure setlength(var s:string;len:longint);将 s 长度定为 lenfunction power(base
11、,expon:real):real;base 的 expon 次方strlcopy 函数 将一个字符串中的字符复制到另一个字符串中strlen 函数 返回字符串中的字符数strlfmt 函数 格式化一系列的参数,其结果中包含有指向目标缓冲区的指针strlicomp 函数 以最大长度比较两个字符串(不区分大小写)strlower 函数 将字符串中的字符转换为小写strmove 函数 将一个字符串中的字符复制到另一个字符串中strnew 函数 在堆栈上分配一个字符串strpas 函数 将以 null 结束的字符串转换为 pascal 类的字符串strpcopy 函数 将 pascal 类的字符串复
12、制为以 null 结束的字符串strplcopy 函数 从 pascal 类的最大长度字符串复制为以 null 结束的字符串strpos 函数 返回一个字符串在另一个字符串中首次出现指针strrscan 函数 返回字符串中最后出现字符的指针strscan 函数 返回字符串中出现首字符的指针strtodate 函数 将字符串转换为日期格式strtodatetime 函数 将字符串转换为日期/时间格式strtofloat 函数 将给定的字符串转换为浮点数strtoint 函数 将字符串转换为整型strtointdef 函数 将字符串转换为整型或默认值strtotime 函数 将字符串转换为时间格式
13、strupper 函数 将字符串中的字符转换为大写style 属性 类型选择suce 函数 返回后继的参数swap 函数 交换参数的高低地址位tabs 属性 标记每一项的内容tabindex 属性 标记索引text 属性 显示的文本texttofloat 函数 将字符串(以 null 结束的格式)转换为浮点数time 函数 返回当前的时间timetostr 函数 将时间格式转换为字符串trim 函数 从给定的字符串中删除前导和尾部的空格及控制字符trimleft 函数 从给定的字符串中删除首部的空格及控制字符trimright 函数 从给定的字符串中删除尾部的空格及控制字符trunc 函数 将
14、实型值截取为整型值truncate 函数 截去当前文件位置后的内容unselectedcolor 属性 未选中颜色upcase 将字符转换为大写uppercase 将给定的字符串变为大写val 函数 将字符串转换为整型值vararraycreate 函数 以给定的界限和维数建立变体数组vararraydimcount 函数 返回给定变体的维数vararrayhighbound 函数 返回给定变体数组维数的上界vararraylock 函数 锁定给定的变体数组vararraylowbound 函数 返回给定变体数组维数的下界vararrayof 函数 返回指定变体的数组元素vararrayred
15、im 函数 通过改变上限来调整变体的大小vararrayunlock 函数 解锁指定的变体数组varastype 函数 将变体转换为指定的类型varcase 函数 将变体转换为指定的类型并保存他varclear 函数 清除指定的变体varcopy 函数 将指定的变体复制为指定的变体varformdatetime 函数 返回包含日期时间的变体varisarray 函数 测试变体是否为数组varisempty 函数 测试变体是否为 unassigned varisnull 函数 测试变体是否为 nullvartodatetime 函数 将给定的变体转换为日期时间vartype 函数 将变体转换为指定的类型并保存他visible 属性 控件的可见性wantreturns 属性 为 true 时,按回车键产生一个回车符;为 false 时,按下ctrl+enter 才产生回车符 write 命令 对有格式的文件,写一变量到文件组件中;对文本文件,写一个或多个值到文件