当前位置:首页 >> 其它课程 >> Free Pascal资料

Free Pascal资料


第一章

Pascal 程序的组成

一、Pascal 程序组成 例 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 是保留字, 接着是程序名 (由你依据“标识符” 规则自行定义),最后以分号表示程序首部结束,下面是程序主体的开始。程序首部在一个 Pascal(仅在 Pascal 中有效)程序中并非必须出现,它是可选的。写上它仅起了文档作用。 因此,在时间有限的情况下,编程时完全可以省略程序首部。 (2)程序体 a.说明部分 说明部分用于定义和说明程序中用到的数据,由单元说明、标号说明、常量说明、类型 说明、变量说明、函数或过程说明组成,并且这些数据的说明次序必须按照以上次序。但是 一个简单的 Pascal 程序也可以不包含说明部分,即说明部分是可选的。 b.执行部分 执行部分描述了程序要执行的操作。它必须以一个 Pascal 保留字 begin 开始,以保留 字 end 后跟句点结束, 其间是一些执行具体操作的语句, 并且以分号作为语句之间的分隔符。 begin 和 end 必须成对出现, 紧跟 end 之后的句号表示执行部分的结束, 也表示整个程序的 结束。此后的任何语句都无效。 Pascal 规定紧随 end 之前语句出现的分号允许省略。 (3)一个完全的 Pascal 程序结构

1

program 程序名; uses 已知单元说明; label 标号说明; const 常量说明; type 类型说明; var 变量说明; function 函数说明; procedure 过程说明; begin 语句 1; ?? 语句 n end. (4)Pascal 程序特点 A.有穷性 B.有 0 个或者 N 个输入 C.有 1 个或者 N 个输出 D. 二、Pascal 字符与符号 1.保留字(关键字) 所谓保留字是指在 Pascal 语言中具有特定的含义,你必须了解它的含义,以便于正确 的使用,否则会造成错误。标准 Pascal 语言中的保留字一共有 35 个, Pascal 语言一共有 51 个。下面是 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)标识符的分类:

2

