当前位置:首页 >> 其它课程 >>

洛阳市014子弟学校信息学竞赛辅导 Pascal基础教程


<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>

http://www.zsqz.com/jsbase/pascal 语言概述与基本 基本知识 第一章 Pascal 语言概述与基本知识
1 关于 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
1

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
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

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>

第二章
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.

Pascal 语言基础知识

{说明部分——数据描述}

{执行部分}

上述程序第一行称为程序首部.其中用花括号(注释可以用{ }或(* *)来表示)括起 来的内容是注释,程序第二行就是一个注释,注释除了给人看,增加程序的可读性外,对程 序编译和运行不起作用.一个程序可以包含多个出现在不同处注释,亦可无注释.程序第三 行是常量说明,程序第四行是变量说明.程序从 begin 到 end 都是执行(语句)部分 (1)程序首部 例 1.1 的第一行称为程序首部. program 是保留字, 接着是程序名 (由你依据"标示符" 规则自行定义),最后以分号表示程序首部结束,下面是程序主体的开始.程序首部在一个 Turbo Pascal(仅在 Turbo Pascal 中有效)程序中并非必须出现,它是可选的.写上它仅 起了文档作用.因此,在时间有限的情况下,如果用 Turbo Pascal 编程完全可以省略程序 首部. (2)程序体 a.说明部分

3

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
说明部分用于定义和说明程序中用到的数据, 由单元说明, 标号说明, 常量说明, 类型说明, 变量说明,函数或过程说明组成,并且这些数据的说明次序必须按照以上次序.但是一个简 单的 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

4

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
语句; 语句; …… 语句 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.用户字定义表识符:由你来根据需要定义.
5

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
(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

6

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
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 <变量标识符列表>:<类型>; ...
7

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
<变量标识符列表>:<类型>; 其中, 保留字 var 表示开始一个变量说明部分. 变量标识符列表是一个用逗号隔开的标识符 序列,冒号后面的类型是类型标识符.每个变量说明均以分号结束. 例如: var a,b,c:integer; m,n:real; 2.5 标准函数 1.算术函数 abs 绝对值 exp 指数 frac 小数部分 int 整数部分 ln 自然对数 pi 圆周率 sqr 平方 sqrt 平方根 abs(-4)=4 abs(-7.49)=7.49 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.转换函数

8

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
chr 自量对应的字符 ord 自量对应的序号 longint round 四舍五入 trunc 截断取整 longint 4.杂类函数 random 无自变量 [0,1)之间的随机实数 real random word [0,自变量)之间的随机整数 wird randomize 无自变量 用一随机值初始化内部随机数产生器 longint upcase 字符型 使小写英文字母变为大写 字符型 2.6 运算符和表达式 1.运算符和优先级 (1)运算符 a.算术运算符 运算符 运算 运算对象 结果类型 + 只要有一个运算对象是实型, 结果就是实型, 如果全部的运算对象都是整型并且运算 不是除法,则结果为整型,若运算是除法,则结果是实型 -减 *乘 / 除 div 整除 mod 取余
9

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
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 提供给布尔表达式以下基本操作:逻辑运算和关系运算.

10

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<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 输入语句 通过计算机的外设把数据送到计算机内存的过程称为输入.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)

11

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
输入语句输入的数据类型必须和变量一一对应. 如果输入的是一串整数或实数, 数据间 用空格或回车分隔;若输入的是一串字符,则不用分隔. 例:输入语句示例 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

12

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
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.

第四章

选择结构程序设计

一,if 语句 IF 语句是由一个布尔表达式和两个供选择的操作序列组成.运行时根据布尔表达式求 值结果,选取其中之一的操作序列执行.有两种形式的 IF 语句: if <布尔表达式> then <语句>; if <布尔表达式> then <语句 1> else <语句 2>; 当布尔表达式的值为真,则执行 then 后面的语句,值为假时有两种情况:要么什么也 不做,要么执行 else 后面的语句.注意 else 前面没有分号,因为分号是两个语句之间的分 隔符,而 else 并非语句.如果在该处添了分号,则在编译的时候就会认为 if 语句到此结 束,而把 else 当作另一句的开头,输出出错信息.
13

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
例:求 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 配对. 二,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

14

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
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 重复一样的描述循环计算的能力,但有一些不同:在
15

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
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 语句会使程序出现一种称为"乱面条"的结构,因此你最好还是不要去用.

16

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>

第六章

递归算法 递归算法

