PASCAL语言基础总成含题目
更新时间:2024-05-02 18:31:01 阅读量: 综合文库 文档下载
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语言来编辑出程序,编译后再运行(可以作为一个过程),这样才能得到答案。
FREE PASCAL提供了一个功能非常强大的集成环境,我们可以利用它来完成上述所有过程。进入这个环境的方法很多,可以根据实际情况自己进入。进入集成环境后屏幕上显示如下: File Edit Search Run Compile Debug Tools Options Window Help 菜单区 程序编辑区
1
PASCAL语言基础及基础训练 第 2 页 共 48页
F1 Help F3 Open ALT F9 Compile F9 Make ALT F10 Local Menu 功能键区 用键盘选择菜单的方法是:按F10,激活菜单后,用光标键来选择;或是直接用ALT健加菜单的第一字母,如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键而直接输入文件名即可。
七、 练习
在集成环境中输入以下程序,程序的作用是计算圆的面积,圆的半径由用户从键盘输入,编辑运行正确后请存盘:
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. 运行举例:
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语言的数据类型很多,最常用的有以下几种: 一、 整数类型(没有小数部分) 计算机存储数据时,1INTEGER:取值范围[-32768,32767]。占用内存2个字节(16位)。 个字节等于8位,即:WORD:取值范围[0,65535]。占用内存2个字节(16位)。 1BYTE=8BIT。 BYTE:取值范围[0,255]。占用内存1个字节(8位)。
LONGINT:取值范围[-2147483648,2147483647]。占用内存4个字节(32位)。 SHORTINT:取值范围[-128,127]。占用内存1个字节(8位)。 二、 实数类型
REAL:取值范围[2.9E-39,1.7E+38]。占用内存6个字节(48位)。
实数的表示法有两种:1、直接表示,如:-0.4576, 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’。‘ ’,?? ,?123456.3? 0~255 如果一个常/变量只要用到1个字符,则可把它定义成CHAR型;如果是多个字符,但不知确切多少个,则定义成STRING型,如果知道确切有N个字符,则定义成STRING[N]型,例如STRING[5],则表示定义的这个字符串变量由5个字符组成。字符串在PASCAL中使用都是加上单引号。 四、 布尔型
BOOLEAN:布尔型即为逻辑型,取值为TRUE、FALSE, 即真、假。 3>4 false;
write(5>3) true; 5=4 false; 5=5 true; 5>=4 true 5<=3 false; 5<>3 true; ?a?=?a? true ?a?>?b? false; ?b?>?bc? false ?c?>?bbb? true; ?caa?>?cabc? false;
第三节、常量、变量、标准函数和表达式
一、 常量和变量
常量:程序运行过程中,其值不会改变的量,称为常量。在程序头部中说明,以CONST引导。 变量:程序运行过程中,其值可改变的量,称为变量。在程序头部中加以说明,以VAR引导。 如,在[例2、1]中说明的常量PI,变量S、R。 二、 标准函数
PASCAL语言提供数量非常大的标准函数供我们使用,这些函数有些可以直接调用,有些放在另外的单元(UNIT)中。PASCAL也提供了大量的标准过程,和标准函数一样供用户直接或间接调用。
如果一个函数或过程不在SYSTEM(即默认调用的单元)中,而在其它单元中话,即在程序头部的第一行正式行中加上USES 单元名;如,如果要使用CLRSCR(清屏过程,在CRT单元中)的话,
4
PASCAL语言基础及基础训练 第 5 页 共 48页
就必须在程序头部加上:USES CRT;
函数的调用:如:A:=ABS(-34),即把-34的绝对值赋给变量A;(注意:函数只能出现在表达式中,即赋值语句中)。此时:A的数据类型与括号中的参数-34是一致的。函数的语法中都会说明,这个函数的参数的类型及这个函数的值(结果)的类型。
过程的调用:过程即命令,如:CLRACR; 程序运行结果是清屏。 常用标准函数与过程很多,这里只列出最常用的几个。 标准函数 函数名 语法 说明 Abs Chr Copy Cos Exp Int Length Ln odd ord random round sin sqrt sqr trunc 过程名 Delay (CRT单元) Delete Exit Gotoxy (CRT单元) halt nosound Sound (CRT单元) str val Abs(r:real/integer):real/integer 返回参数R的绝对值,类型与参数相同 chr(i:integer):char 返回参数所对应的ASCII码值,类型为CHAR Copy(s:string;n,m:integer):string 返回字串S的第N个字符开始的M个字符 Cos(r:real):real 返回参数R的余弦值 Exp(r:real):real 返回参数R的以e为底的幂 Int(r:real):real 返回参数R的整数部分,返回的值是实数类型 Length(s:string):integer 返回字串S的长度 Ln(r:real):real 返回参数R的自然对数 Odd(I:integer):boolean 判断参数I是否奇数,如是,则返回TRUE Ord(s:scalar):integer 返回任意有序量的序值 Random 返回0至于间的任意一个小数(随机数) Round(r:real):longint 返回参数R的四舍五入取整值 Sin(r:real):real 返回参数R的正弦值 sqrt(r:real):real 返回参数R的平方根 Sqr(r) 返回参数R的平方值,结果类型与R的类型相同 Trunc(r:real):integer 返回参数R的整数部分,返回的值是整数类型 标准过程 语法 说明 Delay(ms:word) 延迟发声MS毫秒 Delete(s:string;n,m:integer) Exit Gotoxy(x,y:integer) Halt Nosound Sound(f:word) 把串S中的第N个字符开始的M个字符删除 从当前执行的程序中退出 把光标定位到第X列Y行处 中断程序的运行 关闭机器喇叭 让机器喇叭发出频率为F的声音,直到nosound Str(I:integer;var s:string) 把数值I转换为字符串S Val(s:string;var r:real;var c:word) 把字符串S转换为数值R,并返回错误代码C 三、 表达式
由算术运算符(+,—,*,/)及数字、常量、变量、标准函数所组成的式子中心表达式。 如: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表达式中的分子与分母应该用括号括开;
5
PASCAL语言基础及基础训练 第 11 页 共 48页
值(BOOLEAN型),所有布尔运算也是表达式,可以赋给一个变量,也可以直接用输出语句输出。打印输出时,屏幕上就显示“false”或“true”。
第二节、条件语句
条件语句是用一个布尔表达式的值来决定程序的走向。即程序提供一个分支,由布尔表达式的值来决定程序究竞运行哪个分支。即程序已经不是顺序结构了,而是提供了一个分支结构。每次只可能运行其中的一个分支。如下图所示:
条件语句有两种格式:
1、if <布尔表达式> then <语句>;
2、if <布尔表达式> then <语句1> else <语句2>;
格式1的作用是:如果布尔表达式值为TRUE(即该条件满足),则运行语句,否则不运行任何语句。
格式2的作用是:如果布尔表达式值为TRUE(即该条件满足),由运行语句1,否则(即布尔值为FALSE,亦即条件不满足)就运行语句2。注意:只有条件语句结束时才有分号。
注意:如果条件语句中的分支语句不止一句,可用“begin……end;”来框住,加以区别。如:以下两个程序都为从键盘输入1个整数,打印出它的算术平方根。[例4、2]: Program q421; Var a:integer; Begin Readln(a); If (a<0) then Begin Writeln(?WRONG!?); End else Begin Writeln(a); Writeln(sqrt(a):8:2); End; End. Program q421; Var a:integer; Begin Readln(a); If (a<0) then Writeln(?WRONG!?) else Writeln(sqrt(a):8:2); End. FALSE 布尔表达式 TRUE 语句序列1 语句序列2 条件语句的嵌套:条件语句是可以嵌套的,例如: if a>0 then if a>1 then …… else …… else ….;
上述语句看起来无法理解,但如果我们把它改写为以下形式时,就一目了然了: if a>0 then begin if a>1 then begin …… end
else begin ……
11
PASCAL语言基础及基础训练 第 12 页 共 48页
end else begin …… end;
也就是说,第二个IF语句只是第一个IF语句中的一部分,即嵌入的一个IF语句。
例:输入一个年份,判断它是否闰年。我们知道,每四年中有一年是闰年,即有366天,而其余三年是平年,只有365天,而按照规定:1、如果哪一年的年份能被4整除,则该年一般为闰年;2、这样,每100年又会少一天,所以又规定如果该年能被4整除,又能被100整除,则认为该年不是闰年,而是平年;3、这样,每400年又会多出一天,所以又规定,如果哪一年能被400整除,则该年又是闰年。
由上可知:1980,1996,1984年均为闰年,1900年为平年,而2000年为闰年。 程序如下:[例4、3] Program q43; Var y:integer; Begin Readln(y); if (y mod 4=0) then begin if (y mod 100=0) then begin if (y mod 400=0) then begin writeln('run'); end else begin writeln('ping'); end; end else begin writeln('run'); end; end else begin writeln('ping'); end; end.
第三节、多分支语句
IF语句只能使程序有两个分支,当遇到需要有两个以上分支时,IF语句就很不适用了,这时我们可以用CASE语句,它能使程序有很多个分支。其效果如下图: 其格式为:
case 表达式 语句序列1 语句序列2 语句序列N ?? CASE 表达式 OF 常量1:语句序列1;
12
PASCAL语言基础及基础训练 第 13 页 共 48页
常量2:语句序列2; ??
常量N:语句序列N; else 语句序列N+1; END;
其中语句序列如果只有一句,可直接写在常量后的冒号后;如果语句序列有很多句,则应该用BEGIN??END加以框住。
CASE语句的作用是,根据表达式,表达式可以有多个值,分别对应于常量1、2等值时,就运行该常量后所对应的语句。
例:输入1到7之间的某个整数,打印出其对应的星期的英语名:[例4、4]: 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是C,69-60是D,59-0是E。[例4、5]; Program q44; Var s:integer; G:char; Begin Write(?Input the score:?); Readln(s); Case s div 10 of 用S DIV 10这个表达式作条件; 10,9:g:=?A?; 当 S DIV 10等于10或9时,表示S是90至于100之 8:g:=?B?; 间的值 7:g:=?C?; 6:g:=?D?; else g:=?E?; end; writeln(s,? ?,g); end.
第四节、标号说明及转移语句
此节不用掌握
在几乎所有语言中,都有GOTO(转移)语句,其作用是当程序运行到该句时,自动转移到其指定的标号(行号)语句去执行。
说明语法:LABEL 标号; 如:LABEL 10,20;
13
PASCAL语言基础及基础训练 第 14 页 共 48页
转移语句用法:GOTO 标号; 例:[例4、5]: program q45; label 10; begin 10:
write(?*?); goto 10; end.
运行上述程序时,程序将在屏幕不停地打印出“*”,而不会停止,必须由用户按下CTRL+BREAK才能中断。
练习
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字符串中的第一个字符转换为数值A,同时输出了一个错误代码C(其实对我们是没有用的)。 Var a,b,d:real; C:word; S:string[3]; 把S定义成三个字符的字符串; Begin Readln(s); Val(s[1],a,c); 把S串中的第一个字符转换为数值; ; 把S串中的第三个字符转换为数值; Case s[2] of 用S串中的第二个字符作为条件表达式; ?+?:d:=a+b; ?-?:d:=a-b; ?*?: ; ?/?:d:=a/b; end; writeln(s,?=?, ); end.
第六章、重复结构
重复结构就是循环结构,是指某些语句需要重复执行而设定的程序结构。在PASCAL语言中,共有三种重复结构语句,功能各有不同。
14
PASCAL语言基础及基础训练 第 15 页 共 48页
第一节、直到语句
直到循环语句的语法格式是: repeat
语句序列;(循环体) until 布尔表达式;
其作用是:重复执行语句序列(循环体),直到布尔表达式的值为TRUE为止。即,当执行完一次语句序列后,布尔表达式的值已经为TRUE了,这时循环将不会再被执行,而转向执行UNTIL语句以下的语句。
例:计算M=1+2+3+4+??,直到M的值大于5050为止。[例:5、1] var m,I:integer; 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。 例:计算12![例5、2] var I:integer; x:longint; begin I:=0; X:=1; Repeat I:=I+1; X:=x*I; Until I=12; Writeln(x); End.
当程序开始时,I的初值被定为0,X的初值被定为1(累乘器)。然而开始进入循环,每次I的值比原来增加1,然后再乘进X中去,直到I等于12时,最后一次把I乘进X后,这时I=12这个条件已经满足(I=12的值已经为TRUE),所以循环就被退出,而程序转向执行UNTIL以后的语句:WRITELN(X);。
请大家想一想,为什么X要定义为LONGINT型。
第二节、当语句
当语句的语法格式是:
15
PASCAL语言基础及基础训练 第 21 页 共 48页
编程求需要各种马多少匹?
5、 有三种纪念邮票,第一种每套一张售价2元,第二种每套一张售价4元,第三种每套9张
售价2元。现用100元买了100张邮票,问这三种邮票各买几张? 6、 赵、钱、孙、李、周五人围着一张圆桌吃饭。饭后,周回忆说:“吃饭时,赵坐在钱旁边,
钱的左边是孙或李”;李回忆说:“钱坐在孙左边,我挨着孙坐”。结果他们一句也没有说对。请问,他们在怎样坐的?
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倍,试编程找出满足条件的最小正整数。
21
PASCAL语言基础及基础训练 第 22 页 共 48页
18、某本书的页码从1开始,小明算了算,总共出现了202个数1,试编程求这本书一共有多少页?
19、从键盘上输入两个不超过32767的整数,试编程序用竖式加法形式显示计算结果。 例如: 输入 123, 85 显示: 123 + 85 --------- 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、 冒泡法:这是最常用的一种排序方法,其实质是:先把数据存放在数组中,然后从第一个
开始,分别与其后所有数据进行比较,如果第一个比其后某个数据小,则交换它们的值,一直到第一个与其后所有数据比较完,这时第一个数据就是最大的一个;然后再把第二个数据再与其后数据进行比较,比较完后,第二个数据则为第二大的,这样直到倒数第二个数据比较完后,整个数组就已经按从大到小的顺序排列了。其作用示意如下:
假设我们已经把6个数据分别存放在N[1]至N[6]中,其值分别为:3,1,5,9,2,6。 交换前的值为: 3,1,5,9,2,6 第一步,把第一个值与其后第一个进行比较,这时3>1,所以值不变: 3,1,5,9,2,6 第二步:把第一个值与其后第二个进行比较,这时3<5,所以值交换: 5,1,3,9,2,6
22
PASCAL语言基础及基础训练 第 23 页 共 48页
第三步:把第一个值与其后第三个进行比较,这时5<9,所以值交换: 9,1,3,5,2,6 ?? ?? 当第一个值与其后所有值比较完后,第一个值已经是最大的,数组值9,1,3,5,2,6 为: 这时,重复上述第一步的操作,只是把第一个值换成第二个值,第一9,3,1,5,2,6 个值即第二个值与其后第一个值进行比较,这时1<3,所以交换其值: 第二个值与其后所有值比较完后,数组值为: 9,6,1,3,2,5 再重复进行第三个值与其后值的比较,直到第五个值与第六个值比较9,6,5,3,2,1 完后,这时数组的值已经变为: 至此,数组已经按从大到小的顺序排好了。 程序如下 :[例6、1] Var n:array[1..10] of integer; 说明一个数组型变量 I,j,t:integer; Begin For I:=1 to 10 do Readln(n[I]); 从键盘读入10个数据存放在数组N中 For I:=1 to 9 do begin 参加比较的第一个数据为第1至第9个。 For j:=I+1 to 10 do begin 第二个数据为第一个数据之后所有的数据 If n[I] 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个英语字母等。集合也象常/变量一样有自己的名字,即集合名,它是在程序头部象定义变量一样来定义的。 23 PASCAL语言基础及基础训练 第 24 页 共 48页 定义集合: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赋值成四 个元素。 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; 24 PASCAL语言基础及基础训练 第 25 页 共 48页 3、 函数:PRED()、SUCC()、ORD()。因为枚举类型是有序的,所以可以使用上述三个和序 数有关的函数。如: A、 SUCC(FRIDAY)的值为SATURDAY;即FRIDAY之后的一个值。 B、 PRED(YELLOW)的值为GREEN。即YELLOW之前的一个值。 C、 ORD(BLUE)的值为2;即BLUE在其对应的枚举类型中排在第二位。 二、子界类型 子界类型也是自定义数据类型中的一种。在上一节的枚举类型中我们知道,枚举类型是把一种数据类型所有的值都列举出来。而当需要自定义的类型是一序列连续的数据,并且数量很大时,枚举类型就不适合了,这时,我们就会采用子界类型。子界类型,顾名思义,就是当数据是连续的时,可以指定其上界及下界来定义。定义方法与枚举类型相似。 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); 25 PASCAL语言基础及基础训练 第 26 页 共 48页 S[I].sum:=s[I].chinese+s[I].mathe; S[I].average:=s[i].sum/2 End; ???? {如果程序要求打印或排序,只需在此增加这些功能语句} end. 第四节、字符串 在PASCAL语言中,字符串的处理是非常方便的,在定义字符串时,我们不仅可以定义成CHAR型(单个字符);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); 26 PASCAL语言基础及基础训练 第 27 页 共 48页 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]; write(s:6); end; end. 上述两个程序,哪个快,哪个慢? 第八章、自定义函数和过程 PASCAL语言提供了大量的标准函数及标准过程供我们直接使用,但有时我们也会用到非标准的函数或过程,尤其是在做递归、回溯、搜索问题时,使用PASCAL语言的自定义函数、过程功能,与BASIC相比,能帮我们节省至少一半以上的时间。同样一个搜索问题,用BASIC语言如果要2个小时编出程序,用PASCAL语言就可能不要1个小时。 第一节、自定义函数 自定义函数也是在程序头部说明,其本身就相当于一个小程序,也有其头部及主体。语法如下: FUNCTION 函数名(形式参数表):函数值的数据类型; 函数的头部(常/变量说明); BEGIN 函数语句;(其中一定要有一句对函数名的赋值) END; {注意:这里是分号} 以上整个部分都位于程序的头部。自定义函数由“FUNCTION”引导,名称自定,形式参数表是指一个函数要求输入的参数(如:ABS(3.12),括号中的3.12就是形式参数),而每一个函数都是得到具体的值,所以也必须要说明该函数的值(即结果)的数据类型。 函数定义好后,就可在程序中调用,调用时和调用标准函数方法一样,都是把函数作为表达式或表达式中的一部分,放在赋值语句中或直接放在输出语句中。 [例7、1]编一程序,求两个自然数的最大公约数。 Var n,m:integer; 说明程序主体中的两个变量M,N Function num(a,b:integer):integer; 定义一个函数NUM,要求输入两个形式参数,值Var c:integer; 为整数 Begin 说明只在函数中用到的变量C If a>b then c:=b else c:=a; 函数主体开始 C:=c+1; Repeat C:=c-1; Until (a mod c=0) and (b mod c=0); Num:=c; End; 在函数语句中必不可少的一句:对函数名赋值 Begin 函数结束 Write(?please input 2 numbers:?); 程序主体开始 Readln(m,n); Writeln(num(m,n)); 27 PASCAL语言基础及基础训练 第 28 页 共 48页 End. 在WRITELN语句中调用NUM函数 程序主体结束 在上述程序头部,定义了一个名为NUM的函数,所以在程序主体中,我们就可以随时调用它了。但一定要注意:在函数程序语句中一定要对函数名赋值,否则,该函数是无效的。另外:输入的数值的类型一定要和形式参数的类型相同。 两个重要概念:全局变量、局部变量 全局变量是在程序主体的头部说明的变量,是可以在程序的各个部分(包括主体、自定义函数、自定义过程)直接使用的。 局部变量是在程序的自定义函数或自定义过程的程序头部说明的变量,它们只能在所在的函数或过程中使用,不能在程序的其它部分使用。 如上述程序中的变量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语言很好地表现出来。以下我们用递归函数来完成,请大家注意递归的实现方法,即自己调用自己。 Var n100:integer; 定义程序主体中的变量 Function dg(n:integer):integer; 定义自定义函数DG,形式参数1个,用以记录现在Begin 是推算到了第几个数。 If n:=1 then dg:=1 递归出口是当N等于1时,DG的值为1 Else begin Dg:=dg(n-1)*3-1; 如果N不等于1,我们就继续递归,这就是递归关 End; 系式 End; Begin N100:=dg(100); 程序主体 Writeln(n100); 调用递归函数 End. 由上可以看出,用递归函数来实现算法,程序主体可以变得非常简单,只需少数几句即可。而递归函数就显得至关重要了,由上述程序可以看出,递归函数的实现实际上就是一个自己调用自己 28 PASCAL语言基础及基础训练 第 29 页 共 48页 的函数。直到调用到已知的数为止。递归问题我们还将在递归过程中详细分析。 由上可见,递归过程实际上只有一句,IF 条件 THEN 出口 ELSE 调用下一次递归; 第二节、自定义过程 我们已经学过很多的标准过程,如:WRITE,READLN,STR等等,这些都是PASCAL的标准过程,我们可以随时调用。但有的时候,我们在程序中的不同地方会用到相同的一些语句,这时,我们就会把这些语句组合成一个自定义过程,以便在不同地方调用,这样,就可以节省大量的时间。并且,利用自定义过程,我们能够非常简单的实现递归、回溯。 自定义过程的说明语法如下(在程序头部说明): procedure 过程名(形式参数表); 过程变量(局部变量)说明部分; begin 语句体; end; {此处是分号!} 自定义过程的调用语法如下: 过程名(数值参数表); 自定义过程实际上就是一个小的程序,只不过是划分开来,成为一个过程,然后在程序主体中以过程名来调用这些语句。 自定义过程的形式参数与自定义函数的用法一样,是输入过程中要用到的不同的输入值。如果过程中不要用到形式参数值,那么在说明过程的时候,过程名后面就不用加括号来说明形式参数。 [例7、3]编写一个程序,在屏幕上打印以下图形。 $$$$$ $$$$$ $$$$$ $$$$$ $$$$$ 分析,我们已经编写过类似的程序,这里我们将用一个过程来打印每一行的五个“$”号。只不过每一行开头的位置不同,所以我们把控制开头位置的数值做为一个形式参数,另外,把每行要把多少个“$”也作为形式参数之一。 Var I:integer; Procedure printrow(n,m:integer); 形式参数N控制每行前多少个空格,M为每行多少Var r:integer; 字符 Begin Write(? ?:n); For r:=1 to m do begin 打印每行前N个空格 Write(?$?); 每行打印M个字符 End; Writeln; End; Begin For I:=1 to 5 do begin Printrow(I,5); End; 输入数值参数,每行前I个空格,每行5个字符 End. 上述过程中我们只有两个需输入的参数,有时我们的过程中也会用到输出的参数,如STR(N,S)过程,N是输入的参数,而S是输出的参数,即输入N转化为字符串S输出。这种有输出参数的过程在形式参数说明中有所不同,即输出参数要用VAR来引导。下例就是这种情况。 [例7、4]编写一个程序,求X的N次方。 我们知道,PASCAL语言中没有求乘方的标准函数或过程,这里我们将自己编一个求乘方的过程, 29 PASCAL语言基础及基础训练 第 30 页 共 48页 而该过程的形式参数就必须有两个输入参数,另外,我们计算出的幂值必须输出到一个变量中,这个变量也必须放在形式参数中,只不过这个参数与输入参数是不同的,所以必须以VAR引导加以说明,程序如下: Var x,n:integer; 说明主程序中要用到的X,N变量; C:longint; 说明乘幂C,用长整数型 Procedure cm(a,b:integer;var d:longint); 过程CM,二个输入函数,D为输出变量 Var I:integer; Begin D:=1; For I:=1 to b do begin D:=d*a; End; End; Begin 程序主体开始 Write(?please input x,n: ?); Readln(x,n); Cm(x,n,c); 调用CM过程,输入X,N,输出为C Writeln(c); End. 请大家一定要看懂得上述程序的形式参数部分,分清其中的输入与输出参数。 递归过程 我们从一个例题中来看看递归的实际实现及运行过程。 [例7、5]打印‘A’、‘B’、‘C’、‘D’、‘E’这五个字符任意排列的所有情况。 分析,此题可用五重循环来做,但那样就把此题给复杂化了,运行速度也要慢很多,而此题用递归过程来做的话就要简单许多。我们把递归过程定为每次从五个字符中取一个字符,当然这个字符必须与已经取得的字符全不相同,而我们取得的字符存放在一个字符串中,并把它作为形式参数(这一点至关重要,否则答案将完全错误)。当我们已经取完五个字符后,在取第六个字符时,递归过程就将结束。这就是递归的出口。这样我们就能把所有结果找出来。程序如下: Var t:longint; 计算答案总数的计数器 Procedure dg(n:integer;s:string); 递归过程有两个形式参数,N表示当前取第N个Var I:char; 字符,S存放已经取得的N-1个字符; Begin If n=6 then begin N等于6时,递归到了一个答案 T:=t+1; 答案总数加1 Writeln(t:5,? ?,s); 把答案数及答案打印出来 End else begin 从此句中返回调用此过程的上一过程 For I:=?A? to ?E? do begin 从A—E五个字符中取一个 If pos(I,s)=0 then begin 如果这个字符在已经取得的N-1个字符中没有出 Dg(n+1,s+I); 现 End; 就调用下一次递归,即调用自己,只不过参数NEnd; 变为N+1,即下次将取第N+1个字符(相对于当 End; 前来说),而输入的S参数也变为已经加入第N个End; 字符的新字符串。 Begin T:=0; Dg(1,??); 程序主体开始 End. 答案总数初值为0 调用递归过程,输入值1表示要找第1个字符,??表示已经找到的0个字符 上述程序的运行过程如下: 30
正在阅读:
PASCAL语言基础总成含题目05-02
2011公务员考试模拟卷03-03
2010年南通市教师暑期校本研修模拟试题--初中地理08-25
谐振式电液疲劳试验机的设计毕业设计论文03-02
自由搏击选手康恩的体能训练(不是王力版)04-21
分数的初步认识评课稿03-23
开机提示网络上有重名的解决方法02-09
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 语言基础
- 总成
- 题目
- PASCAL
- 国有资产转让程序完整详细版
- 环境影响评价报告书
- 2017年中国供应链管理(SCM)行业分析及发展趋势预测(目录)
- 《三国演义》分回梗概及重点情节梳理(Word2003)
- 《国家公务员制度》(专)模拟试题
- (2011)造价工程师考试 部分知识点 巧记速记顺口溜 汇总
- 2011届湖北省部分重点中学高三期中联考(数学文)
- 英语初高中衔接
- 在销售中反败为胜
- 工作能力总结
- 爱,就要学会放手 - 教育创新案例(原创)
- 2014福建中考数学l压轴题
- 招教考试教育学基础复习总结
- 集技能训练和创新活动于一体的高职实践教学模式研究与实践
- 住院大楼工程施工组织设计 - 图文
- 中电建〔2012〕498号关于印发《中国电力建设集团有限公司专业技
- 中南大学2012本科毕业设计(论文)任务书 - 彭春华石金晶
- 无缝线路理论知识
- 洗衣机控制电路设计 - 图文
- 2101轨道顺槽掘进作业规程