第一章 开始编写pascal语言程序
1下载Turbo Pascal60
(1)下载turbo pascal
(2)属性设置
2Turbo Pascal 60环境介绍
(1)进入与退出(注意:退出时必须使用文件菜单中的退出命令或Alt+X)
(2)编辑程序
光标移动键的使用
Backspace键:删除光标前一个字符
Ctrl+N:在光标前插入一行
Ctrl+Y:删除光标所在行
Home:光标移到行首
End:光标移到行尾
PageUp/PageDown:上下翻页
Insert:插入与改写状态切换
(3)编译程序(Compile):Alt+F9
(4)运行程序(Run):Ctrl+F9
(5)保存程序(Save):F2
(6)打开原有的程序:F3
(7)查看程序运行结果:Alt+F5
(8)调试时增加观察项:Ctrl+F7
12 简单Pascal程序的结构
例1下列是一Pascal源程序:
program lt1;{程序首部}
var {说明部分}
a,b:integer;
sum:integer;
begin {执行部分}
a:=3355;
b:=789;
sum:=a+b;
writeln('sum=',sum);
end
13 完整的Pascal程序结构
一个完全的Pascal程序结构
program 程序名;
uses 已知单元说明;
label 标号说明;
const 常量说明;
type 类型说明;
var 变量说明;
function 函数说明;
procedure 过程说明;
begin
语句;
语句;
……
语句;
end
作业:
1熟悉Pascal编辑环境
2记住快捷键的使用
3编写7867的值的Pascal程序并运行
第二章Pascal语言基础知识
21 Pascal的字符与符号
22 Pascal数据类型
23 常量与变量
24 标准函数
25 运算符和表达式
练习与作业
21 Pascal字符与符号
1.标识符
(1) 标识符的定义:标识符就是以字母开头的字母数字序列,有效长度为63个字符,并且大小写等效。可以用来标示常量、变量、程序、函数等。例如例11中的Area(程序名),pi(符号常量),s、r(变量名)都是标识符。
(2) 标识符的分类:
a保留字(关键字)
所谓保留字是指在Pascal语言中具有特定的含义,你必须了解它的含义,以便于正确的使用,否则会造成错误。标准Pascal语言中的保留字一共有35个,Turbo 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等
b标准标识符:指Pascal语言预先定义的标识符,具有特殊含义。
以下列举了Turbo Pascal语言部分常用的标准表识符:
标准常量 False Maxint True
标准类型 Boolean Char Real Integer
标准函数 Abs Arctan Chr Cos Eof Eoln Exp
Ln Odd Ord Pred Round Sin Sqr
Sqrt Succ Trunc
标准过程 Dispose Get New Pack Page Put Read
Readln Reset Rewrite Unpack Write Writeln
标准文件 Input Output
c.用户自定义标识符:由你自己根据需要来定义。
(1)选用的标识符不能和保留字相同。
(2)语法上允许预定义的标准标识符作为你自己定义的标识符使用,但最好还是不要用。
以下列举了你自己在定义标识符时可以用的字符:
A——Z;a——z;0——9;+,-,,/,=,<>,<=,>=,<,>,(,),[,],{,},:=,,,;,,:,,',^
22 Pascal数据类型
数据是程序设计的一个重要内容,其重要特征----数据类型,确定了该数据的形、取值范围以及所能参与的运算。
Turbo Pascal 提供了丰富的数据类型,这些数据类型可以分为三大类:简单类型、构造类型和指针类型,其中简单类型可以分为标准类型(整型、实型、字符型和布尔型)和自定义类型(枚举型和子界型),构造类型可以分为数组类型、集合类型、记录类型和文件类型。这些数据类型中除了指针类型是动态数据类型外,其他的都是静态数据类型。在这些数据类型中的简单类型都是有序类型,除了实型以外的简单类型都是顺序类型,所谓顺序类型就是他们的值不仅是有序的而且是有顺序号。
在这里主要介绍整型、实型、字符型和布尔型四种常用的数据类型。
1整型
一个整型数据用来存放整数。Turbo Pascal支持五种预定义整型,它们是shortint(短整型)、 integer(整型)、 longint(长整型)、 byte(字节型)和 word(字类型),Turbo Pascal分别用相同的名字作为他们的标识符。每一种类型规定了相应的整数取值范围以及所占用的内存字节数。
类型 数值范围 占字节数 格式
shortint -128128 1 带符号8位
inteter -3276832767 2 带符号16位
longint -21474836482147483647 4 带符号32位
byte 0255 1 带符号8位
word 065535 2 带符号16位
Turbo Pascal规定了两个预定义整型常量标识符maxint和maxlonint,他们各表示确定的常数值,maxint为32767, longint为2147483647,他们的类型分别是integer 和longint
2实型
一个实型数据用来存放实数。Turbo Pascal支持五种预定义实型,它们是real(基本实型)、 single(但精度实型)、double(双精度实型)、extended(扩展实型)、comp(装配实型),Turbo Pascal分别用相同的名字作为他们的标识符。每一种类型规定了相应的实数取值范围、所占用的内存字节数以及它们所能达到的精度
类型 数值范围 占字节数 有效位数
real 29e-3917e38 6 1112
single 15e-4534e38 4 78
double 50e-32417e308 8 1516
Turbo Pascal支持两种用于执行实型运算的代码生成模式:软件仿真模式和80x87浮点模式。除了real可以在软件仿真模式下直接运行以外,其他类型必须在80x87浮点模式下运行。
3布尔型
一个布尔型数据用来存放逻辑值(布尔值)。布尔型的值只有两个:false和true,并且false的序号是0,true的序号是1。false 和true都是预定义常数标识符,分别表示逻辑假和逻辑真。并且true<false。boolean是布尔型的标识符。
4字符型
字符型用char作为标识符。字符型必须用单引号括起来,字母作为字符型时,大小写是不等价的,并且字符型只允许单引号中有一个字符,否则就是字符串。
23 常量与变量
1常量
(1)常量:在某个程序的整个过程中其值不变的量。
(2)常量定义:常量定义出现在说明部分。它的语法格式是:
const
<常量标识符>=<常量>;
<常量标识符>=<常量>;
常量标识符的类型由定义它的常量的类型决定。例如:const a=12 隐含说明a是整型;const r=321 隐含说明r是实型
(3)常量定义部分必须以保留字const开头,可以包含一个或几个常量定义,而且每个常量均以分号结束。
(4)Turbo Pascal类型常量
类型常量,又称变量常数,它是Turbo Pascal的一个扩充特性。类型常量的定义与标准Pascal规定的常数定义和变量说明有所区别。类型常量定义的语法格式:
const
<简单类型常量标识符>:简单类型=常数;
例如:
const
counter:integer=0;
flag:boolean=true;
index:0100=0;
2变量
(1)变量:在某个程序中的运行过程中其值可以发生改变的量
(2)变量说明:变量说明出现在说明部分。它的语法格式是:
var
<变量标识符列表>:<类型>;
<变量标识符列表>:<类型>;
其中,保留字var表示开始一个变量说明部分。变量标识符列表是一个用逗号隔开的标识符序列,冒号后面的类型是类型标识符。每个变量说明均以分号结束。
例如:
var
a,b,c:integer;
m,n:real;
24 标准函数
1算术函数
函数标识符 自变量类型 意义 结果类型
abs 整型、实型 绝对值 同自变量
arctan 整型、实型 反正切 实型
cos 整型、实型 余弦 实型
exp 整型、实型 指数 实型
frac 整型、实型 小数部分 实型
int 整型、实型 整数部分 实型
ln 整型、实型 自然对数 实型
pi 无自变量 圆周率 实型
sin 整型、实型 正弦 实型
sqr 整型、实型 平方 同自变量
sqrt 整型、实型 平方根 实型
例:abs(-4)=4 abs(-749)=749 arctan(0)=00
sin(pi)=00 cos(pi)=-10 frac(-371)=-071
int(-371)=-30 sqr(4)=16 sqrt(4)=2
2标准函数
函数标识符 自变量类型 意义 结果类型
odd 整型 判断奇数 布尔型
pred 离散类型 求前趋 同自变量
succ 离散类型 求后继 同自变量
例:odd(1000)=false pred(2000)=1999 succ(2000)=2001
odd(3)=true pred('x')='w succ('x')='y'
3转换函数
函数标识符 自变量类型 意义 结果类型
chr byte 自变量对应的字符 字符型
ord 离散类型 自变量对应的序号 longint
round 实型 四舍五入 longint
trunc 实型 截断取整 longint
例:chr(66)='B' ord('A')=65 round(-43)=-5 trunc(288)=2
4杂类函数
函数标识符 自变量类型 意义 结果类型
random 无自变量 [0,1间的随机实数 real
random word [0,自变量间的随机整数) word
randomize 无自变量 初始化内部随机数产生器 longint
upcase 字符型 使小写英文字母变为大写 字符型
downcase 字符型 使小写英文字母变为大写 字符型
25 运算符和表达式
1运算符和优先级
(1)运算符
是实型,如果全部的运算对象都是整型并且运算不是除法,则结果为整型,若运算是除法,则结果是实型 a算术运算符
运算符 运算 运算对象 结果类型
+ 加 整型、实型 只要有一个运算对象是实型,结果就
- 减 整型、实型 是实型,如果全部的运算对象都是整
乘 整型、实型 型并且运算不是除法,则结果为整型,
/ 除 整型、实型 若运算是除法,则结果是实型。
div 整除 整型 整型
mod 取余 整型 整型
b逻辑运算符
运算符 运算 运算对象 结果类型
not 逻辑非 布尔型 布尔型
and 逻辑与 布尔型 布尔型
or 逻辑或 布尔型 布尔型
xor 逻辑异或 布尔型 布尔型
c关系运算符
运算符 运算 运算对象 结果类型
= 等于 简单类型 布尔型
<> 不等于 简单类型 布尔型
< 小于 简单类型 布尔型
> 大于 简单类型 布尔型
<= 小于等于 简单类型 布尔型
>= 大于等于 简单类型 布尔型
(2)优先级
运算符 优先级
not 1(高)
,/,div,mod,and 2
xor,+,-,or 3
in,=,<>,>=,<=,<> 4(低)
2表达式
(1)算术表达式:算术表达式是由算术运算符连接常量、变量、函数的式子。算术表达式中各个运算符的次序为: ( )-->函数-->,/,div,mod-->+,1
(2)布尔表达式:Turbo Pascal提供给布尔表达式以下基本 *** 作:逻辑运算和关系运算。
(3)数学上的表达式与pascal语言表达式的区别
数学表达式 PASCAL表达式 注意
2a 2a 号不能省略
a÷b a/b 除号的写法
a≠b a<>b 不等号的写法
a≤b a<=b 小于等于号的写法
思考与练习:
1、熟记Pascal的保留字和标准标识符,明确自定义标识符的定义要点。
2、取整函数int与截断取整函数trunc有什么区别?举例说明。
3、判断以下标识符的合法性:
a3 3a a17 abcd ex95 α β λ
5、将下列的数学表达式改写成PASCAL表达式:
b^2-4ac
6、求下列表达式的值:
20 mod 19 15 mod 9 7 div 8 19 div 3
(4>5) and (7<8)
(8>9) or ( 9<10)
2 and ((3=3) or (3<7))
第三章 顺序结构程序设计
练习与作业
31 赋值语句
PASCAL有两个语句可以改变变量的值。赋值语句是其中之一(另一个是读语句)。赋值,顾名思义,就是把一个值赋予某个量。可以这理解:变量相当于装东西的容器,赋值的过程就是把东西放进容器的过程。赋值语句格式如下:
变量:=表达式;
写赋值语句有以下几点要注意:
1、赋值号“:=”
赋值号由两个字符构成,是一个运算符。如果把这两个字符拆开,那么这两个字符就是别的意思了:“:”是分隔符而“=”是关系运算符,判定两个对象是否相等。刚刚写程序的同学要特别注意这一点。
例:a,b:integer;——是一个说明语句。“:”是变量表和变量类型的分隔符
a=b——是一个表达式。它的值是一个布尔类型的量:TRUE或FALSE
a:=3;——是一个语句。把整型常量值3赋给整型变量a
2、变量要先说明
在赋值号左边出现的变量,要在程序头的说明部先加以说明,否则编译时出错。
3、表达式必须要有确定的值
赋值号右边出现的表达式,必须是可以求值的。也就是说,经过运算之后,能得出一个具体的、确定的值出来。大家想一想,如果连表达式自己都不知道自己的值是多少,怎么还能把值“赋予”别人呢?
4、赋值号两边的数据类型必须相同或相容
我们知道,PASCAL中的量不管是变量还是常量都有一个属性称为“数据类型”。数据类型相同的或相容的才可以相互赋值。
怎么来理解这句话呢?打个比方,我们沏功夫茶用的是小茶杯,装饭时用饭碗。如果用饭碗来泡功夫茶,用小茶杯来装饭,那情形一定很滑稽而且是不可行的。回到PASCAL中来,赋值号左边变量如果是整型,右边表达式的值的类型也要是整型;赋值号左边变量如果是字符型,右边表达式的值的类型也要是字符型……否则的话,也要出错了。这是数据类型相同的情况。
对于数据类型相容的,我们也可以用一个例子来帮助理解。我们都喝过功夫茶,也喝过大杯茶。把功夫茶倒在大茶杯里,一般不会出什么问题;但如果把大杯里的茶倒在功夫茶杯里呢?可能小茶杯装不下大茶杯里的茶,茶“溢出”了。在PASCAL中也会出现这种情况。当一种数据类型的取值范围包含着另一种数据类型的取值范围时,就可能出现类型相容的情况。如实型与整型,整型、字符型与它们各自的子界类型……如果把整型值赋给实型变量,把整型子界值赋给整型变量,不会出错;但如果反过来,就会出现“溢出”,出错了。
因些,我们在写赋值语句时,要注意两边的类型是否匹配。
例:有程序如下:
var a,b:integer;c:real;d:0100;
begin
a:=100;
b:=a;
{-------------以上是相同数据类型进行赋值}
d:=100;
b:=d;
c:=b;
{-------------以上是相容数据类型进行赋值}
d:=b;
a:=c;
{-------------以上两个赋值语句都出现溢出,编译时出错}
end
32 读语句
读语句(read语句)和赋值语句一样,能够改变变量的值。与赋值语句不同,读语句从键盘或文件接收值赋予变量,而赋值语句则直接由程序语句获得。读语句格式如下:
read(变量名表);
readln(变量名表);
readln;
读语句是编程中用得最多的语句之一。在使用时有几点要注意:
1、变量名表。写在括号中的变量,都要在变量说明中先预以说明;变量与变量之间,以“,”分隔;
例:
var a,b:integer;
read(a,b);
2、从键盘接收数据时,要注意各种不同数据类型数据的分隔符不同。所谓分隔符就是两个完整的数值之间的标记,也可以这样理解,当计算机从键盘读入数据时,一旦碰到分隔符,就认为当前的数据读入已完成,可以把它赋给相应的变量了。各种数据类型的分隔符如下:
数值型(包括整型、实型以及它们的子界类型)以空格或回车符作为分隔符;
字符型不需分隔符(因为字符型数据的长度固定,只有一个);
字符串以回车符作为分隔符。
3、注意read与readln的区别
例:有两段程序有相同的变量说明如下,不同的读语句,我们可以通过比较它们执行结果的异同来理解read与readln的区别。
变量说明 var a,b,c,d:integer; 执行结果
a b c d
程序段一 read(a);
readln(b,c);
read(d);
1 2 3 6
程序段二 readln(a);
read(b,c);
read(d) 1 6 7 8
输入数据 1 2 3 4 5
6 7 8
在程序段一执行时,“read(a);”语句接收了第一个数据1并将它赋给变量a;接着执行第二个语句“readln(b,c);”,接收了第一行数据中的2、3并把它们分别赋给变量b,c,同时,把本行其它数据全部屏蔽掉,也就是宣布它们全部作废。程序段二的执行情况也是如此。
因此,我们可以得出结论:语句read只管接收数据,语句readln接收完数据后,还把同行的其它数据全部宣布作废。
4、“readln;”语句从键盘接收一个回车符。这个语句通常用在需要暂停的地方。如输出时用来等待程序员看清结果。
33 写语句
写(write)语句是Pascal中唯一能将运算结果送出显示在显示器屏幕的语句。格式如下:
write(输出量表);{输出后不换行}
writeln(输出量表);{输出后换行}
writeln;{输出一个回车符}
使用写语句时也有一些小问题需要注意。
1、输出量可以是:
变量。输出变量的值。输出多个变量时,变量间用“,”分隔。
表达式。输出的是表达式的值。
常量。直接输出常量值。
2、场宽的限制在输出不同格式的数值时的作用:
例1:输出多个空格。
write('':n);句子的意思是以n个字符宽度输出冒号前数据项,如果数据项长度不足n,则前面以空格补齐;如果数据项长度大于n,则以实际长度输出。如上语句句输出n个空格。
例2:数据项间隔。
如输出最多四位的数据:write(x:5)。则数据间至少分隔一个空格。
例3:实型数据小数位数的确定。
实型数据不带格式限制时,以科学计数法的形式输出,和我们的一般书写习惯不同。如果加上场宽的限制,则可以有不同的效果:
var a:real;
begin
a:=15/8;
writeln(a);{输出 18750000000E+00}
wiiteln(a:0:2);{输出 188 整数部分按实际位数输出,小数部分保留两位小数,末位四舍五入}
writeln(a:0:0):{输出 2 只输出整数部分,小数部分四舍五入}
end
3、“writeln;”语句通常用于输出多组数据时在屏幕上输出空行来分隔数据组。
思考与练习:
1、 用字符输出一个猪锦佳的头像。
2、 a,b,c分别等于1、12、123,把它们按向左对齐、向右对齐的方式打印出来。
3、 输入一个四位整数,把它的各位数字倒序输出。(提示:用MOD和DIV运算完成)
4、 从键盘上读入小写的"pascal",利用CHR()和ORD()函数,输出大写的"PASCAL"。
5、 从键盘上读入一个实数,利用ROUND()和TRUNC()函数,输出该实数本身、整数部分、小数部分、四舍五入后的值。
要求:分三行输出 ;输出实数本身时,格式与读入时相同;整数部分、小数部分在同一行输出;其它各占一行。
6、 从键盘上读入长方形的边长a,b,计算它的面积和周长,输出。
7、 输入一个时、分、秒,把它转换为一个秒数。
121 单步执行
任何一个天才都不敢说,他编的程序是100%正确的。几乎每一个稍微复杂一点的程序都必须经过反复的调试,修改,最终才完成。所以说,程序的调试是编程中的一项重要技术。我们现在就来掌握一下基本的程序调试。 我们以下的示范,是以时下比较流行的Borland Pascal 70为例子,其他的编程环境可能略有不同,但大致上是一致的。
我们先编一个比较简单的程序,看看程序是如何调试的。
program tiaoshi;
var i:integer;
begin
for i:=1 to 300 do
begin
if i mod 2 = 0 then
if i mod 3 = 0 then
if i mod 5 = 0 then
writeln(i);
end;
end
该程序是输出300以内同时能被2,3,5整除的整数。 现在我们开始调试。 调试有多种方法,先介绍一种,权且叫步骤法,步骤法就是模拟计算机的运算,把程序每一步执行的情况都反映出来。通常,我们有F8即STEP这个功能来实现,如图: 不断地按F8,计算机就会一步步地执行程序,直到执行到最后的“end”为止。
可能你还没有发现F8的威力,我们不妨把上面的程序略微修改一下,再配合另外的一种调试的利器watch,你就会发现步骤法的用处。
program tiaoshi;
var i:integer;
a,b,c:boolean;
begin
for i:=1 to 300 do
begin
a:=false;
b:=false;
c:=false;
if i mod 2 = 0 then a:=true;
if i mod 3 = 0 then b:=true;
if i mod 5 = 0 then c:=true;
if a and b and c then writeln(i);
end;
end
如图,我们单击菜单栏中debug选项,里面有一项叫watch的选项,我们单击它。
就会出现一个watch窗口:
watch窗口可以让我们观察变量的变化情况,具体 *** 作是在watches窗口内按Insert键:
这时,屏幕上d出一个菜单,我们输入所需要观察的变量名,我们分别输入i,a,b,c这4个变量名,于是watches窗口内就有如下的4个变量的状态:
这时,我们再次使用步骤法,我们会发现,这4个变量的状态随着程序的执行而不断变化,比如:
这样我们就可以方便地知道执行每一步之后,程序的各个变量的变化情况,从中我们可以知道我们的程序是否出错,在哪里出错,方便我们及时地修改。 下一次,我们介绍另外的一种方法,断点法。
122 断点发
在前面我们已经学习了基本的程序调试方法——步骤法。步骤法有一个缺点,就是在遇到循环次数比较多或者语句比较多的时候,用起来比较费时,今天我们来学习一种新的也是常用的调试方法——断点法。
所谓断点法,就是在程序执行到某一行的时候,计算机自动停止运行,并保留这时各变量的状态,方便我们检查,校对。我们还是以前面求同时能被2,3,5整除的3000以内的自然数为例,具体 *** 作如下:
我们把光标移动到程序的第14行,按下ctrl+F8,这时我们会发现,该行变成红色,这表明该行已经被设置成断点行,当我们每次运行到第14行的时候,计算机都会自动停下来供我们调试。
我们必须学以致用,赶快运用刚学的watch方法,看看这家伙到底有多厉害。
请记住,计算机是执行到断点行之前的一行,断点行并没有执行,所以这时b:=true这一句并没有执行。
断点行除了有以上用处之外,还有另外一个重要用处。它方便我们判断某个语句有没有执行或者是不是在正确的时刻执行,因为有时程序由于人为的疏忽,可能在循环或者递归时出现我们无法预料的混乱,这时候通过断点法,我们就能够判断程序是不是依照我们预期的顺序执行。
(1)var si,pr:set of 2n; 是集合
(2)表示集合为空,初始值
(3)while not(x in si) {当x这个值不在集合si中时}
x in si 就是 x这个元素在si这个集合中
一、集合类型
集合是由具有某些共同特征的元素构成的一个整体。在pascal中,一个集合是由具有同一有序类型的一组数据元素所组成,这一有序类型称为该集合的基类型。
(一)集合类型的定义和变量的说明
集合类型的一般形式为:
set of <基类型>;
说明:①基类型可以是任意顺序类型,而不能是实型或其它构造类型;同时,基类型的数据的序号不得超过255。例如下列说明是合法的
type letters=set of 'A''Z';
numbers=set of 09;
s1=set of char;
ss=(sun,mon,tue,wed,thu,fri,sat);
s2=set of ss;
②与其它自定义类型一样,可以将类型说明与变量说明合并在一起。如:
type numbers=set of 09;
var s:numbers;
与 var s:set of 09;等价。
(二)集合的值
集合的值是用"〔"和"〕"括起来,中间为用逗号隔开的若干个集合的元素。如:
[] 空集
[1,2,3]
['a','e','i','o','u']
都是集合。
说明:①集合的值放在一对方括号中,各元素之间用逗号隔开
②在集合中可以没有任何元素,这样的集合称为空集
③在集合中,如果元素的值是连续的,则可用子界型的表示方法表示。例如:
〔1,2,3,4,5,7,8,9,10,15〕
可以表示成:
〔15,710,15〕
④集合的值与方括号内元素出现的次序无关。例如,〔1,5,8 〕和〔5,1,8〕的值相等。
⑤在集合中同一元素的重复出现对集合的值没有影响。例如,〔1,8,5,1,8〕与〔1,5,8〕的值相等。
⑥每个元素可用基类型所允许的表达式来表示。如〔1,1+2,4〕、〔ch〕、〔succ(ch)〕。
(三)集合的运算
1、赋值运算:只能通过赋值语句给集合变量赋值,不能通过读语句赋值,也不能通过write(或writeln)语句直接输出集合变量的值
2、集合的并、交、差运算:可以对集合进行并、交、差三种运算,每种运算都只能有一个运算符、两个运算对象,所得结果仍为集合。三种运算符分别用"+"、"*"、"-"表示;注意它们与算术运算的区别
3、集合的关系运算:集合可以进行相等或不相等、包含或被包含的关系运算,还能测试一个元素是否在集合中。所用的运算符分别是:=、<>、>=、<=、in
它们都是二目运算,且前4个运算符的运算对象都是相容的集合类型,最后一个运算符的右边为集合,左边为与集合基类型相同的表达式。
例4设有如下说明:
type weekday=(sun,mon,tue,wed,thu,fri,sat);
week=set of weekday;
subnum=set of 150;
写出下列表达式的值:
⑴〔sun,sat〕+〔sun,tue,fri〕
⑵〔sun,fri〕〔mon,tue〕
⑶〔sun,sat〕〔sunsat〕
⑷〔sun〕-〔mon,tue〕
⑸〔mon〕-〔mon,tue〕
⑹〔sunsat〕-〔mon,sun,sat〕
⑺〔1,2,3,5〕=〔1,5,3,2〕
⑻〔1,2,3,4〕<>〔14〕
⑼〔1,2,3,5〕>=〔13〕
⑽〔15〕<=〔14〕
⑾〔1,2,3〕<=〔13〕
⑿ 2 in〔110〕
答:表达式的值分别是:
⑴ 〔sun,sat,tue,fri〕
⑵ 〔 〕
⑶ 〔sun,sat〕
⑷ 〔sun〕
⑸ 〔 〕
⑹ 〔tuefri〕
⑺ TRUE
⑻ FALSE
⑼ TRUE
⑽ FALSE
⑾ TRUE
⑿ TRUE
例5输入一系列字符,对其中的数字字符、字母字符和其它字符分别计数,输入“?”后结束
源程序如下:
program ex10_2;
var id,il,io:integer;
ch:char;
letter:set of char;
digit:set of '0''9';
begin
letter=['a''z','A''Z'];
digit:=['0''9'];
id:=0;il:=0;io:=0;
repeat
read(ch);
if ch in letter
then il:=il+1
else if ch in digit
then id:=id+1
else io:=io+1;
until ch='';
writeln('letter:',il,'digit:',id,'Other:',io);
end
二、记录类型
在程序中对于组织和处理大批量的数据来说,数组是一种十分方便而又灵活的工具,但是数组在使用中有一个基本限制,这就是:一个数组中的所有元素都必须具有相同的类型。但在实际问题中可能会遇到另一类数据,它是由性质各不相同的成份组成的,即它的各个成份可能具有不同的类型。例如,有关一个学生的数据包含下列项目:
学号 字符串类型
姓名 字符串类型
年龄 整型
性别 字符型
成绩 实型数组
Pascal给我们提供了一种叫做记录的结构类型;在一个记录中,可以包含不同类型的并且互相相关的一些数据。
(一)记录类型的定义
在pascal中,记录由一组称为“域”的分量组成,每个域可以具有不同的类型,记录类型定义的一般形式:
record
<域名1>:<类型1>;
<域名2>:<类型2>;
: :
: :
<域名n>:<类型n>;
end;
说明:①域名也称域变量标识符, 应符合标识符的语法规则;在同一个记录中类型中,各个域不能取相同的名,但在不同的记录类型中,两个类型中的域名可以相同
②记录类型的定义和记录变量可以合并为一个定义,如:
type date=record
year:19001999;
month:112;
day:131
end;
var x:date;
可以合并成:
var x: record
year:19001999;
month:112;
day:131
end;
③对记录的 *** 作,除了可以进行整体赋值, 只能对记录的分量——域变量进行。
④域变量的表示方法如下:
记录变量名域名
如前面定义的记录X,其3个分量分别为:xyear;xmonth;xday
⑤域变量的使用和一般的变量一样, 即域变量是属于什么数据类型,便可以进行那种数据类型所允许的 *** 作。
(二)记录的嵌套
当一个记录类型的某一个域类型也是记录类型的时候,我们说发生了记录的嵌套,看下面的例子:
例6某人事登记表可用一个记录表示,其中各项数据具有不同的类型,分别命名一个标识符。而其中的“出生年月日”又包括三项数据,还可以用一个嵌套在内层的记录表示。
具体定义如下:
type sexs=(male,female);
date=record
year:19001999;
month:112;
day:131;
end;
personal=record
name:string[15];
sex:sexs;
birthdate:date;
home:string[40];
end;
例7设计一个函数比较两个dates日期类型记录变量的迟早。
设函数名、形参及函数类型定义为:
AearlyB(A,B:dates):boolean;
函数的形参为两个dates类型的值参数。当函数值为true 时表示日期A早于日期B,否则日期A迟于日期B或等于日期B。显然不能对A、B两个记录变量直接进行比较,而要依具体的意义逐域处理。
源程序如下:
program ex6_7;
type dates=record
year:19001999;
month:112;
day:131
end;
var x,y:dates;
function AearlyB(A,B:dates):boolean;
var earln:boolean;
begin
early:=false;
if (Ayear<Byear) then early:=true;
if (Ayear=Byear)and(Amonth<Bmonth)
then early:=true;
if (Ayear=Byear)and(Amonth=Bmonth)and(Aday<Bday)
then early:=true;
AearlyB:=early;
end;{of AearlyB}
begin
write('Input DATE X(mm-dd-yy):')readln(Xmonth,Xday,Xyear);
write('Input DATE Y(mm-dd-yy):')readln(Ymonth,Yday,Yyear);
if AearlyB(X,Y) then writeln(Date X early!') else writeln('Date X not early!');
end
(三)开域语句
在程序中对记录进行处理时,经常要引用同一记录中不同的域,每次都按641节所述的格式引用,非常乏味。为此Pascal提供了一个with语句,可以提供引用域的简单形式。开域语句一般形式:
with <记录变量名表> do
<语句>
功能:在do后的语句中使用with后的记录的域时, 只要直接写出域名即可,即可以省略图1022中的记录变量名和""。
说明:①一般在with后只使用一个记录变量名。如:
write('Input year:');
readln(xyear);
write('Input month:');
readln(xmonth);
write('Input day:');
readln(xday);
可以改写成:
with x do
begin
write('Input year:');readln(year);
write('Input month:');readln(month);
write('Input day:');readln(day);
end;
②设x,y是相同类型的记录变量,下列语句是非法的:
with x,y do;
③with后接若干个记录名时,应是嵌套的关系。如有记录说明:
var x:record
i:integer;
y:record
j:05;
k:real;
end;
m:real
end;
可以使用:
with x do
begin
read(i);
with y do
read(j,k);
readln(m);
end;
或简写为:
with x,y do
readln(i,j,k,m);
例8读入10个日期,再对每个日期输出第二天的日期。输入日期的格式是月、日、年,如9□30□1993,输出的格式为10/1/1993
分析:可用一个记录变量today表示日期。 知道一个日期后要更新为第二天的日期,应判断输入的日期是否为当月的最后一天,或当年的最后一天。
源程序如下:
program ex6_8;
type date=record
month:112;
day:131;
year:19001999;
end;
var today:array[110]of date;
i:integer;
maxdays:2831;
begin
for i:=1 to 10 do {输入10个日期}
with today[i] do
readln(month,day,year);
for i:=1 to 10 do
with today[i] do{求第i个日期中月份最后一天maxdays}
begin
case month of
1,3,5,7,8,10,12:maxdays:=31;
4,6,9,11 :maxdays:=30;
2 :if(year mod 400=0) or( year mod 4=0)
and(year mod 100<>0)
then maxdays:=29
else maxdays:=28;
end;
if day=maxdays
then begin
day:=1;
if month=12
then begin
month:=1;year:=year+1;
end
else month:=month+1;
end
else day:=day+1;
writeln(month,'/',day,'/',year);
end;
end
五、应用实例
例9编制用筛法求1-n(n≤200)以内素数的程序
分析:由希腊著名数学家埃拉托色尼提出的所谓“筛法”,步骤如下:
①将所有候选数放入筛中;
②找筛中最小数(必为素数)next,放入集合primes中;
③将next的所有倍数从筛中筛去;
④重复②~④直到筛空。
编程时,用集合变量sieve表示筛子,用集合primes存放所有素数。
源程序如下:
program ex10_3;
const n=200;
var sieve,primes:set of 2n;
next,j:integer;
begin
sieve:=[2n];{将所有候选数放入筛中}
primes:=[];{素数集合置空}
next:=2;
repeat
{找筛sieve中最小一个数}
while not(next in sieve) and(next<=n)do
next:=succ(next);
primes:=primes+[next];{将最小数放入素数集合中}
{将这个素数的倍数从筛中删去}
j:=next;
while j<=n do
begin
sieve:=sieve-[j];
j:=j+next;
end
until sieve=[];
j:=0;
for next:=2 to n do{打印出所有素数}
if next in primes then
begin
write(next:5);
j:=j+1;
if j mod 10=0 then writeln;
end;
writeln;
end
一、 引入:
fpc-200i386-win32
程序一:已知长方形的长、宽,求长方形的周长
program circle; 该程序的首部,program是保留字
var chang,kuan,zhouchang:real; 定义变量:设定长,宽,周长为实数类型
begin 开始语句
readln(chang); 读语句,读入长(chang)和宽(kuan)
readln(kuan);
zhouchang:=2(chang+kuan); 赋值语句,将计算结果赋给zhouchang
write(zhouchang); 写语句,将结果(zhouchang)
end 结束语句,与begin成对出现
程序二:已知长方形的长、宽,求长方形的周长,并求出长方形的面积。
rogram circle;
var chang,kuan,zhouchang,mianji:real;
begin
readln(chang);
readln(kuan);
zhouchang:=2(chang+kuan);
mianji:=changkuan;
write(zhouchang,mianji);
end
小结:一个完整的pascal程序结构
Program 程序名(程序参数表);
var
变量说明;
Begin
语句;
语句;
……
End
编译:Alt+F9
运行 Ctrl+F9
返回看结果Alt+F5
思考练习:
1、已知长方体的长、宽、高,求长方体的表面积及体积。
2、已知正方体的边长,求正方体的表面积及体积。
3、已知圆半径,求圆的周长及面积。
作业
已知圆半径,求圆的周长及面积。314若改成314159
第一句为程序首部,每个pascal程序都必须以它开头。
增加程序的可读性,用pi表示
一、常量说明
Const pi=314159
变量说明
VAR 单个变量或用逗号分开的多个变量
<变量表>:<类型>
二、标准数据类型
(一)、实型(real)
1、两种表示方法:小数表示法和指数表示法
小数表示法:125,00025,2582,2530
科学表示法:125e0,13654e+2,25e-3,
0e0,1e2
2、说明方式
const k=126
var m,n:real;
3、运算:+(加),—(减),(乘),/(除)
标准函数:
abs(绝对值),sqr(平方),sqrt(开方),
trunc(取整),round(舍入取整)
(二)、整型(integer)
1、表示方法:25,-456,0
2、说明方法:
const long=150;
wide=65;
var I,j,k:integer;
3、整型量的运算:
+(加),—(减),(乘),div(整除)
/(除)得到的值为实型,mod(取余) 4、用于整数的标准函数
abs(绝对值),sqr(平方),pred(前导)
succ(后续),
三、
读语句一:read
用于在程序执行时,从外部输入数据给变量
一般形式:read(变量表) 其中变量表是一些由逗号分开的变量
程序一、读入2个整数和1个实数,并将这三个数输出。
Program shu;
Var
x,y:integer;
z:real;
begin
read(x);
read(y);
read(z);
write(x);
write(y);
write(z);
end Program shu;
Var
x,y:integer;
z:real;
begin
read(x,y,z);
write(x,y,z);
end
可以将读入与写出语句合并成一句。
注意:从键盘上输入的数据必须与程序中设定的输入变量的类型相同。例如上题,x,y是整型,我们从键盘上输入就必须是整型数,例如:14、-6,而不能是实型数,例如:19、980;而z是实型数,输入可以是小数也可以是整数,例如:236666 ,或者是10。
读语句二:readln
在完成该语句的最后一个变量值的输入以后,将结束包括这个数据值的输入行,使下一个read语句(或readln语句)从下一个新行开始输入数据。
例:
Program shu2;
Var a,b:real;
begin
Read(a,b);
Read(c,d,e,f);
Read(g,h);
Writeln(a,b,c,d,e,f,g,h);
End Program shu2;
Var a,b:real;
begin
Readln(a,b);
Readln(c,d,e,f);
Readln(g,h);
Writeln(a,b,c,d,e,f,g,h);
End
从键盘上输入以下数据:
15 37 24
57 21 89
92 17 53
28 34 29
得到的结果:
a=15 b=37
c=24 d=57 e=21 f=89
g=92 h=17 得到的结果:
a=15 b=37
c=57 d=21 e=89 f=92
g=28 h=34
四、表达式与赋值语句
一般形式:<变量>:=<表达式>
表达式可以是简单的常数、常量、变量、函数或它们之间的算术运算、逻辑运算、关系运算等
例如:2+3x
125×10-5
写表达式时,要注意以下几点:
1、所有表达式必须以线形写出。
2、只能使用合法的标志符
3、乘号必须用符号“”明确地指出,不得省略
4、函数的自变量可以是任意表达式。
注意:赋值语句中,表达式的类型必须与左端变量的类型赋值相容。
(1)、表达式的类型与左端变量的类型相同
(2)、表达式为整型,左端变量为实型
var I,j,k:integer
k:=I/j
X:=x+1 I:=I+1
写语句一:Write语句
将计算结果通过屏幕或打字机输出显示。
例如:write(aa,bb);
一般形式:write(<输出表>:场宽:小数位数)
输出表是一些由逗号分开的输出项。
输出项可以是变量或表达式,或用引号括起来的字符串。
若为变量,则输出变量的值。
若为表达式,则先计算表达式的值,然后将值输出。
若为字符串,则输出字符串本身。
若为用符号’ x+y= ’ ,则将单引号内的值原样输出
例如:输入:x=5,y=6
write(x,y,x+y,xy)
输出结果:5,6,11,30
write(‘x=‘,x,’y=‘,y,’x+y=‘,x+y,’xy=‘,xy);
输出结果:x=5y=6x+y=11xy=30
写语句二:Writeln语句
结果将输出在不同的行上。
在印出输出表的最后一个输出项后,结束当前输出行,使得下一个write(或writeln)语句从下一个新行的开头输出。即:印出输出项后,回车换行,光标移到下一行的首位。
例如:
Writeln 可以单独使用,用于结束当前输出行,指向下一行的开始
writeln(‘x=‘,x,’y=‘,y);
Writeln(’x+y=‘,x+y,’xy=‘,xy);
例:
1、写一程序读入三角形的三个边a,b,c,计算并输出三角形的面积S。可利用下列公式计算:S= ,其中p= 。
2、输入一个三位整数,将它反向输出。例如输入127,输出应为721。
常量说明,不一定要有
三、字符型
1、表示方法: ‘A’,’B’,’C,’,…… ‘a’,’b’,’c’,…… ‘0’,’1’,’2’,’3’,…… ‘+’,’-’,’’,…… ‘’代表空格字符
2、说明方法
const black=‘’ star=‘’ var ch1,ch2:char;
3、用于字符的标准函数
ord(取序号),pred(前导),succ(后继)
chr(65)=‘A’ chr(97)=‘a’ ord(‘A’)=65 ord(‘a’)=97
四、布尔型(boolean)
1、说明
const f=false;
t=true;
var b1,b2,flag:boolean;
2、标准函数
odd(取序号)、pred(前导)、succ(后继)、
odd(false)=0 odd(true)=
pred(true)= succ(false)=
3、用于布尔量运算有布尔逻辑运算(即逻辑运算)
AND(与)OR(或) NOT(非)
B1 B2 NOT B1 B1 AND B2 B1 OR B2
FALSE FALSE
FALSE TRUE
TRUE FALSE
TRUE TRUE
4、关系运算
<(小于),<=(小于等于),=(等于)
>(大于),>=(大于等于),<>(不等于)
关系运算可以用于整型、实型、字符型、布尔类型。
结果均为布尔型
例:3<6=
3<78=
false<true=
‘a’>=‘b’=
判断(x,y)是否在第一象限
6、表达式按下列运算优先规则计算
(1)、所有括起来的子表达式必须首先计算,且子表达式必须从里到外计算。
(2)、在同一表达式中的运算符按下列次序计算:
①函数
②not
③AND,,/,DIV,MOD
④OR,+,-
⑤<,<=,=,>,>=,<>
(3)、同一个表达式中,同一优先级按从左到右注意:赋值语句中,表达式的类型必须与左端变量的类型赋值相容。
a、表达式的类型与左端变量的类型相同
b、表达式为整型,左端变量为实型
var I,j,k:integer
k:=I/j
X:=x+1 I:=I+1
Write语句
将计算结果通过屏幕或打字机输出显示。
例如:write(aa,bb);
一般形式:write(<输出表>:场宽:小数位数)
输出表是一些由逗号分开的输出项。
输出项可以是变量或表达式,或用引号括起来的字符串。
若为变量,则输出变量的值。
若为表达式,则先计算表达式的值,然后将值输出。
若为字符串,则输出字符串本身。
若为用符号’ x+y= ’ ,则将单引号内的值原样输出
例如:输入:x=5,y=6
write(x,y,x+y,xy)
输出结果:5,6,11,30
write(‘x=‘,x,’y=‘,y,’x+y=‘,x+y,’xy=‘,xy);
输出结果:x=5y=6x+y=11xy=30
1、 输入三个字符,然后按输入字符次序输出这三个字符,再输出每个字符的序号,最后按与输入字符相反的次序输出这三个字符。
2、 输入两组x,y值,由程序根据它们是否在斜线区域内,输出不同的值。若在斜线区域内,输出true,否则输出false。
三、选择结构程序设计
程序一:期末成绩,如果成绩在60分以上的为合格,60分以下的为不及格,如何表示
program pd;
var
x:real;
begin
read(x); 读入成绩
if x>=60 then write(‘pass’)
else write(‘not pass’); 用if语句进行判断,如果>=60打印“pass ” 否则打印“not pass”
End
选择结构语句一:If语句格式
IF语句格式1:IF〈条件〉THEN 〈语句1〉
ELSE 〈语句2〉
IF语句格式2:IF〈条件〉THEN 〈语句1〉
程序二:火车托运行李,要根据重量按不同的标准收费。例如不超过50kg,按每公斤035元收费。若超过50k按每公斤035元收费,其余超过部分按每公斤050远收费。现输入托运行李重量,要求计算并输出托运费。
Program compay;
var
weight,pay:real;
begin
readln(weight); 读入行李重量
if weight<=50 then pay:=weight035 判断语句
else pay:=50035+(weight-50)05;
Writeln(‘pay=‘,pay); 打印付费结果
end
注意:If语句中,如果<语句一>或者<语句二>,执行的内容无法用一个语句实现,可以使用复合语句,用begin 和end将执行的语句合并成一个复合语句。
复合语句格式:BEGIN
〈语句1〉;
〈语句2〉;
……;
END;
程序三:输入一个数字,如果该数字大于100,则先输出这个数,并将该数减去100,并将减去100后的结果输出,否则输出“no”。
Program number;
Var x,y:real;
Begin
read(x); 读入该数x
If x>100 then 对x进行判断
Begin 用begin和end将三个语句合并成一个复合语句
writeln(x);
x:=x-100;
writeln(x);
end
else writeln(“no”);
End
复合判断条件语句:当<条件>中包含的不仅只有一个语句,而是多个条件时,可以使用and\or\not复合判断条件
AND:与、和 ,条件都成立时为真
OR:或者,只要有一个条件成立时为真
NOT:非,
程序四:输入一个成绩,如果该成绩小于90并且大于等于70,则输出“ok”
程序:Program score;
var k:real;
begin
read(k);
if (k>=70) and (k<90) then write(‘ok’);
end
复合IF语句
程序五、输入某学生成绩,若成绩在85分以上,输出“A”,若成绩在60分到85分之间,包含60和85,输出“B”,若成绩低于60分,输出“C”。
该题有三重判断,如何实现?
应用复合IF语句:
read(成绩)
IF 成绩>85 then write(’A’) 第一重IF
Else if 成绩>=59 then write (‘B’) 第二重IF
Else write(‘C’);
复合IF语句格式:
IF〈条件1〉 THEN 〈语句1〉
ELSE IF〈条件2〉 THEN〈语句2〉
ELSE〈语句3〉
If语句练习题:
1、 从键盘上输入一个正整数,判断奇数、偶数。如果为奇数则输出“YES”,如果为偶数则输出“NO”。
2、 读入两个数,找出其中最大的数,并输出。
3、 输入一个数,判断该数是正数、负数还是零,为正数输出“zheng”,为负数输出“fu”,为零输出“0”。
Program circle;
Var num:integer;
Begin
Read(num);
If num>0 then writeln(‘zheng’)
Else if num<0 then writeln(‘fu’)
Else writeln(‘0’);
End
4、 对一批货物征收税收。价格在1万元以上的货物征税5%,在5000元以上,1万元以下的货物征税3%,5000元以下的货物征税2%,1000元以下的货物免税。编一程序,读入货物价格,计算并输出税金。
Program test;
Var price,tax:real;
Begin
Read(price);
If price>=10000 then tax:=price005
Else if price>=5000 then tax:=price003
Else if price>=1000
then tax:=price002
Else tax:=0;
Writeln(‘tax=’,tax);
End
5、 输入一个数,如果这个数能同时满足用3除余2,用5除余3,用7除余2的所有整数,则输出“yes”。
Program sum;
Var a:integer;
Begin
If (a mod 3=2) and (a mod 5=3) and (a mod 7=2) then write(‘yes’);
End
6、输入3个字母,按字母表顺序从小到大输出这3个字母。
7、读两个数将大数存于X,小数存于Y。
8、输入一个年份,判断是否是闰年,如果是则输出“yes”,否则输出“no”
目前公认的闰年判断算法,满足下列二者之一,即为闰年:
① 能被4整除,但不能被100整除
② 能被4整除,且能被400整除
9、输入一个加减式,根据输入的式子,判断运算符号,求出结果。例如从键盘上输入:+,5 , 3,则输出为8;例如输入:-,10 , 6,则输出为5。
10、输入一个1000以内的任意一个数,如果这个数中至少有一位数字是5,则输出“yes”,否则输出“no”。
11、输入一个三位的数,判断该数是否为水仙花数,是则输出“flower”。(水仙花数:若三位数abc,a^3+b^3+c^3=abc ,则称该数为水仙花数)
12、输入一个1000以内的数,判断该数是否为守行数(若某数的平方,其低位与该数本身相同,则称该数为守行数。例如25,252=625,62=36,平方值的低位与原数相同,25、6为守行数)。
选择结构语句二:CASE语句:是实现选择结构程序设计的另一种语句。
程序一:输入班号,输出该班学生人数。
班号: 1 2 3 4 5 6
人数: 50 52 50 50 52 55
使用IF语句:
Program number;
Var x:integer;
Begin
Read(x);
If (x=1) or (x=3) or (x=4) then write(50)
Else if x=6 then write(55)
Else write(52);
End
使用CASE语句:
Program number;
Var x:integer;
Begin
Read(x);
Case x of
1, 3, 4:write(50);
6 :write(55);
2, 5 :write(52);
end
end
CASE语句的一般形式是:
CASE <表达式> OF 表达式:必须是有序类型(整型、字符型、布尔型)
<值表1>:<语句1>; 值表1:为具体的值列表,用逗号隔开
<值表2>:<语句2>;
……
<值表n>:<语句n>
END
练习:
1、输入年、月,输出该月有几天。(每年的1、3、5、7、8、10、12,每月有31天;4、6、9、11月,每月有30天;2月闰年有29天,平年有28天。年号能被4整除,但不能被100整除,或者年号能被400整除的年份均是闰年)
2、输入两个运算量及一个运算符(+,-,,/),输出运算结果。
例如:输入 6 9 +
输出 15
3、若已知x在1到8之间,要按如下公式计算y。
y=
4、 输入实数x(已知0<=x<=10),计算y并输出。
2x2+3x+5 x<3
y= (x-3)2 3<=x<6
x>=6
用两种方法编程:
(1) 用IF语句编程;
(2) 用CASE语句编程
<循环体>
循环过程:首先将初值赋给循环变量,然后将循环变量与终值比较,当循环变量的值小于等于终值时,执行循环体。每次执行循环体以后,将循环变量自动加1(即后继值)赋给循环变量,然后再与终值比较,如果与(终值+1)的值相等则退出循环结束For语句,否则再次执行循环体,重复该过程直到循环变量的值与(终值+1)相等。
注意:
1、循环变量必须是有序类型的,且必须与初值与终值的类型相同,例如:整数,字符,而不能是实型。
2、循环变量的初值、终值可以是表达式。
3、循环体可以是任何单个语句或由多个语句组成的复合语句(begin……end)。
4、在循环体内不要随意改变循环变量的值,否则可能会造成死程序循环。
3、 在循环体中,对初、终值表达式值的改变不会影响循环次数及循环变量的取值。
FOR <循环变量>:=<初值> to <终值> do
<循环体>
循环过程:首先将初值赋给循环变量,然后将循环变量与终值比较,当循环变量的值大于等于终值时,执行循环体。每次执行循环体以后,将循环变量自动减1(即前导值)赋给循环变量,然后再与终值比较,如果与(终值-1)的值相等则退出循环结束For语句,否则再次执行循环体,重复该过程直到循环变量的值与(终值-1)相等。
例题二:在1——500中,找出能同时满足用3整除余2,用5整除余3,用7整除余2的所有整除,打印出来。
程序二:
program sunzi;
var I:integer; 仅需一个变量i
begin
for I:=1 to 500 do 直接利用循环变量,对其进行判断
if (I mod 3=2) and (I mod 5=3) and (I mod 7=2) then write(I);
end
例题三:例题二改进:找出满足条件的数打印出,并统计其个数,最后将总个数打印出来。
程序三:program sunzi;
var I,num:integer;
begin
num:=0; 利用变量num统计符合条件的个数,初始化num=0
for I:=1 to 500 do
if (I mod 3=2) and (I mod 5=3) and (I mod 7=2) then
begin write(I);
num:=num+1; 符合条件时,记数自动累加1
end;
writeln(num); 500次判断后将计算结果打印出来
end
多重循环概念:
如果一个循环结构的内部(循环体)又包括一个循环结构,就称为多重循环结构。
注意:多重循环的嵌套次数可以是任意的。可以按照嵌套层次数,分别叫做二重循环、三重循环等。处于内部的循环叫做内循环,处于外部的循环叫做外循环。
练习:
1、打印如下图形:
(1) (2) (3) (4) (5)
(6) (7) (8) (9) (10)
2、打印出如下图形:
1
12
123
1234
12345 1
2 2 2
3 3 3 3 3
4 4 4 4 4 4 4 1
2 3 4
5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23 24 25
A
AB
ABC
ABCD
ABCDE A
A B
A B C
A B C D
……
A B C …… Z 1
1 2 1
1 2 3 2 1
1 2 3 4 3 2 1
1 2 3 4 5 4 3 2 1
3、打印杨辉三角形
一、WHILE循环
对于for循环有时也称为计数循环,当循环次数未知,只能根据某一条件来决定是否进行循环时,用while 语句或repeat语句实现循环要更方便。
while语句的形式为:
while <布尔表达式> do <语句>;
其意义为:当布尔表达式的值为true时,执行do后面的语句。
while语句的执行过程为:
①判断布尔表达式的值,如果其值为真,执行步骤2,否则执行步骤4;
②执行循环体语句(do后面的语句);
③返回步骤1;
④结束循环,执行while的下一个语句。
说明:这里while和do为保留字,while语句的特点是先判断,后执行。 当布尔表达式成立时,重复执行do后面的语句(循环体)。
例1 、求恰好使s=1+1/2+1/3+…+1/n的值大于10时n的值。
分析:“恰好使s的值大于10”意思是当表达式s的前n-1项的和小于或等于10,而加上了第n项后s的值大于10。从数学角度,我们很难计算这个n的值。故从第一项开始,当s的值小于或等于10时,就继续将下一项值累加起来。当s的值超过10时,最后一项的项数即为要求的n。
程序如下:
var
s : real;
n : integer;{n表示项数}
begin
s:=00;n:=0;
while s<=10 do{当s的值还未超过10时}
begin
n:=n+1;{项数加1}
s:=s+1/n;{将下一项值累加到s}
end;
writlen('n=',n);{输出结果}
end
例2、求两个正整数m和n的最大公约数。
分析:求两个正整数的最大公约数采用的辗转相除法求解。以下是辗转的算法:
分别用m,n,r表示被除数、除数、余数。
①求m/n的余数r
②若r=0,则n为最大公约数若r≠0,执行第③步
③将n的值放在m中,将r的值放在n中
④返回重新执行第①步。
程序如下:
program ex4_4;
var m,n,a,b,r:integer;
begin
write('Input m,n:');
readln(m,n);
a:=m;b:=n;r:=a mod b;
while r<>0 do
begin
a:=b;b:=r;
r:=a mod b;
end;
writeln('The greatest common divide is:',b:8);
end
二、直到循环(REPEAT-until语句)
用while语句可以实现“当型循环”,用repeat-until 语句可以实现“直到型循环”。repeat-until语句的含义是:“重复执行循环,直到指定的条件为真时为止”。
直到循环语句的一般形式:
Repeat
<语句1>;
:
<语句n>;
until <布尔表达式>;
其中Repeat、until是Pascal保留字,repeat与until之间的所有语句称为循环体。
说明:
①repeat语句的特点是:先执行循环,后判断结束条件,因而至少要执行一次循环体。
②repeat-until是一个整体,它是一个(构造型)语句,不要误认为repeat是一个语句,until是另一个语句。
③repeat语句在布尔表达式的值为真时不再执行循环体,且循环体可以是若干个语句,不需用begin和end把它们包起来, repeat 和until已经起了begin和end的作用。while循环和repeat循环是可以相互转化的。
对于例2中求两个正整数的最大公约数,程序可用repeat-until循环实现如下:
var
m,n,a,b,r : 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 is',a);
end
以上我们已介绍了三种循环语句。一般说来,用for 循环比较简明,只要能用for循环,就尽量作用for循环。只在无法使用for循环时才用while循环和repeat-until循环, 而且 while 循环和repeat-until循环是可以互相替代的。for 循环在大多数场合也能用whiel和repeat-until循环来代替。
一般for循环用于有确定次数循环,而while和repeat-until循环用于未确定循环次数的循环。
当一个循环的循环体中又包含循环结构程序时,我们就称之为循环嵌套。
三、循环结构程序设计
例3 求1!+2!+…+10!的值。
分析:这个问题是求10自然数的阶乘之和,可以用for 循环来实现。程序结构如下:
for n:=1 to 10 do
begin
①N!的值àt
②累加N!的值t
end
显然,通过10次的循环可求出1!,2!…,10!,并同时累加起来, 可求得S的值。而求T=N!,又可以用一个for循环来实现:
t=1;
for j:=1 to n do
t:=tj;
因此,整个程序为:
program ex4_5;
var t,s:real;
i,j,n:integer;
begin
S:=0;
for n:=1 to 10 do
begin
t:=1;
for j:=1 to n do
t:=tj;
S:=S+t;
end;
writeln(‘s=’,s:0:0);
end
以上的程序是一个二重的for循环嵌套。这是比较好想的方法,但实际上对于求n!,我们可以根据求出的(n-1)!乘上n即可得到,而无需重新从1再累乘到n。
程序可改为:
program ex4_5;
var t,s:real;
i,j,n:integer;
begin
S:=0;t:=1;
for n:=1 to 10 do
begin
t:=tn;
S:=S+t;
end;
writeln(‘s=’,s:0:0);
end
显然第二个程序的效率要比第一个高得多。第一程序要进行1+2+…+10=55次循环,而第二程序进行10次循环。如题目中求的是1!+2!+…+1000!,则两个程序的效率区别更明显。
(一) 单选题
1
分析下面的一组语句,其中N为整型变量,这组语句执行的结果将输出字符串Good___________个
n:=0;
repeat
writeln(‘Good’);
n:=n+2;
until n=5
(A)
0
(B)
3
(C)
5
(D)
无限
难度:易 分值:40
2
下面循环语句能构成有限次循环的是____
(A)
I:=5;
repeat
i:=i+1;
until I>0
(B)
I:=1;
Repeat
Writeln(i);
Until
I>1
(C)
I:=5;
While
(I>0) do
I:=I+1;
Writeln(i);
(D)
I:=1;
While
I<>0 do
I:=I+2;
Writeln
难度:易 分值:40
3
结构化程序的主要优点是(
(A)
程序体积小,节省内存空间
(B)
程序效率高,节省运行时间
(C)
程序结构清晰,可读性高,易维护与修改,可靠性高
(D)
容易实现巧妙的算法
难度:易 分值:40
4
一个完整的pascal 程序由程序首部,说明部分及执行部分组成,其说明部分的次序为(
)
(A)
常量说明,类型说明,变量说明,标号说明,过程说明
(B)
标号说明,类型说明,变量说明,常量说明,过程说明
(C)
标号说明,常量说明,类型说明,变量说明,过程说明
(D)
类型说明,变量说明,标号说明,过程说明,常量说明
难度:易 分值:40
5
对于PASCAL语言的记录类型,其开域语句用保留字________
(A)
RECORD
(B)
CASE
(C)
WHILE
(D)
WITH
难度:易 分值:40
6
已知实型变量r的值为32 635,若要求按32 635的形式输出,应使用的写语句是___
(A)
writeln(r );
(B)
writeln(r:6:3);
(C)
write(r:5:3);
(D)
writeln(r:5);
难度:易 分值:40
7
以下标准数据类型中,__________ 不能用读语句赋值
(A)
整型
(B)
实型
(C)
字符型
(D)
布尔型
难度:易 分值:40
8
已知x,y,z 均为整型变量,如果输入的数据为
1 2
3
4 5
6
7
8 9
则下面____________组输入语句可以使x,y,z 的值分别为1,4,5
(A)
read(x);read(y);read(z);
(B)
readln(x);readln(y);readln(z)
(C)
readln(x);read(y);readln(z)
(D)
read(x);readln(y);read(z)
难度:易 分值:40
9
选择适当内容填入下面的过程说明中,要求过程SWAP中的形式参数X为值参,Y为变参 __________
PROCEDURE swap( );
(A)
CONST x: real;VAL
y:rea
(B)
CONST x:
real;y:real
(C)
X:real;VAR y:real
(D)
X,y:real
难度:易 分值:40
10
设a和b为同一类型枚举变量,以下语句合法的是:__
(A)
a:=b;
(B)
read(a,b);
(C)
a:=ord(b);
(D)
writeln(a,b);
难度:易 分值:40
11
有一单向链表,已知P,Q两接点,在P,Q间添加S 接点的 *** 作是( )
head
……
Q P
(A)
q^next:=s; S^next:=p;
(B)
q^next:=p^next; p^next:=s;
(C)
q^:=s; s^:=p;
(D)
q^next:=s;
p^next:=nil;
难度:易 分值:40
12
下面语句中,可以使布尔型变量L的值为真的是___
(A)
L:=T
(B)
L:=‘T’
(C)
L:=TRUE
(D)
A) L:=‘TRUE’
难度:易 分值:40
13
以下叙述不正确的是____
(A)
Pascal提供了一些标准函数和过程,用户使用时可直接调用,无需定义
(B)
使用标准函数sin时,每调用一次都能得到唯一的一个值
(C)
标准函数只能出现在表达式中,不能以一个调用语句的形式单独调用
(D)
调用标准函数或标准过程均能通过一个函数名或过程名带回一个结果
难度:易 分值:40
14
以下不符合pascal规定的字符常量是___
(A)
‘2’
(B)
‘pascal’
(C)
’’’’
(D)
‘a’
难度:易 分值:40
15
以下程序段共执行___________次循环
I:=05;
While
I<25 do
Begin
I:=I+05;
End;
(A)
1
(B)
3
(C)
4
(D)
5
难度:易 分值:40
16
以下属非法的pascal用户自定义标识是_____
(A)
CONST
(B)
FORMAT
(C)
MAX
(D)
NEXT
难度:易 分值:40
17
下面的常量定义中正确的是__
(A)
CONST I=100 OR 200
(B)
CONST
R:125
(C)
CONST PI=314
(D)
CONST
J:=10
难度:易 分值:40
18
分析下面的PASCAL程序,给出正确的运行结果___________
PROGRAM
mx(input,output);
VAR
R,
s, t :integer;
PROCEDURE
change(a,b:integer);
VAR
T:integer;
BEGIN
A:=3a;
B:=2b;
T:=a+b;
End;
BEGIN
R:=2;s:=4;t:=6;
Change(r,s);
Writeln(‘r=’,r,’s=’,s,’t=’,t)
End
(A)
r=2 s=4
t=6
(B)
r=2 s=4
t=14
(C)
r=6
s=8 t=6
(D)
r=6
s=8 t=14
难度:易 分值:40
19
设有如下的过程说明
PROCEDURE wri;
BEGIN
Writeln(‘Welcome to
use pascal!!!’);
End;
则下面有关过程wri的叙述中正确的是____
(A)
过程说明有错,因为没有形式参数
(B)
过程说明有错,因未说明过程的类型
(C)
过程说明有错,因为在过程体内没有给过程名赋值的语句
(D)
过程说明正确
难度:易 分值:40
20
有一单向链表,已知P,Q两接点,删除P 接点的 *** 作是( )
head
……
Q P
(A)
Q^next:=P^next; Dispose(p);
(B)
q^next^next:=next; dispose(p);
(C)
q^next:=p; P^next:=nil; Dispose(P);
(D)
p:=q^next; q^:=p^next; p^next:=q^next;
Dispos(p);
难度:易 分值:40
21
下面循环语句仅执行一次的是_____
(A)
I:=0; Repeat I:=I+1; Writeln(i) Until
I<3
(B)
I:=0; while (I<3)
do I:=I+1; writeln(i);
(C)
for I:=0 downto 3 do I:=I+1; Writeln(i);
(D)
I:=0 while (I>0) or (I<3) do I:=I+1; writeln(i);
难度:易 分值:40
22
以下pascal程序输出结果是__________
program
tea(output);
VAR
i,j:integer;
Begin
For i:=1 to 4
do
Begin
For j:=4-i to 1 do
Write(‘’);
Writeln
end
end
(A)
(B)
(C)
(D)
难度:易 分值:40
23
循环语句FOR C:=‘X’
DOWNTO ‘Z’
DO writeln;的循环次数是___
(A)
0
(B)
1
(C)
2
(D)
3
难度:易 分值:40
24
根据下面的变量说明
VAR
M, n,
i, j:integer;bool:Boolean;
则下面的赋值语句中正确的是_____________
(A)
m+n:=2j
(B)
bool:=n=i DIV j
(C)
m=15 MOD 7
(D)
m:=i+j:=n+8
难度:易 分值:40
25
Pascal 程序中无序类型是指( )
(A)
实型
(B)
字符型
(C)
整型
(D)
布尔型
program guessword;
uses
crt;
var
chance,i,used,correct:integer;
guess:char;
word:string;
guessed:set of char;
begin
clrscr;
used:=0;
correct:=0;
guessed:=[];
write('Word:');
readln(word);
word:=lowercase(word);
write('Chance:');
readln(chance);
clrscr;
for i:=1 to length(word) do write('_ ');
writeln;
writeln('Chance: 0/',chance:2);
write('Guess:');
repeat
gotoxy(7,3);
readln(guess);
guess:=lowercase(guess);
if not (guess in guessed) then
begin
guessed:=guessed+[guess];
if pos(guess,word)<>0
then
begin
for i:=1 to length(word) do if guess=word[i] then
begin
correct:=correct+1;
gotoxy(2i-1,1);
write(guess);
end;
end
else
begin
used:=used+1;
gotoxy(8,2);
write(used:2);
end;
end;
until (used=chance) or (correct=length(word));
gotoxy(1,4);
if used=chance then writeln('Game over!');
if correct=length(word) then writeln('Well done!');
readln;
end
以上就是关于高分求free pascal的教程全部的内容,包括:高分求free pascal的教程、一道Pascal小问题,急!!!!!!!!、pascal 由键盘上输入任意n个一位数数输出它的全排列等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)