将复杂的处理归纳为较简单的处理,直到 最简单的处理.基础为归纳,即通过观察, 得到 3 个内容: 1, 递归的形式; 2, 最基本式是否有解决的方案; 3, 递归终止的条件 1, 某人写了 n 封信和 n 个信封,如果所有的信都装错了信封.求所有的信都装错信封 共有多少种不同情况. 归纳法例子 1.有 n 个硬币(n 为偶数)正面朝上排成一排,每次将 n-1 个硬币翻成朝上为止.编程让计算机把翻硬币的最简过程及翻币次数打印出来(用*代 表正面,用 0 代表反面). 基本形式:D[1]=0;d[2]=1 递归式:d[n]= (n-1)*( d[n-1] + d[n-2]) program lettter; var n:integer; function d(n:integer):longint; begin case n of 1:d:=0; 2:d:=1; else d:=(n-1)*(d(n-1)+d(n-2)); end; end; begin repeat write('n='); readln(n); if n<=0 then writeln('Once more!') until n>0; writeln('d=',d(n)); readln; end. 2, 有一对雌雄兔子,假定两个月便可以繁殖雌雄各一对兔子.问 n 各月后共有多少对 兔子? 递归的三要素: 递归的形式:T[n]= T[n-1]+ T[n-2] 基本:T[1]=1,T[2]=1 结束条件:n 个月 program rabbit; var n:integer; function fa(n:integer):integer;
17

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
begin if n<3 then fa:=1 else fa:=fa(n-1)+fa(n-2); end; begin write('n=');readln(n); writeln('The number of the rabbits:',fa(n)); end. 3 梯有 N 阶,上楼可以一步上一价,也可以一次上二阶.编一个程序,计算共有多少 种不同的走法. 递归的形式:s[n]=s[n-1]+s[n-2] 基本式子:s[1]=1;s[2]=2 program upstairs; var n:integer; function s(n:integer):longint; begin if (n=1)or(n=2) then s:=n else s:=s(n-1)+s(n-2); end; begin repeat write('N=');readln(n); until n>0; writeln('s=',s(n)); readln; end. 4 ,设有 2^n 个运动员要进行网球比赛.现要设计一个满足以下要求的比赛日程表: (1),每个选手必须与其他 n-1 个选手各赛一次; (2),每个选手每天只能参赛一次; (3),循环赛在 n-1 天内结束.program match; const k=3;n=8; var s:array[1..n,1..n] of integer; i,j,p:integer; ju:boolean; procedure copy1(be,en:integer;jug:boolean;q:integer); var m,t,ban:integer; begin if jug then begin if be=1 then begin if s[en,en]=0 then
18

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
begin copy1(be,en div 2,true,q div 2); copy1((en div 2)+1,en,false,q div 2); end; for m:=1 to en do for t:=1 to en do s[m+q,t+q]:=s[m,t] end else begin if s[be+q-1,q]=0 then begin copy1(be,be+(q div 2)-1,true,q div 2); copy1(be+(q div 2),en,false,q div 2) end; for m:=be to en do for t:=1 to q do s[m+q,t+q]:=s[m,t] end end else begin if s[be,q]=0 then begin copy1(be,be+(q div 2)-1,true,q div 2); copy1(be+(q div 2),en,false,q div 2) end; for m:=be to en do for t:=1 to q do s[m-q,t+q]:=s[m,t] end end; begin p:=8; for i:=1 to n do for j:=1 to n do s[i,j]:=0; for i:=1 to n do begin s[i,1]:=i; if odd(i) then s[i+1,2]:=s[i,1] else s[i-1,2]:=s[i,1]; end; copy1(1,n div 2,true,p div 2); copy1((n div 2)+1,n,false,p div 2); for i:=1 to n do begin for j:=1 to n do write(s[i,j],' ');

19

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
writeln; end; end. 思考题 1, 数学宝塔,从最顶上走到最底层,每次只能走到下一层的左边或右边的数字,求 出使所走到的所有数字之和为 60 的途径. 7 4 6 6 9 3 6 3 7 1 2 5 3 2 8 5 9 4 7 3 2 6 4 1 8 5 6 3 3 9 7 6 8 4 1 5 2 5 7 3 5 7 8 4 2 2, 汉诺塔问题: 设有三个塔座,依次命名为 x,y,z.有 z 个直径不同的圆盘,由 小到大依次编号为 1,2,……,n.开始时,它们全部按递减的次序插在塔座上.现要求按 下列规则把 n 个圆盘按次序插放在 z 塔座上. (1),每次只能移动一个圆盘; (2),圆盘可以从任一个塔座上移到另一个塔座上; (3),任何时刻都不能把一个较大的圆盘压在较小的圆盘上.

20

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>

第七章

回溯算法 回溯算法

搜索:全面访问所有可能的情况,分为两种:不考虑给定问题的特有性质,按事先顶 好的顺序,依次运用规则,即盲目搜索的方法;另一种则考虑问题给定的特有性质,选用合 适的规则,提高搜索的效率,即启发式的搜索. 回溯即是较简单,较常用的搜索策略. 基本思路: 若已有满足约束条件的部分解, 不妨设为 (x1,x2,x3,……xi) I<n,则添加 x(i+1) , 属于 s(i+2),检查(x1,x2,……,xi,x(i+1))是否满足条件,满足了就继续添加 x(i+2), s(i+2) , 若 所 有 的 x(i+1) 属 于 s(i+1) 都 不 能 得 到 部 分 解 , 就 去 掉 xi , 回 溯 到 (xi,x2,……x(i-1)),添加那些未考察过的 x1 属于 s1,看其是否满足约束条件,为此反复 进行,直至得到解或证明无解. 八皇后问题. 例 1 八皇后问题. program eightqueens; var x:array[1..8] of integer; a,b,c:array[-7..16] of boolean; i:integer; procedure print; var k:integer; begin for k:=1 to 8 do write(x[k]:4); writeln; end; procedure try(i:integer); var j:integer; begin for j:=1 to 8 do if a[j] and b[i+j] and c[i-j] then begin x[i]:=j; a[j]:=false; b[i+j]:=false; c[i-j]:=false; if i<8 then try(i+1) else print; a[j]:=true; b[i+j]:=true; c[i-j]:=true end end; begin for i:=-7 to 16 do begin

21

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
a[i]:=true; b[i]:=true; c[i]:=true end; try(1); end. 跳马问题. 例 2 跳马问题.在 5*5 格的棋盘上,有一个国家象棋的马,它可以朝 8 个方向跳, 但不允许出界或跳到已跳过的格子上,要求在跳遍整个棋盘后再条回出发点. program jump; var h:array[-1..7,-1..7] of integer; a,b:array[1..8] of integer; i,j,num:integer; procedure print; var i,j:integer; begin num:=num+1; if num<=5 then begin for i:=1 to 5 do begin for j:=1 to 5 do write(h[i,j]:4); writeln; end; writeln; end; end; procedure try(x,y,i:integer); var j,u,v:integer; begin for j:=1 to 8 do begin u:=x+a[j]; v:=y+b[j]; if h[u,v]=0 then begin h[u,v]:=i; if i<25 then try(u,v,i+1) else print; h[u,v]:=0 end; end; end; begin

