分享到新浪微博 分享到QQ空间 打印

Pascal语言概述与预备知识

Pascal语言概述与预备知识

第一章 Pascal语言概述与预备知识
1 关于Turbo Pascal
  Pascal是一种计算机通用的高级程序设计语言。它由瑞士Niklaus Wirth教授于六十年代末设计并创立。

  以法国数学家命名的Pascal语言现已成为使用最广泛的基于DOS的语言之一,其主要特点有:严格的结构化形式;丰富完备的数据类型;运行效率高;查错能力强。

  正因为上述特点,Pascal语言可以被方便地用于描述各种算法与数据结构。尤其是对于程序设计的初学者,Pascal语言有益于培养良好的程序设计风格和习惯。IOI(国际奥林匹克信息学竞赛)把Pascal语言作为三种程序设计语言之一, NOI(全国奥林匹克信息学竞赛)把Pascal语言定为唯一提倡的程序设计语言,在大学中Pascal语言也常常被用作学习数据结构与算法的教学语言。

  在Pascal问世以来的三十余年间,先后产生了适合于不同机型的各种各样版本。其中影响最大的莫过于Turbo Pascal系列软件。它是由美国Borland公司设计、研制的一种适用于微机的Pascal编译系统。该编译系统由1983年推出1.0版本发展到1992年推出的7.0版本,其版本不断更新,而功能更趋完善。

下面列出Turbo Pascal编年史

出版年代
版本名称
主要特色

1983
Turbo Pascal 1.0

Turbo Pascal 2.0

Turbo-87 Pascal
提高实数运算速度并扩大值域

1985
Turbo Pascal 3.0
增加图形功能

Turbo BCD Pascal
特别适合应用于商业

1987
Turbo Pascal 4.0
提供集成开发环境(IDE),引入单元概念

1988
Turbo Pascal 5.0
增加调试功能

1989
Turbo Pascal 5.5
支持面向对象的程序设计(OPP)

1990
Turbo Pascal 6.0
提供面向对象的应用框架和库(Turbo Vision)

1992
Turbo Pascal 7.0
面向对象的应用系统、更完善的IDE

Turbo Vision 2.0

1993
Borland Pascal 7.0
开发 Object Windows库、

(For Windows)
提供对OLE多媒体应用开发的支持

1995
Delphi
Visual Pascal


  Turbo Pascal语言是编译型程序语言,它提供了一个集成环境的工作系统,集编辑、编译、运行、调试等多功能于一体。

1.2 Turbo Pascal 或 Borland Pascal 的启动

(1) Turbo Pascal的启动

a.DOS下的启动(适用于MS-DOS6.22之前的版本或Win 9X & Win2000 的Command Mode)

  DOS下,在装有Turbo Pascal的文件目录下,键入turbo即可进入Turbo Pascal集成环境。

b.Win9X或Win2000模式下的启动(适用于Turbo Pascal 3.0以后的版本)

  如果在Win9X或Win2000的“资源管理器”装有Turbo Pascal的目录中,双击turbo.exe或在“开始--程序”菜单中通过MS-DOS方式来运行turbo.exe,它会提示你“该程序设置为MS-DOS方式下运行,并且其它程序运行时,无法运行它。如果选择继续所有其它程序将关闭”,所以在Win9X或Win2000下无法直接运行它,这时你可以在你希望的地方(比如说桌面上)单击鼠标右键“新建--快捷方式”,单击“浏览”,找到turbo.exed选中,然后单击“打开”,再单击“下一步”,再单击完成;这还没完,选中前面新建的快捷方式(应该叫Turbo Pascal吧),单击右键,单击“属性”,选择“程序”,然后再单击“高级”,把“MS-DOS方式”前面的那个勾去掉,也就是不要选“MS-DOS方式”,然后单击“确定”,在单击“确定”就大功告成了,以后你运行Turbo Pascal的时候,只要双击那个你建立起的快捷方式就可以直接在Win9X或Win2000下运行Turbo Pascal。

(2)Borland Pascal的启动

  Borland Pascal的启动没有像Turbo Pascal那样复杂,一般来说在任何情况下双击bp.exe或是在MS-DOS下运行都不会出现什么问题。
2.1 Pascal程序基本组成

例1.1计算半径为R的圆面积S

program Area; {程序首部}

{已知半径求圆的面积}

const pi=3.14159;  {说明部分——数据描述}

var s,r:real;

begin           {执行部分}

readln(r);

s:=pi*sqr(r);

writeln('s=',s);

end. 

  上述程序第一行称为程序首部。其中用花括号(注释可以用{ }或(* *)来表示)括起来的内容是注释,程序第二行就是一个注释,注释除了给人看,增加程序的可读性外,对程序编译和运行不起作用。一个程序可以包含多个出现在不同处注释,亦可无注释。程序第三行是常量说明,程序第四行是变量说明。程序从begin到end都是执行(语句)部分

(1)程序首部

  例1.1的第一行称为程序首部。program是保留字,接着是程序名(由你依据“标示符”规则自行定义),最后以分号表示程序首部结束,下面是程序主体的开始。程序首部在一个Turbo Pascal(仅在Turbo Pascal中有效)程序中并非必须出现,它是可选的。写上它仅起了文档作用。因此,在时间有限的情况下,如果用Turbo Pascal编程完全可以省略程序首部。

(2)程序体

a.说明部分

说明部分用于定义和说明程序中用到的数据,由单元说明、标号说明、常量说明、类型说明、变量说明、函数或过程说明组成,并且这些数据的说明次序必须按照以上次序。但是一个简单的Turbo Pascal程序也可以不包含说明部分,也就是说说明部分是可选的。

b.执行部分

执行部分描述了程序要执行的操作。它必须以一个Turbo Pascal保留字begin开始,以保留字end后跟句点结束,其间是一些执行具体操作的语句,并且以分号作为语句之间的分隔符。begin 和end必须成对出现,这是一个Turbo Pascal程序所必须有的。紧跟end之后的句号表示执行部分的结束,也表示整个程序的结束。此后的任何语句都无效。Turbo Pascal规定紧随end之前出现的分号允许省略。

