PASCAL语言基础_1
PASCAL语言基础
PASCAL语言基础及基础训练 第 1 页 共 48页
PASCAL语言基础
第一章、 什么是计算机语言
计算机语言是计算机软件中非常独特的一部份,它属于系统软件,但又和应用软件息息相关。它的作用是:使人类能够用某些命令、指令去让计算机为人类进行数值、逻辑运算。计算机语言中,只有一种语言是计算机能自己识别的,就是最底层、最难的机器语言,这是一般人类所无法接受的语言,所以在此基础上,人们发展出了许多高级的语言,这些语言的共同特点是:人类无需去掌握高深的机器语言,只要掌握这些更容易理解、更贴近人类的高级语言,用高级语言编出程序后,再由语言解释、编译系统去把程序解释、编译成机器语言让计算机去执行。目前最常用的高级语言大致有以下几种:
BASIC语言:是一般计算机入门者的首选语言,命令少,容易掌握,从BASIC,BASICA,GWBASIC,TRUE BASIC,TURBO BASIC,QUICK BASIC等一直发展到目前的WINDOWS环境下的VB。
PASCAL语言:最适合科学计算、数据处理的语言,运行、编译速度最快,从TURBO PASCAL 5 .5, 6.0, 7.0一直到现在的WINDOWS环境下的DELPHI以及LAZARUS等面向对象的PASCAL,以及目前信息学竞赛使用的FREE PASCAL各个版本。
C语言:主要适用于应用软件的开发,是计算机人员的必修课,但在算法实现、建模方面不如PASCAL方便。从C,C++,一直到现在的WIONDOWS环境下的VC、C++等。
实际上,我们日常所用的各种软件,包括Windows,WORD、EXCEL、各种游戏等等,全部都是使用程序设计语言编写出来的软件,我们只有掌握了程序设计语言,才能进行计算机软件的开发。
在我们的信息学竞赛中,所有的题目都是非常复杂的数值与逻辑运算,所以世界上广泛采用PASCAL语言作编程工具,我们采用的是FREE PASCAL2.0版本或者相近版本。
我们学习信息学竞赛除了要掌握程序设计语言,能够使用程序设计语言编写程序外,还有一部分要掌握的更加重要的内容就是——算法设计,它能够使我们的程序运行速度更快、效率、精度更高,使我们的程序取得快人一步的优势,算法设计在本书中我们将接触一部分。
第二章、PASCAL语言入门
第一节、 PASCAL语言的特点
以法国数学家命名的PASCAL语言是世界上使用最广泛,最有效的语言之一。其主要特点是:严格的结构化形式;丰富完备的数据类型;运行能力、效率高;查错能力强等等。与BASIC、C等语言相比,PASCAL语言更适合科学计算,运行速度最快,编译能力最强,编译成的可执行文件也最小。
PASCAL语言是编译执行的语言(BASIC语言是解释执行),因此在速度与效率上都比BASIC语言提高了一个档次。所谓解释执行,是在程序环境下编写好程序后,执行它时是一句一句地由语言解释器翻译成机器语言,由计算机去执行,计算机能在程序编辑时就发现程序中错误,但程序运行速度慢;而编译执行是在程序环境中编写好程序后,执行时先由编
译器把整个程序编译成机器语言,然后再由计算机执行,计算机必须在编译程序时才能发现程序中的错误,但程序运行速度快。
第二节、FREE PASCAL的集成环境
一个题目,如果用PASCAL语言来解,在建立好数学模型及完成一定的自然语言描述后,就用PASCAL语言来编辑出程序,编译后再运行(可以作为一个过程),这样才能得到
答案
八年级地理上册填图题岩土工程勘察试题省略号的作用及举例应急救援安全知识车间5s试题及答案
。
FREE PASCAL提供了一个功能非常强大的集成环境,我们可以利用它来完成上述所有过程。进
1
PASCAL语言基础及基础训练 第 2 页 共 48页
的第一字母,如ALT+F,即能调出FILE菜单。另外,我们也可用鼠标来调用菜单,操作方法与其它软件一样。
功能健中定义了:F1可得到帮助;F3打开一个已存盘的程序文件;ALT F9 编译当前程序;F9把当前程序编译成EXE(可执行)文件,ALT F10打开菜单,当然,还有一些功能键并没有在这里显示,在后面的学习中我们将逐个涉及,大家自己也可以从菜单中发现。
第三节、一个PASCAL程序
一、 进入编辑状态:
选择菜单[FILE][OPEN](今后涉及到菜单调用时,均以此格式表示,即选择FILE菜单中的OPEN功能)功能,打开一个程序文件,在输入文件名时,输入文件的主名即可进入程序编辑状态。这时可用编辑功能健:
光标键:用以上下左右移动光标位置;
INSERT:插入/改写状态切换;
TAB;光标跳至下一制表位;
CAPSLOCK:大小写切换;
DELETE:删除光标位一字符;
BACKSPACE:删除光标前一字符;
CTRL+Y:删除光标处一行;
HOME:光标跳至行首;
END:光标跳至行未;
PAGEUP:上翻一页;
PAGEDOWN:下翻一页;
ENTER:回车/换行;
二、 编辑一个PASCAL程序:
[例1、1] 输出一句话的小程序:
program Q1;
begin
writeln(‘You are welcome to the PASCAL world !’);
end.
请在编辑状态下编辑输入上述程序,第一行为程序开头,程序名(这一行并不是必须的,今后的程序中我们会经常省略之一行);第二行BEGIN表示程序开始,最后一行END表示程序结束;WRITELN()语句把括号中单引号中的的字符打印在屏幕上;记住,一般每行以分号“;”结束,但END后以句号“.”结束,而BEGIN后没有标点符号。即:
除BEGIN外,每一句PASCAL语句后均有分号或句号,只有程序的最后一个END后才用句号,而其它任何行未都是分号~~~
三、 在集成环境中运行程序:
上述程序[例1、1]编辑好后,如果要运行,只需选择菜单[RUN][RUN]命令(或CRTL+F9),如果程序正确的,就会在屏幕(这个屏幕叫程序输出屏幕)上显示:
You are welcome to the PASCAL world !
但是我们看到,输出屏幕上显示的结果一闪而过就又回到了集成环境屏幕显示,我们几乎看不到在屏幕上显示的结果,要查看刚才的屏幕显示,只需选择菜单[RUN][USER SCREEN](或ALT+F5),就又能回到输出屏幕,敲任意键又回到集成环境中。
如果程度出错,则程序没有被运行完就会回到集成环境中,并且光标停在错误的这一行,在编辑窗口中的第一行还会显示出错信息,如:
Run-time error 错误代码 at 错误发生地址
2
PASCAL语言基础及基础训练 第 3 页 共 48页
四、 保存文件
把当前编辑的程序文件以当前名存盘,只需运行菜单命令[FILE][SAVE](或F2),即可。
五、 关闭当前文件
当前文件不想现在再编辑了,可把它关闭掉,即运行菜单命令[WINDOWS][CLOSE](或ALT+F3),即可。
六、 打开已有文件
欲打开一个已经存在的程序文件,运行菜单命令[FILE][OPEN](或F3),再按TAB键去选择或不按TAB键而直接输入文件名即可。
七、 练习
在集成环境中输入以下程序,程序的作用是计算圆的面积,圆的半径由用户从键盘输入,编辑运行正确后请存盘:
const pi=3.1416;
var s:real;
r:integer;
begin
writeln(„Please input radius :?);
readln(r);
s:=pi*r*r;
writeln(„s=?,s);
end.
运行举例:
Please input radius:
5
s=7.854000000E+01
第三章、PASCAL语言程序基本概念
第一节、PASCAL程序的组成
我们仍以上述程序为例:[例2、1]
program area_of_cicle;
const pi=3.1416;
var s:real;
r:integer;
begin
writeln(„Please input radius :?);
readln(r);
s:=pi*r*r;
writeln(„s=?,s);
end.
每一个PASCAL程序都由程序头部和程序主体组成,最后以“end.”作为整个程序的结束。
一、 程序头部
程序头部毫无疑问是在程序的开头位置,以“program”这个词开始(但经常省略这一),以
第一个BEGIN的前一行结束,中间每行后均有分号。
以CONST为开始的部分是说明程序中要用到的常量,以VAR为开始的部分是说明程序中
要用到 3
PASCAL语言基础及基础训练 第 4 页 共 48页
的变量。即程序中要用到的所有的常量及变量,我们必需在程序首部加以说明其名称及类
型。这些我们将在稍后讲到。
二、 程序主体
以第一个BEGIN开始,以最后一个END结束,中间即为程序命令行,每一行均以分号结束~
第二节、PASCAL的数据类型
PASCAL语言的常量与变量都必须在程序头部先加以说明,即说明常量、变量的的名称及数据类型。PASCAL语言的数据类型很多,最常用的有以下几种:
一、 整数类型(没有小数部分) INTEGER:取值范围[-32768,32767]。占用123.567, -234,
0
2、科学计数法,如:1.234E-4, -3.546E12
表示1.234乘10的负4次方;-3.546乘10的12次方。
三、 字符类型
CHAR:单字符型,即取1个字符,如‘A’, ‘1’。
STRING:字符串型,即多个字符,如‘ABCD~123’,‘%,#DS12’。
如果一个常/变量只要用到1个字符,则可把它定义成CHAR型;如果是多个字符,但不知确切多少个,则定义成STRING型,如果知道确切有N个字符,则定义成STRING[N]型,例如STRING[5],则表示定义的这个字符串变量由5个字符组成。字符串在PASCAL中使用都是加上单引号。
四、 布尔型
BOOLEAN:布尔型即为逻辑型,取值为TRUE、FALSE, 即真、假。
第三节、常量、变量、标准函数和表达式
一、 常量和变量
常量:程序运行过程中,其值不会改变的量,称为常量。在程序头部中说明,以CONST引导。 变量:程序运行过程中,其值可改变的量,称为变量。在程序头部中加以说明,以VAR引导。 如,在[例2、1]中说明的常量PI,变量S、R。
二、 标准函数
PASCAL语言提供数量非常大的标准函数供我们使用,这些函数有些可以直接调用,有些放在另外的
单元
初级会计实务单元训练题天津单元检测卷六年级下册数学单元教学设计框架单元教学设计的基本步骤主题单元教学设计
(UNIT)中。PASCAL也提供了大量的标准过程,和标准函数一样供用户直接或间接调用。
如果一个函数或过程不在SYSTEM(即默认调用的单元)中,而在其它单元中话,即在程序头部的第一行正式行中加上USES 单元名;如,如果要使用CLRSCR(清屏过程,在CRT单元中)的话,就必须在程序头部加上:USES CRT;
函数的调用:如:A:=ABS(-34),即把-34的绝对值赋给变量A;(注意:函数只能出现在表达式中,即赋值语句中)。此时:A的数据类型与括号中的参数-34是一致的。函数的语法中都会说明,这个函数的参数的类型及这个函数的值(结果)的类型。
过程的调用:过程即命令,如:CLRACR; 程序运行结果是清屏。
4
PASCAL语言基础及基础训练
第 5 页 共 48页 三、 表达式
由算术运算符(+,—,*,/)及数字、常量、变量、标准函数所组成的式子中心表达式。 如:5+9; A*B-34*ABS(-34)/INT(B)
另外,PASCAL中有两个很有用的运算符,DIV:求商的整数值;MOD:求余数。如:
8 DIV 3 的值是2,10 DIV 3 的值是3;
8 MOD 3的值是2,10 MOD 3的值是1;
在PASCAL的表达式中,不允许出现我们日常生活中的那种分式或根号等式子,我们必须按照PASCAL的语法把它们改写成PASCAL表达式。在PASCAL的表达式中,运算顺序是:
() 函数 *,/,DIV,MOD +,-
如:把下列算式改写成PASCAL表达式:
x2,3y,5(z,2)
x,y2
改写为PASCAL表达式为:(x*x+3*y-5*(z-2))/(x-y*y)
从上例中可以看出:
1、 PASCAL表达式中没有分式,只能以除号“/”来隔开;
2、 PASCAL表达式中的分子与分母应该用括号括开;
3、 PASCAL表达式中只有小括号,不能有中括号或大括号,小括号可以有很多层;
4、 PASCAL表达式中没有乘幂,只能用乘法来表达(在FP中有平方函数,所以可以使用SQR函
数);
5、 PASCAL*表达式中任意两个常量、变量、数值、括号、函数之间都必须不能缺省运算符,即
乘号必不可少;
这些要求希望大家记熟,这是我们编写PASCAL程序的必要基础。
四、 练习
1、 计算下列表达式的结果:
31 div (5 mod 2) 31 div 5 mod 2 31 /(5 div 2)
5
PASCAL语言基础及基础训练 第 6 页 共 48页
2、 把下列算式改写为PASCAL表达式:
a3,b(c2,abc),4c
1,ab2
c,2a
第四节、程序头部的说明语句
在程序头部的说明语句中,可有以下几种引导词,例:
LABEL 10,30: 说明程序中要用到两处标记(即行号)10和30;此项不用掌握。
CONST p=123;
a=12.346; s=?abcdefg?
VAR I,j,k:integer;
X,y:real; S1:string[5];
TYPE T=record Tn,tm:integer; Ts:string; End;
第四章、PASCAL的顺序程序结构
PASCAL是一种结构化的程序设计语言,其包含三种结构:顺序、选择、重复,其中顺序结构是最基础的,即程序是完全从第一句运行到最后一句,中间没有中断,没有分支,没有反复;而选择结构即是给程序设置了分支;重复结构即反复运行某一段(句)程序。
第一节、赋值语句
赋值语句的一般格式:变量名:=表达式
变量名一定要已经在程序头部先说明过,赋值符号其实就是冒号加等于号“:=”,而绝不能只用等于号“=”。冒号的左边(即赋值符号的左边)只能是一个变量名~不能也是表达式,更不能是具体数值。一个赋值语句中只能出现一个赋值符号。
例如:以下赋值语句都是正确的:
X:=1; 把1这个数值赋给X这个变量;
A:=B*C+12*INT(D); 把B*C+12*INT(D)这个表达式的值赋给变量A;
Y:=Y+1; 把Y+1的值再赋给Y这个变量, 即累加。
以下赋值语句都是错误的:
S:=T:=1; 不能有两个赋值号在一个语句中;
X+2:=4; 赋值号左边不能是表达式;
Z=3; 少了冒号;
由上可以看出,赋值语句实际上是先把等于号右边的表达式计算出,再赋给赋值号左边的变量。 以下[例3、1]程序的作用是先把A,B两个变量赋上值(3和2),打印在屏幕上;然后再交换 6
PASCAL语言基础及基础训练 第 7 页 共 48页
上述程序是一个比较简单的顺序结构的程序,希望大家看懂程序每一句的作用,进一步理解PASCAL程序的语法规则。在程序运行过程中各变量数值变化的情况如程序右边。从上述程序中还可以看出,一个变量如果本身已经被赋过值,当再次赋值时,原来的值就不起作用,而被新的值所覆盖。
第二节、输出语句
计算机在运行一个程序时,当计算出结果后,是不会自动在屏幕上显示出结果的,而必须由用户用输出(打印)语句把结果显示(打印)到屏幕上。输出语句就是在程序完成计算后,让用户能够控制计算机把结果显示出来。PASCAL语言提供了两个输出语句:
WRITE(项目,项目,„„);
WRITELN(项目,项目,„„);
两个语句用法完全相同,只不过WRITE在输出所有项目后,光标不换行,停在最后一个输出项目后;而WRITELN在输出所有项目后,光标自动换行,跳到下一行开头位置。
PASCAL的输出屏幕与DOS下完全相同,共有25行,80列,即每行可显示80个字符。
例:[例3、3]:
program q33;
var a,b,c:integer;
begin
a:=1;
b:=a+1;
c:=a+b;
write(a);
write(b);
writeln(c);
writeln;
writeln(a,b,c);
writeln(a:4,b:4,c:4);
end.
输出结果是:
123
7
PASCAL语言基础及基础训练 第 8 页 共 48页
123
1 2 3
由上可以看出,一个WRITE语句输出完内容后,光标没有换行;一个WRITE或WRITELN语句中可输出多个项目;一个空的WRITELN语句的作用是换行(即空一行);在WRITE或WRITELN语句中如果输出数值型数据,可用如“A:4”这种格式来控制变量A在输出时固定占用4个字符位(4个有效数字)。如:WRITELN(X:6:2);表示输出X的值时,给定6个有效数字,其中2个小数位,即另有3个整数位及一个小数点。
第三节、键盘输入语句
键盘输入语句的作用是,使用户能在程序运行过程中,从键盘对变量进行赋值。PASCAL提供了两个键盘输入语句:
READ(变量名,变量名,„„);
READLN(变量名,变量名,„„);
其中变量名必须是在程序头部先说明过的,而在键盘输入时输入的数据也必须与其类型相符。READ和READLN都可以一次性从键盘输入多个数据,每个数据用空格隔开。假设READ或READLN要求输入X个数据,而我们输入时也输入了X个数据,这时READ与READLN的功能是完全一样的。但是,如果要求输入X个数据,而我们输入了多于X个数据时(如X+N个),这时READ与READLN都是把前X个数据赋给X个变量,而剩下的多输入的N个数据就有如下情况:如果是READ,则这N个数据被保存下来,到下一个READ/READLN语句时再赋给剩下的变量;而用的是READLN的话,这些数据
,如果类型不对,或是数据之间不用空格隔开,屏幕上都会显示出错信息。如果我们每个程序的再次键盘输入都只输入两个数据:即:
1 2
3 4
这时,两个程序的运行结果都相同:
1234 1234
如果我们每个程序都输入以下数据,即:
1 2 3
4 5
这时,两个程序的运行结果是不同的:
1234 1245
请大家注意两个结果为什么不同,
第四节、程序的调试
1、 运行程序:CTRL+F9或菜单[RUN][RUN];
2、 程序运行过程中暂停:CTRL+BREAK;
3、 继续运行程序:CTRL+F9;
4、 程序在暂停后取消继续状态:CTRL+F2;
5、 逐句(单步)执行程序:F7或TRACE;
6、 逐段运行程序:F8或STEP;
8
PASCAL语言基础及基础训练 第 9 页 共 48页
7、 在当前光标处设置一个断点:CTRL+F8;
8、 查看{单引号间没有字符}
C:=‘ ’ {单引号间有一个空格}
4、写出下列每小段程序的运行结果(只是程序的一部分):
A.write(„*?);write(„*?);write(„*?);write(„*?);
B.writeln(„*?);writeln(„*?);writeln(„*?);writeln(„*?);
C.write(„*?);writeln;write(„*?);writeln;write(„*?);writeln;write(„*?);writeln;
D.write(„?);writeln(„*?);write(„?);writeln(„*?);write(„?);writeln(„*?);write(„?);writeln(„*?);
5、编一程序,从键盘输入整数A,B的值,然后把A,B的值交换后输出。
6、编一程序,键盘输入整数A,B的值,然后打印A除以B的商的整数部分及余数。
7、编一程序,从键盘输入一个实数,然后输出其四舍五入精确到小数点后第3位的数。
8、编一程序,从键盘输入一个四位整数,然后把该数的每一位进行交换,即千位换为个位,百位换成十位,然后输出新数。
9、random函数可得到0到1之间的随机小数,请编一程序用此函数得到10到100之间的随机整数。(注意:randomize可初始化随机数)。
10、从键盘输入一个4位整数,要求打印出它的各位数之和。
11、从键盘输入两个整数,打印出更小的那个数。
第五章、选择结构
本章讨论程序的分支结构,其主要知识是布尔运算(逻辑运算)。
第一节、布尔运算(逻辑运算)
要判断“A>B”是否成立,其结果不是一个具体的数值,而是“真”或“假”,即“是”或“否”的问题。这类问题在我们日常生活中是很多的,诸如这类判断的问题,其结果都是只有两个:真或假,这就是我们所说的布尔运算(逻辑运算)。
一、 布尔常量和布尔变量
布尔型的常量或变量的值只有两个:TRUE(真)和FALSE(假)。要把一个变量定义成
布尔类型,用的数据类型是:BOOLEAN。例如程序:
var a,b:boolean;
begin
a:=true;
b:=false;
„„
9
PASCAL语言基础及基础训练 第 10 页 共 48页
end.
二、布尔表达式
布尔表达式有以下两种操作:
1、 关系运算符:=;<>; >; <; >=; <=,是用来进行关系操作(对比)运算的符号,其结果为
BOOLEAN型。如:2=3,其结果为FALSE。*注意:这里的“=”与赋值符号“:=”是完全不同的,其作用和结果均不同。
2、 逻辑运算符:AND(逻辑和);OR(逻辑或);NOT(逻辑非)。是用来进行逻辑值的
逻辑运算的。如:(2=3)AND (4<>3),值为FALSE。
布尔表达式的运算顺序是:() 函数
NOT *,/.DIV,MOD,AND,+,-,OR >,<,>=,<=,<>,=。
1、 用AND运算时,左右两个值同为TRUE时,运算结果才为TRUE,即两个条件同时满足,结果
才为TRUE。这就是我们平常所说的“和”。
2、 用OR运算时,左右两个值只需有一个为TRUE,运算结果就为TRUE,即两个条件满足其中
一个,结果就为TRUE。这就是我们平常所说的“或”。
3、 用NOT运算时,只是把其后的逻辑值取反,即“非”。
false
true
true
由上可以看出:逻辑运算中的关系运算均用括号“()”括起来。关系运算/逻辑运算的结果也是一个值(BOOLEAN型),所有布尔运算也是表达式,可以赋给一个变量,也可以直接用输出语句输出。打印输出时,屏幕上就显示“false”或“true”。
第二节、条件语句
条件语句是用一个布尔表达式的值来决定程序的走向。即程序提供一个分支,由布尔表达式的值来决定程序究竞运行哪个分支。即程序已经不是顺序结构了,而是提供了一个分支结构。每次只可能运行其中的一个分支。如下图所示:
10
PASCAL语言基础及基础训练 第 11 页 共 48页
条件语句有两种格式:
1、if <布尔表达式> then <语句>;
2、if <布尔表达式> then <语句1> else <语句2>;
格式1的作用是:如果布尔表达式值为TRUE(即该条件满足),则运行语句,否则不运行任何语句。
格式2的作用是:如果布尔表达式值为TRUE(即该条件满足),由运行语句1,否则(即布尔值为FALSE,亦即条件不满足)就运行语句2。注意:只有条件语句结束时才有分号。
注意:如果条件语句中的分支语句不止一句,可用“begin……end;”来框住,加以区别。如:
条件语句的嵌套:条件语句是可以嵌套的,例如:
if a>0 then if a>1 then …… else …… else ….;
上述语句看起来无法理解,但如果我们把它改写为以下形式时,就一目了然了:
if a>0 then begin
if a>1 then begin
……
end
else begin
……
end
else begin
……
end;
也就是说,第二个IF语句只是第一个IF
语句中的一部分,即嵌入的一个IF语句。
例:输入一个年份,判断它是否闰年。我们知道,每四年中有一年是闰年,即有366天,而其余三年是平年,只有365天,而按照规定:1、如果哪一年的年份能被4整除,则该年一般为闰年;
2、这样,每100年又会少一天,所以又规定如果该年能被4整除,又能被100整除,则认为该年不是闰年,而是平年;3、这样,每400年又会多出一天,所以又规定,如果哪一年能被400整除,则该年又是闰年。
由上可知:1980,1996,1984年均为闰年,1900年为平年,而2000年为闰年。
11
PASCAL语言基础及基础训练 第 12 页 共 48页
第三节、多分支语句
IF语句只能使程序有两个分支,当遇到需要有两个以上分支时,IF语句就很不适用了,这时我们可以用CASE语句,它能使程序有很多个分支。其效果如下图:
其格式为:
常量1:语句序列1;
常量2:语句序列2;
„„
常量N:语句序列N;
else 语句序列N+1;
END;
其中语句序列如果只有一句,可直接写在常量后的冒号后;如果语句序列有很多句,则应该用BEGIN„„END加以框住。
CASE语句的作用是,根据表达式,表达式可以有多个值,分别对应于常量1、2等值时,就运行该常量后所对应的语句。
例:输入1到7之间的某个整数,打印出其对应的星期的英语名:[例4、4]:
12
PASCAL语言基础及基础训练 第 13 页 共 48页
program q44;
var n:integer;
begin
write(„n=?);
readln(n);
case n of
1:writeln(„Monday?);
2:writeln(„Tuesday?);
3:writeln(„Wednseday?);
4:writeln(„Thursday?);
5:writeln(„Friday?);
6:writeln(„Saturday?);
7:writeln(„Sunday?);
else writeln(„WORNG!?);
end;
end.
例:输入一个学生的数值化成绩,把它转化为等级化成绩。即100-90是A,89-80是B,
79-70
第四节、标号说明及转移语句
此节不用掌握
在几乎所有语言中,都有GOTO(转移)语句,其作用是当程序运行到该句时,自动转移
到其指定的标号(行号)语句去执行。
说明语法:LABEL 标号; 如:LABEL 10,20;
转移语句用法:GOTO 标号;
例:[例4、5]:
program q45;
label 10;
begin
10:
write(„*?);
goto 10;
end.
运行上述程序时,程序将在屏幕不停地打印出“*”,而不会停止,必须由用户按下
CTRL+BREAK才能中断。
13
PASCAL语言基础及基础训练 第 14 页 共 48页
练习
1、 设X,Y,Z的值分别是FALSE,TRUE,FLASE。写出下列逻辑表达式的值:
not x and not y;
true and x or y;
(x and z) or (z and y);
x or z and y;
2、 编写一个程序,功能是从键盘输入一个整数,判断它是否二位数,如果是,就打印它,然
后结束程序,否则继续要求输入数。
3、 编写一个程序,功能是从键盘输入三个整数,打印出其中最大的一个值。
4、 编写一个程序,功能是从键盘输入1—12中的某一个数字,由电脑打印出其对应的月份的
英语名称。
5、 以下程序的功能是从键盘输入一个式子,它只有三个字符,第一个及第三个都是数字,中
间那个是运算符,程序能把它的结果打印出来。试在程序空中填上相应的语句。
注意:计算机是不懂得把输入的字符串进行计算的,我们必须自己动手把其中的数字转化成数值型的数据,这其中我们使用了VAL函数,如程序中的:Val(s[1],a,c),是把S字符串中
第六章、重复结构
重复结构就是循环结构,是指某些语句需要重复执行而设定的程序结构。在PASCAL语言中,共有三种重复结构语句,功能各有不同。
第一节、直到语句
直到循环语句的语法格式是:
repeat
语句序列;(循环体)
until 布尔表达式;
其作用是:重复执行语句序列(循环体),直到布尔表达式的值为TRUE为止。即,当执行完一次语句序列后,布尔表达式的值已经为TRUE了,这时循环将不会再被执行,而转向执行UNTIL语句以下的语句。
例:计算M=1+2+3+4+„„,直到M的值大于5050为止。[例:5、1]
var m,I:integer;
14
PASCAL语言基础及基础训练 第 15 页 共 48页
begin
m:=0;
I:=0;
Repeat
I:=I+1;
M:=m+I;
Until m>5050;
Writeln(I,? ?,m);
End.
在上述程序中,我们使用了PASCAL中的两个作用强大的概念:累加和循环。
累加:我们在上述程序中没定了两个累加器:I,M。累加器初值我们在第一句中设定了为0,之后每次运行一次I:=I+1后,I的值就比原来大1。每运行一次M:=M+I后,M的值就被M+I所替代。
循环:这里我们使用的是直到循环,即重复执行循环体中的两个语句,直到M>5050这个条件满足为止(即这个布尔表达式的值为TRUE为止)。
上述程序运行后,会在输出屏幕上显示两个值:101 5151。即当I的值为101时,这时所算得的M的值为5151。亦即,1+2+3+„„101=5151。
象上述这种X=1+2+3+„„这种加法,我们就把它叫累加,这里的X就是累加器,一般初值为0。 而N=1*2*3*4*5*6*„„这种乘法我们把它叫累乘,这里N就是累乘器,一般初值为1(为什么,)。 一般的:1*2*3*„„N,我们把这个式子的结果叫做N的阶乘(N~)。如:4~=1*2*3*4。 例:计算19~[例5、2]
var I:integer;
x:longint;
begin
I:=0;
X:=1;
Repeat
I:=I+1;
X:=x*I;
Until I=19;
Writeln(x);
End.
当程序开始时,I的初值被定为0,X的初值被定为1(累乘器)。然而开始进入循环,每次I的值比原来增加1,然后再乘进X中去,直到I等于20时,最后一次把I乘进X后,这时I=20这个条件已经满足(I=20的值已经为TRUE),所以循环就被退出,而程序转向执行UNTIL以后的语句:WRITELN(X);。
请大家想一想,为什么X要定义为LONGINT型。
第二节、当语句
当语句的语法格式是:
while 布尔表达式 do begin
语句序列;(循环体)
end;
其作用是,当布尔表达式的值为TRUE时,才会运行语句序列(循环体),否则循环将不会被执行,即从循环头部就退出,而转向执行END后的语句。
例:计算19~[例5、3]
var I:integer;
x:longint;
begin
I:=0;
X:=1;
15
PASCAL语言基础及基础训练 第 16 页 共 48页
While I<19 do begin
I:=I+1;
X:=x*I;
End;
Writeln(x);
End.
请大家把此程序与上一节的[例5、2]进行比较,看两种循环在运用时有何不同。
WHILE语句是在循环开始时就判断布尔表达式的值时否为TRUE,如果为TRUE,就进入循环,运行循环体,如果为FALSE,就不运行循环体,而直接转向执行END后的语句WRITELN(X);。
REPEAT与WHILE循环的示意框图如下所示:
从上述框图中可以看出,要使用循环语句时,必须要确定循环体及条件(布尔表达式)两个重要因素,亦即首要考虑的是:我要重复执行哪些语句,我要重复到什么时候为止~
[例5、4],从键盘上输入两个整数M,N,求它们的最大公约数。
分析:我们只需从M,N中更小的一个数开始,每次让其减1,直到这个数能同时被M和N数整除为止。在下述程序中,我们在程序头部调用了CRT单元,是为了使用CLRSCR语句来清屏,即把输出屏幕上的字符清除干净。
Uses crt; {调用CRT单元}
Var m,n,x:integer;
Begin
Clrscr; {清屏}
Write(„Please input 2 numbers:?)
Readln(m,n);
If m>n then x:=n else x:=m;
While (n mod x<>0) or (m mod x<>0) do begin
x:=x-1;
End;
Writeln(x);
End.
上述程序如果改用REPEAT语句来做的话,程序为:
uses crt;
var m,n,x:integer;
begin
write(„Please input 2 numbers:?)
16
PASCAL语言基础及基础训练 第 17 页 共 48页
Readln(m,n);
If m>n then x:=n+1 else x:=m+1;
Repeat
X:=x-1;
Until (m mod x=0) and (n mod x=0);
Writeln(x);
End.
请大家考虑上述两个程序为何会有这样有不同之处。
第三节、FOR循环语句
前面所计的两个语句都是在未知循环次数的情况下而用的循环语句,但在程序中,如果我们已经知道循环的次数而来编程序的话,就可以使用FOR循环语句,这也是PASCAL及其它高级语言中用得最多的语句。其语法格式有两种,如下:
(1) 增量为1:
for 变量名:=初值 to 终值 do begin
语句序列(循环体);
end;
(2) 增量为-1:
for 变量名:=初值 downto 终值 do begin
语句序列(循环体);
end;
变量名的类型由程序头部中定义,而其初值、终值必须和它是同一类型。该变量的类型是能是有序数据类型。
[例5、5]:从键盘输入一个字符串,把它按正序及逆序分别输出:
uses crt;
var s:string;
l,I:integer;
begin
clrscr;
write(„Please input the string:?);
readln(s);
l:=length(s);
for I:=1 to l do begin
write(s[I]);
end;
writeln;
for I:=l downto 1 do begin
write(s[I]);
end;
end.
17
PASCAL语言基础及基础训练
22第 18 页 共 48页 2 [例5、6]计算1,2,......,10
uses crt;
var s,a:integer;
begin
clrscr;
s:=0;
for a:=1 to 10 do begin
s:=s+a*a;
end;
writeln(a,? „,s);
end.
[例5、7]:计算:1+3+5+7+„„101的值:
uses crt;
var m,n:integer;
begin
clrscr;
m:=0;
for n:=0 to 50 do begin
m:=m+(2*n+1);
end;
writeln(m);
end.
请大家注意上述程序中的几个小技巧,一个是FOR N:=0 TO 50,共循环51次;一个是
M:=M+(2*N+1),其是的2*N+1得到的是一序列的奇数。
第四节、多重循环语句
多重循环语句即循环嵌套,也就是一个循环语句的循环体中还有循环语句。
[例5、8]编程序打印九九乘法表:
uses crt;
var I,j:integer;
begin
clrscr;
for I:=1 to 9 do begin
for j:=1 to 9 do begin
write(j:1,?*?,i:1,?=?,I*j:2);
end;
writeln;
end;
end.
运行结果:
1*1= 1 2*1= 2 3*1= 3 4*1= 4 5*1= 5 6*1=6 7*1= 7 8*1= 8 9*1= 9 1*2=2 2*2= 4 3*2= 6 4*2= 8 5*2=10 6*2=12 7*2=14 8*2=16 9*2=18 1*3=3 2*3= 6 3*3= 9 4*3=12 5*3=15 6*3=18 7*3=21 8*3=24 9*3=27 1*4=4 2*4= 8 3*4=12 4*4=16 5*4=20 6*4=24 7*4=28 8*4=32 9*4=36 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 6*5=30 7*5=35 8*5=40 9*5=45 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 7*6=42 8*6=48 9*6=54 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 8*7=56 9*7=63 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 9*8=72 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 注意:循环有嵌套时,必
须分清层次,切不可把循环进行交叉。
[例5、9]编程序分别打印以下三图:
18
PASCAL语言基础及基础训练 第 19 页 共 48页
(1) (2) (3)
***** ***** *****
***** ***** *****
***** ***** *****
***** ***** *****
形的不同之处是:第一个直上直下,是个矩形;第二个是左斜的平行四边形;第三个是右斜的平行四边形。所以三个对应的程序也就有所不同,第(2)、(3)个程序比第(1)个多了一句,即加粗加线的那一句。这两句的作用是使每一行开头打印几个空格,即让图形左或右斜。WRITELN的作用是打印完一行后换行。
[例5、10]编程打印下列图形:
1
222
33333
4444444
素数,即为除了1和它本身外没有另外的因数的整数。所以我们判断一个数N是否素数,可以用2至N-1所有数去除N,如果没有一个数能被N整除,则N为素数。
当然,其实我们可以不用用2至N-1这第多的数去除,而只需用2至不大于N的平方根的整数去除N即可(为什么),
这里我们的程序就用2至TRUNC(SQRT(N))来判断,到后面我们还会谈到:如果要判断一个 19
PASCAL语言基础及基础训练 第 20 页 共 48页
A:“B在说谎”;B:“C在说谎”;C:“A、B都在说谎”。现在问,到底谁说真话,谁说谎, 分析:A、B、C三人,要么说谎,要么说真话,即三个的状态要么为FALSE,要么为TRUE,所以,可让A、B、C三个变量进行循环,循环初值为TRUE,终值为FALSE。而三个人所说的话即为三个逻辑表达式,其值也为TRUE或FALSE,并且与A、B、C的值是有关系的。
A、B、C三个所说的话转化为逻辑表达式即为:
A:B=FLASE;
B:C=FALSE;
C:(A=FALSE) AND (B=FALSE)
以上三个逻辑表达式的值中,TRUE的个数应该与A、B、C三个变量中TRUE的个数相同。并且,每一个变量的值应该与其对应的话的逻辑表达式的值相等。如:A应该等于(B=FALSE)这个逻辑表
第五节、练习
1、 随机产生一些1—100之间的整数,直到产生的数为50为止。
2、 计算1—1000之间能同时被3和5整除的整数的和。
3、 打印下列图形:
1
121
12321
1234321
12321
121
1
4、 一百匹马驮一百块瓦,一匹大马可以驮3块,一匹母马可驮2块,小马2匹可驮1块。试
编程求需要各种马多少匹,
5、 有三种纪念邮票,第一种每套一张售价2元,第二种每套一张售价4元,第三种每套9张
售价2元。现用100元买了100张邮票,问这三种邮票各买几张,
6、 赵、钱、孙、李、周五人围着一张圆桌吃饭。饭后,周回忆说:“吃饭时,赵坐在钱旁边,
钱的左边是孙或李”;李回忆说:“钱坐在孙左边,我挨着孙坐”。结果他们一句也没有说对。 20
PASCAL语言基础及基础训练 第 21 页 共 48页
请问,他们在怎样坐的,
7、找数。一个三位数,各位数字互不相同,十位数字比个位、百位数字之和还要大,且十位、百位数字之和不是质数。编程找出所有符合条件的三位数。
注:1. 不能手算后直接打印结果。
2. “质数”即“素数”,是指除1和自身外,再没有其它因数的大于1的自然数。
8、选人。一个小组共五人,分别为A、B、C、D、E。现有一项任务,要他们中的3个人去完成。已知:(1)A、C不能都去;(2)B、C不能都不去;(3)如果C去了,D、E就只能去一个,且必须去一个;(4)B、C、D不能都去;
(5)如果B去了,D、E就不能都去。编程找出此项任务该由哪三人去完成的所有组合。
9、输入一个字符串,内有数字和非数字字符。如A123X456Y7A,302ATB567BC,打印字符串中所有连续(指不含非数字字符)的数字所组成的整数,并统计共有多少个整数。
10、A、B、C三人进入决赛,赛前A说:“B和C得第二,我得第一”;B说:“我进入前两名,丙得第三名”;C说:“A不是第二,B不是第一”。比赛产生了一、二、三名,比赛结果显示:获得第一的选手全说对了,获得第二的选手说对了一句,获得第三的选手全说错了。编程求出A、B、C三名选手的名次。
11、甲、乙、丙、丁四人共有糖若干块,甲先拿出一些糖分给另外三人,使他们三人的糖数加倍;乙拿出一些糖分给另外三人,也使他们三人的糖数加倍;丙、丁也照此办理,此时
甲、乙、丙、丁四人各有16块,编程求出四个人开始各有糖多少块。
12、截数问题: 任意一个自然数,我们可以将其平均截取成三个自然数。例如自然数135768,可以截取成13,57,68三个自然数。如果某自然数不能平均截取(位数不能被3整除),可将该自然数高位补零后截取。现编程从键盘上输入一个自然数N(N的位数<12),计算截取后第一个数加第三个数减第二个数的结果。
13、从键盘输入一段英文,将其中的英文单词分离出来:已知单词之间的分隔符包括空格、 问号、句号(小数点)和分号。
例如:输入:There are apples; oranges and peaches on the table.
输出:there
are
apples
oranges
and
peaches
on
the
table
14、山乡希望
小学
小学生如何制作手抄报课件柳垭小学关于三违自查自纠报告小学英语获奖优质说课课件小学足球课教案全集小学语文新课程标准测试题
收到一箱捐赠图书,邮件上署名是“兴华中学高二班”,山乡希望小学校 长送来了感谢信,可是兴华中学高二年级有四个班,校长找来了四个班的班长,问他们是哪 个班做的这件好事。一班的班长说:“是四班做的。”二班的班长说:“是三班做的好事。”三 班的班长说:“不是我们班。” 四班的班长说:“三班的班长说的不对。”
四个班的班长都说不是自己班做的,这就难坏了校长,后来得知四个班的班长中有两个 说得是真话,有两个没有说真话,请你利用计算机的逻辑判断编一个程序,找出究竟是哪个 班做了这件好事。不能手算后直接打印结果。
15、A,B,C,D,E五个人合伙夜间捕鱼,凌晨时都疲惫不堪,各自在河边的树丛中找地 方睡着了,日上三竿,E第一个醒来,他将鱼数了数,平分成五分,把多余的一条扔进河中, 拿走一份回家去了,D第二个醒来,他并不知道有人已经走了,照样将鱼平分成五分,又扔 掉多余的一条,拿走自己的一份,接着C,B,A依次醒来,也都按同样的办法分鱼(平分成 五份,扔掉多余的一条,拿走自己的一份),问五人至少合伙捕到多少条鱼。
也许你能用数学办法推出鱼的条数,但我们的要求你编出一个程序,让计算机帮你算出鱼的总数。
16、试编程找出能被各位数字之和整除的一切两位数。
17、一个正整数的个位数字是6,如果把个位数字移到首位,所得到的数是原数的4倍,试编程找出满足条件的最小正整数。
18、某本书的页码从1开始,小明算了算,总共出现了202个数1,试编程求这本书一共有多少页,
19、从键盘上输入两个不超过32767的整数,试编程序用竖式加法形式显示计算结果。
例如: 输入 123, 85
显示: 123
+ 85
21
PASCAL语言基础及基础训练 第 22 页 共 48页
---------
208
20、有30个男人女人和小孩同在一家饭馆进餐,共花了五十先令,其中男宾3先令,女宾2先令,小孩1先令。试编程求出男人女人小孩各多少人,
第七章、数组、集合与自定义数据类型
第一节、数组
在一个程序中,如果所要用到的常量、变量不多,并且彼此之间无序列化的联系,我们一般定义成不同的常/变量名即可。但如果要用到的常/变量个数很多,彼此之间有着序列化的联系时,我们就会把它们定义成一个数组。数组—即一序列的数(各种类型的数据)组成的一个数据的序列。这些数据共用一个名称,只不过下标不同。
例如:在我们的数学学习中,在解一元二次方程时,方程有两个解,我们会分别用X1、X2来表示。而在PASCAL语言中,我们用X[1]、X[2]来表示,即下标是放在中括号中的。
一、一维数组
数组如果要使用的话,就必须先在程序头部的常量/变量说明中先说明,说明语法是:
变量名:ARRAY[下标初值..下标终值] OF 数据类型;
如:VAR N:ARRAY[1..10] OF INTEGER;
作用是说明一个名为N的整数型数组,可用的下标为1至10,即可用10个变量。
再如:CONST M:ARRAY[1..5] OF CHAR=(‘A’,‘B’,‘C’,‘D’,‘E’);
作用是说明了一个名为M的字符型数组常量,下标范围为1至5,因为是常量,所以在后面指明了这五个常量的值分别为:‘A’,‘B’,‘C’,‘D’,‘E’。
在程序头部说明了数组后,在程序中就可以使用了,使用方法为:常/变量名[下标号]。如,M[1]即调用M[1]这个常量,其值为‘A’。
[例6、1]从键盘输入10个整数,然后把它们排序,从大到小打印出来。
分析:排序是各种语言中的一个必需掌握的要点。排序有很多种方法,但不论是哪种方法,都是把这些据存放在一个数组中,然后再对其进行排序操作。排序一般有以下几种方法:
1、 双数组法:再定义另一个与存放数据数组同类型的数组,然后把数据数组中最大的一个数
找出来,存放为另一数组中的第一个;再找第二、第三个等等。其中的细节问题就是:在数据数组中找到最大的一个后,就把它的值赋成一个非常小的值,然后再找最大的一个,这样就能顺序把数据从大到小存放到另一个数组中,也即排好了序。
2、 冒泡法:这是最常用的一种排序方法,其实质是:先把数据存放在数组中,然后从第一个
开始,分别与其后所有数据进行比较,如果第一个比其后某个数据小,则交换它们的值,
一直到第一个与其后所有数据比较完,这时第一个数据就是最大的一个;然后再把第二个数据再与其后数据进行比较,比较完后,第二个数据则为第二大的,这样直到倒数第二个数据比较完后,整个数组就已经按从大到小的顺序排列了。其作用示意如下:
。 22
PASCAL语言基础及基础训练 第 23 页 共 48页
二、二维数组
1、 矩阵:我们在PASCAL语言中接触到的一般是数字矩阵,如:
1 2 3 4 5 6
3 4 5 6 7 9
1 5 8 9 4 2
7 5 3 2 1 7
如果要存放这样的矩阵数据,我们可以定义几个数组来存放,每个数组存放一行或一列,
但最好的办法是定义一个二维数组来存放。二维数组有两个下标,可以分别对应矩阵中的行号、列号,从而能更加方便的存取数据。定义的语法是:
变量名:ARRAY[下标初值1..下标终值1,下标初值2..下标终值2] OF 数据类型;
例如:VAR A;ARRAY[1..4,1..6] OF INTEGER;
数组A就可存放上述矩阵的所有数值。或者定义一个常量:
CONST B:ARRAY[1..4,1..6] OF INTEGER=((1,2,3,4,5,6),
(3,4,5,6,7,9),
(1,5,8,9,4,2),
(7,5,3,2,1,7));
这样我们就能在程序直接使用,如:B[1,5]是指第一行的第五个数据,即5;B[3,2]指第三行第二个数据,即5,等等。
第二节、集合
集合是一序列有共同性质或联系的数据组成的一个集体。如日常生活中所说的:一个班的全体同学;一个书架上所有的书等。而在PASCAL语言中,集合一般都是指一系列的数值或字符等数据,如:小于10的正整数;26个英语字母等。集合也象常/变量一样有自己的名字,即集合名,它是在程序头部象定义变量一样来定义的。
定义集合:VAR 集合名:SET OF 数据类型;
这里需要注意的是:集合只能定义成整数(byte)、布尔型或CHAR型的。
如:VAR S:SET OF byte;
其作用是定义了一个整数型的集合S。
集合的赋值:集合的值实际上应该是一些数据的总和。一个集合的值(元素)是用中括号“[]”括起来的。如:
S:=[];是把S赋成一个空集合。
S:=[1,2,4];是把S赋成一个有三个元素的集合。
集合的运算:集合的并、交、差运算及关系运算。
1、 并:用运算符“+”:即把两个集合的元素合并。如:S:=[1,2]+[4,5];是把S赋值成四 23
PASCAL语言基础及基础训练 第 24 页 共 48页
个元素。
2、 交:用运算符“*”:即取两个集合的相同元素。如:S:=[1,2,3]*[3,4,5];这时S的
值被赋成了一个元素[3]。
3、 差:用运算符“-”:即取属于前一集合但不属于后一集合的元素。如:S:=[1,2,3]-[2,
5,6];这时S的值被赋成了[1,3]。
4、 关系运算:这是在PASCAL语言中集合概念最重要的部分,是用来判断集合之间或集合与元
素之间关系的运算。有以下几种:
A、=:判断两个集合的元素是否完全相同;
B、<>:判断两个集合是否不相等;
C、>=:包含;
D、<=:包含于;
E、IN:存在于。即用来判断一个元素是否存在于一个集合中。
第三节、自定义数据类型
PASCAL语言不仅直接提供大量的可直接使用的数据类型,还提供了功能强大的扩展自定义功能,用户可以自己定义适合自己程序中使用的数据类型。这种自定义数据类型同样是在程序头部加以说明,引导字是TYPE,定义好类型后,就可能把常/变量定义成这种类型了。这样的自定义数据类型有两种定义方式,分别是:枚举类型、子界类型。
一、 枚举类型
日常生活中的一个星期中的每天的名称:SUNDAY、MONDAY等,颜色的名称:RED、BLUE等,如果我们的PASCAL程序中要使用这些数据的话是很不方便的,所以我们可以使用自定义枚举类型来使它运用起来更加方便。
定义语法如下:TYPE 类型名=(标志符);
如:TYPE COLOR=(RED,BLUE,GREEN,YELLOW,BLACK,WHITE);
WEEKDAY=(SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY); MONTH=(JAN,FEB,MAR,APR,MAY,JUN,AUG,SEP,OCT,NOV,DEC);
这样,我们就能在定义常/变量时把常/变量定义成这些类型。如:
VAR C:COLOR;
W:WEEKDAY;
M,N:MONTH;
在程序中,我们使用上述四个变量时,它们的值只能是对应的类型中的值。如:C这个变量的值就只能是:RED,BLUE,GREEN,YELLOW,BLACK,WHITE。
注意:枚举类型的数据是有序的。即可用函数:PRED()前趋;SUCC()后续。这两个函数的用法我们将在下面介绍。
枚举类型数据的运算:
1、 赋值:如:C:=BLUE;
W:=FRIDAY;
2、 判断:如:BLUE>GREEN的值为TRUE;
3、 函数:PRED()、SUCC()、ORD()。因为枚举类型是有序的,所以可以使用上述三个和序
数有关的函数。如:
A、 SUCC(FRIDAY)的值为SATURDAY;即FRIDAY之后的一个值。
B、 PRED(YELLOW)的值为GREEN。即YELLOW之前的一个值。
C、 ORD(BLUE)的值为2;即BLUE在其对应的枚举类型中排在第二位。
二、子界类型
子界类型也是自定义数据类型中的一种。在上一节的枚举类型中我们知道,枚举类型是把一种 24
PASCAL语言基础及基础训练 第 25 页 共 48页
数据类型所有的值都列举出来。而当需要自定义的类型是一序列连续的数据,并且数量很大时,枚举类型就不适合了,这时,我们就会采用子界类型。子界类型,顾名思义,就是当数据是连续的时,可以指定其上界及下界来定义。定义方法与枚举类型相似。
TYPE 类型名称=上界..下界;
如:TYPE YEAR=1900..2000;是定义一个名为YEAR的数据类型,其值可取为1900—2000。 再如:TYPE NUMBER=1..9;
CHARACTER=?a?..?z?;
上述语句定义了两个子界类型的变量,第一个NUMBER的取值为1至9;第二个CHARACTER的取值为小写字母‘a’至‘z’。
三、记录类型
记录型数据类型是PASCAL语言中做搜索问题中一定要用到的数据类型,所以,它在PASCAL语言中占着非常重要的地位。学过数据库管理软件的人都知道,在数据库文件中,有一个非常重要的概念—记录,例如:一个人的各门成绩,一个人的各种信息(姓名、性别等等),我们都把它们存放成一条记录而给予一个统一的名称。
1、 记录说明:记录类型和枚举类型一样,都要在程序头部用TYPE引导说明。语法如下: TYPE 类型名称=RECORD
域变量1:基类型;
域变量2:基类型;
„„„„
END;
然后在常/变量说明中就要以用这种类型了。在程序中使用必须指定变量名与域名。
[例6、2]编一程序,用来记录20个学生的姓名、年级、班级、性别、语文成绩、数学成绩、总分,平均分。
Type student=record
Name:string;
Grade,class,chinese,mathe,sum:integer;
Average:real;
Male:boolean;
End;
Var s:array[1..20] of student;
I,j:integer;
Begin
For I:=1 to 20 do begin
Write(„please input the student?s name,grade,class,male,chinese,mathe); Readln(s[I].name);
Readln(s[I].grade);
Readln(s[I].class);
Readln(s[I].male);
Readln(s[I].chinese);
Readln(s[I].mathe);
S[I].sum:=s[I].chinese+s[I].mathe;
S[I].average:=s[i].sum/2
End;
„„„„
{如果程序要求打印或排序,只需在此增加这些功能语句}
end.
第四节、字符串
在PASCAL语言中,字符串的处理是非常方便的,在定义字符串时,我们不仅可以定义成CHAR 25
PASCAL语言基础及基础训练 第 26 页 共 48页
型(单个字符);STRING型(任意个字符);STRING[N]型(指定只有N个字符)。在后两种类型中,我们都可以使用:变量名[I],来指定字符串中的第I字符,以便得到它的值或对其赋值。而且,我们还可以使用如下函数对字符串进行各种操作:
1、 CHR(N):返回N(ASCII码)对应的字符。如:CHR(66)的值是?b?;
2、 UPCASE(C):把字符串全部转成大写字母。
3、 CONCAT(S1,S2):把两个字符串相加,如:CONCAT(‘ABC’,‘123’)的结果是‘ABC123’;
4、 COPY(S,M,N):这是很有用的一个函数,它的作用是取字符串S第M个字符开始的N个
字符作为一个新的子串。如:COPY(‘ABCDE’,3,2)的值是‘CD’;
5、 LENGTH(S):求字符串S的长度。如:LENGTH(‘ABCD’)的值是4;
6、 DELETE(S,M,N):与COPY的功能正好相反,作用是把字符串S的第M个字符开始的N个
字符删除掉。如DELETE(‘ABCDEF’,3,2)的结果是‘ABEF’;
7、 INSERT(S1,S2,N):把字符串S1插入到字符串S2中,插在S2的第N个字符。如:INSERT
(‘ABCD’,‘12345’,2)的结果是:‘1ABCD2345’。
8、 POS(S1,S2):这是一个非常有用的函数,其作用是判断S1是否是S2的子串,返回结果
是:(1)如果是子串,只返回S1在S2中的起始位置;(2)如果不是子串,则返回0。如:POS(‘123’,‘ABCDEF’)的值为0;POS(‘AB’,‘BABCD’)的值为2;
另外,我们还可以使用如下几个过程:
1、 STR(N,S):这是一个过程,作用是把N这个数值转化为S这个字符串。如:STR(123,S),
作用是把S的值赋成了‘123’;
2、 VAL(S,N,CODE):这也是一个过程,作用是把S这个字符串转化为N这个数值,并且同
时返回CODE这个错误代码(整数型)。如:VAL(‘135’,N,C);作用是把N的值赋成了135这个数值,而且返回C这个错误代码。为什么会有错误代码呢,大家看这个语句是否错误,错在哪里:VAL(‘12ABC’,M,C);
[例6、3]把26个英语字母正向、逆向打印出来。
Const s:string[26]=?abcdefghijklmnopqrstuvwxyz?;
Var t:string[26];
I:integer;
Begin
t:=? „; {共26个空格}
For I:=1 to 26 do begin
T[I]:=s[27-I];
End;
Writeln(s);
Writeln(t);
End.
[例6、4]找出所有的四位回文数:(回文数就是一个数从左往右读与从右往左读都是同一个数) var s:string[4];
n:integer;
begin
for n:=1000 to 9999 do begin
str(n,s);
if (s[1]=s[4]) and (s[2]=s[3]) then write(n:6);
end;
end.
或者用如下程序:
var n:integer;
s,t:string;
begin
for n:=10 to 99 do begin
str(n,s);
t:=s+s[2]+s[1];
26
PASCAL语言基础及基础训练 第 27 页 共 48页
write(s:6);
end;
end.
上述两个程序,哪个快,哪个慢,
第八章、自定义函数和过程
PASCAL语言提供了大量的标准函数及标准过程供我们直接使用,但有时我们也会用到非标准的函数或过程,尤其是在做递归、回溯、搜索问题时,使用PASCAL语言的自定义函数、过程功能,与BASIC相比,能帮我们节省至少一半以上的时间。同样一个搜索问题,用BASIC语言如果要2个小时编出程序,用PASCAL语言就可能不要1个小时。
第一节、自定义函数
自定义函数也是在程序头部说明,其本身就相当于一个小程序,也有其头部及主体。语法如下: FUNCTION 函数名(形式参数表):函数值的数据类型;
函数的头部(常/变量说明);
BEGIN
函数语句;(其中一定要有一句对函数名的赋值)
END; {注意:这里是分号}
以上整个部分都位于程序的头部。自定义函数由“FUNCTION”引导,名称自定,形式参数表是指一个函数要求输入的参数(如:ABS(3.12),括号中的3.12就是形式参数),而每一个函数都是得到具体的值,所以也必须要说明该函数的值(即结果)的数据类型。
函数定义好后,就可在程序中调用,调用时和调用标准函数方法一样,都是把函数作为表达式或表达式中的一部分,放在赋值语句中或直接放在输出语句中。
但一定要注意:在函数程序语句中一定要对函数名赋值,否则,该函数是无效的。另外:输入的数值的类型一定要和形式参数的类型相同。
两个重要概念:全局变量、局部变量
全局变量是在程序主体的头部说明的变量,是可以在程序的各个部分(包括主体、自定义函数、自定义过程)直接使用的。
局部变量是在程序的自定义函数或自定义过程的程序头部说明的变量,它们只能在所在的函数 27
PASCAL语言基础及基础训练 第 28 页 共 48页
或过程中使用,不能在程序的其它部分使用。
如上述程序中的变量M,N就是全局变量,而变量C就是局部变量。A,B是形式参数(数值参数),是常量而不是变量。
所以,大家在编写PASCAL程序时一定要注意变量的命名,全局变量与局部变量不要取相同的名称。
递归函数
递归函数是PASCAL语言编程中通向高级算法的必由之路,要掌握递归函数必须要先掌握递归这个概念。
什么是递归呢,我们来看一个例题,在此之前我们先学会什么是数列。数列即一序列数的总称,如:1,2,3,4,5,6,7,8„„是自然数数列;2,4,6,8,10,„„是自然偶数数列;象这种以某种关系定义的数的序列就叫数列。数列的名称可任取,象上述第一个数列如果名为A,第二个数列名为B,则第一个数列的各个数字的名字就为:A1,A2,A3,A4„„或A(1),A(2),A(3)„„。数列A的数字关系是:(1)A(N)=A(N-1)+1(N>1);(2)A(1)=1;由此两个关系,我们只要知道该数列中任何一个数的序号,就可推知该数的数值。
那么如果对于数列A,我想知道A(100)是多少该如何推算呢,
由上述关系我们已经知道:
A(100)=A(99)+1,即要知道A(100),我们就必须先知道A(99);而
A(99)=A(98)+1;即要知道A(99)就必须先知道A(98);由此类推
A(98)=A(97)+1;
„„„„„„
A(3)=A(2)+1;
A(2)=A(1)+1;而此时就已经不用继续推算下去了,因为A(1)是已知的了。
而实际上,上述推算过程就是递归过程。即要完成某个计算,必须先完成其前的另一个计算,以此类推,直到推到一个已知的值为止。
[例7、2]有一个数列N,已知:N(1)=1,N(X)=N(X-1)*3-1(X>1),求N(100);
我们已经知道,由递归关系,我们要求N(100),就必须知道N(99)„„N(1),而最终N(1)是已知的,所以这个递归关系我们就可以用PASCAL语言很好地表现出来。以下我们用递归函数来完
递归函数就显得至关重要了,由上述程序可以看出,递归函数的实现实际上就是一个自己调用自己的函数。直到调用到已知的数为止。递归问题我们还将在递归过程中详细分析。
由上可见,递归过程实际上只有一句,IF 条件 THEN 出口 ELSE 调用下一次递归;
第二节、自定义过程
我们已经学过很多的标准过程,如:WRITE,READLN,STR等等,这些都是PASCAL的标准过程,我们可以随时调用。但有的时候,我们在程序中的不同地方会用到相同的一些语句,这时,我们就会把这些语句组合成一个自定义过程,以便在不同地方调用,这样,就可以节省大量的时间。并且,利用自定义过程,我们能够非常简单的实现递归、回溯。
28
PASCAL语言基础及基础训练 第 29 页 共 48页
自定义过程的说明语法如下(在程序头部说明):
procedure 过程名(形式参数表);
过程变量(局部变量)说明部分;
begin
语句体;
end; {此处是分号~}
自定义过程的调用语法如下:
过程名(数值参数表);
自定义过程实际上就是一个小的程序,只不过是划分开来,成为一个过程,然后在程序主体中以过程名来调用这些语句。
自定义过程的形式参数与自定义函数的用法一样,是输入过程中要用到的不同的输入值。如果过程中不要用到形式参数值,那么在说明过程的时候,过程名后面就不用加括号来说明形式参数。
[例7、3]编写一个程序,在屏幕上打印以下图形。
$$$$$
$$$$$
$$$$$
$$$$$
$$$$$
分析,我们已经编写过类似的程序,这里我们将用一个过程来打印每一行的五个“$”号。只不过每一行开头的位置不同,所以我们把控制开头位置的数值做为一个形式参数,另外,把每行要把
(N,S)过程,N是输入的参数,而
S是输出的参数,即输入N转化为字符串S输出。这种有输出参数的过程在形式参数说明中有所不同,即输出参数要用VAR来引导。下例就是这种情况。
[例7、4]编写一个程序,求X的N次方。
我们知道,PASCAL语言中没有求乘方的标准函数或过程,这里我们将自己编一个求乘方的过程,而该过程的形式参数就必须有两个输入参数,另外,我们计算出的幂值必须输出到一个变量中,这个变量也必须放在形式参数中,只不过这个参数与输入参数是不同的,所以必须以VAR引导加以说 29
PASCAL语言基础及基础训练 第 30 页 共 48页
递归过程
我们从一个例题中来看看递归的实际实现及运行过程。
[例7、5]打印‘A’、‘B’、‘C’、‘D’、‘E’这五个字符任意排列的所有情况。
分析,此题可用五重循环来做,但那样就把此题给复杂化了,运行速度也要慢很多,而此题用递归过程来做的话就要简单许多。我们把递归过程定为每次从五个字符中取一个字符,当然这个字符必须与已经取得的字符全不相同,而我们取得的字符存放在一个字符串中,并把它作为形式参数(这一点至关重要,否则答案将完全错误)。当我们已经取完五个字符后,在取第六个字符时,递归
30
PASCAL语言基础及基础训练 第 31 页 共 48页
括返回第一层的情况,这样就能把所有答案都找出来。下面我们以取‘ABC’三个字符的全排列来看其生成树的全过程:
第0层: 开始(1)
第一层: A(2) B(7) C(12)
第二层 AB(3) AC(5) BA(8) BC(10) CA(13)
CB(15)
第三层 ABC(4) ACB(6) BAC(9) BCA(11) CAB(14)
CBA(16)
由上可以看出,共生成了16个节点(NODE),我们把每一个状态,即每一个递归过程产生的字符串叫做一个节点,请大家记住这个概念。从开始第一个节点开始,我们的子点遍历过程是按数字
31
PASCAL语言基础及基础训练 第 32 页 共 48页
大小来标明的,即(1)--(16)这16个节点是按顺序生成的,结果共有6个,这6个节点产生的顺序也可看出是按数字大小来产生的。整个递归过程共产生了三层节点,每个目标节点都是直线产生,每条能够走通的路线都一定能产生出目标节点,这就是递归,同样,这就是我们所说的深度优先搜索问题,即搜索方向是直向深处的节点的。
另外,上述图中,程序经过每个节点的顺序我们也能很清楚的说出了:(开始)1 2 3 4 3 2 5 6 5 2 1 7 8 9 8 7 10 11 10 7 1 12 13 14 1
3 12 15 16 15 12 1(结束)。
上述到达4、6、9、11、14、16节点是找到了答案,由小节点往大节点走时是调用深一层递归过程,而大节点往小节点走时是由深层的节点返回上一层节点,这其实也就是回溯了。从这种观点来看,递归与回溯的差别是很小的,递归是在找到一个答案之前,即中途是不会返回上一层的,而回溯是在中途就有可能无法展开下一层节点,而只能返回上一层。下面我们将以数个例子来更深入地说明递归与回溯这两大重点。
[例7、6]从键盘输入一个正整数N,求把它分解成若干个小于等于N的正整数之和的所有情况。 分析:我们完全可模仿[例7、5]的方法,把递归过程定为每次从1到N-1这些正整数中取一个整数,而我们取得的数字经转换为字符后,也存放在一个字符串中,并把它作为形式参数。然后把M减去这整数后再做为新的参数,当我们新的参数已经为0时,递归过程就将结束。这就是递归的
[例7、7]八皇后问题,要在国际象棋棋盘中放八个皇后,使任意两个皇后都不能互相吃,
共有多少种放法,全部打印出来。
分析:皇后能吃同一行、同一列、同一对角线的任意棋子。所以,我们可以这样考虑:在每一行中放一个皇后,从第一行开始,在往每新的一行加皇后时,我们必须确保这个皇后必须不能与已经取得的所有皇后都不在同一列或同一条对角线。我们定义一个数组来存放八个皇后的在1到8行中的列位置,所以形式参数就可以只要一个----行号,当行号达到9时,我们就找到了一个答案。 32
PASCAL语言基础及基础训练 第 33 页 共 48页
同,都是定义了出口,然后中间就是调用过程,展开下一层节点。但实际运行过程中,回溯和递归是有差别的,递归是每次顺一条路往下走都能找到答案,然后才往回回溯;而回溯则不然,在中间某层时,就有可能走不通,下一层一个节点都无法展开,这时就只能在中途就回溯了。
如:我们把8皇后问题中简化为4皇后问题。如果我们的前两个皇后放的位置为:1、3,这时,第三个皇后是无法放下去的(为什么,),这时就只能回溯,返回第二层(这个返回是循环结束,正 33
PASCAL语言基础及基础训练 第 34 页 共 48页
常结束此次过程,于是返回调用它的上一层过程),第二个皇后就放到第4个位置,位置变为:1、4,这时,再展开第3个皇后,可放在第三2个位置,位置变为:1、4、2,再展开第4个皇后,这时,第四个皇后又无法放下,于是返回第三层,第三层已别无选择,再返回第二层,仍无其它选择,于是返回第一层,第一个皇后放在第2个位置,再展开第二层,放第4个位置,再展开第三层,放第1个位置,再展开第四层,放第3个位置,这时,才找到第一个答案。
从这我们完全可以看出,递归在找到一个答案前,是不会中途回溯的;而回溯在找到第一个答案前有可能就已经回溯了好几次了。递归算法是往下展开时就一直往下走;而回溯则是中途可以任意返回,回溯是能进则进,不能进则退。两种算法的程序是相似的,但运行过程是不同的。
练习
请大家用递归或回溯算法完成下列各题:
1、 把正整数M分解成N个正整数之和。
2、 路径问题:已知下列各点之间的通向问题,请打印出由0至N(由键盘输入)的所有走法。
1
0 3 2 5 4 7 6 9 8
提示:用一个10X10的数字矩阵(定义一个二维数组)来存放各点之间的相通情况,然后用递归从一点往另一点逐步展开,到目标点为止。如:我们定义的下列二维数组常量就说明了任意两点之间是否相通:
const a:array[0..9,0..9] of integer=((1,1,0,0,0,0,0,0,0),
(0,1,1,0,0,0,0,0,0),
(0,0,1,1,0,0,0,0,0),
(0,0,0,1,1,0,0,0,0),
(0,0,0,0,1,1,0,0,0),
(0,0,0,0,0,1,1,0,0),
(0,0,0,0,0,0,1,1,0),
(0,0,0,0,0,0,0,1,1),
(0,0,0,0,0,0,0,0,0))
3、 填数问题:从整数1至10中任取九中不同的数,填入下面九个格子中,使所有相邻(左、右、
例如: 有的解。
5、 有一台阶共20级,标为0至20号,现从0级开始往上走,每次只能走一级或二级台阶,请打
印出所有从0级走至20级的情况。
提示:每次往上走一级或二级台阶,所以我们的递归过程中也有两种调用下一层的情况:(1)当目前的级数小于20时,可往上走一级;
(2)当目前的级数小于19时,可往上走二级。
即:我们可把当前在第几级作为形式参数N,当级数N=20时,就找到了一个答案。当N<>20时:如果N<20,则往上走一步;如果N<19则往上走二步。
6、 一张地图,有12个区域(如下所示),用四种颜色着色,要求相邻的区域不用同种颜色,问共
有多少种
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
,打印所有结果。
12
34
PASCAL语言基础及基础训练 第 35 页 共 48页
11 5 4 9
提示:用一个12X12的数字矩来表示任意两个区域是否相邻,然后在递归往1至12区域上着色时,就可判断该区域上能否用某种颜色。
7、 编一上程序将1,2,3„„2N这2N个数排成一个圈,使每相邻数之和为素数。
第九章、顺序文
文
PASCAL语言的文件有几种,如:顺序文
12345
当我们把这几个字符读出赋给一个整数型变量时,值就是12345;而如果读给一个字符串型变量时,值就是‘12345’。
一、 文件名
和DOS文件一样,PASCAL语言的顺序文
二、文件说明:
说明一个顺序文
三、几个命令:
1、 ASSIGN(文
‘T1.TXT’);即把变量名F1定义为对应T1.TXT这个DOS文件。这样,我们在使用这个文件时,就可直接用F1这个变量来调用。
2、 RESET(文
文
3、 READ()/READLN():从已打开的文
为:T1.TXT,文件312
A AB CD
当我们RESET(F1)后,文件的指什定位在12这个数据前。如果我们顺序用以下语句,功能分别为:
READ(F1,A); {A的值为12,此时指针指在345前}
READLN(F1,B): {B的值为345,此时312虽然没有被读出,但因为用READLN
语句读数据,所有312将不被读出,而指针将换行,指向A}
READLN(F1,D,E,F); {一次把该行三个数据都读出,分别赋给D、E、F三个变量
(字符型),此时,指针已经指向文件结束位置}
4、 EOF();判断文件是否结束的函数。如:经过上述读取数据后,此时,EOF(F1)的值为TRUE。
5、 REWRITE(文件名变量):打开文
对应的文
6、 APPEND(文件名变量):打开文
应的文
PASCAL语言基础及基础训练 第 36 页 共 48页
被添加在此文件的后面。请大家注意上述两个语句的区别。
7、 WRITE(文件名变量,变量表)/WRITELN(文件名变量,变量表):往已经打开的数据文件
中写入新的数据。如:当REWRITE(F1)后,如果我们用了以下语句:
WRITE(F1,123);
WRITE(F1,456);
WRITELN(F1,‘ ’,789);
WRITELN(F1);
WRITELN(F1,‘A’,‘ ’,‘B’);
此时文件的 789
{注:此处为空行}
A B
请大家注意此文件的结果,为什么会这样,
8、 CLOSE(文件名变量):关闭文
文件,最后都必须用CLOSE语句来关闭文件。如:CLOSE(F1);关闭文件F1。
四、例题:
[例8、1]把1到100这100个数字写到一个文
Var I:integer;
F:text;
Begin
Assign(f,?answer.txt?);
Rewrite(f);
For I:=1 to 100 do writeln(f,I);
Close(f);
End.
[例8、2]把以下文
NUMBER.TXT
3 5 7 1
2 8 12 54 14 9
程序如下:
var f:text;
n:array[1..10] of integer;
I,j:integer;
begin
assign(f,?number.txt?);
reset(f);
read(f,n[1],n[2],n[3],n[4]);
readln(f);
readln(f,n[5],n[6],n[7],n[8],n[9],n[10]);
close(f);
{此处语句为排序数组N,大家自已加入};
rewrite(f);
for I:=1 to 10 do writeln(f,I);
close(f);
end.
第十章、调试PASCAL程序
调试运行PASCAL语言程序是非常重要的,往往编一个程序不困难,但如果程序出错,要
从中找出错误,使程序能正确运行,得出正确答案是很困难的。PASCAL语言提供了很强大
的调试功能,使我们能很方便的找出程序的错误。
36
PASCAL语言基础及基础训练 第 37 页 共 48页
一、 程序错误:
1、 编译错误:即语法错误。如:命令错写,少分号等等。此种错误在程序编译执行就能发现,
而把光标停留在错误行上,并显示出错误信息,由用户修改。
2、 运行错误:如果没有语法错误。则程序可以运行,但在运行过程中也有可能出现错误,如
程序结构不合理,打印语句错误等。此时,程序将中止运行,光标停留在错误语句处,并显示错误信息,等待用户修改。
3、 逻辑错误:如:程序递归出口设置不正确,逻辑判断设置错误,这样程序虽然能够正常运
行,但运行结果却不正确,这是用户最难发现有错误,也是最难查找的错误,此时计算机也无任何错误信息。
二、TURBO PASCAL的集成调试器
在TURBO PASCAL语言集成环境中,我们可以非常方便地调试程序。
1、 暂停(CTRL+BREAK):在程序运行过程中,我们可用CTRL+BREAK暂停程序的运行,此时集
成环境会在当前运行到的语句上设置一条光带,表示程序可继续运行。此时,如果要程序继续执行(接着刚刚中断的语句),可用CTRL+F9(即RUN功能)继续运行程序;如果不需程序继续运行,可用CTRL+F2清除光带,这样程序将不能被继续运行。
2、 跟踪(F7):菜单RUN|TRACE INTO功能能够逐步运行程序,即使在过程中也能爱步运行。
3、 跟踪(F8):菜单RUN|STEP功能能够使我们逐段运行程序,即子程序中的语句将不会逐步
执行。
4、 执行到光标处(F4):把光标移到要执行到的语句行,再用F4(菜单RUN|GOTO CRUSOR)可
让程序执行到该行暂停。
5、 断点:我们可用DEBUG|BREAKPOINT功能在光标处行设置程序断点,这样,当程序运行到这
里时将自动暂停。清除断点也用此功能。
6、 查看变量或表达式值(CTRL+F4):我们可以在程序未运行、运行暂停、运行结束后用此功
能查看变量或表达式的值。
7、 设置动态变量查看(CTRL+F7):我们可用此功能打开WATCH窗口,在此窗口中增加要查看
的变量,这样,我们在用F7或F8或在程序暂停时,就能在此窗口中看到要查看的变量的值。
8、 集成环境中的窗口操作:TURBO PASCAL语言是类似WINDOWS的,也可提供多窗口操作。如:
用F3功能打开一个文件,再用F3功能打开一个文件,这时,我们就打开了两个窗口。此
时,可用F6在各个窗口之间切换;用ALT+F3可把当前窗口关闭;用CTRL+F5可进入改变窗口大小、位置状态,此时,可用光标键上下左右移动当前窗口,也可用SHIFT+光标键来改变窗口大小。这样,我们就能在屏幕上同时看到文件窗口、WATCH窗口、OUTPUT窗口等。
9、 记录文件运行编译环境(CTRL+OO):因为PASCAL语言是在集成环境中来运行程序,而各台
计算机的集成环境设置有可能不同,这样就使得一个文件在一台机器上运行正常,而在另一台机器上运行不正常或不能运行。所以,我们一般都会在程序的第一行用CTRL+OO键来记录下当前的程序运行环境,这此在屏幕当前行会出现两行语句,都是用“{}”括住,以“$”引导,尤其是第二行是非常重要的,如:{$16384,0,655350};是指程序中允许最多打开16384个栈,这如果是在做一些搜索问题时是不够的,所以我们都会把它改成最大的数值:65520,请大家记住这个数值,这是PASCAL语言允许打开的最大栈数。
附录一 错误信息(略)
附录二、常用ASCII码表
37
PASCAL语言基础及基础训练 第 38 页 共 48页
附录三、TURBO PASCAL 7.0集成环境的主要菜单项
一、 FILE菜单
1、 OPEN(F3):装入一个已经存在于磁盘上的文件(也可以是非PASCAL源程序文件,如文本
文件)。
2、 NEW:新建一个文件,文件名为NONAME.PAS。 3、 SAVE(F2):当前编辑的文件存盘。
4、 SAVE AS„:把当前文件存成另外一个文件名。 5、 SAVE ALL:保存已经打开的所有文件。 6、 CHANGE DIR„:改变当前目录。 7、 PRINT:打印当前文件。
8、 PRINTER SETUP:打印机设置。
9、 DOS SHELL:DOS外壳,暂时退出集成环境,进入DOS环境,可用EXIT命令回到集成环境。 10、 EXIT(ALT+X):退出TURBO PASCAL语言集成环境。
二、EDIT菜单
1、 UNDO(ALT+BACKSPACE):取消刚才的操作。 2、 REDO:重复进行刚才的操作。 3、 CUT(SHIFT+DEL):把定义的块删除,存放到剪贴板中。(定义块:用鼠标拖曳或用SHIFT+
光标键)
4、 COPY(CTRL+INS):把定义的块拷贝到剪贴板中。 5、 PASTE(SHIFT+INS):把剪贴板中语句粘贴到当前光标位置。 6、 CLEAR(CRTL+DEL):把定义的块删除掉。 7、
SHOW CLEPBOARD:显示剪贴板中的语句。
三、SEARCH菜单
1、 FIND:寻找。
2、 REPLACE:寻找替换。
3、 SEARCH AGAIN:继续寻找。
4、 GO TO LINE NUMBER:到某个行号。
5、 SHOW LAST COMPILER:显示最后一次编译的错误。 6、 FIND ERROR:查找当
前文件的错误。
38
PASCAL语言基础及基础训练 第 39 页 共 48页
7、 FIND PROCEDURE:查找过程。
四、RUN菜单
1、 RUN(CTRL+F9):运行当前程序。
2、 STEP OVER(F8):逐句运行程序,但运行过程或函数时不逐句。
3、 TRANCE INTO(F7):逐句进行程序,运行。
4、 GO TO CURSOR(F4):运行到光标位置。
5、 PROGRAM RESET(CTRL+F2):重设当前程序运行指针。
6、 PARAMETERS:设置命令行参数。
五、COMPILE菜单
1、 COMPILE(ALT+F9):编译当前程序,但没有生成EXE文件。
2、 MAKE(F9):编译当前文件,是否生成EXE文件要看DESTINATION项的设置。
3、 BUILD:与MAKE基本相同。但BUILD会不论单元是否编译过都会重新编译。
4、 DESTINATION:编译目标,在此项上用回车键可在MEMORY与DISK之间切换,
为DISK时,
编译时会在磁盘上生成EXE文件。
5、 PROMARY FILE„:指定主文件,如果指定,编译时将先编译主文件,如果不指定,
编译时
只编译当前文件。
6、 CLEAR PRIMARY FILE:删除指定的主文件。
7、 INFORMATION:显示编译信息。
六、DEBUG菜单
1、 BREAKPOINTS„:断点删除、设置功能。
2、 CALL STACK(CTRL+F3):定位当前的栈。
3、 REGISTER WATCH:查看寄存器值。
4、 OUTPUT:查看输出。
5、 USER SCREEN(ALT+F5):查看输出屏幕。
6、 EVALUATE/MODIFY„(CTRL+F4):查看或修改程序运行中过程中的变量或表达式的值。
7、 ADD WATCH„(CTRL+F7):增加要查看的内存变量名。
8、 ADD BREAKPOINT„:增加断点。
七、TOOLS菜单
1、 OPTIONS菜单:
(1) COMPILER„:设置编译器选项。
RANGE CHECKING:设为ON时,编译时将检查所有数组、字符串和下标变
量的值是否越界。
STACK CHECHING:设为ON时,编译执行时将检查堆栈是否够用。
I/O CHECKING:设为ON时,将检查输入输出错误。
FORCE FAR CALLS:设为ON时,将允许远程调用。
OVERLAYS ALLOWED:设为ON时,允许覆盖一个单元。
ALIGN DATA:数据存放以字节对齐或是字对齐。
VAR-STRING CHECKING:设为ON时,则每当一个串被当作变量参数传递
时,TURBO PASCAL都将检查。
BOOLEAN EVALUATION:设置布尔表达式计算方式:完全(COMPLETE)和
短路(SHORT CIRCUIT)。
NUMERIC PROCESSING:设置数字协处理器。设为8087/80287时,可以利
用TURBO PASCAL支持的浮点运算的数据类型(SINGLE、DOUBLE、EXTENDED、
COMP);设为SOFTWARE时则只能用REAL类型。能否设为8087/80287要
视EMULATION的设置。
EMULATION:设为ON时,可以在上一设置中设置8087/80287来提高运算
精度与速度。
DEBUG INFORMATION:设为ON时,将产生单步调试的代码。
LOCAL SYMBOLS:设为ON时,允许用户检查局部符号。
39
PASCAL语言基础及基础训练 第 40 页 共 48页
CONDITIONAL DEFINES:定义编译指令。
(2) MEMORY SIZES:设置程序运行中允许使用的最大栈数,最小堆数与最大堆
数。即我们用CTRL+OO时得到的第一行配置。
(3) LINKER:设置链接选项菜单。
(4) DEBUGGER:设置调试菜单。
(5) DIRECTORIES:设置各种文件的搜索目录。
TURBO DIRECTORY:告诉PASCAL语言到哪个目录中寻找TURBO.HLP及
TURBO.TP文件。
EXE & TPU DIRECTORY:指定EXE、TPU、MAP文件的存放目录。
INCLUDE DIRECTORIES:指定包含文件的目录。
UNIT DIRECTORIES:指定单元目录。
OBJECT DIRECTORIES:指定外部OBJ文件的存放目录。
2、 TOOLS„:工具设置。
3、 ENVIONMENT:集成环境选项:
PREFERENCES:环境设置。
EDITOR:设置编辑器。
MOUSE:设置鼠标。
STARTUP:设置启动状态。
COLORS:设置环境颜色。
4、 OPEN:打开一个集成环境配置文件。
5、 SAVE TURBO.TP:把当前的设置存成TURBO.TP文件,即系统默认文件。
6、 SAVE AS:存成另起名的配置文件。
八、WINDOW菜单
1、 TILE,CASCADE:层叠或平铺已打开的窗口。
2、 CLOSE ALL:关闭所有的窗口。
3、 REFRESH DISPLAY:重新刷新显示。
4、 SIZE/MOVE(CTRL+F5):改变窗口大小(SHIFT+光标键)及移动窗口(光标键)。
5、 ZOOM(F5):把当前窗口最大化。
6、 NEXT(F6):切换到下一个窗口。
7、 PREVIOUS(SHIFT+F6):切换到上一窗口。
8、 CLOSE(ALT+F3):关闭当前窗口。
9、 LIST„(ALT+0):列出已经打开的窗口。
九、HELP菜单
大家用F1或SHIFT+F1可得到帮助。
信息学竞赛基础训练题
******一. 数值计算******
1.1. 找出100到999之间的整数中所有等于它每位数字立方和的数.
1.2. 求所有满足条件的四位数: (1)这四位数是11的倍数; (2)a,b,c,d均是小于10 的互不相等的自然数; (3)b+c=a; (4)bc是完全平方数.
1.3. 已知四位数3025有一个特殊性质: 它的前两位数字30和后两位数字25的和是 55, 而55的平方刚好等于该数(55*55=3025). 试编一程序打印所有具有这种性质的四位数.
1.4. 编程找出四个互不相等的自然数, 它们之中任意两数之和为偶数, 任意三数之和可以被3整除, 而且这四个数的和越小越好(已知它们的和不大于50).
1.5. 输入两城市之间的距离(单位为千米)及旅行的速度(单位为千米/小时)和从某一城市出发的时间,计算出到达另一城市的时间。其中输入的时间用1805表示18点05分,而输出的时间用18-5这种形式表示。
40
PASCAL语言基础及基础训练 第 41 页 共 48页
******二. 数字游戏******
2.1. 以不同的字母代表0--9之间的数字, 现有如下等式成立: a+bc+def=ghij,编程求出满
足上述条件等式的个数并将所有等式打印输出.
2.2. 下面的竖式表示, 图中的"*"号只能用素数2,3,5,7代替, 因此称为素数乘法竖式.(难度较大,放后)
* * *
× * *
---------------
* * * *
* * * *
----------------
* * * * *
编程找出此乘法竖式的所有可能方案.
2.3. 出售金鱼: 出售金鱼者决定将缸里的金鱼分五次全部卖出:
第一次卖出全部金鱼的一半加二分之一条;
第二次卖出剩余金鱼的三分之一加三分之一条;
第三次卖出剩余金鱼的四分之一加四分之一条;
第四次卖出剩余金鱼的五分之一加五分之一条;
现在还剩下11条金鱼一次卖出. 问缸里原来有多少条金鱼.
2.4. 一个四位数是一个完全平方数,减去一个每位数字都相同的四位数( 如 1111, 5555)后, 仍是一个完全平方数. 请编程打印出所有这样的四位数.
2.5. 将1,2,3,4,5,6,7,8,9这九个数字组成三个三位数, 使每个数都是完全平方数.
2.6. 如果一个数从左边读和从右边读都是同一个数, 就称为回文数. 例如: 686就是一个回文数. 编程找出所有既是回文数又是素数的三位数.
2.7. 有一个八位数12345679, 若它乘以9, 则得九位数111111111, 试求:
(1)当这个数乘以什么数时, 才能得到全部由5所组成的九位数?
(2)当这个数乘以什么数时, 才能得到全部由9所组成的九位数?
2.8. 把N个同学排成一排, 由前向后按1,2,1,2......报数, 报单数的走出队伍, 报双数的向前靠拢重新组成一排, 然后再1,2,1,2......报数, 报单数的走出队伍, 问剩下最后一个人时, 这个人原来在哪个位置.(N由键盘输入)
2.9. 李先生和他的孙子同出生于20世纪, 他的孙子与他的年龄之差为60岁, 李先生和他的孙子出生年份被3,4,5,6除, 余数分别为1,2,3,4. 编程求出李先生和他的孙子各出生在哪一年.
2.10、有N个人围坐在圆桌周围,座号依次为1„„N,从1号开始报数,数到M的人便退出,从下一个人起重新报数,数到M的人也退出,不断进行下去直到最后一个人退出,编程打印出依次退出的人的座号。(N、M由键盘输入)
2.11、五个好朋友聚在一起,第一个带了很多糖块送给大家,他使每人的糖块在原来基础上翻了一倍。接着第二个人也同样向每人发糖块,他也使每人的糖块翻了一倍。然后第三、第四、第五个人都一照此办理。奇怪的是经过这样互赠糖块之后,发现每个人的糖块都一样是32块,请问各个朋友原先各有多少块糖,
2.12、有N只猴子选大王,选举的办法是:排成一排,从头到尾报数,报到3的倍数(3、6、
9、„„)的退出去,直到全部报完,然后从尾到头开始逆向报数,同样报3的倍数的退出。第三遍又是从头到尾进行,第四遍又从尾到头,直到最后余下两只,以排在后面(按报数的顺序)的那只为猴王。请编程序找出猴王的位置。(N从键盘输入)
2.13.魔术师翻牌:魔术师把扑克中的13张黑桃预先排好后,牌面朝下放在手中。第一次
数一张牌,翻过来恰好是A,放在桌面上,第二次数两张牌,数1的那张放在手中牌的下面,数2的那张牌翻过来恰好是2,也放在桌面上,再数三张牌,顺次把数1、2的牌放在手中牌的下面,第三张牌翻过来恰好是3,仍然放在桌面上。这样继续做下去,直到手中的13张牌全部翻完为止,此时桌面上的牌的顺序恰好是:A,2,3,4,5,„„,J,Q,K。请编程序找出魔术师手中的那13张牌的原始顺序
2.14.编一程序,从键盘上输入整数a,b,c(-100<b,c<100,a>0)后,显示出式子ax2+bx+c分解为两个整式(所有项的系数都为整数)之积的结果,例如:
41
PASCAL语言基础及基础训练 第 42 页 共 48页
输入:2 -3 -2
输出:(2x+1)(x-2) 或 (x-2)(2x+1) (即显示一个式子即可)
如不能分解成题目要求的式子,就显示“NO”。
******三. 穷举法(枚举法)******
3.1. 一位妇女在河边洗碗. 邻居问:"家里来了多少个客人?", 她回答:" 每两个客人合用一个菜碗, 每三个客人合用一个汤碗, 每四个客人合用一个饭碗, 共用碗65个". 问共来了多少客人?
(一): 顺序列举:
3.1.1. 某个班有48个同学, 按1--48编号, 称为学号. 按学号顺序分为6个组, 每组 8人.请挑出所有学号是所在组号倍数的学生的学号.
3.1.2. 将1--6这六个自然数排成两行三列, 使每一行相邻的数右比左大, 每一列相邻的数下比上大. 编程找出所胡的排列方法.
3.1.3. 甲乙两个自然数的和, 差, 积, 商四个数加起来等于243, 求甲乙两数各是多少. 若他们的和, 差, 积, 商四个之积等于94221. 那么甲乙两数又各是多少?
3.1.4. 海滩上有一堆苹果是五只猴子的共同财产, 准备平均分配. 第一只猴子先到, 它见别的猴子迟迟不来, 就把苹果平均分成五堆, 把多余的一个丢到海里, 拿走了其中一堆.第二只猴子以及后面的猴子都照此办理, 把苹果分成五堆, 把多余的一个丢到海里, 并拿走一堆. 问原来至少有多少个苹果?
3.1.5. 有三位数很独特, 它们每位上的数字互不相同且都不大于7, 特别是十位数字正好是百位数字与个位数字之差, 求所有这样的三位数.
(二): 排列列举:
3.2.1. 举出所有用1,2,3这三个数字组成的, 且每位数字互不相同的三位数.
3.2.2. 从A,B,C三个字母中选出两个按先后顺序排在一起, 共有多少种排法.
3.2.3. 在航海中党挂出不同颜色的一组旗, 表示不同的信号. 今有红, 黄, 绿, 蓝四面旗, 任意取三面从上到下挂出, 共可表示多少种信号? 请全部列举.
3.2.4. 第一年把五件礼物发给五个孩子, 第二年又把同样的五件礼物发给这五个孩子 , 而每个孩子的礼品都与上一年的不同, 请找出所有的方案.
3.2.5. 若指纹只有斗和箕两种, 试找出右手含有大拇指和中指为斗的各种情况, 并统计种数.
3.2.6. 输入N个整数(可正可负)及一个整数M, 让计算机在这N个整数之间添加一对括号, 使它们的代数和等于M, 并打印这个等式, 若无相等可能, 则打印无解. 如, N=6, 六个数分
别是: 1,-2,-3,4,-5,6, M=9, 在输入以后, 计算机最后应打印: 1-(2-3+4-5)+6=9.
3.2.7. 用穷举法解八皇后问题: 在8*8的国际象棋棋盘上摆八个皇后, 使任两个皇后都不在同一行, 同一列及同一条对角线.
(三): 组合列举:
3.3.1. 有六位同学去照相, 每次照三个同学, 共可照出多少张不全相同的照片? 每张照片都是谁?
3.3.2. 某班挑出八名同学组成两个4×100米的接力队参加校运会, 这八名同学的百米成绩为: 12.25, 13.11, 12.45, 12.94, 12.48, 13.09, 12.34, 12.83.由于事先知道竞争对手的成绩不超过50.82秒. 问如何组队使本班稳拿第一, 二名? 打印所有方案及相应成绩.
3.3.3. 平面上有五个点, 任三点不在同一直线上, 连接每二个点的线段有多少条?
(四): 综 合:
* 3.4.1. 16/64是一个分子和分母都是两位数的真分数, 且分子的个位数与分母的十位数相同. 非常奇怪的是: 如果把该分数的分子的个位数和分母的十位数同时划去, 所得到的结果正好等于原分数约分后的结果. 例 16/64=1/4. 编程找出所有满足上述条件的真分数.
3.4.2. 公鸡每只值5文钱, 母鸡每只值3文钱, 小鸡3只值1文钱. 今用100 文钱买鸡共100只, 问公鸡, 母鸡, 小鸡各儿只.
3.4.3. 甲去买东西, 要负给乙19元, 而甲只有3元一张的钱, 乙只有5元一张的钱. 请 42
PASCAL语言基础及基础训练 第 43 页 共 48页
为他们设计一个交换方案.
3.4.4. 一米店有三箩米被盗去一部分, 其中左箩剩1合, 中箩剩14合, 右箩剩1合. 小偷甲说他用一马勺在左箩舀米, 每次舀满, 装到布袋. 小偷乙说他用一只木鞋在中箩偷. 小偷丙说他用一只漆碗在右箩中偷. 作案物经标定: 马勺一次舀19合, 木鞋一次舀17合, 漆碗一次舀12合. 问米店被偷走多少米? 甲乙丙各偷多少米?
3.4.5. 五户人家共用一口井, 如果用A家的绳2条, B家的绳1条接长, 正好抵达水面; 又用B家绳3条, C家绳1条; 或用C家绳4条, D家绳1条; 或用D家绳5条, E家绳1条; 或用E 家绳6条, A家绳1条接长, 也都一样正好抵达水面, 问井深和各家的绳子各长多少?( 不超过999的整数解).
3.4.6、有六箱货物,重分别是5吨、2吨、3.5吨、1.7吨、1吨、5.1吨。现有一台货车,载重量10吨。设计一个程序,使这次车运走的货物最多。
3.4.7、某电台组织一次智力竞赛,计划安排奖励30人。准备了50件奖品。得一等奖者可得3件,二等奖2件,三等奖1件。希望把所有奖品都发到获奖者手中。请找出所有方案(即各等奖各有多少人)。
******四. 数字问题******
4.1. 从键盘输入二个整数a, b(b<>0), 若a能被b整除, 就打印"YES", 否则打印"NO".
4.2. 从键盘输入一个整数, 如果是奇数就直接打印, 否则反复除以2, 直到商为奇数为止, 打印这个奇数商.
4.3. 从键盘输入一个小于1000的正整数, 若此数的各位数字之和能被7整除, 则打印, 否则不打印.
4.4. 求100以例如
13. 试找出所有这样的二位绝对素数.
4.10. 编程验证对任意自然数N, 如果各位数字平方和不是1, 则求平方和的各位数字的平方和, ......, 最后必有145, 42, 20, 4, 16, 37, 58, 89 之无穷循环.
4.11. 五位数 4H97H 能被3整除, 且它的最低二位数字所组成的数 7H 能被6整除, 求这个五位数字.
4.12. 975*935*972*( ), 在( )中填什么自然数使四个数的乘积末四位全为0, 求出最小值.
4.13. 修改31743的某一位上的数字, 使之成为823的倍数.
4.14. 一个自然数, 若它的质因数至少是两重的(相同的质因数至少个数为二个, 如36=2*2*3*3)则称该数为"漂亮数". 若相邻两个自然数都是"漂亮数", 就称它们为"孪生漂亮数". 例如8与9就是一对. 请编程再找出一对"孪生漂亮数".
4.15. 任意输入二个自然数, 若商为整数, 则直接显示商; 否则把商分解成一个自然数和一个正的既约真分数之和才显示. 例如: 输入: 9, 3 显示: 9/3=3
输入: 8, 6 显示: 8/6=1+1/3
4.16. 任意输入四个自然数a,b,c,d, 看成二个分数a/b, c/d. 求这二个分数之和. 和的显示格式为: 输入 3,2,1,6 输出: 3/2+1/6=1+2/3.
4.17. 在自然数中, 各位数字之和的11倍正好等于自身的自然数只有一个. 请找出这个自然数.
4.18. 求所有不超过1000的这样的整数, 它的平方的末二位数字相同但不为0.
4.19. P是一个大于3的质数, 对某个自然数N, PN恰好是五位数, 且至少有三个位上的数字相同, 求P至少是多少.
4.20. 编程求最小正整数M,N(0<N<M)为何值时, 1989m与1989n的最后三位数字相同.
4.21. 验证下面结论: 一个各位数字不同且都不为0的N位数X(3<=N<=5), 将组成该数的各位数字重新排列成一个最大数和一个最小数作减法, 其差值再重复前述运算, 若干次后必出现一 43
PASCAL语言基础及基础训练 第 44 页 共 48页
个N位数Y, 使之重复出现. 例如: X=213, 则有213?321-123=198
981-189=892
982-289=693
963-369=594
954-459=495
954-459=495
这时Y=954. (注意:重复不仅仅是与上一次的数相同,也可能是出现成段的多个数反复重复)
4.22、编程序进行高精度的整数加、减、乘、除、乘方运算。如:一个100位整数加上一个150位整数,或一个数十位整数乘以一个数十位整数。
114.23、计算: 1,1,1, ,......,11*21*2*31*2*3*...*20
4.24、小明的妈妈是负责分发全厂工资的。为使分发时有足够多的零钞,同时又尽量不使每个人领到的钱太零碎。每个月她都要计算出各种面值的钞票(100元、50元、10元、5元、2元、1元,假设每个人的工资都是整数元)各需要多少张。你能否为她设计一个程序,从键盘输入10个人的工资,再计算出各种面值的钞票各需要多少张,
******五. 逻辑判断******
5.1. 编一程序实现人和计算机玩"石头, 剪子, 布"这个猜拳游戏. 计算机用随机方法出拳, 人的则由键盘输入. 谁先胜三盘就算谁赢.
5.2. 编一程序, 从键盘输入三角形的三条边, 然后进行判断. 打印出是否能构面三角形, 是否是等腰三角形, 是否是等边三角形, 是否是直角三角形.
5.3. 警察抓住了A,B,C,D四名偷窃嫌疑犯, 其中只有一人是小偷. 审问中A说:" 我不是小偷", B说:"C是小偷", C说:"小偷肯定是D", D说:"C在冤枉人". 现在已经知道四个人中有三个人说的是真话, 一人说的是假话, 问到底谁是小偷.
5.4. 有红, 蓝, 黄, 白, 紫色的珠子分别包在5个包里. 甲说: 第二包里是紫珠子, 第四包里是黄珠子.乙说: 第一包里是红珠子, 第五包里是白珠子. 丙说: 第三包里是白珠子, 第四包里是蓝珠子.丁说: 第二包里是黄珠子, 第五包里是紫珠子.
每人都说对一句话, 说错一句话. 各包里的珠子是什么颜色的?
5.5. 一次考试后, 分获数学, 物理, 化学, 和外语第一名的考生一起猜测考试结果. 甲说: 丁获得外语第一.
乙说: 丙会获得物理第一.
丙说: 甲的数学成绩不会超过第三名.
丁说: 没有人的化学成绩能超过乙.
公布结果后发现: 只有获得数学, 外语第一的两人猜对了. 请编程求出他们各获哪科 第一.
5.6. 在一次国际会议上, 甲, 乙, 丙, 丁四人在一个会议小组中讨论, 交谈时发生了语言障碍. 在中, 英, 法, 日四种语言中, 每人只会两种, 可惜选不出一种大家都会的语言. 于是交谈时可有趣了:
(1) 只有一种语言有三个人会;
(2) 甲会日语, 丁不会日语, 但能互相交谈;
(3) 乙不会英语, 但甲和丙交谈时, 却要请他当翻译;
(4) 乙, 丙, 丁三人想互相交谈, 却找不到三人都会的语言.
(5) 没有人能既用日语, 又用法语交谈.
请问: 甲, 乙, 丙, 丁各会什么语言.
5.7. 有一块金属, 三个人对他进行判断:
甲说: 它不是铁, 也不是钢;
乙说: 它不是铁, 而是锌;
丙说: 它不是锌, 而是铁.
如果有一个人完全说错了, 一个人全说对了, 一个人对一句, 错一句. 请你判断这块金属到底是什么?
5.8. 三人对比赛名次进行预测:
甲说: A得第一, B得第三;
乙说: C得第一, D得第四;
44
PASCAL语言基础及基础训练 第 45 页 共 48页
丙说: D得第一, B得第三.
每人都说对一半, 请你排出四人的名次.
5.9. A,B,C,D,E五人为竞赛前五名, 他们在名次公布前猜名次.
A说: B得第三, C得第五;
B说: D得第二, E得第四;
C说: B得第一, E得第四;
D说: C得第一, B得第二;
E说: D得第二, A得第三.
每个人都猜对一半, 实际名次是什么?
5.10. 四名专家分析4口油井:
甲说: 2号井是最好的;
乙说: 4号井是最好的;
丙说: 3号井不是最佳油井;
丁说: 乙说错了.
四口井中只有一口是最佳油井, 一名专家说对了, 请你分析哪口井是最佳油井, 哪位专家
说对了.
5.11. 张, 李, 王三人比体重. 每人说了两句话, 但体重越轻的人讲对的话越多. 张
说: 李比我重, 王和我一样重.
李说: 张比我重, 也比王重.
王说: 我比李重, 李比张重.
请按体重由高到低顺序打印出三人的姓.
5.12. 刘, 马, 张三家每家有一个孩子, 名字是小芳(女), 小青(女), 小龙(男). 三家的妈妈
是赵林, 李君和方华. 还知道:
老刘和李君的孩子都是女儿;
老马的女儿不是小青;
老张和方华不是一家;
请问三家的成员各是谁?
5.13、四大湖问题:上地理课时,四个学生回答我国四大淡水湖的大小时说:
A:洞庭湖最大,洪泽湖最小,潘阳湖第三;
B:洪泽湖最大,洞庭湖最小,潘阳湖第二,太湖第三;
C:洪泽湖最小,洞庭湖第三;
D:潘阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三。
对于每个湖的大小,每人仅答对一个。请编程判断四个湖的大小顺序。
5.14、某侦察队长接到一项紧急任务,要他在代号为A、B、C、D、E、F的六个队员中选
出若干人去侦破一件案子。人选的配备必须尊照下列各点:
(1)A、B两人中至少去一人;
(2)A、D不能一起去;
(3)A、E、F三人中要派两人去;
(4)B、C两人都去或都不去;
(5)C、D两人中去一人;
(6)若D不去,则E也不去。
请问应该让哪些人去,
5.15、白帽子和红帽子问题:厅内有五人,他们均戴着帽子—白帽子或红帽子。已知戴白
帽子的说真话,戴红帽子的说假话,请从他们各自提供的线索辨别谁戴白帽子谁戴红帽子。
甲:我看见一个戴白帽子的;
乙:我没有看见戴红帽子的;
丙:我看见一个戴白帽子的,但不是甲;
丁:我没有看见戴白帽子的。
戊:我的话和丙的一样。
******六. 随机模拟与概率问题******
6.1. 小学生四则运算练习程序
45
PASCAL语言基础及基础训练 第 46 页 共 48页
练习时先由练习者选择题目难度, 1表示一位数计算题, 2表示二位数计算题. 选择好难度后, 计算机显示出10道题目, 每道题的数据和运算种类都是随机的. 每显示一道题, 练习者从键盘输入一个答案, 答对了加10分, 答错了不加分.10 道题全答完由计算机给出成绩.
6.2. 有一个程序, 它的处理对象是一个10*10的二维数组A, 这个数组中的元素有以下特点:
(1)数组中每行中非0元素至少是一个, 最多也不超过5个.
(2)数组中的非0元素都是100以 (I=1,2,3......10)
(4)数组元素构成主对角线的对称阵, 即 A(I,J)=A(J,I) (I,J=1,2,....10) 编一个程序, 用来产生上述的二维数组.
6.3. 口袋里放着手感相同的3个红球, 4个白球, 随机摸出3个, 问拿出的3 个球颜色相同的概率是多少?
6.4. 随机产生100个人的成绩, 满分100分,试统计出每十分成绩段有多少个同学.
6.5. 新年晚会上, 50个同学带50份礼物放在一起, 编上号, 再由50个同学随机拿, 问没有同学拿到自己的礼物的概率有多大?
6.6. 有三个人每人同时掷三个骰子, 试模拟这个过程, 直到有两个人的点数相同为止.
6.7. 从5双不同的鞋子中拿四只, 问其中有一双的概率多大?
6.8. 两个赌徒每人拿出1000元进行赌博, 约定打扑克定输赢, 谁先胜11盘, 谁就算赢, 可拿走全部赌资. 两个刚打到比分为4:6时就不能继续打下去了, 必须中断赌博. B 胜6盘, 他认为应拿走全部赌资的6/10, A认为没结束就不能定输赢, 如果赌下去, A离胜11盘还差7盘, B还差5盘, 所以赌资应按5:7分配. 你认为应如何分配才算合理.
6.9. 飞机上有三个部位相对薄弱, 若第一部分被击中一弹, 或第二部分被击中两弹, 或第三部分被击中三弹就会被击落. 但命中概率与每一部分的面积成正比, 已知三部分的面积各占10%, 20%, 30%. 若飞机被击中两弹, 飞机被击落的可能性多大?
6.10、口袋里放着M个红球,N个白球,这M+N个球的大小、手感相同,随机摸出K个球,问这K个球颜色相同的概率是多少,(M、N、K由键盘输入)
******七. 分类(排序)******
7.1. 编程用双数组法排序.
7.2. 编程用冒泡法排序.
7.3. 编程用穿梭法排序.
7.4. 编程用交换法排序.
7.5、某车间加工10件工件。每种工件必须先由甲工序加工后再由乙工序加工。请写一个程序安排好此10件工件的加工次序,以便能用最少时间完成这批工作,并计算出最少时间。此10件工
满的时间也不全一样。该油库有两个一样的龙头。应如何安排各车的装油顺序才能使所用时间最少,最少时间是多少,
,现在如果要把所有钢管焊成一整根,而所花时间要最短,请问应按什么顺序来焊接。(钢管根数及长度由键盘输入)。
7.8、设有五件物品重量分别为8、16、21、17、12,它们的价值分别是8、14、16、11、7。背包装入的物品总重量不超过37,问应装哪几种物品使总价值最大。
7.9. 输入若干个正整数N(0<N<3000),然后输出:
(1) 其中的最大数及其出现的次数;
46
PASCAL语言基础及基础训练 第 47 页 共 48页
(2) 这个整数序列中长度最长的连续严格递增子序列,如有多个,应一一列出。
例:从键盘依次输入下列数据:
2344 888 2999 1234 765 888 1 345 1999 67 999 2999 2344 99 99
输出:(1)最大数:2999 次数:2
(2)最长的连续子序列有2 个:
1 345 1999
67 999 2999
******八. 关于字符及字符串******
要求: 1. 熟悉ASCII码;
2. 熟悉关于字符串的函数及过程: COPY(STRING, N, M)函数;
DELETE(STRING, N, M)过程; LENGTH(STRING)函数;
POS(STRING1, STRING2)函数; STR(S, STRING)过程;
VAL(STRING,S,CODE)过程; ORD(STRING)函数等等;
8.1. 从键盘输入一个字符串, 打印出其所有子串.
8.2. 三位数学系的大学生走在马路上, 发现一辆汽车违反交通规则后逃走了. 他们没有记下汽车的号码, 不过每个人都注意到了这是个四位数. 甲记得这个汽车号码的前二位数字相同, 乙记得后两位数字相同, 丙记得整个四位数恰好是一个完全平方数. 请问这个号码是什么?
8.3. 打印如下图形:
(1) 1 (2) 1111111 (3) 1 (4) 4444444
111 11111 222 33333
11111 111 33333 222
1111111 1 4444444 1
(5)1 1 (6) * (7) * (8) *******
22 22 * * *** *** ***
333 333 * * ***** ** **
4444 4444 * * * * * *
555555555 * * ** ** ** **
* * *** *** *** ***
* *******
(9) 1 2 3 4 5 6 7 (10) 1 2 4 7 11 16 22 (11) 1
8 9 10 11 12 13 3 5 8 12 17 23 121
14 15 16 17 18 6 9 13 18 24 12321
19 20 21 22 10 14 19 25 1234321
23 24 25 15 20 26 12321
26 27 21 27 121
28 28 1
(12) 1 (13) 1 2 3 4 5 (14) 1
212 16 17 18 19 6 6 2
32123 15 24 25 20 7 10 7 3
4321234 14 23 22 21 8 13 11 8 4
32123 13 12 11 10 9 15 14 12 9 5
212
1
(15) 1 0 2 0 3 0 4 (16) 0 (17)1 2 4 7 1 6 2
1 0 2 0 3 1 2 3 5 8 2 7 3
1 0 2 3 4 5 6 9 3 8 4
1 6 7 8 9 0 4 9 5
-1 0-2 A B C D E 5 0 6
-1 0-2 0-3 F G H I J K 1 7
-1 0-2 0-3 0-4 L M N O P Q R 8
47
PASCAL语言基础及基础训练 第 48 页 共 48页
S T U V W X Y Z
(18)1 3 6 0 5 1 8
2 5 9 4 0 7 4
4 8 3 9 6 3 9
7 2 8 5 2 8 3
1 7 4 1 7 2 6
6 3 0 6 1 5 8
2 9 5 0 4 7 9
(19) 4(输出自然数M和N,造一个M N的沿斜线方向摆放的数字阵,具体式样见下例:
如果输入M=3,N=5时,则输出的数字阵如下:
1 2 6 7 12
3 5 8 11 13
4 9 10 14 15
如果输入M=7,N=4时,则输出的数字阵如下:
1 2 6 7
3 5 8 14
4 9 13 15
10 12 16 22
11 17 21 23
18 20 24 27
19 25 26 28
(20)打印N行的以下图形,N由键盘输入,如N=4时:
1
9 2
8 10 3
7 6 5 4
******九. 数制转换******
9.1. 编程实现2, 8, 10, 16进制数值之间相互转换.
48