22

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
for i:=-1 to 7 do for j:=-1 to 7 do if (i>=1)and(i<=5)and(j>=1)and(j<=5) then h[i,j]:=0 else h[i,j]:=1; a[1]:=2;b[1]:=1; a[2]:=1;b[2]:=2; a[3]:=-1;b[3]:=2; a[4]:=-2;b[4]:=1; a[5]:=-2;b[5]:=-1; a[6]:=-1;b[6]:=-2; a[7]:=1;b[7]:=-2; a[8]:=2;b[8]:=-1; num:=0; h[1,1]:=1; try(1,1,2); writeln('num=',num); end. 思考题 1, 试编程找出下列字母方阵中所隐含的单词 "fujian",单词中字母的走向可以是图的 编号为 1----8 的 8 个方向,要求打印的格式为: (x,y),a1,a2,a3,a4,a5 (其中(x,y)为首字母"f"所在的行,列坐标,a1,a2,a3,a4,a5 为后续每个字母相对前一个 字母的代号. f j n u i j u i u a a n j f i n j n u i j j f i a u u n i n n n f a u f

23

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>

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

枚举型和子界型

8.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; 8.3 子界类型 子界类型是由整型,字符型,枚举型,布尔型的两个常量指定该类型的值域区间.子界
24

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
类型的形式: 常量..常量 两个常量必须是同一种顺序类型.例如:a..b,要求 a<=b 例如: type a=1..3; b='a'..'d'; 一个子界类型继承它的常量类型的运算符和标准函数, 常量类型相容的不同子界类型可 以混合运算, 可以赋值. 可以将子界类型的定义和变量的定义结合在一起. 例如: a:1. 9 var . 例 按月,日,年顺序读入一日期,输出该日期是这一年中的第几天. 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. 8.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;

25

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
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 所定义的值的范围; 否则将产生类型溢出, 而这种错误只能在你运行程序时进 行检查,因此你必须要避免不发生这种错误.

26

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>

数组及其应用 第九章 数组及其应用
1.数组的定义 数组是程序中最常用的结构数据类型, 用来描述由固定数目的同一类型的元素组成的数 据结构.数组的每个元素和下标相关联,根据下标指示数组的元素.数组的存储方式为按行 存储,在编译阶段,计算机根据数组的类型说明,确定其存储空间的大小.数组可以是任何 顺序类型. 数组的定义形式: array [<下标类型 1>,……<下标类型 n>] of <元素类型> 其中 n 称为数组的维数, 每维的下标类型必须是一个顺序类型, 通常为子界类型或枚举 类型,其作用是指定数组下标的编制方式和下标取值范围. 例如: type color=(red,yellow,blue); sample1=array [1..10]of integer;{有 10 个元素的一维数组} sample2=arrayp[1..5,1..5]of real;{有 25 个元素的二维数组,依次按[1,1]……,[1, 5],[2,1]……,[2,5],……[5,1],……[5,5]} 2.数组的操作 当数组的元素类型为简单类型时,其下标变量和简单类型变量一样使用.例如: a[50]:=50; a[20]:=a[5]; 一个数组, 下标的起始值和终止值是在类型定义中给定的, 不能在程序执行中再通过其 他途径来改变, 所以数组元素的个数在程序运行期间是固定不变的. 数组变量作为整体仅允 许同类型数组之间的赋值运算. 例如:var x,y:array[1..10]of integer; x::=y 例:读入5个学生的学号和成绩,计算他们的平均分,若比平均分高10分的等第为 A,若 比平均分高小于10分的等地为 B,若低于平均分,则等第为 C,输出他们的成绩和等第. program sample7d1(input,output); const n=5; type no=array[1..n] of integer; s=array[1..n]of real; var i:integer; k:real; num:no; score:s; begin k:=0; for i:=1 to n do begin readln(num[i],score[i]); k:=k+score[i];

27

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
end; k:=k/n; for i:=1 to n do begin write(num[i],score[i]); if (score[i]-k)>=10 then writeln('A') else if((score[i]-k)<10)and((score[i]-k)>0) then writeln('B') else writeln('C'); end; end. 3,字符串 为了使程序能够处理文字信息,Turbo Pascal 特别引入了字符串类型,其值表示一个 具有可变长度的字符序列.字符串类型定义形式为: strign[n]或者 string 其中正整数 n(1<=n<=255)表示构成字符串的字符最多个数,即通常所说的字符串最大 长度.而字符串的实际长度决定程序运行时的实际字符个数,可以由函数 length 返回.若 字符串说明中没有指定长度,缺省值为 255. 字符串类型定义字符串连接操作'+', 是将两个字符串连接成新字符串. 连接操作允 许字符串类型和字符串类型混合运用. 字符串常量可以通过常量说明语句 const 字符串常量名:string[n]='字符串'; 规定其常量的串长 n,并赋初值.例如:const head:string[7]='zhoufei'; Turbo Pascal 还提供了不少预定义函数和过程: (1)字符串函数 函数名 自变量及类型 意义 结果类型 concat s1[,s2……,sN]:string 连接字符串序列 string copy s:string,index,count:integer 返回串 s 的一个子串 string length s:string 返回串 s 的动态长度 integer pos substr,s:string

28

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
返回子串 substr 在串 s 中的起始位置 byte (1)字符串过程 过程名 自变量及类型 意义 delete var s,source:string;index,count:integer 从串 S 中删除一个子串 insert var s:string;index:integer; 在串 S 中插入一个指定子串 str var x[:width[:Decimals]];s:string 把一数值转换成相应的字符串表示 val var s:string;code:integer 把一字符串转换成相应的数值 例:字符串函数调用示例 program samplefun; const tur='turbo'; pas='pascal'; var st:string[60]; p:byte; begin st:=concat(tur,pas,'is better than','stand',pas,'.'); writeln(st); writeln(length(st)); st:=copy(st,29,15); writeln(st); p:=pos(pas,st); writeln(p); p:=pos(tur,st); writeln(p); end. 例:字符串过程调用示例 program guocheng; const typedstring:string='turbo pascal is better than standard pascal.'; total:real=388.4;
29

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
var totalstring:string[60]; integervalue:integer; realvalue:real; status:integer; begin delete(typedstring,13,40); writeln(typedstring); insert('using',typedstring,1); writeln(typedstring); str(total:8:2,totalstring); writeln(totalstring); str(total,totalstring); writeln(totalstring); val('-33',integervalue,status); writeln(integervalue,'':2,status); val('-33.99',realvalue,status); writeln(realvalue:6:2,'':2,status); end.

第 十章

函数和过程

一,函数 如果一个子程序执行后能够返回其结果制, 那么它就可以用于表达式中, 称这种子程序 为函数,这种语句序列的定义称为函数说明.函数说明形式如下: 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 为实型;函数值的数据类

30

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
型为实型.Turbo Pascal 规定一个函数只能求出一个简单值,所以函数值类型只能是任何 非结构类型. 除函数首部和过程首部的句法略有差别外, 函数体和过程体完全相同. 函数体中至少要 有一条语句对函数名赋值.如函数 zhoufei 中有语句"power:=z".函数的每次求值至少 要执行这样的一条语句,为次计算求得一个值.返回时就把这个值带调用的地方. 二,过程 给某个语句序列组成的子程序赋于一个适当的名字. 程序中凡是需要出现这个语句序列的地 方,可以简单的写上子程序的名字.这种完成一个操作的子程序称为过程;子程序的定义称 为过程说明. 过程说明由过程首部和过程体组成,其形式如下: procedure 过程名(形式参数表);-------过程首部 说明部分; begin 执行语句; …… end; 例 输出两个数中最大值的过程 procedure largest(a,b:integer); begin if a>b then writeln(a) else writeln(b); end. 上面 largest 过程由两个类型为整型的形式参数:a,b, 你向过程传入的两个需要比较大 小的数. 三,形参和实参 子程序调用(过程调用或函数调用)的执行顺序分为以下几步: 实参和形参结合——〉执行子程序——〉返回调用处继续执行 子程序说明的形式参数表对子程序体直接引用的变量进行说明, 详细指明这些参数的类 别,数据类型要求和参数的个数.子程序被调用时必须为它的每个形参提供一个实参,按参 数的位置顺序一一对应,每个实参必须满足对应形参的要求 Turbo Pascal 子程序形参有四类: 1.值参数 形式参数表中前面没有 var,后有类型的参数.它类似过程和函数的局部变量,仅为过 程和函数的执行提供初值而不影响调用时实际参数的值. 在调用过程或应用函数时, 值参数 所对应的实际参数必须是表达式, 而且它的值不能使文件类型或包括文件类型的值. 实参必 须和形参赋值相容. 2.变量参数 形式参数表中前面有 var 后由类型的参数. 如果需要子程序向调用程序返回值时, 应采 用变量参数.变量参数要求它的实参是和它同一类型的变量.因为在子程序执行时,遇到对 相应形参的引用式定值, 就是对相应实参的引用式定值, 即对形参的任何操作就是对实参本 身的操作. 3.无类型变量参数 形式参数表中前面有 var 而后面没有类型的参数. 形参是无类型变量, 对应的实参允许

31

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
为任意类型的变量, 但要在子程序中设置的强制类型转换 (类型名(无类型变量参数名)), 将无类型变量参数改变为相应类型. 4.子程序参数 用过程首部或函数首部作为形式参数. 四,标识符的作用域 1.全局变量和它的作用域 全局变量是指在程序开头的说明部分定义和说明的量.它的作用域分为两种情况: (1)在全局变量和局部变量不同名时,其作用域是整个程序. (2)在全局变量和局部变量同名时,全局变量的作用域不包含同名局部变量的作用域. 2.局部变量和它的作用域 凡是在子程序内部使用的变量, 必须在子程序中加入说明. 这种在子程序内部说明的变 量称为局部变量.局部变量的作用域是其所在的子程序.形式参数也只能在子程序中有效. 因此也属于局部变量.局部变量的作用域分为两种情况: (1)当外层过程序的局部变量名和嵌套过程中的局部变量不同名时,外层过程的局部变量作 用域包含嵌套过琛. (2)当外层过程的局部变量名和嵌套过程内的局部变量名同名时,外层局部变量名的作用域 不包含此过程.

32

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>

第十一章 集合与记录 十一章
一,集合 以已知序数类型值的集合为值,所构成的类型是集合类型,称已知序数类型为基类型. 集合类型的定义形式为: 集合类型名=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 记录 记录是描述同一对象的一组类型可能不同的数据的集合. 使用记录类型实现了数据逻辑 关系和存放形式上的一致.定义记录类型的一般形式
33

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
记录类型名=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 打开内层记录.上面的嵌套格式也可以简写为:

34

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
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;

35

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>

第十二 第十二章 指针
一,指针的动态变量 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 二,对动态变量的操作 在 Turob Pascal 程序中,动态变量不能由 var 直接定义而是通过调用标准过程 new 建 立的.过程形式为: new(指针变量名); 如果有下列变量定义语句:
36

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
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.

37

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>

第十三章

类型文件

按数据的二进制代码形式存放时的文件称为类型文件. 如果再按照组成类型文件的元素 数据结构分,又可以分为有类型文件和无类型文件.其定义为: 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 表);

