为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。

Pascal

来自NOCOW
跳转到: 导航, 搜索

目录

[编辑] 历史

Pascal在众多语言中算是长辈了,比C要老一点,说起C++么和Pascal比起来就嫩得多了

Pascal的名字是为了纪念数学家帕斯卡,Pascal出自Niklaus Wirth之手,起初是简化Algol用于教学的语言,它早在1971年就被提出,后来成为了主流语言。现在Pascal已经不仅仅是一种专门用于教学的语言,功能也强了许多。但是始终抹不掉最初的目的,所以许多竞赛都可以提交Pascal代码,有许多标程也是Pascal写成的。所以Pascal在OI中还是占有一席之地的,了解Pascal语言也成为了必要。

Pascal是世界上第一个结构化程序设计语言。值得一提的是,Knuth的TeX当初是用Pascal写成的,因为这是当初罕见的易于移植的语言之一。

好了,闲话少说,让我们开始.......

[编辑] 编译器

Pascal的编译器有很多种,包括很古老版本。现在工业应用上流行的是Borland的编译器(P.S. 这么说其实不准确,Borland现在把这一块整个卖了......)

我们这里主要介绍的是Free Pascal

Free Pascal顾名思义,首先它是自由的(在GPL下发布),官方网站 http://www.freepascal.org

它是一个32位编译器,支持大数组、Ansistring和Object Pascal等等,功能比TurboPascal强大得多。Freepascal本身只是一个编译器,并不是IDE,比较有名的基于Freepascal的IDElazarusFPS

FreePascal有多个系统的版本,无论是Windows下还是Linux下我们都可以使用FP。

现在OI评测中所用的编译器,大都是FreePascal。由于其有一些独特的语法特性,和一些与标准Pascal有区别的功能,所以在这里强烈建议大家能够实际使用它编译程序,来了解编译器的特性和熟悉编译

[编辑] 调试

我们这里先主要讲FP,程序编译完了,却没办法调试,这的确是很难过的事情,你可能会说没关系我们有IDE呀。但是万一像Lazaurs一样,不时地就罢工,而且不罢工时候还很不好用,在这种情况下你怎么办呢?

恩GDB,其实几乎可以这么说,有FP的地方就有GDB,Lazaurs也有GDB包含在其中。在windows下可以在Lazaurs或者FP的安装文件夹中可以找到gdb.exe,在linux下如果安装了lazarus或者gdb可以在终端中直接输入gdb进入调试。这个命令行调试器,大家可以很容易地上手,大家有什么不明白的地方也可以用help命令来获得帮助。这不是正题,所以就闲话少说了。 注:如果用命令行编译请加 -g 如 fpc -g helloword.pas

下面是一些gdb的基本命令,供大家参考

 file 装入想要调试的可执行文件.
 kill 终止正在调试的程序.
 list 列出产生执行文件的源代码的一部分.
 next 执行一行源代码但不进入函数内部.
 step 执行一行源代码而且进入函数内部.
 run 执行当前被调试的程序
 quit 终止 gdb
 watch 使你能监视一个变量的值而不管它何时被改变.
 break 在代码里设置断点, 这将使程序执行到这里时被挂起.
 make 使你能不退出 gdb 就可以重新产生可执行文件.
 shell 使你能不离开 gdb 就执行 UNIX shell 命令.
 continue 设置断点后运行;
 set 在调试的时候修改变量数值。
 display 每运行一步都显示某个变量数值。
 print 打印某个变量的当前数值。


 所有的命令都可以简写,更详细的内容请参见:用GDB调试程序

[编辑] 错误

FreePascal的错误一览表: FP错误一览表

[编辑] IDE

Delphi 是Borland最著名的IDE,在当初几乎和VB一起统治了Windows RAD领域,也是罕见的仍在开发的Win32原生代码IDE。 Kylix 是Borland Delphi的Linux版本,但由于Borland和Linux社群的一些争吵和内部原因,这个项目夭折了。 Lazarus是仿造Delphi设计的,但并不是十分成熟。
FPIDE/FPS 是轻量级的IDE。你也可以使用vim/Emacs这样的常规工具编写Pascal代码,往往也更好用。

[编辑] 程序设计

[编辑] 基本知识

程序结构

   PROGRAM  程序名;
   LABEL    
   CONST  <常量标识符> = <常量>;
   TYPE    
   VAR  <变量标识符> : <类型>;    
   FUNCTION     
   PROCEDURE   
   BEGIN
      语句;
   END.

[编辑] 基本语句

(1)赋值语句

   变量:=表达式;

(2)输入语句

   read(变量列表);
   readln(变量列表);

(3)输出

   write(输出项列表);
   writeln(输出项列表);

[编辑] 选择结构

(1) IF语句

       IF  <条件>
           THEN  <语句1>
           ELSE  <语句2>;

(2)复合IF语句

       IF  <条件1>
           THEN  <语句1>
           ELSE  IF  <条件2>
                     THEN  <语句2>
                     ELSE  <语句3>;

(3)CASE语句

       CASE  <表达式>  OF
          <值表1> :<语句1>;
          <值表2> :<语句2>;
                 …
          <值表n> :<语句n>;
         else <语句n+1>;
       END

[编辑] 循环结构

(1)FOR语句(计数型循环)

      FOR  <循环变量> : = <初值> TO(DOWNTO)<终值>   DO
         <循环体>

