当前位置:文档之家› Freepascal资料详解

Freepascal资料详解

Freepascall资料详解一、TP和FP的功能区别1.Free Pascal理论上可以使用4GB(2^32byte)的内存,因此实际上几乎可以使用系统中的所有剩余内存(除非赛题中有内存限制),这是因为Free Pascal使用的是32位的编译器。

但是对于Turbo Pascal来说,由于是16位的编译器,因此不能定义大小超过64KB (2^16byte)的数据类型和变量,并且在DOS实模式下可以使用的内存总数只有640KB。

但这并不是说,你可以随意定义很大的数组了,因为光读入200MB的数据就会让你的程序超时了(因为现在的7200转硬盘和133的系统总线速度决定了读取数据的速度也就100MB/秒)。

2.在Free Pascal中,如果用assign给标准输入输出文件变量input和output指定了文件,在程序结束之前一定要用close关闭input和output,否则输出文件可能不能被正确的写入。

这个问题是近几年NOIP竞赛和省队训练、选拔中选手常犯的错误。

尤其是程序非正常结束之前(如halt)会忘记。

3.如果用Rewrite打开文件,那么文件就只能被写入了。

如果需要读取这个文件,要对文件执行Reset。

所以,在Free Pascal中最好不要对一个文件同时进行读写操作。

4.在Free Pascal中,集合中的元素都是4个字节长的。

5.表达式执行的顺序是不确定的。

比如对于表达式a:=g(2)+f(3); 不保证g(2)一定在f(3)之前执行。

6.函数和过程在使用时,参数的类型必须和定义时完全一致。

原因是在Free Pascal中添加了函数重载功能。

7.PROTECTED,PUBLIC,PUBLISHED,TRY,FINALLY,EXCEPT,RAISE成为了关键字,因此不能作为函数和过程的名字;而FAR,NEAR不再是关键字了,原因是Free Pascal是32位系统,不再需要这些关键字。

二、FP的新增功能1.函数可以返回复杂的类型,比如记录和数组。

如:typearrtype=array[1..100] of longint;{必须要先定义数组基类型}vari,j,k,n:longint;a:arrtype;function sort(a:arrtype;n:longint):arrtype;var i,j,k:longint;beginfor i:=1 to n-1 dofor j:=i+1 to n doif a>a[j] thenbegink:=a;a:=a[j];a[j]:=k;end;sort:=a;end;beginread(n);for i:=1 to n do read(a);a:=sort(a,n);for i:=1 to n do write(a,' ');writeln;end.2.在函数中,函数的返回值可以作为一个变量来处理。

比如:function a : longint;begina:=12;while a>4 dobegin{...}end;end;这个例子在Turbo Pascal中,a>4会被认为是函数的递归调用,但是在Free Pascal 中会认为a只是一个变量。

如果想在Free Pascal中实现递归调用,就要写成下面的形式:function a : longint;begina:=12;if a()>4 then { 递归调用}begin{...}end;end;3.exit可以接受一个参数作为函数的返回值。

比如:function a : longint;begina:=12;if a>4 thenbeginexit(a*67); { 函数的返回值就是a*67 }end;end;4.Free Pascal支持函数重载。

可以用相同的名字定义不同的函数,只要这些函数的参数不同,就是不同的函数。

比如: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是不同的} begin{...}end;5.Free Pascal容许运算符重载。

比如,可以自己为矩阵运算定义一个“+”运算。

格式: operator 运算符(运算数) 结果例:operator +(x:datatype; y:datatype) z:datatype;begin{……}end;6. Turbo Pascal中定义了十六进制数的表示方法,即在十六进制数前添加符号$,如:X:=$F0A;Writeln(‘X=’,x);输出结果是X=3850。

这种进制数的表述给编程者带来很多便捷,而Free Pascal扩容了此优点,除十六进制数外,二进制数也有类似的表述(添加符号%)如:X:=%101;Writeln(‘X=’,x);输出结果是X=5。

7.Turbo Pascal中注释部分可用(*comment*)或者{comment}表示,如:Var I:integer;Begin (*for I:=1 to 100 do write(i);*)writeln(‘$’);End.或者:Var I:integer;Begin{for I:=1 to 100 do write(i)}writeln(‘$’);End.Free Pascal除前面两种表述方法外,//comment也可以,但其中comment必须在同一行内,如:将3、4行都括为注释部分:VarI:integer;Begin//for I:=1 to 100 do// write(i);writeln(‘$’);End.只将第3行括为注释部分:VarI:integer;Begin//for I:=1 to 100 dowrite(i);writeln(‘$’);End.8.在Free Pascal中,编译时使用Fpc–Op3 *.pas (针对PⅡ以上的处理器进行了优化)。