38

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
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);

39

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
对文本文件的读操作步骤: 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.

40

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>

第十四章

实数类型

一个实型数据用来存放实数.Turbo Pascal 支持五种预定义实型,它们是基本实型 (Real),单精度实型(Single),双精度实型(Double),扩展实型(Extended)和装配 实型(Comp).每一种类型规定了相应实数取值范围,其所占内存字节数,以及它们所能达 到的精度即有效数字位数:类型 取值范围 占字节数 有效位数 数字协处理器 说明 Real 2.9E-39~1.7E+38 6 7~8 不需要 速度慢 Single 1.5E-45~3.4E+38 4 11~12 需要 Double 5.0E-324~1.7E+308 8 15~16 需要 Extended 1.9E-4951~1.1E+4932 10 19~20 需要 Comp -2^63~2^63-1 8 19~20 需要 自动取整 所有的程序都可使用基本实型 Real,而对其它四种类型 Single,Double,Extended 和 Comp,则要求系统提供数字协处理器----8087,80287 或 80387 芯片,或者由软件模拟的仿 真程序.前者的优点是提高对实型数据的处理速度,并减少舍入误差.Turbo Pascal 为后 者提供了仿真程序. 可以根据具体的计算机配置, 使用 IDE 中菜单项选择或在程序中使用编 译指示,来确定采用哪种方式. 使用实数类型需要的编译注释 除了基本实型 Real,其它四种类型 Single,Double,Extended 和 Comp 都要求系统提 供数字协处理器.无论使用数字协处理还是用仿真程序代替,都应用编译注释声明:{$N+}.