(3)一个完全的Pascal程序结构

program 程序名;

 uses

   已知单元说明;

 label

   标号说明;

 const

  常量说明;

 type

   类型说明;

 var

  变量说明;

 function

  函数说明;

 procedure

  过程说明;

begin

 语句;

 语句;

 ……

 语句

end.

2.2 Pascal字符与符号
1.保留字(关键字)

  所谓保留字是指在Pascal语言中具有特定的含义,你必须了解它的含义,以便于正确的使用,否则会造成错误。标准Pascal语言中的保留字一共有35个,Turbo Pascal语言一共有51个。下面是Pascal语言的保留字(斜体是Turbo Pascal特有的保留字):

AND,ARRAY,BEGIN,CASE,CONST,DIV,DO,DOWNTO,ELSE,END,FILE,FOR,FUNTION,GOTO,IF,IN,LABEL,MOD,NIL,NOT,OF,OR,PACKED,PROCEDURE,PROGRAM,RECORD,REPEAT,SET,THEN,TO,TYPE,UNTIL,VAR,WHILE,WITH,EXPORTS,SHR,STRING,ASM,OBJECT,UNIT,CONSTRUCTOR,IMPLEMENTATION,DESTRUCTOR,USES,INHERITED,INLINE,INTERFACE,LIBRARY,XOR,SHL

2.标识符

  (1)表识符的定义:标识符就是以字母开头的字母数字序列,有效长度为63个字符,并且大小写等效。可以用来标示常量、变量、程序、函数等。例如例1.1中的Area(程序名),pi(符号常量),s、r(变量名)都是标识符。

(2)表识符的分类:

    a.标准标识符:指Pascal语言预先定义的表识符,具有特殊含义。

以下列举了Turbo Pascal语言部分常用的标准表识符:

标准常量 False Maxint True        
标准类型 Boolean Char Real Integer      
标准函数 Abs Arctan Chr Cos Eof Eoln Exp
  Ln Odd Ord Pred Round Sin Sqr
  Sqrt Succ Trunc        
标准过程 Dispose Get New Pack Page Put Read
  Readln Reset Rewrite Unpack Write Writeln  
标准文件 Input Output          

b.用户字定义表识符:由你来根据需要定义。

(1)选用的表识符不能和保留字相同。

(2)语法上允许预定义的标准标识符作为你定义的的表识符使用,但最好还是不要用。

以下列举了你在定义表识符时可以用的字符:
A——Z;a——z;0——9;+,-,*,/,=,<>,<=,>=,<,>,(,),[,],{,},:=,,,;,.,:,..,',^

2.3 Pascal数据类型
  数据是程序设计的一个重要内容,其重要特征----数据类型,确定了该数据的形、取值范围以及所能参与的运算。
  Turbo Pascal 提供了丰富的数据类型,这些数据类型可以分为三大类:简单类型、构造类型和指针类型,其中简单类型可以分为标准类型(整型、实型、字符型和布尔型)和自定义类型(枚举型和子界型),构造类型可以分为数组类型、集合类型、记录类型和文件类型。这些数据类型中除了指针类型是动态数据类型外,其他的都是静态数据类型。在这些数据类型中简单类型都是有序类型,除了实型以外的简单类型都是顺序类型,所谓顺序类型就是他们的值不仅是有序的而且是有顺序号。
  在这里主要介绍整型、实型、字符型和布尔型四种常用的数据类型。

1.整型
  一个整型数据用来存放整数。Turbo Pascal支持五种预定义整型,它们是shortint(短整型)、 integer(整型)、 longint(长整型)、 byte(字节型)和 word(字类型),Turbo Pascal分别用相同的名字作为他们的表识符。每一种类型规定了相应的整数取值范围以及所占用的内存字节数。

类型 数值范围 占字节数 格式
shortint -128..128 1 带符号8位
inteter -32768..32767 2 带符号16位
longint -2147483648..2147483647 4 带符号32位
byte 0..255 1 带符号8位
word 0..65535 2 带符号16位

  Turbo Pascal规定了两个预定义整型常量表识符maxint和maxlonint,他们各表示确定的常数值,maxint为32767, longint为2147483647,他们的类型分别是integer 和longint。

2.实型
  一个实型数据用类存放实数。Turbo Pascal支持五种预定义实型,它们是real(基本实型)、 single(但精度实型)、double(双精度实型)、extended(扩展实型)、comp(装配实型),Turbo Pascal分别用相同的名字作为他们的表识符。每一种类型规定了相应的实数取值范围、所占用的内存字节数以及它们所能达到的精度。

类型 数值范围 占字节数 有效位数
real 2.9e-39..1.7e38 6 11..12
single 1.5e-45..3.4e38 4 7..8
double 5.0e-324..1.7e308 8 15..16
extended 3.4e-4932..1.1e4932 10 19..20
comp -2**63+1..2**63-1 8 19..20

  Turbo Pascal支持两种用于执行实型运算的代码生成模式:软件仿真模式和80x87浮点模式。除了real可以在软件仿真模式下直接运行以外,其他类型必须在80x87浮点模式下运行。

3.布尔型
  一个布尔型数据用来存放逻辑值(布尔值)。布尔型的值只有两个:false和true,并且false的序号是0,true的序号是1。false 和true都是预定义常数表识符,分别表示逻辑假和逻辑真。并且true<false。boolean是布尔型的表识符。

4.字符型
  字符型用char作为表识符。字符型必须用单引号括起来,字母作为字符型时,大小写是不等价的,并且字符型只允许单引号中有一个字符,否则就是字符串。