但实际比赛一般没有什么用(区别不大)。

9.利用指针实现动态开辟数组vara:^longint;n,i:longint;beginreadln(n);getmem(a,sizeof(longint)*n);for I:=1 to n do a:=I;freemem(a);end.实际很少用,因为一般NOIP的比赛对空间没有限制,在程序开始时总是把数组定义的足够大。

10.强制类型转换格式:数据类型(数据) 例如:varm:longint;n:extended;beginm:=123456;n:=extended(m);writeln(n:0:6);end.注意:并不是任意两个基本数据类型之间都能进行强制转换。

一般来说,fp允许两个整型之间的强制转换(实际意义不大,因为在赋值时fp会自动进行整型之间的类型转换),但需注意数据范围,例如,把p定义为integer,语句p:=integer(123456)虽然编译可以通过,但执行过程中p会溢出。

fp也允许整型转换为实型,但有可能带来精度误差。

至于实型转整型,需要满足整型所占字节数不小于实型,如double占8个字节,因此只能转换为int64。

但实型转换为整型后,结果往往是错误的。

把字符转换成整型,得到的是字符的Ascii码值,例如,writeln(longint('a'))输出的结果是97。

11.乘方x^y可以表示成x**y。

注意:A、在x是实数但y是整数的时候是不能这样表示,其他都可以,但精度可能不符合要求。

B、x**y的结果如果是整型,不能超过longint的范围;如果是实型,不能超过extended 的范围。

一般还是用换底公式(exp(y*ln(x)))来计算x^y。

12.布尔表达式不一定要全部进行计算。

只要最终结果已经能够确定,FP就不再计算其它还没有计算的部分。

比如布尔表达式exp1 AND exp2 AND exp3,如果已知exp1的结果是false,那么整个表达式的结果肯定是false,FP对exp2和exp3就不会再进行计算。

三、FP新增数据类型1.整型名称类型表示范围占用字节Int64 整数类型-9223372036854775808 ~9223372036854775807 8 Qword Int64的无符号整数类型0 ~ 18446744073709551615 8 Cardinal Longint的无符号长整型0 ~ 4294967295 4 Smallint 几乎等同于类型Integer -32768 ~ 32767 2 注意:int64不是有序类型,所以不能作为for循环的循环变量,如:var i:int64;beginfor I:=1 to 100 do writeln(i);end.编译不能通过,但word类型(integer类型的无符号整数类型,0~65535)可以。

另外,直接给一个int64类型的变量赋值一个超过longint范围的整数是不合法的,例如:定义a为int64类型,有如下语句:a:=8000000000; 编译就通不过。

类似的,以下三条语句也通不过编译:a:=2*4000000000;a:=800000*10000;a:=a*8000000000;这是因为fp在表达式的计算过程中用来存储整数的最大默认类型为longint,而不是int64。

当表达式的中间值超过longint时,fp会用实型来储存中间值,而实型是不能直接赋给整型的。

解决方法:分成两步赋值,先执行a:=1;然后执行a:=a*800000*10000; 需要强调的是,第二步赋值中一定要把8000000000拆成若干个不超过longint型的整数的和或乘积。

如嫌上述方法麻烦,还可以利用截尾函数trunc,代码如下:vartmp:double;a:int64;begintmp:=8000000000;a:=trunc(tmp);end.2.实型FP中的双精度实数类型Double,比TP中的Real精确度更高。

名称类型表示范围占用字节精度Real 实数类型 3.4e38 处理器是16位的,则占4个字节,即Single类型;如果是32位的处理器,则占8个字节,此时范围和精度都与double一样7-8位有效数字Double 实数类型 1.7e308 8 15-16位有效数字extended 实数类型 1.1e4932 10 19-20位有效数字3.允许用户按以下方式定义枚举类型:TypeEnumerateType=(Int,Long,Double:=100,Bool,……);这是类似于C的定义方式,定义使得Double的值是100,而并非2;Bool的值为101,而并非3……以此类推。

相关主题