a.标准标识符:指 Pascal 语言预先定义的标识符,具有特殊含义。 以下列举了 Pascal 语言部分常用的标准标识符: 标准常量 False Maxint True 标准类型 Boolean Char Real Integer 标准函数 Abs Chr Eof Ln Odd Ord Pred Round Sqr Sqrt Succ Trunc 等 标准过程 read readln write writeln Dispose Reset Rewrite 等 标准文件 Input Output b.用户自定义标识符:由你来根据需要定义。 (1)选用的标识符不能和保留字相同。 (2)语法上允许预定义的标准标识符作为你定义的的标识符使用,但最好还是不要用。 以下列举了你在定义标识符时可以用的字符:A—Z;a—z;0—9;_ 三、Pascal 数据类型 数据是程序设计的一个重要内容,其重要特征----数据类型,确定了该数据的形、取值 范围以及所能参与的运算。 Pascal 提供了丰富的数据类型,这些数据类型可以分为三大类:简单类型、构造类型 和指针类型,其中简单类型可以分为标准类型(整型、实型、字符型和布尔型)和自定义类 型(枚举型和子界型),构造类型可以分为数组类型、集合类型、记录类型和文件类型。这 些数据类型中除了指针类型是动态数据类型外, 其他的都是静态数据类型。 在这些数据类型 中简单类型都是有序类型, 除了实型以外的简单类型都是顺序类型, 所谓顺序类型就是他们 的值不仅是有序的而且是有顺序号。 在这里主要介绍整型、实型、字符型和布尔型四种常用的数据类型。 1.整型 一个整型数据用来存放整数。Pascal 支持五种预定义整型, 它们是 shortint 短整型) ( 、 integer(整型)、 longint(长整型)、 byte(字节型)和 word(字类型), Pascal 分别用相同的名字作为他们的标识符。 每一种类型规定了相应的整数取值范围以及所占用的 内存字节数。 类型 shortint integer longint byte word 数值范围 占字节数 -128..127 1 -32768..32767 2 -2147483648..2147483647 4 0..255 1 0..65535 2 格式 带符号 8 位 带符号 16 位 带符号 32 位 带符号 8 位 带符号 16 位

Pascal 规定了两个预定义整型常量标识符 maxint 和 maxlonint, 他们各表示确定的常 数值,maxint 为 32767, longint 为 2147483647,他们的类型分别是 integer 和 longint。 2.实型 一个实型数据用类存放实数。 Pascal 支持五种预定义实型, 它们是 real (基本实型) 、 single(单精度实型)、double(双精度实型)、extended(扩展实型)、comp(装配实型),

3

Pascal 分别用相同的名字作为他们的标识符。每一种类型规定了相应的实数取值范围、所 占用的内存字节数以及它们所能达到的精度。 类型 real single double extended comp 数值范围 占字节数 2.9e-39..1.7e38 6 1.5e-45..3.4e38 4 5.0e-324..1.7e308 8 3.4e-4932..1.1e4932 10 -9.2e18~9.2e18 8 有效位数 11..12 7..8 15..16 19..20 19..20

3.布尔型 一个布尔型数据用来存放逻辑值(布尔值)。布尔型的值只有两个:false 和 true,并 且 false 的序号是 0,true 的序号是 1。false 和 true 都是预定义常数标识符,分别表示 逻辑假和逻辑真。boolean 是布尔型的标识符。 用于布尔型的标准函数有 ord(取序号),pred(前导),succ(后继) 注意:false 没有前导,true 没有后继。 用于布尔量的运算有布尔运算(或称逻辑运算),它们是:AND(与),OR(或),NOT(非), XOR(异或)

p

q

p and q p or q p xor q true true true false true true

true true true true false false false true false false false false

false false

对布尔量还可以进行关系运算(或称比较运算)。关系运算有以下 6 种: <(小于),<=(小于等于),=(等于),>(大于),>=(大于等于),<>(不等于) 4.字符型 字符型用 char 作为标识符。字符型必须用单引号括起来,字母作为字符型时,大小写 是不等价的,并且字符型只允许单引号中有一个字符,否则就是字符串。 四、常量与变量 1.常量 (1)常量:在某个程序的整个过程中其值不变的量。 (2)常量定义:常量定义出现在说明部分。它的语法格式是: const <常量标识符>=<常量>; ... <常量标识符>=<常量>; 常量标识符的类型由定义它的常量的类型决定。 例如: const a=12 隐含说明 a 是整型; const r=3.21 隐含说明 r 是实型...... (3)常量定义部分必须以保留字 const 开头,可以包含一个或几个常量定义,而且每个常量 均以分号结束。 (4) Pascal 类型常量
4

类型常量,又称变量常数,它是 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; 五、标准函数 1.算术函数 函数标识符 abs arctan cos exp frac int ln pi sin sqr sqrt 例: abs(-4)=4 abs(-7.49)=7.49 arctan(0)=0.0
5

自变量类型 整型、实型 整型、实型 整型、实型 整型、实型 整型、实型 整型、实型 整型、实型 无自变量 整型、实型 整型、实型 整型、实型

意义 绝对值 反正切 余弦 指数 小数部分 整数部分 自然对数 圆周率 正弦 平方 平方根

结果类型 同自变量 实型 实型 实型 实型 实型 实型 实型 实型 同自变量 实型

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 ord round trunc 4.杂类函数 函数标识符 random random(x) randomize upcase 自变量类型 无自变量 word 无自变量 字符型 意义 结果类型 [0,1)之间的随机实数 real [0,自变量 x)之间的随机整数 wird 用一随机值初始化内部随机数产生器 longint 使小写英文字母变为大写 字符型 自变量类型 byte 型 离散类型 实型 实型 意义 自量对应的字符 自量对应的序号 四舍五入 截断取整 结果类型 字符型 longint longint longint 自变量类型 整型 离散类型 离散类型 意义 判断奇数 求前趋 求后继 结果类型 布尔型 同自变量 同自变量

六、运算符和表达式 1.运算符和优先级 (1)运算符 a.算术运算符 运算符 运算 运算对象

结果类型

6

+ * / div mod

加 减 乘 除 整除 取余

整型、实型 整型、实型 整型、实型 整型、实型 整型 整型

只要有一个运算对象是实型, 结果就是实型, 如果全部的运算对象都是整型并且运算不 是除法,则结果为整型,若运算是除法,则结果是实型。 b.逻辑运算符 运算符 not and or xor c.关系运算符 运算符 = <> < > <= >= (2)优先级 运算符 not *,/,div,mod,and xor,+,-,or in,=,<>,>=,<=,<> 2.表达式 (1)算术表达式:算术表达式是由算术运算符连接常量、变量、函数的式子。算术表达式中 各个运算符的次序为: ( )-->函数-->*,/,div,mod-->+,1 (2)布尔表达式: Pascal 提供给布尔表达式以下基本操作:逻辑运算和关系运算。 七、算法的表示方式 算法是一系列解决问题的清晰指令。
7

运算 逻辑非 逻辑与 逻辑或 逻辑异或

运算对象 布尔型 布尔型 布尔型 布尔型

结果类型 布尔型 布尔型 布尔型 布尔型

运算 等于 不等于 小于 大于 小于等于 大于等于

运算对象 简单类型 简单类型 简单类型 简单类型 简单类型 简单类型

结果类型 布尔型 布尔型 布尔型 布尔型 布尔型 布尔型

优先级 1(高) 2 3 4(低)

一个算法应该具有以下五个重要的特征: 有穷性,确切性,输入,输出,可行性。 算法可以使用自然语言、伪代码、流程图,或者程序语言(比如 Pascal,C,C++,VB)等 多种不同的方法来描述。 要解决具体的问题,分为三个步骤:分析问题,设计算法,编写程序。 例 2:计算 1900 年开始的任意一天是星期几。 1.分析问题 在日常生活中,我们忘记了某天是星期几,一般会从一个已知星期几的某天开始推算, 计算出两个日期相差的天数,然后用相差的天数除以 7 取出余数,就可以推算出星期几了。 但是我们在计算天数时会发现由于可能会经历平年(365 天) 、闰年(366 天) ,每年的不同 月份天数也不相同,这样计算量是很大的,计算也十分困难。 德国数学家克里斯蒂安·蔡勒(Christian Zeller, 1822~1899)在 1886 年推导出了一个解 决此问题的著名的蔡勒公式,w=[c/4]-2*c+y+[y/4]+[13*(m+1)/5]+d-1。 其中,c 是年份的前 2 位,y 是年份的后两位,m 是月份,d 是日数,[]表示取整。如果 月份是 1 月或 2 月,那么要按上一年的 13 月或 14 月来算。 例如:推算 2006 年 1 月 1 日是星期几。 根据蔡勒公式,c=20,y=05(1 月按上一年 13 月来算,同时 y 取上一年的年份) ,m=13 (1 月按上一年 13 来算) ,d=1。 w=[20/4]-2*20+5+[5/4]+[13*(13+1)/5]+1-1=7,可以推算出 2006 年 1 月 1 日是星期日。 2.设计算法。算法流程图如下。 开始

输入年月日

计算 c,y,m,d

w=[c/4]-2*c+y+[y/4]+[13*(m+1)/5]+d-1

w←w mod 7

输出结果星期几

结束 3.编写程序 program day10; var yy,mm,dd:integer; c,y,m,d,w:integer; begin

8

write('input year');readln(yy); write('input mouth:');readln(mm); write('input day;');readln(dd); if(mm=1) or(mm=2) then begin yy:=yy-1; mm:=mm+12; end; c:=yy div 100; y:=yy-c*100; m:=mm; d:=dd; w:=c div 4 -2*c+y+y div 4 +13*(m+1) div 5+d-1; w:=w mod 7; writeln('this is:',w); readln; end. 总结:这个例子用到的算法是解析算法。

第二章 Pascal 程序的三种基本结构
一、顺序结构 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);

