ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:28.54KB ,
资源ID:18796315      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/18796315.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(NOIP pascal使用技巧文档格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

NOIP pascal使用技巧文档格式.docx

1、Turbo Pascal默认在内存中编译和运行程序,这样当你在软盘上编写程序时就可以节省一些时间。你可以在菜单Compile - Destination中选择Disk,这样在编译和运行程序时就会生成相应的.exe文件了。编译模式专题什么是编译模式?编译模式是指编译器对程序的编译方式,以不同的编译模式编译的程序将在不同的环境中运行,只有Borland Pascal 7.0和Free Pascal支持以不同的编译模式编译程序。Borland Pascal 7.0支持3种编译模式:DOS实模式、DOS保护模式和Windows模式。Free Pascal目前支持6种编译模式:DOS(GO32V1)、D

2、OS(GO32V2)、Freebsd、Linux、OS/2和Win32。DOS实模式是把程序编译为实模式应用程序的编译模式,它是默认的16位DOS程序编译方式,Free Pascal不支持以DOS实模式编译程序。实模式应用程序可以使用最大640KB的DOS常规内存,内存访问速度较快,可执行文件较小,可以单独运行,但无法在DOS实模式中使用动态链接库。DOS保护模式是把程序编译为保护模式应用程序的编译模式。保护模式应用程序可以访问计算机所有可利用的扩充内存(Extended Memory,简称XMS),它通过使用DPMI(DOS Protected Mode Interface)来在保护模式下运

3、行。在保护模式下应用程序只能访问自己持有的内存数据,而不允许访问非法的内存段,否则将会产生错误,其访问内存的速度会比在DOS实模式下稍慢一些,能够使用动态链接库。如何使用DOS保护模式?只有Borland Pascal 7.0支持以DOS保护模式编译程序,你必须在菜单Compile - Target中选择Protected mode Application后才能以DOS保护模式编译程序。由于保护模式的实现比较复杂,Borland Pascal 7.0无法调试保护模式应用程序。你可以先在DOS实模式下调试程序,在确定程序正确后才转用DOS保护模式编译。保护模式应用程序在启动时需要调用Rtm.ex

4、e来装载保护模式系统,因此你必须确保Rtm.exe存放在应用程序所在的目录下或者DOS的默认搜索路径下,你可以在Borland Pascal 7.0的工作目录下找到该文件。在比赛时,你最好预先询问一下出题者或工作人员是否允许使用保护模式,否则你的程序在测试时可能会因缺少文件Rtm.exe而无法执行。保护模式应用程序不允许访问不由自己持有的内存段,否则将会产生216号错误。如果你的程序在运行时出现216号错误,请检查你的程序是否在动态数据的分配和访问上出了问题。这种内存违法访问的错误在DOS实模式下可能会被隐藏起来而无法发现,因此即使你的程序不需要使用保护模式,你也可以通过保护模式来检查它是否正

5、确。如果你需要访问ROM BIOS或视频内存,你可以使用System单元的变量Seg0040、SegA000、SegB000和SegB800来代替只在DOS实模式下可用的段地址$0040、$A000、$B000和$B800。保护模式应用程序虽然在理论上可以利用所有的扩充内存,但实际上经常只能使用所有扩充内存的一部分。例如,如果你的计算机上配有64MB的扩充内存,那么你的程序在保护模式下运行时有时可能只能用到32MB,此时再分配内存就会产生错误。你可以通过调整System单元的变量HeapBlock和HeapLimit的值来改善扩充内存的利用情况。我的许多次测试的结果表明,把HeapBlock和

6、HeapLimit分别赋值为65528和16382,此时扩充内存的综合利用情况最好。但要注意这两个变量只在保护模式下有效,在实模式下这两个变量并不存在。编译指示专题编译指示是一种用来控制编译器特性的特殊语法的注释,它可以出现在普通注释允许出现的任何地方。编译指示从“$”或“(*$”开始,紧接着是一个指示名,然后你可以添上必要的参数和注释,最后以“”或“*)”结束。除了在程序的源代码中直接插入编译指示外,你也可以在IDE的菜单Options或命令行编译器中改变默认的指示。当你在IDE中编写程序时,你可以通过按下Ctrl+OO来让IDE在你的程序源代码开头插入当前的指示设置。编译指示分为开关编译指

7、示、参数编译指示和条件编译指示三种。开关编译指示用来打开或关闭某个编译器特性,你可以在指示字母后面加上“+”或“-”来控制编译器特性的开关,你还可以把多个开关指示以无空格的逗号分隔来组合成一个单独的编译指示注释,例如: $R+表示进行下标范围检查;$D-,I-,S-表示不产生调试信息,不检查I/O错误,不检查栈空间域是否溢出;$I Types.inc表示在该编译指示所在位置把文件Types.inc的源代码嵌入正在编译的正文中;$M 65520,8192,655360表示指定栈大小为65520字节,堆最小值和最大值分别为8192和655360字节。常用开关编译指示表字母缺省值实模式保护模式视窗模

8、式含义AA+按字地址对齐BB-布尔计值控制DD+调试信息开关FF-强制远程调用GG-产生286代码II+I/O出错检查NN-数字协处理器PP-不定长字串参QQ-整数溢出检查RR-下标范围检查SS+栈空间域检查TT-指针类型检查VV+串长匹配检查在Borland Pascal 7.0中,要使程序的可执行文件最小、可用功能最多并且运行速度最高,可使用开关编译指示:$A+,B-,D-,E-,F-,G+,I-,L-,N+,O-,P+,Q-,R-,S-,T-,V-,X+,Y-。在这种设置下,程序在编译和运行时不进行任何可选的错误检查,也不能进行调试。要使程序进行运行时错误检查,可以使用编译指示:$I+,

9、Q+,R+,S+。要使程序能够调试,可以使用编译指示:$D+,L+,Y+。另外,为了使程序的栈尺寸和可用堆尺寸最大,还应在主程序中添加编译指示:$M 65520, 0, 655360。下面是一个简单的样例:program Noname;$A+,B-,E-,F-,G+,N+,O-,P+,T-,V-,X+$I-,Q-,R-,S-$D-,L-,Y-$M 65520, 0, 655360beginend.在Free Pascal中,最优的编译指示是:$I-,Q-,R-,S-,V-,X+。$I+,Q+,R+,S+,V-,X+。但应该注意,Free Pascal有许多编译选项是不能在源代码中以编译指示的方

10、式设置的。你可以在IDE的菜单Options - Mode中选择编译方式:Normal、Debug和Release。在程序最后完成时,应使用Release方式编译程序。另外,Free Pascal提供了参数编译指示$MODE 兼容模式用以设置编译时的兼容模式,即所用的语法,你可以根据你熟悉的语法进行选择:Default、Delphi、TP、FPC、OBJFPC和GPC。如果你只会Turbo Pascal语法,那么你应该选择TP,如果你熟悉Delphi的Object Pascal语法,那么你也可以选择Delphi。$I-,Q-,R-,S-,V-,X+$MODE Delphi如果你不能把全部的编译

11、指示记住,或者你使用的是编译指示不完全的较低版本的Turbo Pascal,那么你可以在IDE中按下Ctrl+OO,IDE会在当前编辑文件的开头插入默认编译指示设置,你可以在其基础上进行修改。虽然大部分的最优编译指示与默认的指示相同,但在源代码中使用编译指示显得更加安全,因为它不会受默认编译指示改变的影响。内存分配专题为何我的程序在递归调用子程序时会出现栈溢出错误?调用子程序是需要分配一定的内存空间用以存放参数、函数返回值和局部变量等数据的。Pascal提供了一个全局静态的栈结构的内存段用以存放这些数据,每次调用子程序都会把所需的数据压入栈中,子程序结束后就把数据从栈中取回。由于栈的大小是在编

12、译时设定的,不能在运行时再更改大小,因此当栈没有足够的剩余空间来存放调用子程序所需的数据时,就会出现栈溢出错误。你可以通过参数编译指示$M来设置栈的大小,根据程序的需要来设置栈的大小是很重要的,因为栈太小则容易出现栈溢出错误,太大又会浪费内存。注意Borland/Turbo Pascal编译器是16位的编译器,你最多只能设置65520字节的栈空间。Free Pascal编译器是32位的,因此基本上没有限制,栈大小设置在Linux下将会被忽略。为何当我声明的全局变量的总尺寸超过64KB时会出现编译错误?在Pascal中,一个主程序及其所有单元(包括System单元)的全局静态数据(包括全局变量、

13、全局和局部类型常数、PChar常量和对象类型的虚拟方法表等)都被存放在一个单独的全局静态的数据段中。由于Borland/Turbo Pascal编译器是16位的编译器,这个数据段的大小不能超过64KB,否则将无法编译。解决的方法是尽可能少用全局静态变量,把一些比较大的全局静态数据改用动态方式存储,以减少全局静态空间的需求。为何我不能定义大小超过64KB的数据类型和变量?由于Borland/Turbo Pascal编译器是16位的编译器,它要求每个单独的数据类型和变量的大小都不能超过64KB,否则将无法编译。解决的方法是把数据分拆,并用动态方式存储分拆后的数据。例如,对于一个很大的一维数组,你可

14、以把它拆为二维数组,然后用动态方式存储第二维数据。下面是一些简单的样例:分拆前的数据类型分拆后的数据类型type TQueue = array0.249999 of Byte;- TList = array0.9999 of Byte; TQueue = array0.24 of TList; TRecord = record A, B, C: array0.9999 of Longint; end; TList = array0.9999 of Longint; TList;我的程序可以申请多大的动态内存空间?在Borland/Turbo Pascal中,如果你以DOS实模式编译程序,那么你

15、的程序可以申请的最大动态内存空间为当前DOS常规内存剩余量和编译指示$M设置的最大堆空间这两个数的最小值,如果你以保护模式编译程序,那么的你的程序可以申请的最大动态内存空间就是扩充内存的剩余量。在Free Pascal中,要视具体环境的设置而定。注意,在很多时候,你的程序实际上并不能使用到理论上可用的最大内存空间,因为由不完全的内存释放操作产生的大量剩余内存碎片会由于每块碎片过小而无法利用。由于Borland/Turbo Pascal编译器是16位的编译器,因此它限定每次申请的内存空间的最大值为65528字节。注意,申请大小在65529至65535之间的内存空间是不安全的。输入输出专题在进行文

16、件输入输出操作时可否免去文件变量参数?可以,方法是设置默认输入输出文件。System单元提供了两个正文文件变量Input和Output,它们是默认的输入输出文件参数,在程序启动时,这两个变量会自动指向并打开默认的输入输出设备(如键盘和显示器),在程序结束后,这两个变量会自动关闭所指向的文件。你可以通过改变这两个变量所指向的文件来自定义默认输入输出文件,下面是一个简单的样例:var S: string;procedure SetIOFiles(const InputName, OutputName: string); Close(Input); Assign(Input, InputName);

17、 Reset(Input); Close(Output); Assign(Output, OutputName); Rewrite(Output);end; SetIOFiles(Input.txt, Output.txt); Readln(S); inputs S from text file Input.txt Writeln(S); outputs S to text file Output.txt在DOS下,把文件名设为空串或者“con”可以指向默认的输入输出设备(如键盘和显示器)。注意,在Free Pascal中,正文文件变量Input和Output不会在程序结束时自动关闭所指向的文

18、件,这可能会造成输出数据遗失,因此你需要在程序结束的地方明确地关闭它们。函数SeekEoln、SeekEof和Eoln、Eof有什么区别?SeekEoln和Eoln用于判断文件行结束,SeekEof和Eof用于判断文件结束,但它们之间还是有区别的。Eoln和Eof只判断当前的所在位置是否位于行结束符上或者文件尾部,而SeekEoln和SeekEof会自动跳过所有连续的空格和制表符再进行判断,因此,在执行函数SeekEoln或SeekEof后,当前的所在位置不会是空格或者制表符。为何我的程序结束后其输出文件无内容?这可能是由于在输出数据后没有关闭输出文件所造成的,或许是你忘了在程序结束的地方关闭

19、文件,也或许是在关闭文件前你的程序就在某个地方终止了。Pascal在向正文文件输出数据时,不一定立即就写进磁盘里,只要剩余缓冲区足够,Pascal会先把数据复制到正文文件变量内置的缓冲区中去,直到缓冲区满或者关闭文件时才真正把缓冲区内的数据写进磁盘文件中。但你可以在输出数据后调用System单元的过程Flush(var F: Text)来强制把缓冲区内所有的数据立即写进磁盘文件中并清空缓冲区。如何设置正文文件缓冲区的大小?Pascal不提供直接设置缓冲区大小的功能,但提供设置缓冲区的功能。在System单元中含有一个过程SetTextBuf(var F: Text; var Buf ; Siz

20、e: Word ),使用它可以为正文文件自定义缓冲区,下面是一个简单的样例: F: Buf: array0.4095 of Byte; Assign(F, SetTextBuf(F, Buf, SizeOf(Buf); or SetTextBuf(F, Buf); Reset(F); or Rewrite(F); . Close(F);注意,SetTextBuf必须在对文件进行任何读写操作之前使用,否则将会造成数据遗失,至少要紧跟在Reset、Rewrite或Append的后面。另外,由于Pascal为每个正文文件变量都内置了一个128字节的缓冲区,因此设置尺寸小于128字节的缓冲区是毫无意义

21、的。一般情况下,设置一个8KB或16KB左右的缓冲区就可以使正文文件读写的速度显著提高了。语法专题程序首部的参数Input和Output是什么意思?它们代表默认输入输出设备,但它们只在老式的Pascal语言中有存在意义。在Borland/Turbo Pascal和Free Pascal中,程序首部不需要任何参数,但为了兼容旧式的Pascal程序,编译器会忽略程序首部的所有参数。如何获得函数返回值的地址?在Borland/Turbo Pascal中,只能通过函数名来设置函数返回值,编译器并不提供获取函数返回值地址的方法。虽然也可以通过底层的方法来获得函数返回值的地址,但该方法不适合在信息学奥林匹

22、克中使用。在Free Pascal中,如果使用Turbo Pascal语法,则和Borland/Turbo Pascal一样,如果使用Object Pascal语法,则可以通过使用标识符Result来像变量一样访问函数返回值,Result返回的就是函数返回值地址。数值参数、变量参数和常量参数有什么区别?数值参数、变量参数和常量参数代表三种不同传递方式的子程序参数类型,它们分别用于不同的场合,使用不同的参数类型会产生不同的子程序调用执行速度、栈空间占用量和传递效果。子程序在调用时会在栈中为数值参数分配一块新的空间,并把实际参数的值赋给数值参数,然后数值参数就可以像局部变量一样使用。子程序结束后,

23、数值参数所占用的栈空间会自动释放,数值参数的值的改变不会影响到实际参数。数值参数可接受的实际参数为:常量、表达式和变量。子程序在调用时会在栈中为变量参数分配四个字节的空间,并把实际参数的地址赋给这四个字节,对变量参数的访问就是通过该四个字节组成的指针来对实际参数进行访问,其访问速度比数值参数慢一些。子程序结束后,这四个字节的空间就会自动释放,变量参数的值的改变等价于实际参数的值的改变。变量参数可接受的实际参数为:变量。对于常量参数,子程序在调用时会根据其数据类型和大小来决定是分配一块新的空间来存放实际参数的值还是分配四个字节来存放实际参数的地址,其决定根据与实际参数是否变量无关。常量参数的访问

24、类似于常量,只能获取它的值而不能进行赋值,唯一的例外是可以使用操作符来获得常量参数的地址。常量参数可接受的实际参数为:注意,由于文件类型比较特殊,文件类型的参数只能作为变量参数传递。如何使两个子程序可以互相调用?Pascal要求每个标识符在使用前必须预先定义,如果两个子程序要互相调用,那么就至少有一个子程序必须在其实现之前预先声明,即预定义子程序,这可以用保留字forward完成。forward用于预定义子程序,把它放在子程序首部的后面,那么这个子程序首部就预定义了一个子程序,而其具体的实现部分可以在其它地方给出。procedure ProcA; forward;procedure ProcB; ProcA; ProcB;注意,forward不能用于预定义单元中已在接口部分声明的子程序。数据类型专题如何设置字符串的长度?在Borl

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1