第一讲 初识Pascal语言
一、Pascal 语言概述
Pascal 语言是一种算法语言,它是瑞士苏黎世联邦工业大学的Niklaus Wirth教授于
1968年设计完成的,1971年正式发表。1975年对Pascal 语言进行了修改,作为“标准PASCAL
语言”。
Pascal 语言是一种结构化的程序设计语言,可以用来编写应用程序。它又是一种系统
程序设计语言,可以用来编写顺序型的系统软件(如编译程序)。它的功能强、编译程序简
单。
二、Pascal 语言的特点
Pascal语言有以下几个主要的特点:
⒈ 它是结构化的语言。Pascal语言提供了直接实现三种基本结构的语句以及定义“过
程”和“函数”的功能。可以方便地书写出结构化程序。在编写程序时可以完全不使用GOTO
语句和标号。这就易于保证程序的正确性和易读性。Pascal语言强调的是可靠性、易于验证
性、概念的清晰性和实现的简化。在结构化这一点上,比其它(如BASIC,FORTRAN77)
更好一些。
⒉ 有丰富的数据类型。Pascal提供了整数、实型、字符型、布尔型、枚举型、子界型、
数组类型、集合类型、记录类型、和文件类型和指针类型。 ⒊ 能适用于数值运算和非
数值运算领域。PASCAL的功能较强,能广泛应用于各种领域。PASCAL语言还可以用于辅
助设计,实现计算机绘图功能。
⒋ PASCAL程序的书写格式比较自由。PASCAL允许一行写多个语句,一个语句可以
分写在多行上,这样就可以使PASCAL程序写得格式优美,便于阅读。
由于以上特点,许多学校选PASCAL作为程序设计语言,它能给学生严格而良好的程
序设计的基本训练。培养学生结构化程序设计的风格。
三、Pascal语言程序的基本结构
程序设计语言都有着一组自己的记号和规则。PASCAL语言必须采用其本身所规定的记
号和规则来编写程序。下面我们首先来了解Pascal语言的程序基本结构。
Pascal语言的程序结构为:
程序首部
标号说明语句
常量定义语句
类型定义语句 程序的说明部分
变量说明语句
函数和过程说明语句 分程序
程序体 程序的执行部分
先看一个简单的PASCAL程序:
program exam1(input,output);
var r,s,c:real;
begin
readln(r);
c:=3.14*2*r;
s:=3.14*r*r;
writeln(c,s)
end.
从这个简单的程序可以看到:
1、 一个PASCAL程序分为两个部分:程序首部和程序体(或称分程序)。
2、程序首部是程序的开头部分,它包括:
⑴ 程序标志。用“program”来标识“这是一个PASCAL 程序”。PASCAL规定任何一
个PASCAL程序的首部都必须以此字开头。在Turbo pascal语言中,首部也可省略。
⑵ 程序名称。由程序设计者自己定义,如例中的exam1。
在写完程序首部之后,应有一个分号。
3、程序体是程序的主体。程序体包括说明部分(也可省略)和执行部分两个部分。
⑴ 说明部分用来描述程序中用到的变量、常量、类型、过程与函数等。本程序中第二
行是“变量说明”,用来定义变量的名称、类型。
PASCAL规定,凡程序中用到所有变量、符号常量、数组、标号、过程与函数、记录、文件
等数据都必须在说明部分进行定义(或称“说明”)。也就是说,不允许使用未说明先使用。
⑵ 执行部分的作用是通知计算机执行指定的操作。如果一个程序中不写执行部分,在
程序运行时计算机什么工作也不做。因此,执行部分是一个PASCAL程序的核心部分。
执行部分以“begin”开始,以“end”结束,其间有若干个语句,语句之间以分号隔开。
执行部分之后有一个句点,表示整个程序结束。
4、 PASCAL程序的书写方法比较灵活。 应以程序结构清晰、易读为目的。在编写程
序时尽量模仿本书中例题程序格式。
5、在程序中,一对大括号间的文字称为注释。注释的内容由人们根据需要可用英语书
写。注释可以放在任何空格可以出现的位置。执行程序时计算机对注释不予理睬。
6、保留字后不加标点符号(END除外)。
四、Turbo Pascal语言系统的使用
下面我们就学习常用的Turbo Pascal 7.0系统的使用。
1、系统的启动
在运行系统目录下的启动程序,即可启动系统。屏幕上出现如图1所示的
集成环境。
2、Turbo Pascal系统集成环境简介
最顶上一行为主菜单。中间蓝色框内为编辑窗口,可进行程序的编辑。最底下一行为提
示行,显示出系统中常用命令的快捷键。
3、新建程序窗口
按F10进行主菜单,选择File菜单,执行其中New命令。就可建立一个新的程序窗口(默
认文件名为或等)。
4、程序的输入、编辑与运行
在当前程序窗口中,一行一行的输入程序。事实上,程序窗口是一个全屏幕编辑器。所
以对程序的编辑与其它编辑器的编辑方法类似,这里不再重复。
当程序输入完毕之后,一般要先按Alt+F9(或执行compile菜单中compile命令)对程
序进行编译。如果程序有语法错误,则会在程序窗口的第一行处显示第一个红色错误信息。
若无语法错误,则窗口正中央会出现一个对话框,提示编译成功。接下来,我们可以运行程
序了。
程序的运行可以通过按ALT+R打开RUN菜单中的RUN命令,或直接按快捷键CTRL+F9。
则可以在用户窗口中输出运行结果。通常在程序运行结束后系统回到Pascal系统的集成环
境,因此要查看运行结果,要按ALT+F5将屏幕切换到用户屏幕。
5、程序的保存与打开
当我们想把程序窗口中的程序存入磁盘时,可以通过按F2键(或执行File菜单中的save
命令)来保存程序。第一次保存文件时屏幕上会出现一个对话框要求输入文件名(默认扩展
名为.pas)。
当我们要将磁盘上的程序文件中的PASCAL程序装入窗口时,可按F3(或执行File菜
单中的Open命令)来装入程序,此时系统也会弹出一个对话框要求输入要打开的文件名,
或直接在文件对话框列表中选择所要的文件,然后回到打开文件。
第二讲 数据类型、表达式、函数
一、数据类型
整数类型 integer -32768~32767
短整型 shortint -128~127
长整型 longint -2147483648~2147483647
字节型 type 0~255
字型 word 0~65535
实数型 real:包括正实数、负实数和实数零。实数的绝对值在1E-38到1E+38之间。
形式有两种:
⑴ 十进制表示法
人们日常使用的带小数点的表示方法。如0.0,-0.0,5.61,-8.0,等都是实数形式。
⑵ 科学记数法
科学记数法是采用指数形式的表示方法,如1.25×105可表示成1.25E+05。在科学记数
法中,字母“E”表示10这个“底数”,而E之前为一个十进制表示的小数,称为尾数,E之后
必须为一个整数,称为"指数"。 如-1234.56E+26 , 0.268E-5 , 1E5是合法形式,而.34E12 , 2.E5 ,
E5 ,E,1.2E+0.5都不是合法形式的实数。
和整数相比,实数能表示的范围大得多,但值得注意的是实数的运算整数的运算速度慢且
无法像整数那样精确表示,只能近似表示。如2.03.0比23的运算慢。
字符型 char 括在两个单引号中的字符: ’a‟表示字符;a表示标识符, ‟3‟ 表示字符;
3表示整数值
布尔型 boolean
布尔型有两个值,真和假,分别用标准常量名true和fal表示,序号分别为1和0。
二、常量
在程序运行过程中,其值不能被改变的量称为常量。如12,14.8,'abc',true等。
Pascal中有一个标准标识符Maxint,它代表所使用的计算机系统允许的最大整型数,
而最小的整型数即为-Maxint-1。Turbo Pascal还定义了长整数常量MaxLongInt,其值为
2147483647。
字符常量:是由字符组成,所有字符来自ASCII字符集,共有256个字符。在程序中,
通常用一对单引号将单个字符括起来表示一个字符常量。如:'a','A','0'等。对于ASCII
字符集中,按每个字符在字符集中的位置,将每个字符编号为0-255,编号称为对应字符
的序号。
符号常量:一个常量即可以直接表示(称为直接常量, 如 124,156.8),也可以用
一个标识符来代表一个常量,称为“符号常量”。但符号常量必须在程序中的说明部分先定
义,后使用。
定义符号常量的一般格式:
CONST <常量标识符>=<常量>
说明:常量说明部分以关键字const开头, 后面的标识符为常量标识符,其中"="号后
的常量为整数、实数、字符、 字符串。例如:
const
pi=3.14159;
zero=0;
var r,s,c:real;
则在程序中pi和zero作为符号常量,分别代表实数3.14159和整数0。也就是说,常量
说明部分既定义了常量名及其值,又隐含定义了常量的类型。
Pi(function函数)为 3.97932385
三、变量
变量代表了一个存储单元,其中的值是可变的,故称为变量。即在程序运行过程中,其
值可以改变的量,称为变量。
变量有三个要素是:变量名、变量类型、变量值。
一个程序中可能要使用到若干个变量,为了区别不同的变量,必须给每个变量(存贮单
元)取一个名(称为变量名),该变量(存贮单元)存放的值称为变量的值,变量中能够存
放值的类型为变量的类型。
1、变量名
用一个合法的标识符代表一个变量。如m,rot,total 等都是合法变量名。在程序中
用到的变量必须在说明部分加以说明。
“自定义标识符”的命名规则为:自定义标识符必须以字母(包含下划线"_")开头,
后面的字符可以是字母或数字。标识符长度不超过63个字符。
变量名应遵循自定义标识符的命名规则,并注意“见名知义”的原则,即用一些有意义
的单词作为变量名。
2、变量的类型
常量是有类型的数据,变量在某一固定时刻用来存放一个常量,因此也应有相应的类型。
如整型变量用来存放整数,实型变量用来存放实数。
3、变量说明
在程序中若要使用变量,变量的名称及类型在程序的变量说明部分加以定义,变量的值
则在程序的执行部分中才能赋给。
变量说明的一般格式:
VAR <变量标识符> [,<变量标识符>]:<类型>; (中括号内部分表示可省)
其中VAR是pascal保留字,表示开始一个变量说明段, 每个变量标识符或由逗号隔开的
多个变量标识, 必须在它的冒号后面说明成同一类型。一个程序中,可以说明许多不同类型
的变量,每种类型变量之间用分号隔开,共用一个VAR符号。
例如:
var age,day:integer;
average:real;
其中,Integer(整型)、Real(实型)是标准标识符, 它们是“类型标识符”,代表了确
定的类型,如age和 day 被定义为整型变量, average被定义为实型变量。
一旦定义了变量,就确定了它的类型,也就是说,就确定了该变量的取值范围和对该变
量所能进行的运算。
四、表达式
表达式的定义
pascal语言中的算术表达式是由符合pascal语法规定的运算对象(包括常量、变量、
函数)、算术运算符、圆括号组成的有意义的式子。如:A+3.14159*5/8.4-Abs(-13)
1、算术运算符
常用的有以下6个算术运算符: + 、- 、* 、 / (实数除)得到结果为实型.如
5.0/2.0=2.5, 5/2= 2. 5,4/2=2.0而不等于2。
div (整除) div它要求除数和被除数均为整型,结果也为整型。如10 div 3=3, 5 div
10=0, -15 div 4= -3。 div运算只取商的整数部分,参与div运算的两个对象不能为实
型。
mod (求余),也只能用于整数运算,结果为整数。例如:10 mod 4=2 , -17 mod 4= -1 ,
4 mod (-3)=1, - 4 mod 3= -1,即 a mod b=a-(a div b)*b。
2、关系运算符: >、<、>=、<=、=、<>
3、逻辑运算符: NOT、 AND 、OR
4、运算优先顺序
如果一个表达式里出现两个或两个以上的运算符, 则必须规定它们的运算次序。
PASCAL语言规定运算优先级如下:
① 表达式中相同优先级的运算符,按从左到右顺序计算
② 表达式中不同优先级的运算符,从高到低进行计算
③ 括号优先级最高,从内到外逐层依次降低
④ not优先级为4
⑤ *、/、div、mod、and优先级为3
⑥ +、-、or优先级为2
⑦ =、<>、<、>=、<=、in优先级为1
五、标准函数
学习标准函数要注意:
每个标准函数对自变量的数据类型都有一定的要求,函数经过运算后得到的函数值
的类型也是一定的。函数值的类型关系到该函数能够参加的运算。函数也可做自变量。
1、算术运算函数函数
绝对值函数abs(x) abs(-10)=10
平方值函数 sqr(x) sqr(4)=16
平方根值函数sqrt(x) sqrt(4)=2
2、逻辑判断函数
奇数函数 odd(x) integer Boolean odd(-11)=true,odd(10)=fal
3、转换函数
截尾函数 trunc(x) real integer trunc(3.7)=3, trunc(-7.9)=-7
舍入函数 round(x) real integer round(12.7)=13, round(12.4)=12
round(-5.7)=-6
序数函数 ord(x) 函数值为字符在ASCII中的序号 ord(‘a’)=97,
ord(‘0’)=48, ord(true)=1
字符函数 chr(x) x表示ASCII中的序号 函数值为该序号代表的字符值。
chr(48)=’0’ , chr(32)=’ ’
4、顺序函数
前驱函数 pred(x) pred(5)=4, pred(‘b’)=’a’, pred(true)=fal
后继函数 succ(x) succ(5)=6, succ(„A‟)=‟B‟
第三讲 赋值语句
一、
赋值语句
变量既然代表一个存储单元,其值是可变的,那么怎么赋值的,又是怎么改变的呢?可
以通过赋值语句来进行。
1、 赋值语句的格式
变量名:=表达式; 其中“:=”称为赋值号。
2、 执行过程
计算机先计算赋值号右边表达式的值,然后将表达式的值赋给变量。如:A:=9*8-2; A:=A+1
注意:1、赋值号与比较关系符是不同的两个符号,
2、赋值号两边的数据类型必须相容
3、变量在程序中如没有赋值,数值变量的值为0。
例1:下列赋值语句那些是错的?错在哪里?(var : x,y,z,a: integer; )
① x:=x+y ② x=y+z ③ x+y:=z
例2:写出下列程序的运行结果
var a,b,c:integer;
begin
a:=5; b:=8;
c:=a; a:=b; b:=c;
writeln('a=’,a,’ ',’b=’,b)
end.
思考题:如果不引入第三个中间变量,能否交换两个变量的值?编程序试一试。
学习两个过程:
① inc(x,n) 等价于 x:=x+n ② dec(x,n) 等价于 x:=x-n
inc(x) 等价于 x:=x+1 dec(x) 等价于 x:=x-1
第四讲 输出语句
输出语句
输出语句的作用是先计算表达式的值,并按指定的格式输出到屏幕。
1、输出语句的两种格式
① write语句
格式: Write(表达式1,表达式2,„„);
如:write(1,2,3,4); write('My name is Liping');
② writeln语句
格式: Writeln (表达式1,表达式2,„„) 或 writeln
2、输出语句的功能
计算机执行到某一输出语句时,先计算出输出语句中的每个表达式的值,并将每一个表
达式的值一个接一个地输出到屏幕上。
Write语句与writeln语句功能基本相同,但有两点不同:
① write语句将其后括号中的表达式一个接一个输出后,没有换行。而writeln语句则
在输出各个表达式的值后换行。
② write语句至少必须输出一项内容,而writeln语句允许不输出任何内容,只是换行。
write(x,y); 等价于 write(x); write(y);
writeln(x,y); 不等价于writeln(x); writeln(y);
等价于write(x); writeln(y);
例1、以下两个程序段的输出分别为:
① write(1,2,3,4);write(5,6); ② writeln(1,2,3,4);write(5,6);
输出为: 输出为:
123456 1234
56
例2:有三个小朋友甲乙丙。甲有50粒糖果,乙有43粒糖果,两有13粒糖果。现在他们
做一个游戏。从甲开始,将自己的糖分三份,自己留一份,其余两份分别给乙与丙,多余的
糖果自己吃掉,然后乙与丙也依次这样做。问最后甲、乙、丙三人各有多少粒糖果?
分析:在游戏中每个小朋友拥有的的糖果数是在变化的,用a,b,c三个变量分别存放甲
乙丙在某一时刻所拥有的糖果数。对于每人,分糖后,他的糖果数一定为原来的糖果数 div
3(用整除恰可以表示多余的糖自己吃掉)。而其他两人则增加与这个小朋友现在拥有的糖果
数。
程序如下:
var A,B,C:integer;
begin
A:=50; B:=43; C:=13; {初始糖果数}
A:=A div 3; B:=B+A; C:=C+A; {甲分糖果后,每个人拥有的糖果数变化情况}
B:=B div 3; A:=A+B; C:=C+B; {乙分糖果后,每个人拥有的糖果数变化情况}
C:=C div 3; A:=A+C; B:=B+C; {丙分糖果后,每个人拥有的糖果数变化情况}
writeln('A=',A,' B=',B,' C=',C);
end.
3、输出格式:数据的输出格式很重要,输出的数据所占的列数为场宽。
输出项中无指定格式符号,则按标准场宽输出,integer实际长度,real 17列,char
串长。
单场宽(输出整数时自定义) 格式:e:n1 n1是正整数,表示e输出时所占的列数。
双场宽(输出实数时自定义) 格式:e:n1:n2 n1,n2是正整数,且n1>n2, n1输出
总列数含符号位、整数部分、小数点、小数部分,n2小数部分的列数。
数据不突破场宽限制时,单场宽一律向右看齐,双场宽实数向小数点看齐,多余的小
数位补0。
数据实际位数超过场宽时,以保证数据的正确输出为原则。单场宽时自动将n1扩展
到所需位数,双场宽时自动将n1扩展到所需位数,n2小于实际的小数位数时,则舍去多
余的位数,内存中仍保留该数的精确值。
例3、写出下列程序的运行结果:
const s='abcd';
var i:integer; r:real; c:char; b:Boolean;
begin
i:=1234; r:=123.456; c:= '*’; b:=true;
writeln(i,i:5,i:3);
writeln(r,r:8:4,i:8:2);
writeln(c,c:4);
writeln(s,s:8,s:3);
writeln(b,b:5,b:3)
end.
运行结果
1234 12341234
1.2345600000E+02123.4560 123.46
* *
abcd abcdabcd
TRUE TRUETRUE
第五讲 输入语句
读语句
格式: read(变量名表);
readln[(变量名表)];
语义:从键盘输入数据,依次赋值给相应变量。
变量名表为一串用逗号分隔的变量标识符。
数值型数据之间用空格或回车键分隔,最后一定要回车,表示输入完毕。
例4、设a,b,c为整型变量; 如需将a,b,c的值分别赋以10,20,30,写出对应read(a,b,c);
语句的所有可能输入格式。
键盘输入 ① 10 20 30↓ ② 10 20↓ ③ 10↓ ④ 10↓
30↓ 20 30↓ 20↓
30↓
如将read(a,b,c)改为readln(a,b); readln(c);而达到本例同样的输入目的,上面哪些输
入格式是有效的。
read语句是一个接一个地读数据,在执行完本Read语句( 读完本语句中变量所需的
数据)后,下一个读语句接着从该数据输入行中继续读数据,也就是说,不换行。
read(a,b);
read(c,d);
read(e);
如果输入数据行如下:
1□2□3□4□5□6□↓ ↓表示回车键
Read后一定要有变量名表,readln可以没有输入项,只是读一个回车换行符。
例5、设有下列语句(所有变量为整型)
read(a,b,c);
readln(d,e); readln;
readln(f,g);
设输入文件input 中的数据如下:
1□2↓
3□4□5□6□7□8↓
9□10↓
11↓
12□13↓
分析:可以假设有一个数据指针,每读一个数据后,指针指向后一个数据,每执行一个
readln语句后,指针移到下一个数据行的开头。
变量值为:a b c d e f g
1 2 3 4 5 11 12
read(a,b); readln; read(c); 相当于 readln(a,b); read(c)
read(a); readln(b,c); 相当于 readln(a,b,c);
read(a); read(b); 相当于 read(a,b);
但是:readln(a); readln(b); 不等价于 readln(a,b);
为了避免可能出现的错误,建议在程序中按下列原则使用读语句:
①如果没有特殊需要,在一个程序中尽量避免混合使用read语句和readln语句;
②尽量用readln语句来输入数据, 一个数据行对应一个readln语句;
③由于执行read或readln语句时, 系统不会提供任何提示信息,因此,编程时最好在
readln语句之前加以适当提示,例如:
write('Input a,b,c:');
readln(a,b,c);
在执行时,屏幕上显示:
Input a,b,c:■
其中,"■"为光标。执行readln语句后,系统处于待输入状态, 只有输入所需数据后才继续往下
执行。
第六讲 分支结构
一、PASCAL中的布尔(逻辑)类型
布尔类型变量不能通过读语句输入给它们提供值,可以通过间接方式对布尔变量进行值
的输入。
var a: boolean;
begin readln(a); {错误语句} writeln(a); end.
二、布尔表达式
逻辑运算符:or、and、not。它们分别相当于数学上的“或”、“与”和“非”。
三个运算符的运算对象为布尔值,其中and与or有两个或两个以上运算对象,not为单目运
算,只有一个运算对象。
用布尔运算符把一个关系表达式或多个关系表达式连接起来的式子就称为布尔尔表达式。布
尔表达式的值也为布尔值。它们的布尔运算真值表如下:
a b a and b a or b not a
fal fal fal fal ture
fal true fal ture
true fal fal true fal
true true true true
对于复杂的命题,我们可以用逻辑表达式来表示。例如,
“判断一个数是否大于0小于10” 可表示为 (x>0) and (x<10)。
“判断一个数是否小于等于0或大于等于10” 则表示为(y<=0) or (y>=10)。
“数学、英语成绩都大于等于90分或数学、英语两科成绩总分大于185分”
表示为 (math>=90) and (English>=90) or (math+English>185)。
例4_1、在你前面有一个长长的阶梯,如果你每步跨2阶,那么最后剩1 阶;如果你每步
跨3阶,那么最后剩2 阶;如果你每步跨5阶,那么最后剩4 阶;如果你每步跨6阶,那
么最后剩5 阶;如果你每步跨7阶,那么正好走完,一阶不剩,问你这条阶梯最少有多少
阶?
三、IF语句
1、格式
① IF <布尔表达式> THEN 语句1;
执行IF语句时,先计算布尔表达式值,若为TRUE则执行语句,否则不执行任何操作;
② IF <布尔表达式> THEN 语句1 ELSE 语句2;
执行IF语句时,先计算布尔表达式值,若为TRUE则执行语句1,否则执行语句2
2、注意
① if、then、el为一条完整的语句,在el之前不能有分号;
② 语句1、语句2若实际功能非一条语句所能描述,要写成复合语句。
例4_2: 输入一个整数a,判断是否为奇数,是输出“yes”否则输出”no”。
var a:integer;
begin
write('a='); readln(a);
if a mod 2 =1 then writeln('yes') el writeln('no');
readln;
end.
例4_3:华联超市里卖电池,每个电池一元钱,若数量超过10个,则可打85折。
var num:integer; price,total:real;
begin
write('num='); readln(num); price=1;
if num>10 then price:=price*0.85;
total:=num*price;
writeln('Total=',total:3:2)
end.
第六讲 IF语句嵌套和CASE语句
四、IF语句的嵌套
在if语句中,如果then子句或el子句仍是一个if语句, 则称为if语句的嵌套。
例4_4、求三个给定的整数a,b,c中的最大数。
① if a>b then if a>c then max:=a { 使用if语句嵌套 }
el max:=c
el if b>c then max:=b
el max:=c;
② if a>b then max:=a el max:=b; { 更简单方法,不必嵌套 }
if max 但如有下面的嵌套语句: if a>0 then if b<0 then y:=1 el y:=0; 那么el是a>0的否定,还是b<0的否定呢?pascal规定:el与它上面的距它最近的then 配对。 如果想让el和第一个if语句配对,则: if a>0 then begin if b<0 then y:=1 end el y:=0; 五、ca语句 当多分支选择的各个条件由同一个表达式的不同结果值决定时,可以用ca语句来实 现。它的选择过程,很象一个多路开关,即由ca语句的选择表达式的值,决定切换至哪 一语句去工作。在实现多分支控制时,用ca对某些问题的处理和设计,比用if语句写程 序更简洁、更清晰。 ①情况语句的一般形式: ca <表达式> of <情况标号表1>:语句1; <情况标号表2>:语句2; : el <情况标号表n>:语句n end; ca语句使用el形式,el前一语句后应有分号,这不同于if-then-el。 表达式的值必须是顺序类型,它可以是整型、布尔型及以后学习的字符型、枚举型和子界型。 情况标号表是一串用逗号隔开的与表达式类型一致的常量序列。语句可以是任何语句,包括 复合语句和空语句。 ② ca语句的执行过程 先计算表达式(称为情况表达式)的值,如果它的值等于某一个常量(称为情况常量或 情况标号),则执行该情况常量后面的语句,在执行完语句后,跳到ca语句的末尾end处。 ③ 说明 情况常量是情况表达式可能具有的值,因而应与情况表达式具有相同的类型; 情况常量出现的次序可以是任意的; 同一情况常量不能在同一个ca语句中出现两次或两次以上; 每个分语句前可以有一个或若干个用逗号隔开的情况常量; 每个常量后面只能是一个语句或一个复合语句。 例4_5、输入两个实数,再输入+、-、* 或 / 号,根据运算符输出这两个数的和、差、积或 商。 var a,b,s:real; operator:char; begin writeln('input a,b:‟); readln(a,b); writeln('input operator:‟); readln(operator); ca operator of '+’: s:=a+b; '-’:s:=a-b; '*’:s:=a*b; '/’:s:=a/b; end; writeln(a,operator,b, '=‟,s:5:4) end. 例4_6、输入某年某月份,输出其天数。 分析:程序中要判断输入的年份是否是闰年。判断闰年的算法是:如果此年份能被400整除, 或者它能被4整除而不能被100整除,则它是闰年。否则,它是平年。 var year,month,days:integer; begin write('Input year,month:'); readln(year,month); ca month of 1,3,5,7,8,10,12: days:=31; 4,6,9,11 : days:=30; 2: if (year mod 400=0) or (year mod 100<>0) and (year mod 4=0) then days:=29 el days:=28; el days:=0; end; if days<>0 then writeln( year,‘-’,month ,’has ',days) el writeln(„Input error‟) end. 第七讲 循环 一、FOR语句 格式 for 控制变量:=初值 to 终值 do 语句; for 控制变量:=初值 downto 终值 do 语句; For语句执行过程: 1、先将初值赋给左边的变量(称为循环控制变量); 2、判断循环控制变量的值是否已“超过”终值,如已超过,则跳到步骤5; 3、果末超过终值,则执行do后面的那个语句(称为循环体); 4、控制变量返回步骤2; 5、循环结束,执行for循环后语句。 说明: 循环控制变量必须是顺序类型。例如,可以是整型、字符型等,但不能为实型。 循环控制变量的值选用to则为递增;选用downto则递减。 循环控制变量的值“超过”终值,对递增型循环,“超过”指大于,对递减型循环,“超 过”指小于。 循环控制变量的初值和终值一经确定,循环次数就确定了。但是在循环体内对循环变量 的值进行修改,常常会使得循环提前结束或进入死环。建议不要在循环体中随意修改控制变 量的值。 for语句中的初值、终值都可以是顺序类型的常量、变量、表达式。 例5_1、求S=1+2+3+„+ 100 var n,i : integer; {i为循环变量} S : longint; {s为累加器} begin write('input n='); readln(n); s:=0; for i:=2 to n do s:=s+i; {从2到n累加到s中} writeln('1+2+3+„+ 100=',s); end. 例5_2、输出斐波那契数列的前20项。 规律: F1=0 (n=1) F2=1 (n=2) Fn=Fn-1+Fn-2 (n>=3) 即 0,1,1,2,3,5,8,13,21,„„ 分析:由公式Fn=Fn-1+Fn-2,采用递推算法求解。 方法一 var a,b,i: longint; begin a:=0; b:=1; write(a, ', ',b); for i=2 to 10 do begin a:=a+b; b:=a+b; write( ', 'a, ', ',b); end; end. 方法二 var a,b,c,i:integer; begin a:=0; b:=1; write(a, ', ',b); for i=3 to 20 do begin c:=a+b; a:= b; b:=c; write(', ',c); end; end. 二、WHILE 当型循环语句 对于for循环有时也称为计数循环,当循环次数未知,只能根据某一条件来决定是否进行循 环时,用while 语句或repeat语句实现循环更方便。 格式: while 布尔表达式 do ; <循环体> while语句的执行过程为: 1、判断布尔表达式的值,布尔表达式的值为true时,执行do后面的语句(步骤2), 否则执行步骤4; 2、执行循环体语句; 3、返回步骤1; 4、结束循环,执行while的下一个语句。 说明: while语句的特点是先判断,后执行。 当布尔表达式成立时,重复执行do后面 循环体的语句。 例4_3、斐波那契数列的第n项的值恰好大于10000,求n。 var a,b,c,n: integer; begin a:=0; b:=1; n:=2; while c<=10000 do begin c:=a+b; a:=b; b:=c; n:=n+1; end; writlen('n=',n); end. 例4_4、求两个正整数m和n的最大公约数。 分析:采用辗转相除法求解,分别用m、n、r表示被除数、除数、余数。 1、求m/n的余数r; 2、若r=0,则n为最大公约数,若r≠0,执行第3步; 3、将n的值赋于m,将r的值赋于n; 4、返回重新执行第1步。 var m,n,r:integer; begin writeln('Input m,n:'); readln(m,n); r:=m mod n; while r<>0 do begin m:=n; n:=r; r:=m mod n end; writeln('The greatest common divide is: ',n); end. 二、REPEAT-UNTIL直到型循环语句 repeat-until语句的含义是 “重复执行循环,直到指定的条件为真时为止”。 直到循环语句的一般形式: Repeat 语句1; : 语句n; until 布尔表达式; repeat与until之间的所有语句称为循环体。 说明: 1、repeat语句的特点是:先执行循环,后判断结束条件,因而至少要执行一次循环体。 2、repeat-until是一个整体,它是一个(构造型)语句,不要误认为repeat是一个语句, until是另一个语句。 3、repeat循环体可以是若干个语句,不需用begin和end。 while循环和repeat循环是可以相互转化的。 例5_5、两个正整数的最大公约数,可用repeat-until循环实现: 本例输出语句中有m、n的原值,所以在程序中增加了两个中间变量a、b。 var m,n,r,a,b : integer; begin write('Input m,n='); readln(m,n); a:=m; b:=n; repeat r:=a mod b; a:=b; b:=r; until r=0; writeln('The greatest common divide of ',m, 'and ',n, 'is ',a); end. 一般说来,用for 循环比较简明,只要能用for循环,就尽量作用for循环。只在无法 使用for循环时才用while循环和repeat-until循环, for 循环在大多数场合也能用whiel和 repeat-until循环来代替。一般for循环用于有确定次数的循环,而while和repeat-until循环 用于未确定循环次数的循环。 第七讲 循环嵌套 循环嵌套用于一个循环的循环体中又包含循环结构程序时。 例5_6、1!+2!+„+10!的值。 分析:这个问题是求1到10自然数的阶乘之和。 var s,t: longint; i,j:integer; begin s:=0; for i:=1 to 10 do begin t:=1; for j:=1 to i do t:=t*j; { 求N!的值t } s:=s+t; { 累加N!的值t } end; writeln('s=',s); end. 以上的程序是一个二重for循环嵌套。这是比较容易想到的方法,但实际上对于求n!, 可以求出的(n-1)!再乘上n即可得到,而无需重新从1再累乘到n。程序可改为: var s,t:longint; i:integer; begin S:=0; t:=1; for i:=1 to 10 do begin t:=t*i; s:=s+t end; writeln('s=',s); end. 显然程序二的效率要比程序一高得多。程序一要进行1+2+„+10=55次循环,而程序二 进行10次循环。 例5_7、上街采购,用500元钱买了90只鸡, 其中母鸡一只15元,公鸡一只10元,小鸡 一只5元,正好把钱买完。问母鸡、公鸡、小鸡各买多少只? var i,j,k:integer; begin for i:=1 to 33 do for j:=1 to 50 do begin k:=90-i-j; if 15*i+10*j+5*k=500 then writeln(i:5,j:5,k:5); end; end. 例5_8、求100-200之间的所有素数。 分析:我们可对100-200之间的每一整数进行判断,判断它是否为素数,是则输出。 而对于任意整数i,根据素数定义,我们从2开始到找到i的第一个约数。若找到第一个约 数,则i必然不是素数。否则i为素数。 var i,x : integer; begin for i:=101 to 200 do begin x:=2; while (x<=trunc(sqrt(i))) and (i mod x<>0) do begin x:=x+1; if x>trunc(sqrt(i)) then write(i:6) end; end; writeln end. 将for循环改为while循环可以减少循环次数。 例5_9、输出下面的数字图形: 1 222 33333 4444444 555555555 var row,column,n,d:integer; begin writeln('n=' ); readln(n); d:=20; for row:=1 to n do begin write(' ':d-row); for column:=1 to 2*row-1 do write(row); writeln; end end. 例5_10、三人对ABCD的比赛名次预测如下: A B C D 甲 1 3 乙 1 4 丙 3 2 比赛结果,三人都只说对了一个,问A、B、C、D的实际名次。 var a,b,c,d:shortint; begin for a:=1 to 4 do for b:=1 to 4 do if a<>b then for c:=1 to 4 do if (a<>c) and (b<>c) then begin d:=10-a-b-c; if (ord(a=1)+ord(b=3)=1) and (ord(c=1)+ord(d=4)=1) and (ord(a=3)+ord(d=2)=1) then writeln('A=',a, 'B=',b, 'C=',c, 'D=',d) end; end. 五、用GOTO语句实现循环 例5_11、两个正整数的最大公约数,可用GOTO实现循环 label a; var m,n,r : integer; begin write('Input m,n='); readln(m,n); write('The greatest common divide of ',m, 'and ',n, 'is ') a:r:=m mod n; m:=n; n:=r; if r<>0 then goto a; writeln(m); end. GOTO语句是无条件转向语句,GOTO语句的使用可能会使程序出现乱线团式的结 构,应限制使用。Pascal语言的发明者沃思说过:“如果一个程序员在Pascal程序中使用goto 语句,往往说明他还没有学会用Pascal语言来思考。”
本文发布于:2023-05-22 13:06:01,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/zhishi/a/1684731963174901.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:全面初识Pascal语言(共七章).doc
本文 PDF 下载地址:全面初识Pascal语言(共七章).pdf
留言与评论(共有 0 条评论) |