1 程序结构
PROGRAM 程序名(程序参数表);
CONST
常量声明;
TYPE
类型声明;
VAR
变量声明;
FUNCTION 函数名(参数表):函数类型;
函数声明;
PROCEDURE 过程名(参数表);
过程声明;
BEGIN
程序主体;
END.
2 定义变量
2.1 变量定义方法
VAR
变量名1:变量类型1;
变量名2:变量类型2;
变量名3,变量名4:变量类型3;
变量名1:变量类型1;
变量名2:变量类型2;
变量名3,变量名4:变量类型3;
2.2 变量类型
类型名 | 含义 | 取值范围 | 占字节数 |
shortint | 短整型 | -128~127 | 1 |
integer | 整型 | -32768~32767 | 2 |
longint | 长整型 | -231~231-1 | 4 |
real | 实数 | 2.9×10-39~1.7×1038 | 6 |
single | 单精度 | 1.5×10-45~3.4×1038 | 4 |
double | 双精度 | 5.0×10-324~1.7×10308 | 8 |
extended | 扩展实数 | 1.9×10-4951~1.1×104932 | 10 |
char | 字符 | 单个ASCII字符 | 1 |
string | 字符串 | 最多255个字符 | 字符个数 |
boolean | 布尔型 | True, False | 1 |
3 输入输出
3.1 输出语句格式
Writeln(项目1,项目2,……,项目n); {输出内容后换行}Write(项目1,项目2 ,……,项目n); {输出内容后不换行}
3.2 输入语句格式
Read(变量1,变量2,……,变量n); {从键盘输入n个数据,以空格格开}Readln(变量1,变量2 ,……,变量n); {从键盘输入n个数据,以空格格开,读完后换行}
3.3 赋值语句用法
变量名:=表达式; {把右边表达式的值计算出来,结果赋给左边的变量}举例:
a:=3;
a:=a+1;
s:=(a+b)*(c+d);
4 文件是输入输出
4.1 装配文件
assign(input,’文件路径’); {文件路径一般为相对路径,相对程序的工作目录}reset(input);
assign(output,’文件路径’);
rewrite(output);
4.2 输入输出方法
read(x);write(x);
4.3 关闭文件
close(input);close(output); {输出文件必须关闭,否则可能不能正确保存}
5 运算符优先级
共四级(同一级优先级相同,按照从左到右的顺序执行)5.1 单目运算符:(最高优先级)
@ 取变量或函数的地址(返回一个指针)not 逻辑取反或按位取反
5.2 乘除及按位运算符
* 相乘或集合交集/ 浮点相除
div 整数相除
mod 取模 (整数相除的余数)
as 程序运行阶段类型转换 (RTTI运算符)
and 逻辑或按位求和
5.3加减运算符
+ 相加、集合并集、字符串连接或指针增加一个偏移量- 相减、集合差集或指针减少一个偏移量
or 逻辑或按位或运算
xor 逻辑或按位异或运算
5.4 关系及比较运算符(最低优先级)
= 判断是否相等<> 判断是否不相等
< 判断是否小于
> 判断是否大于
<= 判断是否小于或等于,或是否是一个集合的子集
>= 判断是否大于或等于,或是否是一个集合的父集
in 判断是否是集合成员
is 判断对象是否类型兼容 (又一个RTTI运算符)
6 基本控制结构
6.1 顺序结构
顺序结构的程序按照书写顺序依次执行begin
语句1;
语句2;
end;
实例
输入两个整数x,y,计算x,y的差并输出。
Program example;
var
x,y,s:integer;
begin
read(x,y);
s:=x-y;
writeln(s);
end.
shl 按位左移
shr 按位右移
6.2 分支结构
6.2.1 分支结构又叫选择结构或条件结构
If 条件then 语句1 {注意这里不可以加分号,因为IF语句到这里没有结束,后面还有ELSE语句}
else 语句2;
6.2.2 没有ELSE的IF语句
If 条件then 语句1;
实例
输入3个整数,输出最大的数。
Program bijiao;
var
a,b,c,max:integer;
begin
readln(a,b,c);
if a>=b then
max:=a
else max:=b;
if c>max then max:=c;
writeln(max);
end.
6.2.3 IF 语句的嵌套
If 条件Then Begin
If 条件
Then 语句1
Else 语句2;
End
Else Begin
If 条件
Then 语句3
Else 语句4;
End;
6.3 循环结构
6.3.1 For循环
For 循环变量:=初值 to 终值 do循环体;
若循环体有多条语句,则必须用begin…end复合语句括起来。
【典型例题1】计算s=1+2+3+...+n,n由键盘输入。
Program example;
var
s,i,n:integer;
begin
readln(n);
s:=0;
for i:=1 to n do
s:=s+i;
writeln(s);
end.
【典型例题2】从键盘输入一个数,判断它是不是素数。
Program sushu;
var
a,i:integer;
flag:boolean;
begin
readln(a);
flag:=true;
for i:=2 to trunc(sqrt(a)) do
if a mod i=0
then begin flag:=false;break;end;
if flag
then writeln(‘Y’)
else writeln(‘N’);
end.
6.3.2 While循环
While 条件 Do循环体;
同样,若循环体有多条语句,则必须用begin…end复合语句括起来。
【典型例题】求最大公约数
program HCF;
var
a,b,r:integer;
begin
r:=a mod b;
while r<>0 do
begin
a:=b;
b:=r;
r:=a mod b;
end;
writeln(b);
end.
6.3.3 Repeat循环
Repeat循环体;
Until 条件;
7 函数
7.1 标准函数(内置函数)
函数名 | 含义 |
abs(a) | 求a的绝对值 |
sqr(a) | 求a的平方 |
sqrt(a) | 求a的平方根 |
sin(a) | 求a的正弦值,a是弧度 |
cos(a) | 求a的余弦值,a是弧度 |
arctan(a) | 求a的反正切值,结果为弧度 |
exp(a) | 自然对数e的a次方 |
ln(a) | 求a的自然对数值 |
trunc(a) | 求a的整数部分 |
round(a) | 四舍五入取整 |
ord(a) | 求字符a的ASCII码 |
chr(a) | 根据ASCII码换成相应的字符 |
random(a) | 求小于a的随机整数 |
7.2 自定义函数
Funtion 函数名(参数1:参数类型,参数2:参数类型,...):函数值类型;VAR
函数内变量定义;
BEGIN
函数体;
END;
【典型例题】自定义一个判断素数的函数
Function prime(a:longint):Boolean;
Var
i:longint;
Begin
prime:=true;
for i:=2 to trunc(sqrt(a)) do
if a mod i=0
then begin prime:=false;break;end;
End;
8 过程
8.1 标准过程
inc(a) {等价于a:=a+1}inc(a,i) {等价于a:=a+i}
dec(i) {等价于a:=a-1}
dec(a,i) {等价于a:=a-i}
8.2 自定义过程
Procedure 过程名(参数1:参数类型,参数2:参数类型,...);VAR
过程内变量定义;
BEGIN
过程体;
END;
【典型例题】随机产生10个100以内不重复的随机数存入数组并输出,然后从小到大排序再输出。
Program example;
Const
n=10;
Var
a:array[1..n] of integer;
i,x,temp:integer;
Function find(x:integer):boolean; {自定义查找函数}
var
i:integer;
begin
find:=false;
for i:=1 to n do
if a[i]=x then begin find:=true;exit;end;
end;
Procedure writea; {自定义输出数组元素的过程}
var
i:integer;
begin
for i:=1 to n do
write(a[i],' ');
writeln;
end;
Procedure selectsort;
var
i,j,k:integer;
begin
for i:=1 to n-1 do
begin
k:=i;
for j:=i+1 to n do
if a[k]>a[j] then k:=j;
if k<>i then begin temp:=a[i];a[i]:=a[k];a[k]:=temp;end;
end;
end;
Begin {主程序开始}
randomize;
x:=random(100);
for i:=1 to n do
begin
while find(x) do
x:=random(100);
a[i]:=x;
end;
writea; {调用输出数组过程}
selectsort; {调用选择排序过程}
writea; {调用输出数组过程}
end.
9 数组定义
9.1 数组定义方法
VAR数组名:Array[下标起点..下标终点] Of 数组元素类型;
例如:定义一个存储10个整数的数组a
a:array[1..10] of integer;
赋值方法:a[1]:=0;
定义数组后计算机会在系统内存内划出一块连续的区域供存放数组元素
10 自定义数据类型
10.1 枚举类型
TYPE枚举类型标识符=(枚举值1,枚举值2 ,枚举值3,… );
VAR
枚举类型变量表:枚举类型标识符;
【实例】
TYPE
weekday=(Sun,Mon,Tue, Wed,Thu,Fri,sat);
month=(Jan,Feb,Mar,Apr,May,Jun,Jul,Aug, Sep,oct,nov,dec);
VAR
d:weekday; m:month;
10.2 子界类型
TYPE子界类型标识符=常量1..常量2;
VAR
子界类型变量表:子界类型标识符;
【实例】
TYPE
age=0..100;
letter=’a’..’z’;
VAR
a:age; l:letter;
10.3 集合类型
TYPE集合类型标识符=SET OF 基类型;
VAR
集合类型变量表:集合类型标识符;
【实例】
TYPE
digit=Set of 0..10;
VAR
a,b:digit;
Begin
a:=[1,3,5,7,9];
b:=[0,2,4,6,8];
End.
【集合运算】
1.空集合:[]
2.集合并交差
并:用+表示,例如[1,3,4]+[1,2,4]=[1,2,3,4]
交:用*表示,例如[1,3,4]*[1,2,4]=[1,4]
差:用-表示,例如[1,3,4]-[1,2,4]=[3]
3.关系运算:集合可以进行>,<,=,<>等运算,规则是元素多的大于元素少的。
4.包含判断:IN,例如1 in [1,3,4]是True; 2 in [1,3,4]是False。
5.集合运算中元素的次序是不重要的。
10.4 记录类型
TYPE记录类型标识符=RECORD
域标识符表:类型;
域标识符表:类型;
…
End;
VAR
记录类型变量表:记录类型标识符;
【实例】 一个学生包括学号、姓名、性别、年龄、成绩五个域。
TYPE
student=RECORD
num:integer;
name:string;
sex:(male,female);
age:0..100;
score:real;
END;
VAR
s:student;
a:array[1..100] of stuent;
【赋值方法】
s.num=9601;
s.name=‘li min’;
s.sex=male;
s.age=18;
s.score=91;
a[1].num=9601;
a[1].name=‘li min’;
a[1].sex=male;
a[1].age=18;
a[1].score=91;
10.5 指针类型
10.5.1 指针类型是一种动态数据结构,它随着程序的执行而改变长度。
定义方法:TYPE
point=^node;
node=RECORD
data:<数据类型>;
link:point;
End;
VAR
p,q,r:point;
10.5.2 空间分配
new(p);new(q);
10.5.3 赋值方法
p^.data:=10;
p^.link:=q;
q^.data:=100;
q^.link:=NIL; {NIL表示空指针}
10.6 字符串类型
10.6.1 字符串用于存放整批的字符数据。字符串可以看作是特殊的字符串数组来处理
字符串定义的格式:var
s:string;
s1:string[15]; {字符串长度固定为15}
字符串定义时,如不指定长度,则按该类型的最大长度(255个字符)分配空间,使用时最大可用长度为255个;如果在中括号中给出一个具体的值(1—255之间),则按这个值的大小分配空间。使用时,最大的可用长度即为该值。
10.6.2 字符串的输入、输出
字符串类型既可按数组方式输入、输出,也可直接输入、输出:readln(s);writeln(s);多个字符串输入时以回车作为数据间的分隔符;每个readln语句只能读入一个字符串。10.6.3 有关字符串的操作
操作
|
类型
|
作用
|
返回值
|
例子
|
length(s) |
函数
| 求字符串s的长度 | 整型 | s:='123456789'; l:=length(s); {l的值为9} |
copy(s,w,k) |
函数
| 复制s中从w开始的k位 | 字符串 | s:='123456789'; s1:=copy(s,3,5); {s1的值是'34567'} |
val(s,k) |
过程
| 将字符串s转为数值,存在k中; | s:='1234'; val(s,k); write(k); {k=1234} | |
str(i,s) |
过程
| 将数值i转为字符串s | i:=1234; str(i,s); write(s);{s='1234'} | |
Delete(s,w,k) |
过程
| 在s中删除从第w位开始的k个字符 | s := 'Honest Abe Lincoln'; Delete(s,8,4); Writeln(s); { 'Honest Lincoln' } | |
Insert(s1,S,w) |
过程
| 将s1插到s中第w位 | S := 'Honest Lincoln'; Insert('Abe ', S, 8); { 'Honest Abe Lincoln' } | |
Pos(c, S) |
函数
| 求字符c在s中的位置 | 整型 | S := ' 123.5'; i :=Pos(' ', S); {i的值为1} |
+ |
运算符
| 将两个字符串连接起来 | s1:='1234'; s2:='5678'; s:=s1+s2; {'12345678'} |