9

writeln(b); readln end.

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) 输入语句输入的数据类型必须和变量一一对应。 如果输入的是一串整数或实 数,数据间用空格或回车分隔;若输入的是一串字符,则不用分隔。 例:输入语句示例 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.输出语句 输出是将内存中的数据送到外设的过程。 Pascal 的输出语句有两种形式: write(<输出项表>) writeln(<输出项表>) 其中<输出项表>是一串用逗号分隔的常量、 变量、 函数名、 表达式或字符串。 如果是变量、函数名、表达式,则将其计算结果输出;如果是常量或字符串,则 直接输出其值。 writeln 和 writeln 的区别在于:write 语句是输出项输出后,不换行,光 标停留在最后一项后,writeln 语句按项输出后,自动换行,光标则停留在下一 行的开始位置。 writeln 语句允许不含有输出项,即仅 writeln;表示换行。 Pascal 语言把输出项的数据显示占用的宽度称为域宽,你可以根据输出 格式的要求在输出语句中自动定义每个输出项的宽度。 定义宽度时分为单域宽和 双域宽。
10

(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:16); writeln('r=',r,r:6:1); writeln('c=',c,c:10); writeln('b=',b,not b:10) end. 4.复合语句 复合语句是由若干语句组成的序列,语句之间用分号“;”隔开,并且以 begin 和 end 括起来,作为一条语句。复合语句的一般形式: begin 语句 1; 语句 2; ?? 语句 n; end 例:交换 a,b 两个变量值的值的程序如下: program jiaohuan; var a,b,t:integer; begin
11