2.4 常量与变量
1.常量
(1)常量:在某个程序的整个过程中其值不变的量。
(2)常量定义:常量定义出现在说明部分。它的语法格式是:
const
<常量标识符>=<常量>;
...
<常量标识符>=<常量>;
常量表识符的类型由定义它的常量的类型决定。例如:const a=12 隐含说明a是整型;const r=3.21 隐含说明r是实型......
(3)常量定义部分必须以保留字const开头,可以包含一个或几个常量定义,而且每个常量均以分号结束。
(4)Turbo Pascal类型常量
类型常量,又称变量常数,它是Turbo Pascal的一个扩充特性。类型常量的定义与标准Pascal规定的常数定义和变量说明有所区别。类型常量定义的语法格式:
const
<简单类型常量标识符>:简单类型=常数;
例如:
const
counter:integer=0;
flag:boolean=true;
index:0..100=0;
2.变量
(1)变量:在某个程序中的运行过程中其值可以发生改变的量
(2)变量说明:变脸说明出现在说明部分。它的语法格式是:
var
<变量标识符列表>:<类型>;
...
<变量标识符列表>:<类型>;
其中,保留字var表示开始一个变量说明部分。变量标识符列表是一个用逗号隔开的标识符序列,冒号后面的类型是类型标识符。每个变量说明均以分号结束。
例如:
var
a,b,c:integer;
m,n:real;
2.5 标准函数
1.算术函数

函数标识符
自变量类型
意义
结果类型

abs
整型、实型
绝对值
同自变量

arctan
整型、实型
反正切
实型

cos
整型、实型
余弦
实型

exp
整型、实型
指数
实型

frac
整型、实型
小数部分
实型

int
整型、实型
整数部分
实型

ln
整型、实型
自然对数
实型

pi
无自变量
圆周率
实型

sin
整型、实型
正弦
实型

sqr
整型、实型
平方
同自变量

sqrt
整型、实型
平方根
实型


例:

abs(-4)=4
abs(-7.49)=7.49

arctan(0)=0.0
sin(pi)=0.0
cos(pi)=-1.0

frac(-3.71)=-0.71
int(-3.71)=-3.0

sqr(4)=16
sqrt(4)=2


2.标量函数

函数标识符
自变量类型
意义
结果类型

odd
整型
判断奇数
布尔型

pred
离散类型
求前趋
同自变量

succ
离散类型
求后继
同自变量


例:

odd(1000)=false
odd(3)true

pred(2000)=1999
succ(2000)=2001

pred('x')='w'
succ('x')='y'


3.转换函数

函数标识符
自变量类型
意义
结果类型

chr
byte型
自量对应的字符
字符型

ord
离散类型
自量对应的序号
longint

round
实型
四舍五入
longint

trunc
实型
截断取整
longint


4.杂类函数

函数标识符
自变量类型
意义
结果类型

random
无自变量
[0,1)之间的随机实数
real

random
word
[0,自变量)之间的随机整数
wird

randomize
无自变量
用一随机值初始化内部随机数产生器
longint

upcase
字符型
使小写英文字母变为大写
字符型


2.6 运算符和表达式
1.运算符和优先级
(1)运算符
a.算术运算符 运算符
运算
运算对象
结果类型

+

整型、实型
只要有一个运算对象是实型,结果就是实型,如果全部的运算对象都是整型并且运算不是除法,则结果为整型,若运算是除法,则结果是实型

-

整型、实型

*

整型、实型

/

整型、实型

div
整除
整型
整型

mod
取余
整型
整型


b.逻辑运算符

运算符
运算
运算对象
结果类型

not
逻辑非
布尔型
布尔型

and
逻辑与
布尔型
布尔型

or
逻辑或
布尔型
布尔型

xor
逻辑异或
布尔型
布尔型


c.关系运算符

运算符
运算
运算对象
结果类型

=
等于
简单类型
布尔型

<>
不等于
简单类型
布尔型

<
小于
简单类型
布尔型

>
大于
简单类型
布尔型

<=
小于等于
简单类型
布尔型

>=
大于等于
简单类型
布尔型


(2)优先级

运算符
优先级

not
1(高)

*,/,div,mod,and
2

xor,+,-,or
3

in,=,<>,>=,<=,<>
4(低)


2.表达式
(1)算术表达式:算术表达式是由算术运算符连接常量、变量、函数的式子。算术表达式中各个运算符的次序为: ( )-->函数-->*,/,div,mod-->+,1
(2)布尔表达式:Turbo Pascal提供给布尔表达式以下基本操作:逻辑运算和关系运算。
3.1 赋值语句
赋值语句是最简单的语句,其一般形式为:
<变量>:=<表达式>
赋值语句的作用是计算表达式的值,并赋给变量。对于任何一个变量必须首先赋值,然后才能引用,否则,未赋初值的变量将以一个随机值参与运算。另外,赋值号两边的类型必须相同,但表达式值为整数时,它可自动化为实型后赋给该实型变量,即符合赋值相容。
例:关于赋值的例子
 program example;
  var a,b:integer;
 begin
  a:=3;b:=2;
  writeln(a);
  writeln(b);
  a:=a+b;
  writeln(a);
  writeln(b);
  b:=a-b;
  writeln(a);
  writeln(b);
  a:=a-b;
  writeln(a);
  writeln(b);
  readln
 end.</P><P>
3.2 输入语句
  通过计算机的外设把数据送到计算机内存的过程称为输入。Turbo Pascal语言的输入语句有如下两种形式:
  read(<变量名表>);
  readln(<变量名表>);
<输入项表>是一个或几个由逗号隔开的变量标识符,他们必须在程序说明部分预先说明,他们可以是整型、实型或字符型,布尔型不可以直接读入。
  例如a,b,c为整型变量,read(a,b,c)之后
    键盘输入:20 30 40 <CR>(<CR>表示回车)
    结果: a=20,b=30,c=40
  readln语句和read语句不同之处在于输入数据到各变量之后,readln自动换行,从下一行开始再输入数据。一个read语句执行完后,数据行中多余的未读数据可以被下一个输入语句读入;而一个readln于执行完后,数据行中多余未读数据就没有用了。readln语句中可以不包含变量名表。即有以下等价情况:
readln(a,b);readln等价于readln(a,b)
  输入语句输入的数据类型必须和变量一一对应。如果输入的是一串整数或实数,数据间用空格或回车分隔;若输入的是一串字符,则不用分隔。
例:输入语句示例
  program shuru;
    var
      x:real;
      c:char;
  begin
    write('please input the number: ($XXX.XX)');
    readln(c,x);
    writeln('The price is ',c,x)
  end.
3.3 输出语句
  输出是将内存中的数据送到外设的过程。Turbo Pascal的输出语句有两种形式:
    write(<输出项表>)
    writeln(<输出项表>)
  其中<输出项表>是一串用逗号分隔的常量、变量、函数名、表达式或字符串。如果是变量、函数名、表达式,则将其计算结果输出;如果是常量或字符串,则直接输出其值。
  writeln和writeln的区别在于:write语句是输出项输出后,不换行,光标停留在最后一项后,writeln语句按项输出后,自动换行,光标则停留在下一行的开始位置。
  writeln语句允许不含有输出项,即仅writeln;表示换行。
  Turbo Pascal语言把输出项的数据显示占用的宽度称为域宽,你可以根据输出格式的要求在输出语句中自动定义每个输出项的宽度。定义宽度时分为单域宽和双域宽。
(1)单域宽输出格式:
    writeln(I:n)
  在n个字符宽的输出域上按右对齐方式输出I的值,若n大于I的实际位数,则在I值前面补(n-I的实际位数)个空格。若I的实际位数大于n,则自动突破限制。n必须是整数。
(2)双域宽输出格式:
    writeln(a:m:n)
  双域宽主要用于实型数据的输出。n的用法同上。在n个字符宽的输出域上按右队齐方式用小数点形式输出a的数值,m是小数点后的位数。原来的数据按该该格式指定的小数位数四舍五入。若m=0 ,则不输出小数部分和小数点,原数据四舍五入取整。n,m必须是整数。
例:输出语句的例子
 program shuchu;
  const
   s='pascal';
  var
   i:integer;
   r:real;
   c:char;
   b:boolean;
 begin
  i:=12345;
  r:=123.45
  c:='a';
  b:=true;
  writeln('i=');
  writeln(i:6);
  writeln('r=',r,r:6:1);
  writeln('c=',c,c:10);
  writeln('b=',b,b:10)
 end.
3.4 复合语句
  复合语句是由若干语句组成的序列,语句之间用分号“;”隔开,并且以begin和end括起来,作为一条语句。复合语句的一般形式:
    begin
     语句1;
     语句2;
     ……
     语句n;
    end
例:变量值的交换
  program jiaohuan;
   var
    a,b,t:integer;
  begin
   a:=10;b:=20;
   begin
    t:=a;
    a:=b;
    b:=t;
   end;
   writeln('a=',a,'b=',b)
  end.
第四章 选择结构程序设计

4.1 if语句
  IF语句是由一个布尔表达式和两个供选择的操作序列组成。运行时根据布尔表达式求值结果,选取其中之一的操作序列执行。有两种形式的IF语句:
       if <布尔表达式> then <语句>;
       if <布尔表达式> then <语句1>
           else <语句2>;
  当布尔表达式的值为真,则执行then后面的语句,值为假时有两种情况:要么什么也不做,要么执行else后面的语句。注意else前面没有分号,因为分号是两个语句之间的分隔符,而else并非语句。如果在该处添了分号,则在编译的时候就会认为if 语句到此结束,而把else当作另一句的开头,输出出错信息。
例:求y=f(x),当x>0时,y=1,当x=0时,y=0,当x<0时,y=-1
 program lianxi;
  var x,y:real;
 begin
  if x>0 then y:=1;
  if x=0 then y:=0;
  if x<0 then y:=-1;
  writeln('y=',y);
 end.
  在Turbo Pascal语言if语句中被构造的语句只能是一条语句,当条件选择某个分支的计算要用多个语句描述时,就必须把该分支用begin和 end括来,写成复合语句。在用if语句连续嵌套时,如果你插入适量的复合语句,有利于程序的阅读和理解。
例:当x>0时候,计算x*x,并且输出x和x*x,
 program lianxie3;
  var x,x1:real;
 begin
 readln('x=',x);
 if x>= then
  begin
   x1:=x*x;
   writeln('x*x=',x1);
   writeln('x=',x);
  end;
 end.
  当if 语句嵌套时,Turbo Pascal约定else总是和最近的一个if配对。
4.2 case语句
  case语句是由一个表达式和众多可选择的操作序列组成。运行时,根据表达式的求值结果,在众多的分支中选取一个分支执行。其形式为:
    case 表达式 of
     常量1:语句1;
     常量2:语句2;
     ……
     常量n:语句n;
     else 语句 n+1 {可选项}
    end;
  表达式只能是顺序类型(除了实型以外的简单类型),其值必须是唯一确定并且和表达式类型相同。case语句执行和表达式值相匹配的case常数所指向的那条语句,如果没有相匹配的值,则执行else部分(如果有的话)或者什么也不做。在else前面的语句末尾有分号,这是和if语句不同的。
例:根据学生的成绩给予相应的等低,对应关系如下:
  90——100 A
  80——89  B
  60——79  C
  60以下    D
 program chengji;
  var s:real;ch:char;
 begin
  write('input the score: ');
  readln(s);
  if(s>=0)and(s<=100)then
   case s div 10 of
    10,9:ch:='B';
    8:ch:='B';
    7,6:='C';
    else ch:='D';
   end;
  writeln(s,'--',ch);
 end.

第五章 循环结构程序设计

5.1 while语句
  while语句用于“当满足某一条件时进行循环”的情况。while语句的语法格式:
              while 布尔表达式 do 语句;
  循环结束条件在进入循环体之前测试,若最初的测试值为false,则根本不进入循环体,也就是说while循环是是属于当型循环。为了能使while重复能终止,循环体中一定要有影响布尔表达式的操作,否则该循就是一个死循环。