41

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>

第十五章 设置正文文件缓冲区
Pascal 的 System 单元提供了一个过程 SetTextBuf, 它可以对一个正文文件设置一个输 入输出缓冲区,以提高文件输入输出操作的速度.它的定义如下: procedure SetTextBuf(var F:Text;var Buf[;Size:Word]); 注意,不要对已打开的正文文件使用此过程,否则可能会遗失数据. 例子 下面是设置正文文件缓冲区的例子: var Buf:array[0..4095] of Byte;{此处可以是任何类型,空间越大,文件读取速度越快} F:Text; begin Assign(F,'Text.txt'); SetTextBuf(F,Buf,SizeOf(Buf)); Reset(F); ...{这里可以对正文文件 F 进行读写操作.} Close(F); end.

第十六章

编译模式

在 Pascal 的 IDE 下,打开菜单 Compile,选择项目 Target,会弹出一个窗口,有三种 选择:Real mode Application,Protected mode Application 和 Windows Application. 这其实就是选择程序(或单元)的编译模式,分别对应的编译模式为:DOS 实模式,保护模 式和 Windows 模式. 选择不同的编译模式编译程序或单元,会生成不同类型的程序,运行在不同的环境中, 使用相应模式的单元. 不同编译模式的程序可以使用的标准单元有所不同; 即使是同一个单 元,在不同的编译模式下,代码也可能略有不同. 用不同的编译模式编译程序是 BP7 比 BP6 新增的一项重要功能. 不同的编译模式 DOS 实模式(Real mode) 这是默认的编译模式,TP7 和其以前的版本都是使用这种编译模式的.程序运行在 DOS 实模式环境中,只能使用最大 640KB 的常规内存,速度较快,生成代码较短.DOS 实模式的 单元文件扩展名为.tpu;

42

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
保护模式(Protected mode) DOS 是一个实模式的操作系统,只能管理 640KB 的常规内存,对于拥有数十至数百 MB 的扩充内存则无法访问.为了弥补 DOS 的这个缺陷,各大计算机公司联合制定了一个叫做 "DOS 保护模式界面"(DPMI)的协定,以规范保护模式下程序的运行.DPMI 是对 DOS 的扩 展.在 DPMI 协议之下,DOS 应用程序可以访问计算机的所有内存.而 Pascal 的保护模式, 就是使用这个规范的的一种编译模式. 程序运行在 DOS 保护模式环境中,能使用扩充内存,速度略有下降,不能调试.生成的 EXE 文件有时需要把 Pascal 的附带文件 rtm.exe 复制到同一目录下才能运行.保护模式的 单元文件扩展名为.tpp; 在保护模式下,System 单元有两个 Word 类型变量:HeapBlock 和 HeapLimit.它们影 响程序使用扩充内存的性能. 如果使用默认值, 即不对其进行修改, 不能充分利用扩充内存, 经常只能使用到总内存的一半.我经过多次试验,发现把它们都赋值为 64000 时,较能充分 利用扩充内存. Windows 模式(Windows) 这是用以编写 Windows 3.x 应用程序的编译模式,我觉得没什么用,现在 Pascal 程序 员编写 Windows 程序都用 Delphi 了.Windows 模式的单元文件扩展名为.tpw. 编写适应不同编译模式的程序 在不同的编译模式下,标准单元的代码有所不同.要编写适应不同编译模式的程序,就 要使程序在不同的编译模式下生成不同的代码.这需要用到条件编译注释. 例如,如果在程序的一部分中,当使用实模式编译时用代码 A,使用保护模式编译时用 代码 B,就可以这样编写: {$IFDEF MSDOS} A {$ENDIF} {$IFDEF DPMI} B {$ENDIF}

第十七章

编译指示

Pascal 借助于一系列编译指示来控制整个编译过程.这是 Pascal 编译器的一大特点. 系统已规定好每一种编译指示的缺省值,藉以缩短代码长度,加快执行速度.同时,系统也 允许用户根据需要和习惯来设置某个或某些编译指示的缺省值, 或者在程序中按要求设置特 定的编译指示.

43

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
在 Pascal 的 IDE 下,打开菜单 Options,选择项目 Compiler,它将显示所有的编译指 示以及它们的缺省值.可以对这些缺省值进行修改.一旦认可之后,便可作为系统新的编译 指示缺省值,将影响以后对源程序的编译. 在程序中设置编译指示 编译指示写成具有特殊语法的注释形式. 它以左花括号开头, 紧跟一个美元符号"$", 后跟有关信息, 而以右花括号结尾. 程序中凡是可以使用注释的地方, 均可以出现编译指示. Pascal 共有三种类型的编译指示: 1.开关编译指示——通过在指示字母后面指定+或-来打开或关闭某种编译性能; 2.参数编译指示——指定影响编译的参数如文件名,单元名或内存设置等; 3.条件编译指示——根据用户定义的条件符对部分源程序进行条件编译. 例如: {$R+}表示进行下标范围检查; {$D-,I-,S-}表示不产生调试信息,不检查 I/O 错误,不检查栈空间域是否溢出; {$I Types.inc}表示在该编译指示所在位置把文件 Types.inc 的源代码嵌入正在编译的 正文中; {$M 65520,8192,655360}表示指定栈大小为 65520 字节, 堆最小值和最大值分别为 8192 和 655360 字节. {$IFDEF MSDOS}……{ENDIF}表示在 DOS 实模式下编译时编译省略号部分,否则忽略. 编译指示表 开关编译指示表;常用参数编译指示表;条件编译指示表.