a:=10;b:=20; begin t:=a; a:=b; b:=t; end; writeln('a=',a,'b=',b)
end.

总结:T:=a;a:=b;b:=t;是经典的 a,b 两数的值交换位置的语句。
二、分支结构 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. 在 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.

12

注意:当 if 语句嵌套时,Pascal 约定 else 总是和最近的一个 if 配对。 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. 3.分支结构练习 1、 设 X,Y,Z 的值分别是 FALSE,TRUE,FALSE。写出下列逻辑表达式的值: not x and not y; true and x or y; (x and z) or (z and y); x or z and y; 2、 编写一个程序,功能是从键盘输入一个整数,判断它是否二位数,如果是,就打印它。 参考程序如下: program fengzhi2; Var x:integer;

13

Begin Read(x); If (x>=10) and(x<=99) then writeln(x); End. 3、 编写一个程序,功能是从键盘输入三个整数,打印出其中最大的一个值。 4、从键盘读入一个数,判断它的正负。是正数,则输出"+",是负数,则输出"-" 5、输入 a,b,c 三个不同的整数,将它们按由小到大的顺序输出。 参考程序一(用 IF 语句判断输出三数 a,b,c 大小的所有可能(6 种)): program shunxu_1; Var a,b,c:integer; Begin Write(’Input a b c:’); Readln(a,b,c); If(a<b)and(b<c)then write(a:8,b:8,c:8); {其他情况还有几种?请自己完整完成它} End. 参考程序二(利用中间变量 t 让不是小前大后的数交换位置实现排序): program shunxu_2; Var a,b,c,t:integer; Begin Write(’Input a b c:’); Readln(a,b,c); If(a>b) then Begin T:=a; A:=b; B:=t; End; If(a>c) then Begin T:=a; A:=c; c:=t; End; If(b>c) then Begin T:=b; b:=c; c:=t; End; writeln(a:8,b:8,c:8); End. 6、铁路托运行李规定:行李重不超过 50 公斤的,托运费按每公斤 0.15 元计费;如超 50 公斤,超过部分每公斤加收 0.10 元。编一程序完成自动计费工作。

14

7、打印某年某月有多少天。(提示:A、闰年的计算方法:年数能被 4 整除,并且不能被 100 整除;或者能被 400 整除的整数年份。B、利用 MOD 运算可以判断一个数能否被另一个 数整除)。 8、某超市为了促销,规定:购物不足 50 元的按原价付款,超过 50 不足 100 的按九折付款, 超过 100 元的,超过部分按八折付款。编一程序完成超市的自动计费的工作。 参考程序如下: Program fengzhi8; Var s,m:real; Begin Write(’How much:’); readln(s); If (s<=50) then writeln(’Money is the number of’,s:8:2) Else If(s<=100) then Begin M:=50+(s-50)*0.9; writeln(’Money is the number of’,m:8:2); end else begin M:=50+50*0.9+(s-100)*0.8; writeln(’Money is the number of’,m:8:2); end; end.
9、 编写一个程序,功能是从键盘输入 1—12 中的某一个数字,由电脑打印出其对应的月份的英 语名称。 参考程序如下: program fengzhi9; var n:integer; begin write('Input 1~12: readln(n); case n of 1:write('January'); 2:write('February'); {中间语句自行完成} 12:write('December'); else write('Error.') end; readln; ');

end. 三、循环结构 1.while 语句 while 语句用于“当满足某一条件时进行循环”的情况。while 语句的语法格式: while 布尔表达式 do 语句;
15

循环结束条件在进入循环体之前测试, 若最初的测试值为 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; end; writeln(sum:10) end. 总结:sum:=sum+odds;一个经典的累加器语句。即每执行一次,把一个新的值加到变量 sum