(2)WHILE语句(当型循环)当满足某一条件时进行循环

      WHILE  <布尔表达式>  DO
         <循环体>

(3)REPEAT语句(直到型循环)重复执行循环体,一直到指定的条件为真时为止

      REPEAT
        <循环体>
      UNTIL  <布尔表达式>

(4)循环中的控制语句

      Break语句:用于终止循环,无条件的跳转到循环外部去执行。
      Continue语句:用于终止本次循环,直接跳到下一次循环。

[编辑] 子程序

(1)函数说明

      FUNCTION  <函数名>  (<参数表>) : <函数类型>;
        <说明部分>;
      BEGIN
        <函数体>
      END;

(2)函数调用

      <函数名>  (<实在参数表>)

(3)过程说明

      PROCEDURE  <过程名>  (<形式参数表>);
        <说明部分>;
      BEGIN
        <过程体>
      END;

(4)过程调用

      <过程名>  (<实在参数表>)

(5)嵌套与递归

      嵌套:一个函数或过程调用另一个函数或过程
      递归:函数或过程调用它本身

[编辑] 枚举、子界、集合类型

(1)枚举类型

      TYPE
        <枚举类型标识符> = ( <标识符>,<标识符>,…,<标识符>);
      VAR
        <枚举类型变量表> : <枚举类型标识符>;

(2)子界类型

      TYPE  
        <子界类型标识符> = <常量1> . . <常量2>;
      VAR
        <子界类型变量表> : <子界类型标识符>;

(3)集合类型

      TYPE 
        <集合类型标识符>  =  SET  OF  <基类型>;
      VAR
        <集合类型变量表> : <集合类型标识符>;

[编辑] 记录类型

(1)记录类型定义

      TYPE 
        <记录类型标识符> = RECORD
                               <域标识符表> : <类型>;
                               <域标识符表> : <类型>;
                                      …
                               <域标识符表> : <类型>
                            END
      VAR
        <记录类型变量表> : <记录类型标识符>;

(2)记录类型引用

       ① 直接引用     <记录变量名> . <域标识符>
       ② 开域语句
         WITH  <记录变量名>  DO
            <语句>

(3)记录数组

[编辑] 指针类型

(1)指针类型定义

      TYPE
        <指针类型标识符>  =  ^ <结点类型标识符>
        <结点类型标识符>  = <类型> 
      VAR
        <指针类型变量表> : <指针类型标识符>;

(2)指针类型引用

      <指针变量名>  ^

(3)new语句:分配一个存储单元,并把存储单元的地址赋给指针变量。

      New ( <指针变量名> )

(4)dispose语句:释放指针变量所指向的存储单元。

      Dispose ( <指针变量名> )

[编辑] 图形操作

[编辑] 参考代码

[编辑] 常见问题

[编辑] 优点

  • 语句清晰自然,适合作为教学语言.
  • 标准化程度高,便于移植.

[编辑] 缺点

  • 语句严谨性不高,特别是对大小写

[编辑] 经验

有人解释下程序每句前面为什么要用 TAB 空一下,谢谢!!

[[User:Bestinmxd|Bestinmxd]:便于阅读,而且方便调试及检查begin、end等配套。总之很好看啦,也都习惯了。

Czyhd:空格是为了阅读方便,用TAB是因为按一下TAB比按n下空格键容易-_-##

sqybi:我觉得两个空格比TAB麻烦不了多少,而TAB的缩进太大,所以个人认为还是空格好-_-..

pascal的tab的缩进是可以更改的……修改fp.ini文件里的DefaultTabSize= Ronice 11:41 2008年2月13日 (CST)

巫山霏云:我喜欢在pascal里面用tab键,而且是两个空格.不过一般都是用的编辑器里面的用空格代替tab,这样在不同的编辑阅读器里面可以保持格式一致了:)

要看情况,比如noi的kate的tab缩进是自己家的kate的4倍,那就没办法了。 --Cosechy 18:44 2007年10月2日 (CST)

Thity: Tab在ASCII是一个字符, 相等宽度的Space要占用更多的空间, 而对于编译器, 行首Tab和Space都是可忽略的, 而由于多个Space即为多个ASCII字符, 引起扫描速度较慢, 会降低编译速度. 推荐使用Tab.

victorlee129:如果觉得TAB太大,VIM的编辑模式里 set tabstop=2+set expandtab就行了

LunarShaddow:可以用Tab键,但在源码里替换为空格,具体如下:在FP里Options-Environment-Editor里取消Use Tab Characters就可以了,这样既保存了Tab的方便性,在其他模式里看上去也一样,但源码会大一些...

Winlzy:大家还有别的经验都多说些啊!

Lsz:我认为使用自定大小Tab(不是8个空格大小的Tab)不如空格好,因为在别的编辑器上的显示通常是8个空格, 这样就容易显示混乱。

Jollwish:个人认为还是一个空格比较清爽。

鸡是拿来啃的:直接用键盘上下左右搞定空格问题的人飘过……

永远ccy:果断是用来加快程序速度的

Lsq_oi:让程序更具机构化

Despair_Afternoons:顶一下Jollwish巨神,Mr.Zhang亦支持一个空格!

Yuzj2001:便于阅读,便与调试,而且层次分明,让人看起来很清爽的说!!

汗,难道大家都那么无聊,这些问题居然那么多人讨论。 无聊是人生最佳状态的说!

[编辑] 参考资料

新河中学http://www.xhms.com/

[编辑] 相关链接

freepascal官方下载

个人工具