第十八章
字母 缺省值 类型

开关编译指示表
实模式 保护模式 Windows 含义 具体含义 所有大于 1 字节的变 按字地址 对齐 量或类型 常数均从 偶地址开 始存放.

A

A+

全程







+

44

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
变量或类 型常数均 简单地放 在下一可 用地址. + 执行完全 布尔计值. 执行短路 布尔计值. 将调试信 息保存在 一个行号 + D D+ 全程 √ √ √ 调试信息 开关 表中,以供 当运行出 错时指示 错处. 不产生调 试信息行 号表. 不出现 8087 数字 + 浮点运算 仿真 协处理器 时运算允 许用运行 库仿真. 必须有 8087 数字 协处理器 才能进行 浮点运算. 对子程序 + 的调用总 是远程调 用. F F局部 √ √ √ 强制远程 调用 由 Pascal 自动选择 对子程序 的调用方 式——远 程调用或 近程调用.

B

B-

局部







布尔计值 控制

-

E

E+

全程







45

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
编译器使 用 80286 的 附加指令 以改善代 + G G全程 √ √ √ 产生 286 代 码 码生成,但 所编译的 代码不能 在 8088 或 8086 上运 行. 编译器只 产生通常 的 8086 指 令. 由系统执 + I I+ 局部 √ √ √ I/O 出错检 查 行 I/O 出错 检查. 系统不执 行 I/O 出错 检查. K K+ 全程 √ 产生某一 模块的局 部符号信 息,使 IDE 可检查和 修改模块 + L L+ 全程 √ √ √ 局部符号 开关 的局部变 量.如果调 试信息开 关置为 {$D-},则 忽略{$L+} 编译指示. 不产生某 一模块的 局部符号 信息. 使用数字 N N全程 √ √ √ 数字协处 理器 协处理器, + 以硬件实 现各类实 型数运算.

46

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
不使用数 字协处理 器,实型数 运算以软 件实现. 控制产生 覆盖代码. 经常与强 制远调用 编译指示 O O全程 √ 产生覆盖 代码 + {$F+}连 用,以满足 覆盖管理 程序远程 调用的要 求. 不产生覆 盖代码. string 类 型的字符 串实参不 预先确定 + 最大长度, 调用子程 序时自动 设为与实 际参数类 型一致. 不使用不 定长字符 串参数,与 旧版本兼 容. 整数运算 + Q Q局部 √ √ √ 整数溢出 检查 检查溢出 错误. 整数运算 不检查溢 出.

P

P-

全程







不定长字 串参

47

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
对运行时 所有数组 和字符串 的下标表 达式检查 下标范围 检查 + 其值是否 越界,并对 标量和子 界的测试 值检查是 否在指定 范围内. 不执行上 述检查. 在每次子 程序调用 S S+ 局部 √ √ √ 栈空间域 检查 + 前检查是 否有足够 的栈空间. 不执行上 述检查. @操作返回 + T T局部 √ √ √ 指针类型 检查 结果类型 为类型指 针. @操作返回 结果类型 为无类型 指针. 对于在子 程序中作 为变量参 数传递的 字符串类 型进行严 V V+ 局部 √ √ √ 串长匹配 检查 + 格检查,要 求实在参 数与形式 参数属于 同一命名 类型,即字 符串长度 必须一致.

R

R-

局部







48

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
不进行串 长匹配检 查,即允许 实在参数 与形式参 数类型中 的字符串 长度不匹 配. W W+ 局部 √ 函数调用 可用语句 + 扩充词法 开关 形式表示, 此时函数 结果值可 予抛弃. 函数调用 按通常形 式,只能出 现在表达 式中. 把单元中 的符号信 息记录在 + Y Y+ 全程 √ √ √ 符号索引 信息 单元编译 文件中,供 IDE 浏览器 使用. 不记录单 元中的符 号信息.

X

X+

全程







49

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>

第十九章

从一题多解看解题方法

信息学竞赛,要求学生有很强的思维能力和逻辑推理能力.下面通过一题多解,层层深 入, 希望能够起到抛砖引玉的作用. 题目: 1×2×3×……×n 所得的数末尾有多少个 0? 求 (1000〈n〈10000)即:若把 n!分解成 b×10 x 形式,其中 b 为不能被 10 整除的正整数, 求 x 为多少? 看到这个题目,一般读者想到计算机的运算速度那么快,可以先求出 1×2×3×...×n 这个数,再数出后面的 0 的个数,可是计算机的长整型也只能表示出 10 位有效数字,而 n 的阶乘(1000〈n〈10000)有上万位数,计算机能表示出来吗?所以这种方法行不通,我们 必须想出其它的方法来解决这个问题,在这里我们用 PASCAL 语言提供三种方法. 方法一:采用从 1 乘到 n,每乘一个数判断一次,若后面有 0 则去掉后面的 0,并记下 去掉的 0 的个数. 我们是求后面的 0 的个数, 与前面一些数无关, 为了不超出数的表示范围, 去掉前面与 0 无关的数,只保留三位有效数,当乘完 n 次后就得到 0 的个数. program ex1; var i,ii,n:integer; sum:longint; begin ii:=0; sum:=1; write('please input n:'); readln(n); for i:=1 to n do begin sum:=sum*i; while sum mod 10=0 do begin sum:=sum div 10; ii:=ii+1; end; sum:=sum mod 1000; end; writeln(ii:6); end. 方法二:第一种方法能得到正确的结果,可是运行的次数太多了,在 1×2×3×...×n 这些数中有些与生成 0 无关的数(如 3,7,9,13 等)可以不考虑进去,其实影响生成 0 的数只有 2 的倍数和 5 的倍数,如在 1 到 9 这些数中只有 2×5,4×5,6×5,8×5,这些 数能生成 0,从这些数中我们还可以看出,真正影响生成 0 的是 5 的倍数,这些数的分解数 含 2 的数显然多于含 5 的数,因此我们可以得出这样一个结论:n!的分解数中有多少个 5, 末尾就有多少个 0.这样就可以使外面的大循环的次数减少五分之四. program ex2; var i,ii,j,n:integer; begin j:=5;ii:=0;

