pascal基础教程.docx
《pascal基础教程.docx》由会员分享,可在线阅读,更多相关《pascal基础教程.docx(56页珍藏版)》请在冰点文库上搜索。
pascal基础教程
机器语言、汇编语言——低级语言
BASIC、PASCAL、VISUALBASIC等称为高级语言
第一部分Pascal语言和程序设计基础
预备知识
基本程序结构和几个概念:
:
标识符保留字常量变量运算符表达式标准数据类型
Pacal语言程序结构
Programprog_name;
var变量申明;
begin
程序体;
end.
例如:
programpname;
constn=4;
typearr=array[1..4]ofinteger;
vari:
integer;a:
arr;
begin
fori:
=1tondoread(a[i]);
readln;
fori:
=ndownto1dowrite(a[i]:
4);
writeln;
end.
以上是一个PASCAL程序。
从键盘读入4个数据,逆序输出。
一般来说,一个PASCAL程序包括以下几个部分:
程序头:
programpname;
其中,program是保留字,表示程序从这个地方开始,pname是标识符,是程序的名字,可由程序员自定。
保留字是PASCAL选定的,具有固定意义和用法的专用单词或缩写,这些单词不允许作其它使用。
如上,“program”就有“程序从这里开始”这样一种特别的意义,而“const”就有“常量说明从这里开始”的意义。
我们不能再用“program”、“const”来作为其它变量、常量等的名字。
标识符是以字母开头的字母数字串,其长度最大为8个字符。
用来表示常量、变量、类型、文件、过程、函数和程序的名字。
如“pname”、“i”、“j”、“a1”就是合法的标识符;但“1a”、“#a”是非法的标识符。
有一点要注意的是,在PASCAL中,字母除了作为字符值或字符串值之外,其大小写是无关的。
如标识符“A1”和“a1”在PASCLA看来是同一标识符。
在PASCAL中除了保留字和自定义的标识符外,还有一类有特殊含义的标识符,这类标识符称为标准标识符。
它们是用来标记程序中经常引用的处理对象,如常量、函数。
(PASCAL定义的保留字和标准标识符附后)
标识符在命名的时候要注意:
1、名字要易记易读,有意义。
如8皇后问题程序名可以是“queen”也可以是“huanghou”等;
2、不能用保留字、标准标识符作为自定义的标识符。
说明部分:
constn=4;
typear=array[1..4]ofinteger;
vari:
integer;a:
ar;
其中,const部分是常量说明,说明一些在以下部分用到的,在整个程序执行过程不改变值的量。
这些量PASCAL称为常量。
在程序中用到这个值的地方均用常量名来代替。
如上题中定义“n=4”指本程序处理4个数值,在下面的程序体中就用“n”来代替具体的值(如for
i:
=1to
n)。
如果要改变处理数据个数,则只在常量说明部分修改“n=4”这一句就行了,而不用在程序中每一个用到的地方都加以修改。
这样不但在编写程序的时候很方便,也增加了程序的可读性,修改时更方便。
常量说明在保留字“const”下开始。
可以有多个语句。
常量说明语句的格式是:
“常量名=值;”。
如“n=4;”。
n是常量名,4是该常量的值,“;”是语句分隔符。
type部分是类型说明,说明一些在以下部分用到的数据类型。
如数组、记录、指针等。
类型说明在保留字“type”下开始。
可以有多个语句。
类型说明语句的格式是:
“类型名=类型说明;”。
如“ar=array[1..4]of
integer;”。
ar是类型名,array[1..4]ofinteger是类型说明,“;”是语句分隔符。
var部分是变量说明。
变量是指在程序执行过程中可以通过赋值语句或读语句来改变值的量。
所有在程序中使用的变量都应该先在变量说明部分说明。
PASCAL中引用的每个变量都有“名字”和“类型”属性。
变量说明“说明”的主要工作是告诉PASCA下面程序中要用到这个名字的量,同时这个量的类型是什么。
变量说明在保留字“var”下开始。
可以有多个语句。
变量说明语句的格式是:
“变量名:
变量类型;”。
其中,如果有多个变量同一类型,则变量名与变量名之间用逗号分隔,变量名与变量类型之间用冒号分隔。
如“i:
integer;”(i是变量名,integer是类型名)、“i、j:
integer;”(i、j是变量名,integer是类型名)……
变量说明要注意:
1、有效变量名称不能大于8个字符;2、变量名称必须以字母开头;3、在同一个有效范围内变量名称必须唯一。
各个说明部分均以该部分的保留字开始。
如“const”开始常量说明;“type”开始类型说明;“var”开始变量说明。
一个程序包含多少种类型的说明,看需要而定,不是每一个程序都必须同时包含这三种说明。
如果程序不须要用到常量,则常量说明部分可以省略;如果不须要用到类型说明,则类型说明可省……
PASCAL还有一条规则:
先说明后引用。
即所有在程序体中用到的“名字”必须都在说明部分说明过才能引用,否则就会出错,通不过编译,也执行不了。
如上,类型“ar”先在类型说明中定义,然后在变量说明中引用;变量i在变量说明中定义,在程序中引用。
程序体:
begin
fori:
=1tondo
read(a[i]);
readln;
fori:
=ndownto1do
write(a[i]:
4);
writeln;
end.
程序体是以begin
end.括起来的语句系列。
“end”后面是一个小圆点,标识着程序结束,整个程序只有一个是一个程序的主要部分。
编程要完成的工作大部分都在这里完成。
程序体中每一语句均以“;”作为结束符。
在书写程序时,以“分层缩进”的风格来写,以便提高程序的可读性。
所谓的“分层缩进”是指在逻辑上同一级的语句其起始点对齐,下一级的语句向右缩进。
运算符表达式
PASCAL中的运算符有算术运算符和关系运算符。
和我们在数学课中学的基本一样但在写法上有些不同,在写程序时要特别注意写法的不同:
+加号;-减号;*乘号(数学中写为×);/除号(数学中写为÷);MOD取余如:
8MOD2=0,7MOD
2=1,2MOD3=2;DIV取整如:
8DIV2=4,7DIV2=3,2DIV
3=0。
在PASCAL只有上面6种数学运算。
其它的就只能利用这6种运算的组合通过语句来实现。
如a^2(a的平方)可以化成a*a。
>大于;<小于;<>不等于(数学中写为≠);<=小于等于(数学中写为≤);>=大于等于(数学中写为≥),
变量、常量通过运算符连接起来的式子我们称为表达式。
一个单独的变量或常量也是表达式。
如a、a+3、a*3+b都是表达式。
写表达式时要注意PASCAL表达式跟我们已经熟悉的数学表达式在格式上的区别:
数学表达式PASCAL表达式注意
2a2*a*号不能省略
a÷ba/b除号的写法
a≠ba<>b不等号的写法
a≤ba<=b小于等于号的写法
标准数据类型:
整型实型字符型布尔型
数据类型可以理解为一个取值范围和定义在这取值范围上的运算规则。
想一想我们对于数的理解:
小学学自然数,范围是从0开始,那时候不知道有小数,也不知道有负数,允许的运算是+、-、×、÷,而且对于减法规定被减数要大于减数。
到了中学,数的范围扩大了,整数包括正数和负数,减法运算也不再有额外的规定的了。
同理,在PASCAL中“数据类型”也是一个取值范围和在它上面定义的运算规则。
PASCAL中定义好的标准数据类型一共有4个:
整型、实型、字符型、布尔型,分别用保留字integer、real、char、boolean来标记它们。
其取值范围和运算如下:
整型(integer):
范围-32768——32767;运算+-*/moddiv
实型(real):
范围运算+-*/
字符型(char):
范围可显示的ASCII字符
布尔型(boolean):
范围truefalse运算andornot
在PASCAL中可使用的基本符号有:
(1)大写字母A—Z;小写字母a—z;数字0—9
(2)其它字符+—*/=><>=<=<>:
=
()[].,:
‘$^(**){}
其中,有些符号是以双字符作为一个整体,拆开后就失去原有的意义。
如“<>”是一个表示“不等于”的关系运算符,如拆开后就变成了两个关系运算符,分别表示“小于”、“大于”。
PASCAL使用的保留字有:
AND、ARRAY、BEGIN、CASE、CONST、DIV、DO、DOWNTO、ELSE、END、FILE、FOR、FUNCTION、GOTO
、IF、IN、LABEL、MOD、NIL、NOT、OF、PACKED、PROCEDURE、PROGRAM、RECORD、REPEAT、SET、THEN、TO、TYPE、UNTIL、VAR、WHILE、WITH、FORWARD
常用的标准标识符有:
标准常量:
FALSETRUEMAXINTMAXLONGINT
标准类型:
INTEGERBOOLEANREALCHARTEXT
标准文件:
INPUTOUTPUT
标准函数:
ABSACTANCHRCOSEOFELONEXPLNODD
ORDPREDROUNDSINSQRSQRTSUCCTRUNC
标准过程:
ASSIGNGETNEWDISPOSEPACKPUTREAD
READLNRESETREWRITEUNPACKWRITEWRITELN
函数格式:
functionfun_name(参数表):
数据类型;
var变量声明;
begin
函数体;
end;
例题:
写出计算两个整数a,b的和函数add(a,b)。
过程格式:
procedureproc_name(参数表);
var变量声明;
begin
过程体;
end;
例题:
写出在屏幕打印一行文字:
”hello,Pascallanguageisveryeasy!
”
函数和过程的调用:
例题:
从键盘输入:
a,b两个数,输出由这两个数为直角边的三角形的面积。
【xoi00_01.pas】
programxoi00_01;
functionarea(consta,b:
real):
real;
vars:
real;
begin
s:
=a*b/2.0;
area:
=s;
end;
proceduremyproc;
vara,b:
real;
s:
real;
begin
write('Pleaseinputtwonumbera,b:
');
readln(a,b);
s:
=area(a,b);
writeln('theareaoftrianis:
',s:
5:
2);
end;
{=============mainprogram================}
begin
myproc;
end.
练习:
一、判断以下标识符的合法性:
a33aa17abcdex9.5αβλ
二、将下列的数学表达式改写成PASCAL表达式:
b^2-4ac
三、求下列表达式的值:
20mod19,15mod9,7div8,19div3,(4>5)and(7<8),(8>9)or(9<10),2
and((3=3)or(3<7))
第一节顺序结构
顺序结构是程序设计中最简单的结构,也是最基本的结构,它就是按照程序书写的顺序逐句执行程序中的指令。
流程图如下:
例题:
计算圆的周长的过程:
输入圆的半径;(操作一)
计算圆的周长;(操作二)
输出圆的周长;(操作三)
基本的程序语句:
赋值语句:
赋值语句是最简单的语句,其一般形式为:
<变量>:
=<表达式>;
“:
=”称为赋值号,赋值语句的作用是计算表达式的值,并赋给变量。
对于任何一个变量必须首先赋值,然后才能引用,否则,未赋初值的变量将以一个随机值参与运算。
另外,赋值号两边的类型必须相同,但表达式值为整数时,它可自动化为实型后赋给该实型变量,即符合赋值相容。
如:
Pi:
=3.14;R:
=2;Age:
=20;S:
=Pi*R*R
例:
关于赋值的例子
prssogramexample;
vara,b:
integer;
begin
a:
=3;
b:
=2;
a:
=a+b;
writeln(a);
writeln(b);
end.
输入语句
通过计算机的外设把数据送到计算机内存的过程称为输入。
TurboPascal语言的输入语句有如下两种形式:
read(<变量名表>);
readln(<变量名表>);
<变量名表>是一个或几个由逗号隔开的变量标识符,他们必须在程序说明部分预先说明,他们可以是整型、实型或字符型,布尔型不可以直接读入。
例如a,b,c为整型变量,read(a,b,c)之后,键盘输入:
20
3040(表示回车),结果:
a=20,b=30,c=40
readln语句和read语句不同之处在于输入数据到各变量之后,readln自动换行,从下一行开始再输入数据。
一个read语句执行完后,数据行中多余的未读数据可以被下一个输入语句读入;而一个readln于执行完后,数据行中多余未读数据就没有用了。
readln语句中可以不包含变量名表。
即有以下等价情况:
read(a,b);readln等价于readln(a,b)
输入语句输入的数据类型必须和变量一一对应。
如果输入的是一串整数或实数,数据间用空格或回车分隔;若输入的是一串字符,则不用分隔。
输出语句
输出是将内存中的数据送到外设的过程。
TurboPascal的输出语句有两种形式:
write(<输出项表>);
writeln(<输出项表>);
其中<输出项表>是一串用逗号分隔的常量、变量、函数名、表达式或字符串。
如果是变量、函数名、表达式,则将其计算结果输出;如果是常量或字符串,则直接输出其值。
write和writeln的区别在于:
write语句是输出项输出后,不换行,光标停留在最后一项后,writeln语句按项输出后,自动换行,光标则停留在下一行的开始位置。
writeln语句允许不含有输出项,即仅writeln;表示换行。
Turbo
Pascal语言把输出项的数据显示占用的宽度称为域宽,你可以根据输出格式的要求在输出语句中自动定义每个输出项的宽度。
定义宽度时分为单域宽和双域宽。
单域宽输出格式:
writeln(I:
n);
在n个字符宽的输出域上按右对齐方式输出I的值,若n大于I的实际位数,则在I值前面补(n-I的实际位数)个空格。
若I的实际位数大于n,则自动突破限制。
n必须是整数。
双域宽输出格式:
writeln(a:
n:
m);
双域宽主要用于实型数据的输出。
n的用法同上。
在n个字符宽的输出域上按右队齐方式用小数点形式输出a的数值,m是小数点后的位数。
原来的数据按该该格式指定的小数位数四舍五入。
若m=0
,则不输出小数部分和小数点,原数据四舍五入取整。
n,m必须是整数。
例:
输出语句的例子
programshuchu;
consts='pascal';
vari:
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.
复合语句
复合语句是由若干语句组成的序列,语句之间用分号“;”隔开,并且以begin和end括起来,作为一条语句。
复合语句的一般形式:
begin
语句1;
语句2;
……
语句n;
end;
例:
变量值的交换
programswap;
var a,b,t:
integer;
begin
a:
=10;b:
=20;
begin
t:
=a;
a:
=b;
b:
=t;
end;
writeln('a=',a,'b=',b)
end.
例题1:
输入圆的半径,求出圆的周长和面积:
ProgamCalCircle;
varR,C,S:
Real;{变量声明}
begin
write(‘输入圆的半径:
’);
readln(R);
C:
=2*Pi*R;
write(‘周长=’,C);
readln;
S:
=Pi*sqr(R);{sqr(R)=R*R}
write(‘面积=’,S);
readln;
end.
例题2:
找出下面程序中的语法错误。
ProgramExample1;
{计算圆环面积的程序,R2表示外圆环的半径,R1表示内圆环的半径,R2>R1}
varR1,R2:
Real;
begin
S=(R2+R1)*(R2-R1)*Pi
{Pi=3.14为常数}
writeln(s)
end;
纠正以后的程序
ProgramExample1;
{计算圆环面积的程序,R2表示外圆环的半径,R1表示内圆环的半径,R2>R1}
varR1,R2:
real;
S:
real;{每一个变量都必须声明}
begin
S=(R2+R1)*(R2-R1)*Pi;{Pi=3.14为常数}
writeln(s);{语句必须以“;”结束}
end.{主程序必须以“.”结尾}
练习:
编写程序实现以下功能:
1、输入三角形三边的长,计算三角形的面积。
计算公式:
Pascal程序中计算平方根的函数为:
sqrt(x);{x:
real;x0}
基本要求:
有友好的输入输出界面,不需要考虑输入的a,b,c是否可以构成三角形,假设输入的数据符合要求。
第二节IF分支结构
例题:
输入一个考试分数,如果大于等于60就说恭喜你考试及格,如果小于60就说真差劲,要努力哦!
programJudgeScore;
输入分数→score;
如果Score≥60那么
输出“恭喜你考试及格”
否则
输出“真差劲,要努力哦”
“如果...那么”形式的判断在Pascal中使用If语句来实现。
IF语句是由一个布尔表达式和两个供选择的操作序列组成。
运行时根据布尔表达式求值结果,选取其中之一的操作序列执行。
有两种形式的IF语句:
if <布尔表达式> then<语句>;
if <布尔表达式> then<语句1>
else<语句2>;
当布尔表达式的值为真,则执行then后面的语句,值为假时有两种情况:
要么什么也不做,要么执行else后面的语句。
注意else前面没有分号,因为分号是两个语句之间的分隔符,而else并非语句。
如果在该处添了分号,则在编译的时候就会认为if
语句到此结束,而把else当作另一句的开头,输出出错信息。
前面例题的Pascal程序代码:
ProgramJudgeScore;
varscore:
real;{声明分数变量score}
begin
readln(score);{输入分数}
ifscore>=60then
begin{score代表分数的变量}
writeln(‘恭喜你,考试及格!
’);
endelsebegin
writeln(‘真差劲,要努力哦!
’);
end;{endifscore>=60}
end.
例:
求y=f(x),当x>0时,y=1,当x=0时,y=0,当x<0时,y=-1
programlianxi;
varx,y:
real;
begin
ifx>0theny:
=1;
ifx=0theny:
=0;
ifx<0theny:
=-1;
writeln('y=',y);
end.
在TurboPascal语言if语句中被构造的语句只能是一条语句,当条件选择某个分支的计算要用多个语句描述时,就必须把该分支用begin和
end括来,写成复合语句。
在用if语句连续嵌套时,如果你插入适量的复合语句,有利于程序的阅读和理解。
例:
当x>0时候,计算x*x,并且输出x和x*x。
programlianxi;
varx,x1:
real;
begin
readln('x=',x);
ifx>=then
begin
x1:
=x*x;
writeln('x*x=',x1);
writeln('x=',x);
end;
end.
当if语句嵌套时,TurboPascal约定else总是和最近的一个if配对。
前面介绍了If语句的使用情况,下面来概括if判断语句的使用方法。
分支结构的基本情况:
if条件成立then
begin
处理;
end;
下一语句;
if条件成立then
begin
操作B;
endelse{if条件不成立then}
begin
操作A;
end;
下一语句;
练习:
写出下列关系表达式和逻辑表达式的Pascal语句:
1、区分合格和不合格:
x>=60
2、60分到70分之间:
(x>=60)and(x<=70)
3、判别闰年的条件(年份能被4整除,并且不能被100整除;或者能被400整除的整数年份):
((ymod4=0)and(ymod100
<>0))or(ymod400=0)
编写程序实现下列功能:
1、从键盘读入一个数,判断它的正负。
是正数,则输出"+",是负数,则输出"-"
2、输入a,b,c三个不同的数,将它们按由小到大的顺序输出
3、铁路托运行李规定:
行李重不超过50公斤的,托运费按每公斤0.15元计费;如超50公斤,超过部分每公斤加收0.10元。
编一程序完成自动计费工作。
4、打印某年某月有多少天。
(提示:
A、闰年的计算方法:
年数能被4整除,并且不能被100整除;或者能被400整除的整数年份。
B、利用MOD运算可以判断一个数能否被另一个数整除)
5、从键盘输入3个数a,b,c输出其中最大的数。
第三节Case分支结构
case语句是由一个表达式和众多可选择的操作序列组成。
运行时,根据表达式的求值结果,在众多的分支中选取一个分支执行。
其形式为:
case 表达式 of
常量1:
语句1;
常量2:
语句2;
……
常量