中。odds:=odds+2;计数器语句。每执行一次,变量 odds 值往高跳一个数。 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 语句描述。 3.for 语句 for 语句用来描述已知重复次数的循环结构。for 语句有两种形式: (1) for 控制变量:=初值 to 终值 do 语句; (2) for 控制变量:=初值 downto 终值 do 语句; 第一种形式的 for 语句是递增循环。首先将初值赋给控制变量,接着判断控制变量的 值是否小于或等于终值,若是,则执行循环体,在执行了循环体之后,自动将控制变量的值 该为它的后继值,并重新判断是否小于或等于终值。当控制变量的值大于终值时,退出 for 循环,执行 for 语句之后的语句。第一种形式的 for 语句是递减循环。首先将初值赋给控 制变量,接着判断控制变量的值是否大于或等于终值,若是,则执行循环体,在执行了循环

16

体之后,自动将控制变量的值该为它的前趋值,并重新判断是否大于或等于终值。当控制变 量的值小于终值时,退出 for 循环,执行 for 语句之后的语句。for 语句中的初值、终值、 控制变量的数据都必须是顺序类型。当初值和终值确定后,重复的次数就确定不变了,并且 控制变量在重复语句内不能施加任何赋值操作。 例:计算 1+2+3+??+99+100 的值。 program jia; var i,sum:integer; begin sum:=0; for i:=1 to 100 do sum:=sum+i; writeln(sum); end. 循环练习一:宰相的麦子:相传古印度宰相达依尔,是国际象棋的发明者。有一次,国王因 为他的贡献要奖励他,问他想要什么。达依尔说: “只要在国际象棋棋盘上(共 64 格)摆上 这么些麦子就行了:第一格一粒,第二格两粒,??,后面一格的麦子总是前一格麦子数的 两倍,摆满整个棋盘,我就感恩不尽了。 ”国王一想,这还不容易,刚想答应,如果你这时 在国王旁边站着,你会不会劝国王别答应,为什么? 分析: 格子号码 i 当前格麦子数 n 麦子总数 sum 1 1 1 2 2 1+2=3 3 4 1+2+4=7 4 8 1+2+4+8=15 5 16 1+2+4+8+16=31 ? ? ?

参考程序如下: Program maizi; Var I, n, sum: integer; Begin Write(’Input n:’); Readln(n); N:=1; Sum:=n; For i:=2 to n do begin n:=n*2; sum:=sum+n; end; writeln(sum); readln; End. 循环练习二:百元买百鸡问题。 (循环嵌套) 鸡翁一值钱五, 鸡母一值钱三, 鸡雏三值钱一, 百钱买百鸡, 问: 鸡翁, 鸡母, 鸡雏各几何? 分析: 程序中公鸡数量为 a 母鸡数量为 b

17

小鸡数量为 c 输出顺序为 a1 b1 c1 a2 b2 c2 参考程序如下: Program maiji ; Var a , b , c : integer ; Begin For a : = 0 to 20 do For b : = 0 to 33 do begin C : = 100 – a – b ; If (5 * a + 3 * b + c /3 =100) then Writeln ( a : 6, b:6 , c :6 ) ; End; Readln; End. 循环练习三: 循环思考题:试编程找出能被各位数字之和整除的一切两位数。 分析:1、如果 a 是十位数,b 是个位数,那么 a 取值范围是 1~9,a 取值范围是 0~9。 2、合成的两位数是 a*10+b,条件转换为:(a *10 + b) mod (a+b) =0。 参考程序如下: Program liangweishu; Var a,b:integer; Begin For a:=1 to 9 do For b:= 0 to 9 do If (a *10 + b) mod (a+b) =0 then Writeln ( a *10+b:8 ) ; Readln; End. 循环思考题之水仙花数:就是指一个三位数,其各个数的立方和等于该数。 方法一: program sxh; var a,b,c,d:integer; begin for a:=100 to 999 do begin b:=a mod 10; c:=a mod 100 div 10; d:=a div 100; if b*b*b+c*c*c+d*d*d=a then writeln(a); end; end. 方法二:

18

program sxh; var a,b,c,d:integer; begin for a:=1 to 9 do for b:=0 to 9 do for c:=0 to 9 do begin d:=100*a+10*b+c; if b*b*b+c*c*c+a*a*a=d then writeln(d); end; end.

第三章
一、类型定义 类型定义的语法格式: type <标识符 1>=<类型 1>; <标识符 1>=<类型 1>; ?? <标识符 n>=<类型 n>;