50

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
write('please input n:'); readln(n); while j<=n do begin i:=j; while i mod 5 =0 do begin i:=i div 5; ii:=ii+1; end; j:=j+5; end; writeln(ii:6); end. 方法三:第二种方法是把含 5 的数转变成含 0 的数,再求 0 的个数,我们已经知道 n! 的分解数中有多少个 5 就有多少个 0,我们可不可以直接求 5 的个数呢?答案是肯定的.这 种方法就是根据含 5 的个数求 0 的个数,用层层剥皮法.先以 5 为步长,执行一次循环,进 行第一次剥皮,求出含 5 的个数(个数为 n/5 取整),通过第一次剥皮 5,10,15,20,25, 30...变成 1,2,3,4,5,6...再以 5 2 为步长,执行第二次循环,进行第二次剥皮,求 出含 5 2 的个数(个数为 n/25 取整),在第一次剥皮后 25,50,75,100,125,150…… 这些数变成 5,10,15,20,25,30……再经过第二次剥皮就变成 1,2,3,4,5,6……再 以 5 3 为步长……直到步长大于或等于 n 退出循环,具体实现如下: program ex3; var i,ii,n:integer; begin write('please input n:'); readln(n); i:=n; ii:=0; while i>=5 do begin i:=i div 5 ; ii:=ii+i; end; writeln(ii:6); end. 这三种方法,从常规思维到方法一,从方法一到方法三,思维过程步步加深,循环次数 成倍减少,方法一与方法二外循环次数分别为 n 次和 n/5 次,里面还有内循环,方法三只需 √n 次循环,笔者实习期间曾以此题为竞赛题目考查学生的思维能力,推理能力,激发学生 学习计算机的兴趣,起到了很好的效果.

51

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
附录 1:二级 PASCAL 考试大纲 基本要求 1.具有计算机的基础知识. 2.了解操作系统的基本概念,掌握常用操作系统的使用. 3.掌握基本数据结构和常用算法,熟悉算法描述工具——流程图的使用. 4.能熟练地使用一种高级语言或数据库语言编写程序,调试程序. 考试内容 一,基础知识与基本操作 (一) 基础知识 1.计算机系统的主要技术指标与系统配置. 2.计算机系统,硬件,软件及其相互关系. 3.微机硬件系统的基本组成.包括:中央处理器(运算器与控制器),内存储器(RAM 与 ROM), 外存储器(硬盘, 软盘与光盘),输入设备(键盘与鼠标)输出设备(显示器与打印机). 4.软件系统的组成,系统软件与应用软件;软件的基本概念,文档;程序设计语言与语言处 理程序(汇编程 序,编译程序,解释程序). 5.计算机的常用数制(二进制,十六进制及其与十进制之间的转换);数据基本单位(位,字 节,字,字长). 6.计算机的安全操作;计算机病毒的防治. 7.计算机网络的一般知识. 8.多媒体技术的一般知识. (二) DOS 的基本操作 1.操作系统的基本功能与分类. 2.DOS 操作系统的基本组成. 3.文件,目录,路径的基本概念. 4.常用 DOS 操作,包括: 初始化与启动; 文件操作(TYPE,COPY,DEL,REN,XCOPY,ATTRIB); 目录操作(DIR,MD,CD,RD,TREE,PATH); 磁盘操作(FORMAT,DISKCOPY,CHKDSK); 功能操作(VER,DATE,TIME,CLS,PROMPT,HELP); 批处理(批处理文件的建立与执行,自动批处理文件); 输入输出改向. (三) WINDOW 的基本操作 1.Windows 的特点,基本构成及其运行环境. 2.Windows 用户界面的基本元素.包括:窗口,图标,菜单,对话框,按钮,光标等. 3.Windows 基本操作.包括:启动与退出,鼠标操作,窗口操作,图标操作,菜单操作,对 话框操作. 二,PASCAL 语言程序设计
52

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
(一)Pascal 程序的构成 1.源程序的组成语言要素. 2.程序首部,说明部分,执行部分. 3.程序的书写规定. (二)数据的类型及其运算 1.Pascal 的数据类型,定义方法及其使用: ⑴标准类型(实型,整型,布尔型和字符型). ⑵用户自定义类型(枚举类型,子界类型). ⑶构造类型(数组类型,集合类型,记录类型,文件类型). ⑷指针类型. 2.运算符和表达式(包括算术型,集合型,关系型和布尔型). 3.数据类型的相容性. (三)基本语句 1.赋值语句. 2.输入输出语句及其格式控制. 3.复合语句. (四)选择结构程序设计 1.用 IF 语句实现选择结构. 2.用 CASE 语句实现多分支选择结构. 3.选择结构的嵌套. (五)循环结构程序设计 1.FOR 循环结构. 2.REPEAT 循环结构. 3.WHILE 循环结构. 4.循环结构的嵌套. (六)数组 1.一维数组和多维数组的基本概念,定义方法和引用数组元素的方法. 2.压缩数组的概念. 3.字符串和字符数组. (七)过程和函数 1.过程与函数的概念. 2.标准过程和标准函数. 3.过程和函数的定义方法和调用方法. 4.形式参数和实在参数的结合,值参数和变量参数的使用. 5.过程和函数的递归调用. 6.标识符的作用域(全程量的局部量). (八)动态数据结构 1.指针变量的概念. 2.动态存储单元的开辟,释放和引用. 3.单向链表和循环链表的操作. (九)文件 1.文件的概念. 2.文件的基本操作(建立,打开,关闭,存取).