例:计算从0到某个数之间所有奇数的和。
 program jishu;
  var odds,limit,sum:integer;
 begin
  readln(limit);
  sum:=0;
  odds:=1;
  while odds<=limit do
   begin
    sum:=sum+odds;
    odds:=odds+2
   end;
  writeln(sum:1)
 end.
5.2 repeat语句
  repeat 语句用于“重复执行循环体,一直到指定的条件为真时为止”。语法格式为:
                 repeat
       语句1;
         ……
        语句n;
                 until 布尔表达式;
  repeat重复基本上有和while重复一样的描述循环计算的能力,但有一些不同:在repeat语句的结构中,布尔表达式求值在计算操作之后,而while语句中,布尔表达式求值在计算操作之前,也就是说repeat至少执行一次循环体。while语句的成分语句只能是一个语句。因此,当重复动作包含多个语句时,要用begin和end ,使它变成一个复合语句。而repeat语句的保留字repeat和until已经起语句括号作用,可以包含多个语句而无须begin和end。repeat语句中,当布尔表达式为true时结束循环,而while语句中,是当表达式为false时才结束循环。当描述由计算操作后的情况确定重复是否继续进行的计算时,通常用repeat语句描述。

5.3 for 语句
  for 语句用来描述已知重复次数的循环结构。for 语句有两种形式:
            (1) for 控制变量:=初值 to 终值 do 语句;
            (2) for 控制变量:=初值 downto 终值 do 语句;
  第一种形式的for 语句是递增循环。首先将初值赋给控制变量,接着判断控制变量的值是否小于或等于终值,若是,则执行循环体,在执行了循环体之后,自动将控制变量的值该为它的后继值,并重新判断是否小于或等于终值。当控制变量的值大于终值时,退出for循环,执行for语句之后的语句。第一种形式的for 语句是递减循环。首先将初值赋给控制变量,接着判断控制变量的值是否大于或等于终值,若是,则执行循环体,在执行了循环体之后,自动将控制变量的值该为它的前趋值,并重新判断是否大于或等于终值。当控制变量的值小于终值时,退出for循环,执行for语句之后的语句。for 语句中的初值、终值、控制变量的数据都必须是顺序类型。当初值和终值确定后,重复的次数就确定不变了,并且控制变量在重复语句内不能施加任何赋值操作。
例:计算1+2+3+……+99+100
 program jia;
  var n,sum:integer;
 begin
  sum:=0;
  for i:=1 to 100 do
   sum:=sum+i;
  writeln(sum);
 end.
5.4 goto语句
  goto语句是一种无条件转向语句,它可以控制直接从程序的一条语句转向另一条语句。goto语句的语法形式为:
      goto 标号;
  其中标号必须是不超过4位整数的正整数或标识符组成,但标号必须在说明语句中先予以说明。
  goto语句会使程序出现一种称为“乱面条”的结构,因此你最好还是不要去用。

第六章 枚举型和子界型

6.1 类型定义
  类型定义的语法格式:
  type
  <标识符1>=<类型1>;
  <标识符1>=<类型1>;
  ……
  <标识符n>=<类型n>;

6.2 枚举类型
  通过预定义列出所有值的标识符来定义一个有序集合,这些值的次序和枚举类型说明中的标识符的次序识一致的。枚举类型的形式:(标识符1,……,标识符n)
例如:type daystype=(sunday,monday,tuesday,wednesday,thursday,friday,saturday)
  枚举元素只能是标识符,而不能是数值常量或字符常量。例如以下的定义是错误的:
type daystype=('sun','mon','tue','wed','thu','fri','sat')
  枚举元素是标识符,不要把作为枚举元素的标识符视作变量名,它不能被赋值。同一个枚举元素不能出现在两个或两个以上的枚举类型定义中。例如以下的定义是错误的:
type daytype1=(monday,tuesday);
daytype2=(monday,wednesday);
  可以将枚举类型的定义和变量的定义结合在一起。例如:var a:(monday,tuesday,sunday)
  枚举类型属于顺序类型。根据定义类型时各枚举元素的排列顺序确定它们的序列,序列号从0开始。
例如:已经定义daystype
   ord(sunday)=0,succ(sunday)=monday,pred(friday)=thursday
  但是枚举类型中的第一个元素没有前趋,最后一个元素没有后继。Turbo Pascal不允许直接读写枚举值,所以枚举值的输出常用case语句间接的输出。枚举值的输入,则要一一判断读入字符是否是枚举类型的标识符。若是才能赋给枚举变量,否则就会出错。
例如:枚举值的输出
 case day of
  sunday:write('sunday');
  monday:write('monday');
  tuesday:write('tuesday');
  wednesday:write('wednesday');
  thursday:write('thursday');
  friday:write('friday');
  saturday:write('saturday');
 end;

6.3 子界类型
  子界类型是由整型、字符型、枚举型、布尔型的两个常量指定该类型的值域区间。子界类型的形式:
                  常量..常量
  两个常量必须是同一种顺序类型。例如:a..b,要求a<=b
例如:
  type a=1..3;
b='a'..'d';
  一个子界类型继承它的常量类型的运算符和标准函数,常量类型相容的不同子界类型可以混合运算,可以赋值。可以将子界类型的定义和变量的定义结合在一起。例如:var a:1..9