枚举型和子界型

二、枚举类型 通过预定义列出所有值的标识符来定义一个有序集合, 这些值的次序和枚举类型说明中 的标识符的次序识一致的。枚举类型的形式:(标识符 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');
19

tuesday:write('tuesday'); wednesday:write('wednesday'); thursday:write('thursday'); friday:write('friday'); saturday:write('saturday'); end; 三、子界类型 子界类型是由整型、字符型、枚举型、布尔型的两个常量指定该类型的值域区间。子界 类型的形式: 常量..常量 两个常量必须是同一种顺序类型。例如: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. 四、类型相容和赋值相容 1.类型相容性 类型相容是对参加同一运算的两个对象的类型要求。 设有两个变量, 如果满足下列条件 之一,就说这两个变量的类型相容。 (1)两个变量的类型相同 a.两个变量被同一类型说明。 例如:var a,b:1..30;
20

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 所定义的值的范围; 否则将产生类型溢出, 而这种错误只能在你运行程序时进 行检查,因此你必须要避免不发生这种错误。

第四章 数组及其应用
一、数组概念 1.数组的定义 数组是程序中最常用的结构数据类型, 用来描述由固定数目的同一类型的元素组成的数 据结构。数组的每个元素和下标相关联,根据下标指示数组的元素。数组的存储方式为按行 存储,在编译阶段,计算机根据数组的类型说明,确定其存储空间的大小。数组可以是任何 顺序类型。数组的定义形式如下: type name1=array [<下标类型 1>,??<下标类型 n>] of <元素类型>; var a:name1; 可以将类型定义和变量定义合二为一: Var a:array[<下标类型 1>,??<下标类型 n>] of <元素类型>; 其中 n 称为数组的维数, 每维的下标类型必须是一个顺序类型, 通常为子界类型或枚举 类型,其作用是指定数组下标的编制方式和下标取值范围。 例如数组类型定义: type color=(red,yellow,blue);
21

sample1=array[1..10] of integer;{有 10 个元素的一维数组} sample2=array[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; 二、数组的应用 1.数组的输入与输出 例 1:读入5个学生的学号和成绩,计算他们的平均分,若比平均分高10分的等第为 A, 若比平均分高小于10分的等地为 B,若低于平均分,则等第为 C,输出他们的成绩和等第。 program chengji; 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]; 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');

22

end; end. 2.数组的应用 例 2:用筛法求 1000 以内的素数(质数)。 分析:素数是除了 1 和它本身以外没有其它约数的数。用筛法求素数的方法是:用质数 筛去合数:从第一个素数 2 开始,把它的倍数去掉;这样 2 以后的第一个非 0 数就一定也是 素数, 把它的倍数也删了??重复这个删数过程, 直到在所找到的素数后再也找不到一个非 0 数。把所有值为 1 数输出。 program sushu; var a:array[1..1000] of integer; t,i,j:integer; begin for i:=1 to 1000 do a[i]:=1; for i:=2 to 1000 do begin for j:=2 to (i div 2) do if i mod j=0 then begin a[i]:=0; break; end; end; for i:=1 to 1000 do begin if a[i]=1 then begin write(i:4); t:=t+1; end; end; readln; end. 例 3.打印杨辉三角的前 10 行。 一、杨辉三角形(杨辉,南宋,1261 年),又称贾宪三角形(贾宪,北宋人,约 1050 年), 帕斯卡三角形,是二项式系数在三角形中的一种几何排列。 1 1 1 1 1 1 1 6 5 15 4 10 20 3 6 10 15 2 3 4 5 6 1 1 1 1 1 1

二、杨辉三角形状:第一个就是杨辉三角中除了最外层(不包括杨辉三角底边)的数为 1 外,其余的数都是它肩上两个数之和。用数组输出杨辉三角就用这个性质。 三、使用数组打印金字塔型杨辉三角 1 1 1

23

1 1 1 1 1 1 1

2 3 4 5 6 7 8

1 3 6 10 15 21 28 1 4 10 20 35 56 1 5 15 35 70 1 6 21 56 1 7 28 1 8 1

定义一个数组 a(i,j)。语法如下: var a:array[1..9,1..9] of integer; 就相当于定义了一个二维表格:
a(1,1) a(2,1) a(3,1) a(4,1) a(5,1) a(6,1) a(7,1) a(8,1) a(9,1) a(1,2) a(2,2) a(3,2) a(4,2) a(5,2) a(6,2) a(7,2) a(8,2) a(9,2) a(1,3) a(2,3) a(3,3) a(4,3) a(5,3) a(6,3) a(7,3) a(8,3) a(9,3) a(1,4) a(2,4) a(3,4) a(4,4) a(5,4) a(6,4) a(7,4) a(8,4) a(9,4) a(1,5) a(2,5) a(3,5) a(4,5) a(5,5) a(6,5) a(7,5) a(8,5) a(9,5) a(1,6) a(2,6) a(3,6) a(4,6) a(5,6) a(6,6) a(7,6) a(8,6) a(9,6) a(1,7) a(2,7) a(3,7) a(4,7) a(5,7) a(6,7) a(7,7) a(8,7) a(9,7) a(1,8) a(2,8) a(3,8) a(4,8) a(5,8) a(6,8) a(7,8) a(8,8) a(9,8) a(1,9) a(2,9) a(3,9) a(4,9) a(5,9) a(6,9) a(7,9) a(8,9) a(9,9)

program yanghui; var a:array[1..10,1..10] of integer; i,j:integer; begin for i:=1 to 10 do for j:=1 to i do begin a[i,1]:=1; if i=j then a[i,j]:=1; if a[i,j]<>1 then a[i,j]:=a[i-1,j-1]+a[i-1,j]; end; for i:=1 to 10 do begin write(' ':40-3*i); for j:=1 to i do write(a[i,j]:6); writeln; end; readln; end.

24

25


更多相关文档:

Freepascal资料详解

Freepascal资料详解_计算机软件及应用_IT/计算机_专业资料。对freepascal与turbopascal的区别,以及freepascal新增功能和注意事项都有详细介绍。Free...

Free Pascal资料

下面是 Pascal 语言的保留字(字母大小写等效): and,array,begin,case,const,div,do,downto,else,end,file,for,funtion, goto,if,in,label,mod,nil,not,of,...

freepascal极详细资料

freepascal极详细资料_IT/计算机_专业资料freepascal极详细资料一、TP 和 FP 的功能区别 1.Free Pascal 理论上可以使用 4GB(2^32byte)的内存,因此实际上几乎可...

free pascal 函数大全

free pascal 函数大全_数学_自然科学_专业资料。一、数学函数: inc(i) 使 i...Pascal 函数大全 2009-11-17 18:53 Pascal 函数大全 一、数学函数: Inc(i)...

Free_Pascal 教程

Free_Pascal 教程_计算机软件及应用_IT/计算机_专业资料 暂无评价|0人阅读|0次下载|举报文档Free_Pascal 教程_计算机软件及应用_IT/计算机_专业资料。目录第一章 ...

freePascal教程

freePascal教程_IT/计算机_专业资料freePascal,lazarus基础教程第四单元 PASCAL 语言程序设计在上一册教材中, 我们已经初步了解了 PASCAL 语言的三种基本结构、 程序...

Free pascal中的各种函数及其基本意义

Free pascal中的各种函数及其基本意义_IT/计算机_专业资料。此文档描述了Free Pascal中的常用函数及其的意义(可能有一点缺漏),本文档结构清晰,方便了大家的阅读。欢...

Free Pascal错误表

Free Pascal错误表_IT/计算机_专业资料Free Pascal 错误一览表 1、 Run Time Errors 运行错误 (A) DOS 错误代码: 1:无效 DoS 功能号 2:文件末找到 3:路径...

百度百科_Free PASCAL

freepascal极详细资料 18页 2财富值 FreePascal2.2 4页 1财富值 FreePascal2.1 2页 1财富值如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建...

FREE PASCAL入门文件输入与输出

FREE PASCAL入门文件输入与输出_电脑基础知识_IT/计算机_专业资料。使用文件输入输出数据任何程序都需要产生一些输出,有时也需要接受若干个输入。这些输入、输出实 际...
更多相关标签:
free pascal | free pascal下载 | free pascal 2.4.0 | free pascal 3.0.0 | free pascal教程 | free pascal 乱码 | free pascal ide下载 | free pascal 2.04下载 |
网站地图

文档资料共享网 nexoncn.com copyright ©right 2010-2020。
文档资料共享网内容来自网络,如有侵犯请联系客服。email:zhit325@126.com