Pascal简明实用教程.docx
- 文档编号:13744074
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:66
- 大小:41.41KB
Pascal简明实用教程.docx
《Pascal简明实用教程.docx》由会员分享,可在线阅读,更多相关《Pascal简明实用教程.docx(66页珍藏版)》请在冰点文库上搜索。
Pascal简明实用教程
Pascal简明教程
2010年3月
一、初识PASCAL
1、程序框架……一个完全的PASCAL程序结构框架如下:
PROGRAM程序名(程序参数表);
CONST……………………………………………常量声明;
TYPE……………………………………………类型声明;
VAR……………………………………………变量声明;
FUNCTION函数名(参数表):
函数类型;………函数声明;
PROCEDURE过程名(参数表);…………………过程声明;
BEGIN
程序主体;
END.
2、变量定义
(一)变量定义方法
VAR
变量名1:
变量类型1;
变量名2:
变量类型2;
变量名3,变量名4:
变量类型3;
(二)变量命名规则
1、首字符必须是英文
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、输入输出语句
(一)输出语句格式
Writeln(项目1,项目2,……,项目n); {输出内容后换行}
Write(项目1,项目2,……,项目n); {输出内容后不换行}
(二)输入语句格式
Read(变量1,变量2,……,变量n); {从键盘输入n个数据,以空格格开}
Readln(变量1,变量2,……,变量n);{从键盘输入n个数据,以空格格开,读完后换行}
(三)赋值语句用法
变量名:
=表达式; {把右边表达式的值计算出来,结果赋给左边的变量}
举例:
a:
=3;
a:
=a+1;
s:
=(a+b)*(c+d);
4、文件输入输出方法
(一)装配文件
assign(input,’文件路径’); {文件路径一般为相对路径,相对程序的工作目录}
reset(input);
assign(output,’文件路径’);
rewrite(output);
(二)输入输出方法
read(x);
write(x);
(三)关闭文件
close(input);
close(output); {输出文件必须关闭,否则可能不能正确保存}
例:
begin
assign(input,’a1.in’);
assign(output,’a1.out’);
reset(input);
rewrite(output);
close(input);
close(output);
end.
只要在程序内加上这些就行了。
5、运算符优先级
共四级(同一级优先级相同,按照从左到右的顺序执行)
(一)单目运算符:
(最高优先级)
@取变量或函数的地址(返回一个指针)
not逻辑取反或按位取反
(二)乘除及按位运算符
*相乘或集合交集
/浮点相除
div整数相除
mod取模(整数相除的余数)
as程序运行阶段类型转换(RTTI运算符)
and逻辑或按位求和
shl按位左移
shr按位右移
(三)加减运算符
+相加、集合并集、字符串连接或指针增加一个偏移量
-相减、集合差集或指针减少一个偏移量
or逻辑或按位或运算
xor逻辑或按位异或运算
(四)关系及比较运算符(最低优先级)
=判断是否相等
<>判断是否不相等
<判断是否小于
>判断是否大于
<=判断是否小于或等于,或是否是一个集合的子集
>=判断是否大于或等于,或是否是一个集合的父集
in判断是否是集合成员
is判断对象是否类型兼容(又一个RTTI运算符)
二、程序的基本控制结构
1、顺序结构
(一)顺序结构的程序按照书写顺序依次执行
begin
语句1;
语句2;
end;
(二)实例
输入两个整数x,y,计算x,y的差并输出。
Programexample;
var
x,y,s:
integer;
begin
read(x,y);
s:
=x-y;
writeln(s);
end.
2、分支结构
(一)分支结构又叫选择结构或条件结构
If条件
then语句1 {注意这里不可以加分号,因为IF语句到这里没有结束,后面还有ELSE语句}
else语句2;
(二)没有ELSE的IF语句
If条件
then语句1;
(三)实例
输入3个整数,输出最大的数。
Programbijiao;
var
a,b,c,max:
integer;
begin
readln(a,b,c);
ifa>=b
thenmax:
=a
elsemax:
=b;
ifc>maxthenmax:
=c;
writeln(max);
end.
(四)IF语句的嵌套
If条件
ThenBegin
If条件
Then语句1
Else语句2;
End
Else Begin
If条件
Then语句3
Else语句4;
End;
3、循环结构
(一)For循环
For循环变量:
=初值to终值do
循环体;
若循环体有多条语句,则必须用begin…end复合语句括起来。
【典型例题1】计算s=1+2+3+...+n,n由键盘输入。
Programexample;
var
s,i,n:
integer;
begin
readln(n);
s:
=0;
Fori:
=1tondo
s:
=s+i;
writeln(s);
end.
【典型例题2】从键盘输入一个数,判断它是不是素数。
PROGRAMsushu;
VAR
a,i:
integer;
flag:
boolean;
BEGIN
readln(a);
flag:
=true;
FORi:
=2totrunc(sqrt(a))do
IFamodi=0
THENBEGINflag:
=false;BREAK;END;
IFflag
THENwriteln(‘Y’)
ELSEwriteln(‘N’);
END.
(二)While循环
While条件Do
循环体;
同样,若循环体有多条语句,则必须用begin…end复合语句括起来。
【典型例题】求最大公约数
programHCF;
var
a,b,r:
integer;
begin
r:
=amodb;
whiler<>0do
begin
a:
=b;
b:
=r;
r:
=amodb;
end;
writeln(b);
end.
(三)Repeat循环
Repeat
循环体;
Until条件;
即使循环体有多条语句,也不必用begin…end复合语句。
【典型例题】求自然对数e的近似值,直到最后一项小于10-5为止。
programe1;
var
i:
integer;
e,s,t:
real;
begin
e:
=1;
t:
=1;
i:
=1;
repeat
t:
=t*i;
e:
=e+1/t;
i:
=i+1;
until1/t<=10e-5;
writeln(e);
end.
三、函数和过程
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的随机整数
二、自定义函数
Funtion函数名(参数1:
参数类型,参数2:
参数类型,...):
函数值类型;
VAR
函数内变量定义;
BEGIN
函数体;
END;
【典型例题】自定义一个判断素数的函数
Functionprime(a:
longint):
Boolean;
Var
i:
longint;
Begin
prime:
=true;
fori:
=2totrunc(sqrt(a))do
ifamodi=0
thenbeginprime:
=false;break;end;
End;
2、过程
(一)标准过程
inc(a) {等价于a:
=a+1}
inc(a,i) {等价于a:
=a+i}
dec(i) {等价于a:
=a-1}
dec(a,i) {等价于a:
=a-i}
(二)自定义过程
Procedure过程名(参数1:
参数类型,参数2:
参数类型,...);
VAR
过程内变量定义;
BEGIN
过程体;
END;
【典型例题】随机产生10个100以内不重复的随机数存入数组并输出,然后从小到大排序再输出。
Programexample;
Const
n=10;
Var
a:
array[1..n]ofinteger;
i,x,temp:
integer;
Functionfind(x:
integer):
boolean; {自定义查找函数}
var
i:
integer;
begin
find:
=false;
fori:
=1tondo
ifa[i]=xthenbeginfind:
=true;exit;end;
end;
Procedurewritea; {自定义输出数组元素的过程}
var
i:
integer;
begin
fori:
=1tondo
write(a[i],'');
writeln;
end;
Procedureselectsort;
var
i,j,k:
integer;
begin
fori:
=1ton-1do
begin
k:
=i;
forj:
=i+1tondo
ifa[k]>a[j]thenk:
=j;
ifk<>ithenbegintemp:
=a[i];a[i]:
=a[k];a[k]:
=temp;end;
end;
end;
Begin {主程序开始}
randomize;
x:
=random(100);
fori:
=1tondo
begin
whilefind(x)do
x:
=random(100);
a[i]:
=x;
end;
writea; {调用输出数组过程}
selectsort; {调用选择排序过程}
writea; {调用输出数组过程}
end.
3、递归
【典型例题1】求阶乘n!
求n!
我们可以使用For循环来做,这里我们换一个思路,使用递归的方法来做。
看下面的数学递推表达式。
我们可以看出为求n!
,必先求出(n-1)!
,同理,要求出(n-1)!
,必先求出(n-2)!
,则如此递推下去,最终当n=0时我们就可以马上得出结果1,然后我们从1开始再逐步返回到n来求出n!
【演示课件】……递归
Programjiecheng;
Var
n:
integer;
Functionjc(n:
integer):
longint;
Begin
Ifn=0
Thenjc=1
Elsejc=n*jc(n-1)
End;
Begin{main}
readln(n);
writeln(jc(n));
End.
【典型例题2】汉诺塔问题
有三根柱A、B、C,在柱A上有N块盘片,所有盘片都是大的在下面,小片能放在大片上面。
现要将A上的N块盘片移到C柱上,每次只能移动一片,而且在同一根柱子上必须保持上面的盘片比下面的盘片小,输入任意的N,输出移动方法。
(注意:
这是一个古老的传说,传说是如果把64个盘子由A柱移到了C柱的话,那么世界末日就到了,事实上如果要把64个盘子从A柱移到C柱的话,即使用计算机运算,也要计算数亿年,所以这个预言未必不是真实。
)
【分析】
我们可以这样考虑,当n=1时,我们只要直接将A柱的盘子移到C柱,当n>1时,我们可以先把n-1个盘子由A柱通过C柱移到B柱,此时就可以把A柱剩下的最后一个盘子直接移到C柱,这样接下来只要把n-1个盘子通过A柱移到C柱即可,如果就构成了递归的思路,我们可以定义个移动过程mov(n,a,b,c)表示将n个盘子从a通过b移到c
【程序】
Programhannuota;
Var
n:
integer;
Proceduremove(n,a,b,c:
integer);
begin
ifn=1
thenwriteln(a,'->',c)
elsebegin
move(n-1,a,c,b); {把n-1个盘子从a柱经由c柱移到b柱}
writeln(a,'->',c); {把剩下的第n个盘子直接移到c柱}
move(n-1,b,a,c); {把在b柱上的n-1个盘子经由a柱移到c柱}
end;
end;
Begin
readln(n);
move(n,1,2,3);
End.
【典型例题3】求公约数问题
利用递归函数的方法求a,b的公约数。
Programgongyueshu;
Var
a,b:
longint;
Functionhcf(a,b:
longint):
longint;
Begin
ifamodb=0
thenhcf:
=b
elsehcf:
=hcf(b,amodb);
End;
Begin{main}
readln(a,b);
writeln('hcf=',hcf(a,b));
End.
四、数组
1、数组定义
(一)数组定义方法
VAR
数组名:
Array[下标起点..下标终点]Of数组元素类型;
例如:
定义一个存储10个整数的数组a
a:
array[1..10]ofinteger;
(二)赋值方法:
a[1]:
=0;
定义数组后计算机会在系统内存内划出一块连续的区域供存放数组元素。
2、数组输入输出
(一)键盘输入数据存入数组过程
PROCEDUREreada;
VAR
i:
INTEGER;
BEGIN
FORi:
=1TOnDO
READ(a[i]);
END;
(二)随机产生n个数据存入数组过程
PROCEDURErandoma(max:
integer;);
VAR
i:
INTEGER;
BEGIN
RANDOMIZE;
FORi:
=1TOnDO
a[i]:
=RANDOM(max);
END;
(三)输出数组过程
PROCEDUREwritea;
VAR
i:
INTEGER;
BEGIN
FORi:
=1TOnDO
WRITE(a[i],'');
WRITELN;
END;
3、数组基本操作
(一)自定义查找函数,在数组中查找x,若有返回x的下标,若无则返回0。
FUNCTIONfind(x:
INTEGER):
INTEGER;
VAR
i:
INTEGER;
BEGIN
find:
=0;
FORi:
=1TOnDO
IFa[i]=x
THENBEGIN find:
=i;break;END;
END;
(二)在数组的p位置插入一个元素x
PROCEDUREinserta(p,x:
INTEGER);
VAR
i:
INTEGER;
BEGIN
FORi:
=nDOWNTOpDO
a[i+1]:
=a[i];
a[p]:
=x;
n:
=n+1;
END;
注意:
因为要插入一个元素,所以首先必须保证数组有空余的单元,否则会出现下标越界错误。
(三)从数组中把下标为p的元素删除掉
PROCEDUREdeletea(p:
INTEGER);
VAR
i:
INTEGER;
BEGIN
FORi:
=pTOn-1DO
a[i]:
=a[i+1];
n:
=n-1;
END;
4、约瑟夫问题
【约瑟夫问题】
编号为1,2,......,n的n个人按照顺时针方向围坐一圈。
从第一个人开始顺时针方向自1开始报数,报到m时停止报数。
报m的人出列,从他在顺时针方向的下一个人开始重新报数,如此下去,直到所有人全部出列为止。
设计一个程序来求出出列顺序。
其中n,m由键盘输入。
【思路1】
利用数组存放n个人,数组下标等于他的编号,然后模拟报数过程,报到m时输出该位置的人编号,然后该位置的值清0,继续报数并判断是否为0,是0则跳过。
直到n个人全部出列为止。
【参考程序】
Programyueshefu;
Var
a:
array[1..100]ofinteger;
n,m,i,j,p:
integer;
Begin
write('Inputn,m:
');
readln(n,m);
fori:
=1tondo
a[i]:
=i;
p:
=1; {p用于记录报数的位置}
fori:
=1tondo
begin
j:
=0; {j用于记录报到的人数}
whilej begin ifa[p]<>0thenj: =j+1; ifp=nthenp: =1elsep: =p+1; {处理边界情况} end; ifp<>1 thenbeginwrite(a[p-1],'');a[p-1]: =0;end {处理边界情况} elsebeginwrite(a[n],'');a[n]: =0;end; end; end. 【思路2】 建立一个循环数组,数组元素的每一个值保存的是它的下一个元素的编号,如果报到m后只要修改m前面的元素的编号为m后面的元素的编号,这样就跳过了第m个元素,如此下去直到n个人全部出列。 【参考程序】 Programyuesefu; Var a: array[1..100]ofinteger; n,m,p,i,j: integer; Begin readln(n,m); fori: =1ton-1do a[i]: =i+1; a[n]: =1; p: =n; fori: =1tondo begin forj: =1tom-1do p: =a[p]; write(a[p],''); a[p]: =a[a[p]]; end; End. 五、自定义数据类型 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; 2、子界类型 TYPE 子界类型标识符=常量1..常量2; VAR 子界类型变量表: 子界类型标识符; 【实例】 TYPE age=0..100; letter=’a’..’z’; VAR a: age;l: letter; 3、集合类型 TYPE 集合类型标识符=SETOF基类型; VAR 集合类型变量表: 集合类型标识符; 【实例】 TYPE digit=Setof0..10; VAR a,b: digit; Begin a: =[1,3,5,7,9]; b: =[0,2,4,6,8]; E
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Pascal 简明 实用教程