53

<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>>
三,上机操作 在指定的时间内使用微机完成下述操作: 1.完成指定的计算机基本操作(包括机器启动和操作命令的使用). 2.按给定要求编写和运行程序. 3.调试程序,包括对给出的不完善的程序进行修改和补充,使之能得到正确的结果.

2:开拓奥赛思路 附 2:开拓奥赛思路 提升创新能力
------IOI2000 媒体座谈会纪要 2000 国际信息学奥林匹克竞赛(简称 IOI2000)于 2000 年九月在北京召开.本次大会 将秉承 IOI 的一贯宗旨:宣传信息学,开拓教育新思路,激励青少年,加强国际间的青少年 和教育界之间的交流.为更好的宣传和报道,IOI2000 宣传与媒体委员会于 2000 年 2 月 24 日在科技会堂召集在京各大媒体举行情况通报座谈会,研究商讨 IOI2000 的宣传事宜. 参加座谈会的新闻单位有:中央电视台-7(梁伟等),北京有线台(刘浩),中国教育 电视台(张舒萍),中央人民广播电台(潘晓闻),《中国青年报》(谢湘),《中国计算 机报》(刘寻),《电脑报》(廖天华),《电脑爱好者》(贾欣),《少年电脑报》(黄 继伟等).《人民日报》:杨健,《计算机世界》:侯梅竹(副总编),《网络报》:周中 麟(副总编)因故未到,但打来电话表示非常支持并愿意参与这一活动. IOI2000 执行委员会主席杜子德(中国计算机学会),副主席郑增仪(教育部),蒙星 (中国科协),IOI2000 市场拓展委员会主席保霁虹及秘书处工作人员参加了会议. 会议 由媒体与宣传委员会主席何东平(光明日报社编委)主持.

3:IOI 附 3:IOI 中国代表队脱颖而出
经过两天激战, 代表中国参加 IOI2000 的国家队的队员日前已脱颖而出. 其领队确定由清华 大学年轻的邓俊辉博士担任.他曾连续两年担任 IOI98,IOI99 中国队的副领队. </P><P> 根据国际信息学奥林匹克(IOI)章程的规定,主办国可组成两个参赛队,一个为国家 队, 一个为国家二队.经组队赛选拔,张辰(安徽省芜湖一中),徐静(安徽省芜湖一中),张 一飞(长沙雅礼中学),陈宏(福建师大附中)4 位同学入选国家队;骆骥(安徽省芜湖一 中),郭一(上海复旦附中),谢婧(长沙一中),肖洲(长沙一中)4位同学入选国家二 队. 参加这次组队赛的中国国家集训队选手共 19 名.这些选手是通过'99 全国信息学奥林 匹克竞赛(NOI99)和冬令营两次选拔产生的. </P><P> IOI2000 执委会主席杜子德感 慨说: "最优秀的选手没有从各方面条件相对来说更好一 些的大城市中产生, 是一件非常值 得琢磨和探讨的现象."

54

相关文章:
洛阳市014子弟学校信息学竞赛辅导 Pascal基础教程
洛阳市014子弟学校信息学竞赛辅导 Pascal基础教程_其它课程_高中教育_教育专区。Pascal基础教程<<Pascal 教程>> 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础...
信息学竞赛初级教程
信息学竞赛辅导教程 第一部分 计算机基础知识一、二进制数计算机内信息的存储、...(16) 2.TURBO-PASCAL 系统中整型变量(数)用两个字节来存储,那么整型变量(数...
信息学竞赛教材
信息学奥赛辅导教程 230页 免费 Pascal 教程 199页 免费 信息学奥赛Pascal教程 ...信息学OI基础教程信息学OI基础教程隐藏>> 第一章 算法与程序 信息学奥林匹克竞...
小学信息学奥赛教程
小学信息学奥赛教程_学科竞赛_小学教育_教育专区。目...pascal 语言除了能使用以上规定的基本符号外,不得...宝安区小学信息学奥赛教材参考答案第一章【习题】 一...
信息学竞赛辅导资料
信息学竞赛辅导资料_学科竞赛_高中教育_教育专区。信息学奥赛。。第...比赛中使用的程序设计语言是 PASCAL 或 C/C++。 初赛内容与要求: 1.计算机和...
浅谈如何在信息学竞赛辅导中引导学生学会学习
首先,本人将信息学辅导活动分成三个基本阶段: 入门阶段:培养学生基本的学习态度,掌握竞赛的规范语言 Pascal,熟悉简单 算法; 提高阶段:培养学生自我学习的态度,通晓...
信息学竞赛基础训练题
信息学竞赛基础训练题_六年级其它课程_其它课程_小学教育_教育专区。pascal语言练习题,比赛必备!!PASCAL 语言基础基础训练 第 1 页共 17 页 信息学竞赛基础训练...
中学信息学奥赛培训教程__Pascal
中学信息学奥林匹克竞赛培训教程 中学信息学奥林匹克竞赛培训教程 Pascal 语言和程序设计基础(第一部分) 第一部分) 1 第一部分 Pascal 语言和程序设计基础预备知识...
为了明显起见先举一个最简单的pascal程序例子【例1】
4 洛阳市 014 子弟学校信息学竞赛辅导 <<Pascal 基础教程>> 注意,如果上面程序运行时会出现初始化图形错误,请将系统目录下 BGI 子 目录 EGAVGA.BGI 和 UNITS ...
在信息学奥赛辅导中我的几点做法
随着信息学奥赛的迅速发展, 网络资源不断丰富, 特别是 Pascal 语言、数据结构、算法等基础知识,有些网站介绍比较详细,很有参考价值。 NOIP 复赛,各省队选拔赛、...
更多相关标签:
信息学竞赛 | 算法艺术与信息学竞赛 | 奥林匹克信息学竞赛 | 2016安徽省信息学竞赛 | 高中信息学竞赛 | 合肥市信息学竞赛 | 信息学竞赛学什么 | noip信息学竞赛题目 |