例 按月、日、年顺序读入一日期,输出该日期是这一年中的第几天。
 program date;
  var year:0..2010;
    month,i:1..12;
    day:1..31;
    dayth:integer;
 begin
  read(month,day,year);
  dyath:=0;
  for i:=1 to month-1 do
   case i of
    1,3,5,7,8,10,12:dayth:=dayth+31;
    2:if ((year mod 4=0)and(year mod 100<>0)or(year mod 400 =0)
     then dayth:=dayth+29
     else dayth=:=dayth+28;
    4,6,9,11:dayth:=dayth+30;
   end;
  dayth:=dayth+day;
  writeln(dayth)
 end.

6.4 类型相容和赋值相容
1.类型相容性
  类型相容是对参加同一运算的两个对象的类型要求。设有两个变量,如果满足下列条件之一,就说这两个变量的类型相容。
  (1)两个变量的类型相同
     a.两个变量被同一类型说明。
      例如:var a,b:1..30;
     b.两个变量的类型是同一类型标识符。
      例如:var a:1..30;
b:1..30;
     c.两个变量的类型是不同的类型标识符,但在类型定义中已经说明两个标识符相同。
      例如:type date=1..100;
range=date;
        var m:data;
n:range;
  (2)一个变量的类型是另一个变量的子界。
  (3)两个变量的类型都是同一基类型的子界。
  (4)两个变量的类型是基类型相容的集合类型。
  (5)两个变量的类型是成分相同的串类型。
2.赋值相容性
  赋值相容是对赋值操作的两个对象的类型要求。设赋值语句“:=”左边的变量类型为T,右边表达式的类型为E,若类型T和类型E满足下列条件之一,则称他们是赋值相容的。
  (1)T和E是相同的类型,而且类型不是文件类型,也不是具有文件类成分的构造类型。
  (2)T是实型,而E是整型或整型的子界。
  (3)T和E是类型相容的顺序类型,并且E的值不超出T所定义的值的范围
  (4)T和E是类型相容的集合类型,并且E的值不超出T所定义的值的范围
  (5)T和E是类型相容的串类型。
  当T和E是顺序类型或都是集合类型时,不仅要求这两个类型是相容的,而且要求E的值不超出T所定义的值的范围;否则将产生类型溢出,而这种错误只能在你运行程序时进行检查,因此你必须要避免不发生这种错误。

第八章 函数和过程

函数和过程
8.1 函数
  如果一个子程序执行后能够返回其结果制,那么它就可以用于表达式中,称这种子程序为函数,这种语句序列的定义称为函数说明。函数说明形式如下:
 function 函数名(形式参数表):函数类型;
  说明部分;
 begin
  语句1;
  语句2;
  ……
  语句n
 end
  函数返回一个函数值,过程则能完成一系列各种操作。函数的调用方式出现在表达式中,而过程调用是一句独立的语句。
例:计算|X|的函数
  function zhoufei(x:real):real;
   var z:integer;
  begin
   if x>=0 then z:=x
   else z:=-x
   zhoufei:=z;
  end;
  函数说明第一行为函数首部。它指明函数名、函数形参信息和函数值的数据类型。如上面求x绝对值的函数说明,函数名是zhoufei;它有一个值参数X为实型;函数值的数据类型为实型。Turbo Pascal规定一个函数只能求出一个简单值,所以函数值类型只能是任何非结构类型。
  除函数首部和过程首部的句法略有差别外,函数体和过程体完全相同。函数体中至少要有一条语句对函数名赋值。如函数zhoufei 中有语句“power:=z”。函数的每次求值至少要执行这样的一条语句,为次计算求得一个值。返回时就把这个值带调用的地方。
8.2 过程
给某个语句序列组成的子程序赋于一个适当的名字。程序中凡是需要出现这个语句序列的地方,可以简单的写上子程序的名字。这种完成一个操作的子程序称为过程;子程序的定义称为过程说明。
  过程说明由过程首部和过程体组成,其形式如下:
procedure 过程名(形式参数表);-------过程首部
说明部分;
begin
执行语句;
……
end;
例 输出两个数中最大值的过程
procedure largest(a,b:integer);
begin
if a>b then writeln(a)
else writeln(b);
end.
  上面largest过程由两个类型为整型的形式参数:a,b,你向过程传入的两个需要比较大小的数。
8.3 形参和实参
  子程序调用(过程调用或函数调用)的执行顺序分为以下几步:
    实参和形参结合——〉执行子程序——〉返回调用处继续执行
  子程序说明的形式参数表对子程序体直接引用的变量进行说明,详细指明这些参数的类别、数据类型要求和参数的个数。子程序被调用时必须为它的每个形参提供一个实参,按参数的位置顺序一一对应,每个实参必须满足对应形参的要求
  Turbo Pascal子程序形参有四类:
1.值参数
  形式参数表中前面没有var,后有类型的参数。它类似过程和函数的局部变量,仅为过程和函数的执行提供初值而不影响调用时实际参数的值。在调用过程或应用函数时,值参数所对应的实际参数必须是表达式,而且它的值不能使文件类型或包括文件类型的值。实参必须和形参赋值相容。
2.变量参数
  形式参数表中前面有var后由类型的参数。如果需要子程序向调用程序返回值时,应采用变量参数。变量参数要求它的实参是和它同一类型的变量。因为在子程序执行时,遇到对相应形参的引用式定值,就是对相应实参的引用式定值,即对形参的任何操作就是对实参本身的操作。
3.无类型变量参数
  形式参数表中前面有var而后面没有类型的参数。形参是无类型变量,对应的实参允许为任意类型的变量,但要在子程序中设置的强制类型转换(类型名(无类型变量参数名)),将无类型变量参数改变为相应类型。
4.子程序参数
  用过程首部或函数首部作为形式参数。
8.4 标识符的作用域
1.全局变量和它的作用域
  全局变量是指在程序开头的说明部分定义和说明的量。它的作用域分为两种情况:
(1)在全局变量和局部变量不同名时,其作用域是整个程序。
(2)在全局变量和局部变量同名时,全局变量的作用域不包含同名局部变量的作用域。
2.局部变量和它的作用域
  凡是在子程序内部使用的变量,必须在子程序中加入说明。这种在子程序内部说明的变量称为局部变量。局部变量的作用域是其所在的子程序。形式参数也只能在子程序中有效。因此也属于局部变量。局部变量的作用域分为两种情况:
(1)当外层过程序的局部变量名和嵌套过程中的局部变量不同名时,外层过程的局部变量作用域包含嵌套过琛。
(2)当外层过程的局部变量名和嵌套过程内的局部变量名同名时,外层局部变量名的作用域不包含此过程。
第九章 集合与记录
集合与记录
9.1 集合
  以已知序数类型值的集合为值,所构成的类型是集合类型,称已知序数类型为基类型。集合类型的定义形式为:
      集合类型名=set of 基类型
  限定基类型为枚举类型、字符型、布尔型以及它们的子界和整型子界。由于基类型中不能超过256个可能值,且它们的序数值应在0..255之间,因此基类型不能是短整型、整型、长整型。
  表示一个集合值的最通用的方法是逐个枚举集合的元素。下面是集合值标记的例子:
[3,9,15,20] {由3,9,15,20组成的集合}
[ ] {空集}
['l'..'p','z' ]{由字符l,m,n,o,p,z组成的集合}
  两个相连的集合对象之间,可以通过下列运算符进行运算
集合运算符: +
产生一个包含两个集合元素的集合
*
产生一个只包含两个集合元素公共元素的集合

产生一个包含所有属于第一个集合、但不属于第二个机和的元素的集合

例如:[A,B,C]+[D]等于[A,B,C,D]
[A,B,C]*[A]等于[A]
[A,B,C]-[A]等于[B,C]
关系运算符
=
检查两个集合所包含的元素相同
<>
检查两个集合不相等
<=
检查第一个集合中的元素都在第二个集合中出现
>=
检查第一个集合中的元素包含第二个集合中的所有元素
in
检查集合基类型的一个元素属于集合

例如:[A,B,C]=[A,B,C] 等于true
[A,B,C]<>[C,B,A] 等于FALSE
9.2 记录
  记录是描述同一对象的一组类型可能不同的数据的集合。使用记录类型实现了数据逻辑关系和存放形式上的一致。定义记录类型的一般形式
         记录类型名=record
               域名1:类型1;
               域名2:类型2;
               ……
               域名m:类型m;
               end;
例如:表示学生信息的记录定义
type
    stype=record
         name:string[20];
         number:integer;
    sex:(male,female);
  class:1..20
  address:string
         end;
  域为记录类型的元素。记录的每个域都有名称,不同域的数据类型可以各不相同,这一点是数组所不能做到的。引用记录变量的元素采用以下标记法:
(1)直接引用,其形式为
   记录变量名.域名
例如:var str1,str2:stype;
   则str1.name表示学生str1的姓名,str2.sex表示学生str2的性别。
(2)使用with开域语句,其形式为
   with 记录变量名 do 语句
  在with语句中,引用记录变量名不再冠以记录变量名,以简化对记录中域的引用写法。例如描述100个学生的数据信息,引入元素类型为stype的数组students。
  var
   students:array[1..100]of stype;
number_of_boy,number_of _girl,k:integer:
例如下面是一段统计一个班级中男生人数和女生人数的程序。
 begin
  number_of_boy:=0;number_of_girl:=0;
  for k:=1 to 100 do
  with student[k] do
  if sex=male then number_of_boy:=number_of_boy+1
   else number_of_girl:=number_of_girl+1
 end;
  with语句的嵌套结构的一般形式:
  with <记录变量名1> do
   with <记录变量名2> do
    ……
     with <记录变量名n> do
      <语句>;
  使用with嵌套结构时,with的嵌套顺序必须和所打开的记录的嵌套顺序一致,以就是说外层with打开外层记录,内层with打开内层记录。上面的嵌套格式也可以简写为:
  with <记录变量名1,记录变量名2,……,记录变量名n> do
   <语句>;
  若记录是由一部分固定不变和另一部分变化部分是随固定部分中的某个数据项的具体取值而定的数据项所组成的称为记录变体。带记录变体的记录类型定义有以下形式:
  type
   <类型标识符>=record
     <域名1>:<类型1>;
     <域名2>:<类型2>;
     ……
     <域名n-1>:<类型n-1>;
     case <标志域>:<类型n> of
      <常量表1>:<域表1>;
      <常量表2>:<域表2>;
      ……
      <常量表m>:<域表m>;
   end;
例:重新定义描述学生信息的记录类型stype,对于大专生,不需要增加其他信息,对于本科生,增加专业信息。
type
    stype=record
         name:string[20];
         number:integer;
    sex:(male,female);
  class:1..20
  address:string
         case studtype:(s,u) of
          s:( );
          u:(major:string);
         end;
第十章 指针
10.1 指针的动态变量
1.定义指针类型
  在Turbo Pascal中,指针变量中存放的某个存储单元的地址,即指针变量指向某个存储单元。一个指针变量仅能指向某一种类型的存储单元,这种数据类型是在指针类型的定义中确定的,称为指针类型的基类型。指针类型定义如下:
   类型名=^基类型名;
例如:type q=^integer;
   var a,b,c:q;
  说明q是一指向整型存储单元的指针类型,其中"^"为指针符。a,b,c均定义为指针变量,分别可以指向一个整型存储单元。
  上例也可定义为:
    var a,b,c:^integer;
  指针也可以指向有结构的存储单元。
例如:type person=record
        name:string[10];
        sex:(male,female);
        age:20..70
      end;
   var pt:^person;
  pt为指向记录类型person的指针变量。
2.动态变量
  应用一个指针指向的动态存储单元即动态变量的形式如下:
    指针变量名^
例如:p^、q^、r^
  指针变量p和它所指向的动态变量^p之间有如下关系:

P->P'

以下语句把整数5存放到p所指向的动态变量p^ 中去:
p^:=5;
以下语句把p所指向的p^中的值赋给整型变量i:
i:=p^;
如果指针变量p并未指向任何存储单元,则可用下列赋值语句:
p:=nil;
其中nil是Turbo Pascal保留字,表示“空”,相当于C里面的null

10.2 对动态变量的操作
  在Turob Pascal程序中,动态变量不能由var直接定义而是通过调用标准过程new建立的。过程形式为:
    new(指针变量名);
  如果有下列变量定义语句:
   var p:^integer;
  仅仅说明了p是一个指向整型变量单元的指针变量,但这个整型单元并不存在,在指针变量p中还没有具体的地址值。在程序中必须通过过程调用语句:new(p);才在内存中分配了一个整型变量单元,并把这个单元的地址放在变量p中,一个指针变量只能存放一个地址。在同一时间内一个指针只能指向一个变量单元。当程序再次执行new(p)时,又在内存中新建立了一个整型变量单元,并把新单元的地址存放在p中,从而丢失了旧的变量单元的地址。
  为了节省内存空间,对于一些已经不使用的现有动态变量,应该使用标准过程dispose予以释放。过程形式为:dispose(指针变量名);为new(指针变量名)的逆过程,其作用是释放由指针变量所指向的动态变量的存储单元。例如在用了new(p)后在调用dispose(p),则指针p所指向的动态变量被撤销,内存空间还给系统,这时 p的值为 nil。
例:输入两个数,要求先打印大数后打印小数的方式输出,用动态变量做。
 program dongtai;
  type intepter=^integer;
  var p1,p2:intepter;
  procedure swap(var,q1,q2:intepter);
   var p:integer;
  begin
   p:=q1;q1:=q2;q2:=p;
  end;
 begin
  new(p1);new(p2);
  writeln('input 2 data: ');readln(p1^,p2^);
  if p1^
  writeln('output 2 data: ',p1^:4,p2^:$);
 end.

第十一章 类型文件
按数据的二进制代码形式存放时的文件称为类型文件。如果再按照组成类型文件的元素数据结构分,又可以分为有类型文件和无类型文件。其定义为:
   type 类型名=file of 基类型;{有类型文件}
     类型名=file;    {无类型文件}
  例如:var f:file of integer;
     说明f为名的变量对应文件将用于存放整数。
     var g:file;
     说明g为名的变量对应文件的数据无任何规定。
  Turbo Pascal有关类型文件的函数和过程
(1)assign过程
  形式:assign(f,str);
  功能:将文件名字符串str赋给文件变量f,程序对文件变量f的操作代替对文件str的操作。
(2)rewrite过程
  形式:rewrite(f);
  功能:建立并打开一个新的允许写磁盘文件,其文件名必须先由assign过程赋给变量f。这时,指向文件元素的指针指向第一个元素,rewrite过程所建立的文件为空文件。
(3)reset过程
  形式:reset(f);
  功能:打开一个已经存在的磁盘文件,其文件名必须先由assign过程赋给变量f,该文件只能读,指向文件元素的指针指向第一个元素。
(4)read过程
  形式:read(f,var表);
  功能:从磁盘文件f中,将数据依次读到var表表示的各个变量中。
(5)write过程
  形式:write(f,var表);
  功能:将var表所表示的各个变量的值依次写到磁盘文件f上。
(6)close过程
  形式:close(f);
  功能:关闭和f关联的磁盘文件,在写操作时自动产生一个文件结束标志。
(7)seek过程
  形式:seek(f,n);
  功能:把文件指针移到f指明文件的第n个元素。
(8)eof函数
  形式:eof(f);
  功能:若文件指向文件尾,则返回true,否则返回false。
  对有类型文件的写操作步骤为:
   assign(f,str);
   rewrite(f);
   write(f,var表);
   close(f);
  对有类型文件的读操作步骤为:
   assign(f,str);
   reset(f);
   read(f,var表);
   close(f);
例:在磁盘上建立一个1~50的平方数的数据文件zhoufei.dat。要求以一个数,这个数的平方数的格式写入。
  program zhoufei;
   var f:file of integer;
   i:integer;
  begin
   assign(f,'zhoufei.dat');
   rewrite(f);
   for i:=1 to 50 do write(f,i,sqr(i));
   close(f)
  end.
文本文件
  文本文件的内容有ASCII字符集中的字符组成,因此文本文件也称ASCII码文件,它可以用DOS中的type命令列出内容。文本文件具体是由一系列行组成,每一行可以包括0个或多个字符型成分,并以也行结束符结尾,文本文件类型TXT和类型文件file of char区别在于后者不包含行结束符。
  文本文件和类型文件在读写上的差别在于前者只能按次序顺序读写,而后者可以不按照次序读写。适用文本文件的函数和过程除了用于类型文件操作的过程和函数外主要还有:
(1)readln过程
形式:readln(f,var表);或readln(f);
功能:从磁盘文件f中,将数据依次读到var表表示的各变量中(其中readln(f)只读数据),并将文件指针移到行结束符后,就是下一行开头。
(2)writeln过程
  形式:writeln(f,var表)或writeln(f);
  功能:将var表所表示的各个变量的值依次写到磁盘文件f上去(writeln(f)不写值),然后再写一个行结束符。
(3)append过程
  形式:append(f);
  功能:打开一个已经存在的磁盘文件,其文件名必须和assign过程中的变量名f相对应,该文件只能写,此时文件指针指向文件尾。
(4)eoln函数
  形式:eoln(f);
  功能:若文件指针指向行结束符或文件结束符,则返回true,否则返回false。
  对文本文件的写操作步骤:
   assign(f,str);
   rewrite(f);  或append(f);
   write(f,var表);或writeln(f);
   close(f);
  对文本文件的读操作步骤:
   assign(f,str);
   reset(f);  
   readln(f,var表);或readln(f);
   close(f);
例:随机产生30个随机整数存放于文本文件zhoufei.txt 中
  program zhoufei;
   const n=30;
   var ra:text;
     i:integer;
  begin
   randomize;
   assign(ra,'zhoufei,txt');
   rewrite(ra);
   for i:=1 to n do writeln(ra,random(100));
   close(ra)
  end.
谁不怀念苏联,谁就没有良心;谁想回到苏联,谁就没有头脑.

Woodu.ME--从零开始的博客生活

TOP