pascal

来源:百度文库 编辑:神马文学网 时间:2024/04/25 00:01:56
[编辑本段]
Pascal是一种计算机通用的高级程序设计语言。它由瑞士Niklaus Wirth教授于六十年代末设计并创立。
以法国数学家命名的Pascal语言现已成为使用最广泛的基于DOS的语言之一,其主要特点有:严格的结构化形式;丰富完备的数据类型;运行效率高;查错能力强。
正因为上述特点,Pascal语言可以被方便地用于描述各种算法与数据结构。尤其是对于程序设计的初学者,Pascal语言有益于培养良好的程序设计风格和习惯。IOI(国际奥林匹克信息学竞赛)把Pascal语言作为三种程序设计语言之一, NOI(全国奥林匹克信息学竞赛)把Pascal语言定为唯一提倡的程序设计语言,在大学中Pascal语言也常常被用作学习数据结构与算法的教学语言。
在Pascal问世以来的三十余年间,先后产生了适合于不同机型的各种各样版本。其中影响最大的莫过于Turbo Pascal系列软件。它是由美国Borland公司设计、研制的一种适用于微机的Pascal编译系统。该编译系统由1983年推出1.0版本发展到1992年推出的7.0版本,其版本不断更新,而功能更趋完善。
下面列出Turbo Pascal编年史
出版年代 版本名称 主要特色
1983 Turbo Pascal 1.0
Turbo Pascal 2.0
Turbo-87 Pascal 提高实数运算速度并扩大值域
1985 Turbo Pascal 3.0 增加图形功能
Turbo BCD Pascal 特别适合应用于商业
1987 Turbo Pascal 4.0 提供集成开发环境(IDE),引入单元概念
1988 Turbo Pascal 5.0 增加调试功能
1989 Turbo Pascal 5.5 支持面向对象的程序设计(OPP)
1990 Turbo Pascal 6.0 提供面向对象的应用框架和库(Turbo Vision)
1992 Turbo Pascal 7.0 面向对象的应用系统、更完善的IDE
Turbo Vision 2.0
1993 Borland Pascal 7.0 开发 Object Windows库、
__(For Windows) 提供对OLE多媒体应用开发的支持
1995 Delphi (Object Pascal)
Visual Pascal
Turbo Pascal语言是编译型程序语言,它提供了一个集成环境的工作系统,集编辑、编译、运行、调试等多功能于一体
ps:高级语言发展过程中,PASCAL是一个重要的里程碑。PASCAL语言是第一个系统地体现了E.W.Dijkstra和C.A.R.Hoare定义的结构化程序设计概念的语言。1971年,瑞士联邦技术学院尼克劳斯·沃尔斯(N.Wirth)教授发明了另一种简单明晰的电脑语言,这就是以电脑先驱帕斯卡的名字命名的PASCAL语言。PASCAL语言语法严谨,层次分明,程序易写,具有很强的可读性,是第一个结构化的编程语言。它一出世就受到广泛欢迎,迅速地从欧洲传到美国。沃尔斯一生还写作了大量有关程序设计、算法和数据结构的著作,因此,他获得了1984年度“图灵奖”。
Pascal有5个主要的版本,分别是Unextended Pascal、Extended Pascal、Object-Oriented Extensions to Pascal、Borland Pascal和Delphi Object Pascal。其中,Unextended Pascal、Extended Pascal和Object-Oriented Extensions to Pascal是由Pascal标准委员会所创立和维护的,Unextended Pascal类似于瑞士Niklaus Wirth教授和K.Jensen于1974年联名发表的Pascal用户手册和报告,而Extended Pascal则是在其基础上进行了扩展,加入了许多新的特性,它们都属于正式的Pascal标准;Object-Oriented Extensions to Pascal是由Pascal标准委员会发表的一份技术报告,在Extended Pascal的基础上增加了一些用以支持面向对象程序设计的特性,但它属于非正式的标准。Borland Pascal和Delphi Object Pascal是由Borland公司专门为其开发的编译工具设计的Pascal语言,前者是用于DOS的Turbo Pascal系列和Windows 3.x的Turbo Pascal for Windows的传统高级语言,后者是用于Windows的Delphi和Linux的Kylix的面向对象程序设计语言,它们都不是正式的Pascal标准,具有专利性。但由于Turbo Pascal系列和Delphi功能强大并且广为流行,Borland Pascal和Delphi Object Pascal已自成为一种标准,为许多人所熟悉。
看到这里,你可能会发觉我的回答与你最初的设想不同。你原来可能是想问Turbo Pascal有几个版本,然而我却回答了Pascal语言有几个版本。这就是初学者常有的一个错误认识:Pascal是一种编程工具。实际上,Pascal是一种程序设计语言的名称(从一般意义上说,Pascal也可以是指人名,它的取名原本就是为了纪念十七世纪法国著名哲学家和数学家Blaise Pascal),而不是编程工具。刚才我是纯粹从字面意思上来回答这个问题。
“在turbo pascal中不能使用标准pascal的紧缩字符型数组!turbo pascal建立文件也有自己的语法规则!assign!!! ”
PASCAL是一门编程语言,而TURBO PASCAL是PASCAL程序的编译系统.
用pascal编辑的程序能在turbopascal中运行
Pascal只是一门语言,而Turbo Pascal是编译器
这两个是不能比较的
你可以把两个语言放在一起比较,或者两个编译器放在一起比较
而一切编译器都是基于语言的,因此不会有某个编译器不能适应语言
在中国的信息学奥林匹克竞赛中,过去比较常用的Pascal编程工具是Turbo Pascal。Turbo Pascal是DOS下的一种16位编程工具,在Delphi出现之前,它是世界上最多人使用的Pascal编程工具,拥有编译速度极快的先进编译器和功能强大而又简便易用的集成开发环境(IDE),在微机程序员中广为流行,正是它的出现奠定了Pascal在DOS/Windows平台上不可动摇的根基,现在常见的版本有Turbo Pascal 5.5、Turbo Pascal 6.0和Borland Turbo Pascal with Objects 7.0。Turbo Pascal 6.0与Turbo Pascal 5.5相比,主要是IDE更为强大,而其程序设计功能改变不大,只是增加了一些新的功能,例如可以内嵌asm汇编语句等。而Borland Turbo Pascal with Objects 7.0(简称Borland Pascal 7.0)则有了新的飞跃,首先是IDE进一步加强,提供了程序浏览器,然后是程序设计功能有了很大的提升,新增了一些十分有用的标准子程序,支持比较完善的面向对象程序设计功能,并提供了DOS实模式、DOS保护模式和Windows模式三种程序编译模式,能够编写出可以使用扩充内存(XMS)的保护模式应用程序或者在Windows 3.x下运行的Windows程序,另外还提供了一个对象窗口库(OWL),使用它可以快速的开发出具有一致的视窗界面(DOS或Windows 3.x)的应用程序。Borland Pascal 7.0在1992年推出,是Turbo Pascal系列在DOS下的最后版本。
现在,随着Turbo Pascal逐渐被淘汰,全国信息学奥林匹克竞赛决赛(NOI)和国际信息学奥林匹克竞赛(IOI)已经指定Free Pascal为比赛使用的Pascal编程工具。Free Pascal是由一个国际组织开发的32位Pascal编程工具,属于共享软件,可用于各种操作系统。根据编译选项的不同,它可以使用Borland Pascal兼容语法、Delphi 2 Object Pascal语法或者其它语法进行编写程序。由于它拥有32位的编译器,而且一直在更新发展中,因此它的功能比Borland Pascal更加强大,拥有许多现代程序设计的特征,但同时也很不成熟,存在很多漏洞。Free Pascal正处于发展初期,相应的函数库十分少,对程序员的吸引力远比不上拥有VCL和CLX的Delphi和Kylix。
Pascal中基本符号以及保留字:
pascal语言只能使用一下几类基本符号:
(1)大小写英文字母
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
(2)数字
1 2 3 4 5 6 7 8 9 0
(3)其他符号
+ - * / = <> <= >= < > ( ) [ ] { } := , . ; : .. '
注意,pascal语言除了可以使用以上规定的字符外,不得使用其他任何符号。
补充说明FreePascal(FP):
Free Pascal是一个在多种版本Pascal和Delphi下的产物,目前比较成熟的版本是由FreePascal.org发布的1.0.10版本,由于是Pascal上的改版,在FP里加入了很多以前没有的东西,例如:FillChar系列内存块赋值语句,用Power代替了**(乘方),但是**还是可以使用。
另外FP加强了与内存的互容性,增大对内存的支持,FP里的内存限制是TP和BP里的将近上万倍。
FP还进一步加强了单元支持、面向对象程序设计的支持、显卡(声卡)的支持、图形高级覆盖的支持、Windows\Linux\OS/2\..等众多系统的支持。在FP的较稳定版本中,可以方便的利用Win32编译模式,编译出Windows应用程序,与Delphi的功能相当。同时对动态连接库、控件、数据库、文件、网络、OpenGL的深入支持,使得FP脱颖而出。
更值得提出的是,FP支持Delphi及C++的部分语言,例如:A+=2这样的C Style语言,在FP里完美支持。
FP中支持单目、双目操作符,即所有版本的Pascal的符号和“@”等特殊符号。
FreePascal.org现在正在修订FP 2.0的版本,但使用起来并没有1.0.10那样轻松,稳定性也下降不少。
截止09年头,版本到了2.2.4.
[编辑本段]
pascal教材
第一节 Pascal语言的特点
信息学奥林匹克竞赛是一项益智性的竞赛活动,核心是考查参赛选手的智力和使用计算机编程解题的能力。信息学奥林匹克竞赛要求参赛选手有如下能力:针对竞赛题目中的要求构建数学模型,构造出有效的算法和选用相应的数据结构,写出高级语言程序,上机调试通过。程序设计是信息学奥林匹克竞赛的基本功,因此,青少年参与竞赛活动的第一步是必须掌握一门高级语言及其程序设计方法。
以纪念法国数学家而命名的Pascal语言是使用最广泛的计算机高级语言之一,被国际上公认为程序设计教学语言的典范。其主要特点有:严格的结构化形式;丰富完备的数据类型;运行效率高;查错能力强。正因为这些特点,Pascal语言可以被方便地用于描述各种数据结构和算法,编写出高质量的程序。尤其是对于青少年程序设计初学者,Pascal?语言有利于顺利入门,有益于从一开始培养良好的程序设计风格和习惯,越来越多的各类学校都把Pascal语言作为程序设计教学的第一语言。IOI(国际奥林匹克信息学竞赛)把Pascal语言规定为二种程序设计语言之一,?NOI(全国信息学奥林匹克竞赛)把Pascal语言定为唯一提倡的程序设计语言,NOIp(全国信息学奥林匹克联赛)把Pascal定为最主要的程序设计语言。
Pascal语言有多种版本,本教材采用的Turbo Pascal 7.0(或Borland Pacsal 7.0) 是目前PC机上使用最多的一种高效Pascal,是迄今为止DOS环境下的最高版本。Turbo Pascal 7.0 所需硬件环境是任意型号的PC机,并且仅需一台1.44M软盘驱动器(?当然有其它条件更好);最小软件系统包括Turbo.exe(集成环境)和Turbo.tpl(标准单元库)两个文件,如果包括Turbo.hlp(求助文件)则更有利于学习。Turbo Pascal 7.0可以工作在DOS操作系统或Windows操作系统环境下。
第一课 Pascal语言知识
一、Pascal 语言概述
PASCAL语言是一种算法语言,它是瑞士苏黎世联邦工业大学的沃思教授于1968年设计完成的,1971年正式发表。PASCAL语言是在ALGOL60的基础上发展而成的。它是一种结构化的程序设计语言。它的功能强、编译程序简单,是70年代影响最大一种算法语言。
从使用者的角度来看,PASCAL语言有以下几个主要的特点:
⒈ 结构化
PASCAL可以方便地书写出结构化程序。这就保证程序的正确性和易读性。在结构化这一点上,比其它算法语言更好一些。
⒉ 数据类型丰富
PASCAL提供了整数型、实型型、字符型、布尔型、枚举型、子界型以及由以上类型构成的数组类型、集合类型、记录类型和文件类型。此外,还提供了其它许多语言中所没有的指针类型。丰富的数据结构和上述的结构化性质,使得PASCAL可以被方便地用来描述复杂的算法。
⒊ 适用性好
既适用于数值运算,也适用于非数值运算领域。有些语言只适用于数值计算,有些语言则适用于商业数据处理和管理领域。PASCAL的功能较强,能广泛应用于各种领域。
⒋ 书写较自由
不象有些算法语言那样对程序的书写格式有严格的规定。PASCAL允许一行写多个语句,一个语句可以分写在多行上,这样就可以使PASCAL程序写得象诗歌格式一样优美,便于阅读。
由于以上特点,许多学校选PASCAL作为程序设计课程中的一种主要的语言。它能给学生严格而良好的程序设计的基本训练。培养学生结构化程序设计的风格。
二、Pascal语言程序的基本结构
任何程序设计语言都有一定的规则。使用PASCAL语言必须遵循其本身所规定的规则来编写程序。尽管不同版本的PASCAL语言所采用的符号的数量、形式不尽相同,但其基本成分一般都符合标准PASCAL的规定。下面我们首先来了解Pascal语言的程序基本结构。
为了明显起见,先举一个最简单的PASCAL程序例子:
【例1】
program li1(input,output); {程序首部}
const pi=3.1415926; {程序体 说明部分}
var r,l,s:real;
begin {执行部分}
write(‘input r:’);
readln(r);
s:=pi*r*r;
l:=2*pi*r;
writeln(‘s=’,s);
writeln(‘l=’,l);
readln;
end.{ 程序体}
从这个简单的程序可以看到:
⒈ 一个PASCAL程序分为两个部分:程序首部和程序体(或称分程序)。
⒉ 程序首部是程序的开头部分,它包括:
⑴程序标志。用"program"来标明这是一个PASCAL 程序。PASCAL规定任何一个PASCAL程序的首部都必须以此字开头。在free pascal语言中,首部也可省略。
⑵程序名称。由程序设计者自己定义,如例中的li1。在写完程序首部之后,应有一个分号。
⒊ 程序体是程序的主体,在有的书本里也称"分程序"。程序体包括说明部分(也可省略)和执行部分两个部分。
⑴说明部分用来描述程序中用到的变量、常量、类型、过程与函数等。本程序中第二行是"变量说明",用来定义变量的名称、类型。
PASCAL规定,凡程序中用到的所有变量、符号常量、数组、过程与函数、记录、文件等数据都必须"先说明,再使用"。
⑵执行部分的作用是给出需要计算机执行的操作。
执行部分以"begin"开始,以"end"结束,其间有若干个语句,语句之间以分号隔开。执行部分之后有一个句点,表示整个程序结束。
⒋ PASCAL程序的书写方法比较灵活。书写程序应结构清晰、容易阅读理解。在编写程序时希望读者尽量模仿本书中例题程序格式。
⒌ 在程序中,一对大括号间的文字称为注释。注释的内容由人们根据需要书写,可以用英语或汉语表示。注释可以放在任何空格可以出现的位置。执行程序时计算机对注释不予理睬。
三、Free Pascal语言系统的使用
目前,信息学竞赛使用的Pascal语言系统是free Pascal,下面我们就来学习free Pascal的使用。
1. 系统的启动
在运行系统目录下的启动程序fp.EXE,即可启动系统。屏幕上出现如图1所示的集成环境。
2.free Pascal系统集成环境简介
最顶上一行为主菜单。中间蓝色框内为编辑窗口,在它个编辑窗口内可以进行程序的编辑。最底下一行为提示行,显示出系统中常用命令的快捷键,如打开一个文件的快捷键为F3,将当前编辑窗口中文件存盘的快捷键为F2,获得系统帮助的快捷键为F1,等等。
3. 新建程序窗口
按F10进行主菜单,选择FILE菜单,执行其中New命令。就可建立一个新的程序窗口(默认文件名为Noname00.pas或Noname01.pas等)。
4. 程序的输入、编辑与运行
在当前程序窗口中,一行一行的输入程序。程序窗口是一个编辑器。所以对程序的编辑与其它编辑器相似,类似记事本程序。
当程序输入完毕之后,一般要先按Alt+F9(或执行compile菜单中compile命令)对程序进行编译。如果程序有语法错误,则会在程序窗口的下方显示错误信息。若无语法错误,则窗口正中央会出现一个对话框,提示编译成功。接下来,我们可以运行程序了。
程序的运行可以通过按ALT+R打开RUN菜单中的RUN命令,或直接按快捷键CTRL+F9。则可以在用户窗口中输出运行结果。通常在程序运行结束后系统回到Pascal系统的集成环境,因此要查看运行结果,要按ALT+F5将屏幕切换到用户屏幕。
5.程序的保存与打开
当我们想把程序窗口中的程序存入磁盘时,可以通过按F2键(或执行File菜单中的save命令)来保存程序。第一次保存文件时屏幕上会出现一个对话框要求输入文件名(默认扩展名为.pas)。
当我们要将磁盘上的程序文件中的PASCAL程序装入窗口时,可按F3(或执行File菜单中的Open命令)来装入程序,此时系统也会弹出一个对话框要求输入要打开的文件名,或直接在文件对话框列表中选择所要的文件,然后回到打开文件。
四、第一个程序
下面程序在运行时,会提示输入一个数N,然后会在屏幕上打出用“*”号排列成的菱形,菱形的行数是2N-1行,按回车后程序结束回到程序窗口。 Program tu;
Var n,i,j:integer;
Begin
Write('Please enter the n:');readln(n);
For I:=1 to n do
Begin
Write('':(n+1-i));
For j:=1 to 2*I-1 do
Write('*');
Writeln;
end;
for i:=n-1 downto 1 do
begin
write('':(n+1-i));
for j:=1 to 2*i-1 do
write('*');
writeln;
end;
Readln;
End.
请输入上面的程序,并练习将其存盘、打开与运行上面程序。
六,pascal基本程序语句以设计方法小节
1 输入语句:
Read ( a, b ) :读入a,b两个变量的值,注意变量类型与输入数据类型要一致
Readln(xp) :读入一行数据
2 计算或赋值语句:
A:=100*C+d :直接计算赋值语句,注意 “:=”的写法,等号前不能丢冒号
3 输出语句:
Write (a, b:5); :输出a,b两个变量的值,其中规定b变量的值占5个字符宽度
Writeln(a); :输出a变量的值,并自动将光标换到下一行
Write( ‘a=’,a); :输出a变量的值,并在值的前面增加提示,显示为 a=****
4判断语句:
简单判断语句:
(1) If 条件 then 一个语句;
如:IF cj>60 then write ( ‘考试及格了’);
(2) if 条件 then
Begin
多个语句( 复合语句 );
…………
End;
如: if cj >60 then
Begin
n:=n+1;
write ( ‘考试及格了’);
end;
两路分支语句:
If 条件 then 语句1 else 语句2; 语句可以是复合语句;
如 if cj>60 then write(‘及格了’)
Else
Write( ‘不及格’);
多路分支语句:
Case 表达式 of
值1:语句1;
值2:语句2;
值3:语句3;
……
End;
如:
Case xm of
'l': lp:=lp+1;
'z': zp:=zp+1;
'w': wp:=wp+1;
End ;
5 循环语句:三种
(1)计数循环:按照设定的次数循环
For 变量:=循环初值 TO 循环终值 DO
循环体语句;
如:
for i:=1 to 10 do
begin
a:=trunc(random*900)+100;
write (a:6);
end;
(2)直到型循环:一直循环,直到给定条件成立时,退出循环
Repeat
循环体语句
until 条件
如:
repeat
r:=m mod n;
m:=n;
n:=r;
until r=0;
(3)当型循环:当条件成立时,就循环,否则不循环
while 条件 do
循环体语句;
如:
While i<=100 do
S:=s+I ;
6 定义变量时常用的数据类型:
(1)整数型娈量: integer ; 这种变量只能用于存放整数 -32768 ~ +32768
(2)实数型变量: real ; 这种变量可用于存放整数或小数 -10~+10
(3)字符型变量: char ; 这种变量只能用于存放一个字符
(4)字符串变量: string ; 这种变量可用于存放一串多个字符
(5)布尔型变量: boolean ; 这种变量只能存放逻辑值fals或true
7 基本运算方法:
(1)整数累加: s:=s+n ;
(2)计数 : n:=n+1;
(3)求余运算: C:=A mod B; 要会判断两数能否整除
(4)取整数商: C:=A div B;
(5)交换A和 B两变量的值 :
C:=A;A:=B;B:=C;
8 重要的基本运算函数
(1)随机函数: Random(N) :产生一个 [0,N)之间的随机整数,使用前必须先用 randomize 激活随机数发生器
例如 begin
Randomize
……
A:= 100+Random(900) 产生一个三位的随机整数
(2)取整函数 TRUNC ( 实数变量或表达式 ) :只截取整数部分
例如:
B:=123.56
A:=TRUNC(B);
结果A的值为123
(3)四舍五入取整函数: ROUND (表达式)
例如: A:=ROUND(123.56)
结果A的值为124
(4)平方根函数: SQRT(X) :取X的平方根
(5)正弦和余弦函数 :SIN(X) COS(X)
9 关于数组的使用
数组就是一组带下标的变量,它与简单变量的区别就是在变量名称后面带有下标,这种下标变量规定必须先定义后使用,下标必须是正整数,且下标值不能超过设定的范围,下标变量的类型与简单变量的类型规定一致。
(1)一维数组:用于存放一行或一列的线性数据
定义: 数组名 array [最小下标,最大下标] of 类型;
如: Var
A array [1..100] of integer; 定义了A[1],A[2]……A[100]
(2)二维数组:用于存放二维表格形式的数据
定义:数组名 array [行下标范围,列下标范围] of 类型;
如: Var
A array [1..4,1..5] of integer; 定义了4行5列的二维数组
[编辑本段]
Pasal的单元
Turbo Pascal提供八大类型标准单元
标注库单元及功能
SYSTEM
TP的运行库,包括常用的标准函数和过程,可以在程序中直接运行使用,不需USES语句说明
DOS
具有日期,时间,目录的查找,程序执行等功能
CRT
具有屏幕模式控制,扩展键盘码,颜色,窗口,声音等功能
PRINTER
支持打印输入操作
GRAPH
高级图形软件包,支持多种图形适配器
GRAPH3
实现TP3.0的图形软件包
TURBO3
兼容TP3.0的源程序
OVERLAY
实现高级覆盖管理
程序标志符
program 定义一个程序名,放在程序最开头
var 定义一个字符变量
const 定义一个字符常量
type 定义一个范围
procedure 定义一个过程
function 定义一个函数
PASCAL教程
初识PASCAL
程序框架
一个完全的PASCAL程序结构框架如下:
PROGRAM 程序名(程序参数表);
CONST
常量声明;
TYPE
类型声明;
VAR
变量声明;
FUNCTION 函数名(参数表):函数类型;
函数声明;
PROCEDURE 过程名(参数表);
过程声明;
BEGIN
程序主体;
END.
变量定义
一、变量定义方法
VAR
变量名1:变量类型1;
变量名2:变量类型2;
变量名3,变量名4:变量类型3;
二、变量命名规则
1、首字符必须是英文
2、只能由英文、数字和下划线组成。
三、变量类型
常用的几个变量类型如下表:
类型名 含义 取值范围 占字节数
shortint 短整型 -128~127 1
integer 整型 -32768~32767 2
longint 长整型 -231~231-1 4
real 实数 2.9×10-39~1.7×1038 6
single 单精度 1.5×10-45~3.4×1038 4
double 双精度 5.0×10-324~1.7×10308 8
extended 扩展实数 1.9×10-4951~1.1×104932 10
char 字符 单个ASCII字符 1
string 字符串 最多255个字符 字符个数
ansistring 超长字符串 长度不限,最大可产生占用1G内存的字符串
boolean 布尔型 True, False 1
输入输出语句
一、输出语句格式
Writeln(项目1,项目2,……,项目n); {输出内容后换行}
Write(项目1,项目2 ,……,项目n); {输出内容后不换行}
二、输入语句格式
Read(变量1,变量2,……,变量n); {从键盘输入n个数据,以空格格开}
Readln(变量1,变量2 ,……,变量n); {从键盘输入n个数据,以空格格开,读完后换行}
三、赋值语句用法
变量名:=表达式; {把右边表达式的值计算出来,结果赋给左边的变量}
举例:
a:=3;
a:=a+1;
s:=(a+b)*(c+d);
文件输入输出方法
一、装配文件
assign(input,’文件路径’); {文件路径一般为相对路径,相对程序的工作目录}
reset(input);
assign(output,’文件路径’);
rewrite(output);
二、输入输出方法
read(x);
write(x);
三、关闭文件
close(input);
close(output); {输出文件必须关闭,否则可能不能正确保存}
程序的基本控制结构
顺序结构
一、顺序结构的程序按照书写顺序依次执行
begin
语句1;
语句2;
end;
二、实例
输入两个整数x,y,计算x,y的差并输出。
Program example;
var
x,y,s:integer;
begin
read(x,y);
s:=x-y;
writeln(s);
end.
分支结构
一、分支结构又叫选择结构或条件结构
If 条件
then 语句1 {注意这里不可以加分号,因为IF语句到这里没有结束,后面还有ELSE语句}
else 语句2;
二、没有ELSE的IF语句
If 条件
then 语句1;
三、实例
输入3个整数,输出最大的数。
Program bijiao;
var
a,b,c,max:integer;
begin
readln(a,b,c);
if a>=b
then max:=a
else max:=b;
if c>max then max:=c;
writeln(max);
end.
四、IF 语句的嵌套
If 条件
Then Begin
If 条件
Then 语句1
Else 语句2;
End
Else Begin
If 条件
Then 语句3
Else 语句4;
End;
一、For循环
For 循环变量:=初值 to 终值 do
循环体;
若循环体有多条语句,则必须用begin…end复合语句括起来。
【典型例题1】计算s=1+2+3+...+n,n由键盘输入。
Program example;
var
s,i,n:integer;
begin
readln(n);
s:=0;
For i:=1 to n do
s:=s+i;
writeln(s);
end.
【典型例题2】从键盘输入一个数,判断它是不是素数。
PROGRAM sushu;
VAR
a,i:integer;
flag:boolean;
BEGIN
readln(a);
flag:=true;
FOR i:=2 to trunc(sqrt(a)) do
IF a mod i=0
THEN BEGIN flag:=false;BREAK;END;
IF flag
THEN writeln(‘Y’)
ELSE writeln(‘N’);
END.
二、While循环
While 条件 Do
循环体;
同样,若循环体有多条语句,则必须用begin…end复合语句括起来。
【典型例题】求最大公约数
program HCF;
var
a,b,r:integer;
begin
r:=a mod b;
while r<>0 do
begin
a:=b;
b:=r;
r:=a mod b;
end;
writeln(b);
end.
三、Repeat循环
Repeat
循环体;
Until 条件;
即使循环体有多条语句,也不必用begin…end复合语句。
【典型例题】求自然对数e的近似值,直到最后一项小于10-5为止。
program e1;
var
i:integer;
e,s,t:real;
begin
e:=1;
t:=1;
i:=1;
repeat
t:=t*i;
e:=e+1/t;
i:=i+1;
until 1/t<=10e-5;
writeln(e);
end.
函数和过程
函数
一、标准函数(内置函数)
函数名 含义
abs(a) 求a的绝对值
sqr(a) 求a的平方
sqrt(a) 求a的平方根
sin(a) 求a的正弦值,a是弧度
cos(a) 求a的余弦值,a是弧度
arctan(a) 求a的反正切值,结果为弧度
exp(a) 自然对数e的a次方
ln(a) 求a的自然对数值
trunc(a) 求a的整数部分
round(a) 四舍五入取整
ord(a) 求字符a的ASCII码
chr(a) 根据ASCII码换成相应的字符
random(a) 求小于a的随机整数
二、自定义函数
Funtion 函数名(参数1:参数类型,参数2:参数类型,...):函数值类型;
VAR
函数内变量定义;
BEGIN
函数体;
END;
【典型例题】自定义一个判断素数的函数
Function prime(a:longint):Boolean;
Var
i:longint;
Begin
prime:=true;
for i:=2 to trunc(sqrt(a)) do
if a mod i=0
then begin prime:=false;break;end;
End;
过程
一、标准过程
inc(a) {等价于a:=a+1}
inc(a,i) {等价于a:=a+i}
dec(i) {等价于a:=a-1}
dec(a,i) {等价于a:=a-i}
二、自定义过程
Procedure 过程名(参数1:参数类型,参数2:参数类型,...);
VAR
过程内变量定义;
BEGIN
过程体;
END;
【典型例题】随机产生10个100以内不重复的随机数存入数组并输出,然后从小到大排序再输出。
Program example;
Const
n=10;
Var
a:array[1..n] of integer;
i,x,temp:integer;
Function find(x:integer):boolean; {自定义查找函数}
var
i:integer;
begin
find:=false;
for i:=1 to n do
if a=x then begin find:=true;exit;end;
end;
Procedure writea; {自定义输出数组元素的过程}
var
i:integer;
begin
for i:=1 to n do
write(a,' ');
writeln;
end;
Procedure selectsort;
var
i,j,k:integer;
begin
for i:=1 to n-1 do
begin
k:=i;
for j:=i+1 to n do
if a[k]>a[j] then k:=j;
if k<>i then begin temp:=a;a:=a[k];a[k]:=temp;end;
end;
end;
Begin {主程序开始}
randomize;
x:=random(100);
for i:=1 to n do
begin
while find(x) do
x:=random(100);
a:=x;
end;
writea; {调用输出数组过程}
selectsort; {调用选择排序过程}
writea; {调用输出数组过程}
end.
【典型例题1】求阶乘n!
n! 1:n*(n-1)(n>0) 2:1(n=0)
求n!我们可以使用For循环来做,这里我们换一个思路,使用递归的方法来做。看下面的数学递推表达式。
我们可以看出为求n!,必先求出(n-1)!,同理,要求出(n-1)!,必先求出(n-2)!,则如此递推下去,最终当n=0时我们就可以马上得出结果1,然后我们从1开始再逐步返回到n来求出n!
【演示课件】请用右键[目标另存为]命令保存下来再观看
Program jiecheng;
Var
n:integer;
Function jc(n:integer):longint;
Begin
If n = 0
Then jc = 1
Else jc = n * jc(n - 1)
End;
Begin
readln(n);
writeln(jc(n));
End.
【典型例题2】汉诺塔问题
有三根柱A、B、C,在柱A上有N块盘片,所有盘片都是大的在下面,小片能放在大片上面。现要将A上的N块盘片移到C柱上,每次只能移动一片,而且在同一根柱子上必须保持上面的盘片比下面的盘片小,输入任意的N,输出移动方法。
(注意:这是一个古老的传说,传说是如果把64个盘子由A柱移到了C柱的话,那么世界末日就到了,事实上如果要把64个盘子从A柱移到C柱的话,即使用计算机运算,也要计算数亿年,所以这个预言未必不是真实。)
【分析】
我们可以这样考虑,当n=1时,我们只要直接将A柱的盘子移到C柱,当n>1时,我们可以先把n-1个盘子由A柱通过C柱移到B柱,此时就可以把A柱剩下的最后一个盘子直接移到C柱,这样接下来只要把n-1个盘子通过A柱移到C柱即可,如果就构成了递归的思路,我们可以定义个移动过程mov(n,a,b,c)表示将n个盘子从a通过b移到c
【程序】
Program hannuota;
Var
n:integer;
Procedure move(n,a,b,c:integer);
begin
if n=1
then writeln(a,'->',c)
else begin
move(n-1,a,c,b); {把n-1个盘子从a柱经由c柱移到b柱}
writeln(a,'->',c); {把剩下的第n个盘子直接移到c柱}
move(n-1,b,a,c); {把在b柱上的n-1个盘子经由a柱移到c柱}
end;
end;
Begin
readln(n);
move(n,1,2,3);
End.
【典型例题3】求公约数问题
利用递归函数的方法求a,b的公约数。
Program gongyueshu;
Var
a,b:longint;
Function hcf(a,b:longint):longint;
Begin
if a mod b=0
then hcf:=b
else hcf:=hcf(b,a mod b);
End;
Begin
readln(a,b);
writeln('hcf=',hcf(a,b));
End.
数组
数组定义
一、数组定义方法
VAR
数组名:Array[下标起点..下标终点] Of 数组元素类型;
例如:定义一个存储10个整数的数组a
a:array[1..10] of integer;
赋值方法:a[1]:=0;
定义数组后计算机会在系统内存内划出一块连续的区域供存放数组元素
一、键盘输入数据存入数组过程
PROCEDURE reada;
VAR
i:INTEGER;
BEGIN
FOR i:= 1 TO n DO
READ(a);
END;
二、随机产生n个数据存入数组过程
PROCEDURE randoma(max:integer;);
VAR
i:INTEGER;
BEGIN
RANDOMIZE;
FOR i:= 1 TO n DO
a:=RANDOM(max);
END;
三、输出数组过程
PROCEDURE writea;
VAR
i:INTEGER;
BEGIN
FOR i:=1 TO n DO
WRITE(a,' ');
WRITELN;
END;
一、自定义查找函数,在数组中查找x,若有返回x的下标, 若无则返回0。
FUNCTION find(x:INTEGER):INTEGER;
VAR
i:INTEGER;
BEGIN
find:=0;
FOR i:=1 TO n DO
IF a=x
THEN BEGIN find:=i;break;END;
END;
二、在数组的p位置插入一个元素x
PROCEDURE inserta(p,x:INTEGER);
VAR
i:INTEGER;
BEGIN
FOR i:= n DOWNTO p DO
a[i+1]:=a;
a[p]:=x;
n:=n+1;
END;
注意:因为要插入一个元素,所以首先必须保证数组有空余的单元,否则会出现下标越界错误。
三、从数组中把下标为p的元素删除掉
PROCEDURE deletea(p:INTEGER);
VAR
i:INTEGER;
BEGIN
FOR i:=p TO n DO
a:=a[i+1];
n:=n-1;
END;
约瑟夫问题
【约瑟夫问题】
编号为1,2,......,n的n个人按照顺时针方向围坐一圈。从第一个人开始顺时针方向自1开始报数,报到m时停止报数。报m 的人出列,从他在顺时针方向的下一个人开始重新报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。其中n,m由键盘输入。
【思路1】
利用数组存放n个人,数组下标等于他的编号,然后模拟报数过程,报到m时输出该位置的人编号,然后该位置的值清0,继续报数并判断是否为0,是0则跳过。直到n个人全部出列为止。
【参考程序】
Program yueshefu;
Var
a:array[1..100] of integer;
n,m,i,j,p:integer;
Begin
write('Input n,m:');
readln(n,m);
for i:=1 to n do
a:=i;
p:=1; {p用于记录报数的位置}
for i:=1 to n do
begin
j:=0; {j用于记录报到的人数}
while jbegin
if a[p]<>0 then j:=j+1;
if p=n then p:=1 else p:=p+1; {处理边界情况}
end;
if p<>1
then begin write(a[p-1],' ');a[p-1]:=0;end {处理边界情况}
else begin write(a[n],' ');a[n]:=0;end;
end;
end.
--------------------------------------------------------------------------------
【思路2】
建立一个循环数组,数组元素的每一个值保存的是它的下一个元素的编号,如果报到m后只要修改m前面的元素的编号为m后面的元素的编号,这样就跳过了第m个元素,如此下去直到n个人全部出列。
【参考程序】
Program yuesefu;
Var
a:array[1..100] of integer;
n,m,p,i,j:integer;
Begin
readln(n,m);
for i:=1 to n-1 do
a:=i+1;
a[n]:=1;
p:=n;
for i:=1 to n do
begin
for j:=1 to m-1 do
p:=a[p];
write(a[p],' ');
a[p]:=a[a[p]];
end;
End.
自定义数据类型
枚举类型
TYPE
枚举类型标识符=(枚举值1,枚举值2 ,枚举值3,… );
VAR
枚举类型变量表:枚举类型标识符;
【实例】
TYPE
weekday=(Sun,Mon,Tue, Wed,Thu,Fri,sat);
month=(Jan,Feb,Mar,Apr,May,Jun,Jul,Aug, Sep,oct,nov,dec);
VAR
d:weekday; m:month;
子界类型
TYPE
子界类型标识符=常量1..常量2;
VAR
子界类型变量表:子界类型标识符;
【实例】
TYPE
age=0..100;
letter=’a’..’z’;
VAR
a:age; l:letter;
集合类型
TYPE
集合类型标识符=SET OF 基类型;
VAR
集合类型变量表:集合类型标识符;
【实例】
TYPE
digit=Set of 0..10;
VAR
a,b:digit;
Begin
a:=[1,3,5,7,9];
b:=[0,2,4,6,8];
End.
【集合运算】
1.空集合:[]
2.集合并交差
并:用+表示,例如[1,3,4]+[1,2,4]=[1,2,3,4]
交:用*表示,例如[1,3,4]*[1,2,4]=[1,4]
差:用-表示,例如[1,3,4]-[1,2,4]=[3]
3.关系运算:集合可以进行>,<,=,<>等运算,规则是元素多的大于元素少的。
4.包含判断:IN,例如1 in [1,3,4]是True; 2 in [1,3,4]是False。
5.集合运算中元素的次序是不重要的。
]
记录类型
TYPE
记录类型标识符=RECORD
域标识符表:类型;
域标识符表:类型;

End;
VAR
记录类型变量表:记录类型标识符;
【实例】 一个学生包括学号、姓名、性别、年龄、成绩五个域。
TYPE
student=RECORD
num:integer;
name:string;
sex:(male,female);
age:0..100;
score:real;
END;
VAR
s:student;
a:array[1..100] of stuent;
【赋值方法】
s.num=9601;
s.name=‘li min’;
s.sex=male;
s.age=18;
s.score=91;
a[1].num=9601;
a[1].name=‘li min’;
a[1].sex=male;
a[1].age=18;
a[1].score=91;
字符串类型
1、字符串用于存放整批的字符数据。字符串可以看作是特殊的字符串数组来处理。
字符串定义的格式:
var
s:string;
s1:string[15]; {字符串长度固定为15}
字符串定义时,如不指定长度,则按该类型的最大长度(255个字符)分配空间,使用时最大可用长度为255个;如果在中括号中给出一个具体的值(1—255之间),则按这个值的大小分配空间。使用时,最大的可用长度即为该值。
2、字符串的输入、输出:
字符串类型既可按数组方式输入、输出,也可直接输入、输出:readln(s);writeln(s);多个字符串输入时以回车作为数据间的分隔符;每个readln语句只能读入一个字符串。
3、有关字符串的操作:
操作 类型 作用 返回值 例子
length(s) 函数 求字符串s的长度 整型 s:='123456789';
l:=length(s);
{l的值为9}
copy(s,w,k) 函数 复制s中从w开始的k位 字符串 s:='123456789';
s1:=copy(s,3,5);
{s1的值是'34567'}
val(s,k) 过程 将字符串s转为数值,存在k中; s:='1234';
val(s,k);
write(k);
{k=1234}
str(i,s) 过程 将数值i转为字符串s i:=1234;
str(i,s);
write(s);{s='1234'}
Delete(s,w,k) 过程 在s中删除从第w位开始的k个字符 s := 'Honest Abe Lincoln';
Delete(s,8,4);
Writeln(s);
{ 'Honest Lincoln' }
Insert(s1,S,w) 过程 将s1插到s中第w位 S := 'Honest Lincoln';
Insert('Abe ', S, 8);
{ 'Honest Abe Lincoln' }
Pos(c, S) 函数 求字符c在s中的位置 整型 S := ' 123.5';
i :=Pos(' ', S);
{i的值为1}
+ 运算符 将两个字符串连接起来 s1:='1234';
s2:='5678';
s:=s1+s2;
{'12345678'}
指针类型
一、指针类型是一种动态数据结构,它随着程序的执行而改变长度。
定义方法:
TYPE
point=^node;
node=RECORD
data:<数据类型>;
link:point;
End;
VAR
p,q,r:point;
二、空间分配
new(p);
new(q);
三、赋值方法
p^.data:=10;
p^.link:=q;
q^.data:=100;
q^.link:=NIL; {NIL表示空指针}
[编辑本段]
基本算法模块
对于NOIP,基础是相当重要的,一些简单的、常用的算法模块,一定要要熟练掌握并灵活运用。
一、 排序
1. 选择排序
2. 插入排序
3. 冒泡排序
4. 快速排序
5. 归并排序
二、 高精度
1. 高精度比较
2. 高精度加法
3. 高精度减法
4. 单精度乘法
5. 高精度乘法
6. 单精度除法
7. 高精度除法
三、 排列组合
1. 排列生成算法
2. 组合生成算法
3. 排列按序生成法
一、 排序算法
var
a:array[1..maxn]of longint;——排序对象
1. 选择排序——Select_sort
procedure select_sort;
begin
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]>a[j] then
begin temp:=a[i];a[i]:=a[j];a[j]:=temp;end;
end;
2. 插入排序——Insert_sort
procedure insert_sort;
begin
for i:=2 to n do
begin
key:=a[i];j:=i-1;
while (key0) do begin a[j+1]:=a[j];dec(j);end;
a[j+1]:=key;
end;
end;
3. 冒泡排序——Bubble_sort
procedure bubble_sort;
begin
for i:=1 to n-1 do
for j:=n downto i+1 do
if a[j]begin temp:=a[j];a[j]:=a[j-1];a[j-1]:=temp;end;
end;
4. 快速排序——Quick_sort
procedure qsort(s,t:longint);
var
i,j,x:longint;
begin
i:=s;j:=t;x:=a[(i+j)div 2];
repeat
while a[i]while a[j]>x do dec(j);{找右边比他小的}
if i<=j then{交换}
begin
temp:=a[i];a[i]:=a[j];a[j]:=temp;
inc(i);dec(j);
end;
until i>j;
if sif iend;
5. 归并排序——Merge_sort
procedure mergesort(s,t:longint);
var
m,i,j,k:longint;
begin
if t-s=0 then exit;
m:=(s+t)div 2;
mergesort(s,m);
mergesort(m+1,t);
for i:=1 to m-s+1 do b[i]:=a[s+i-1];
for j:=m+1 to t do c[j-m]:=a[j];
i:=1;j:=1;b[m-s+2]:=max;c[t-m+1]:=max;
for k:=s to t do
if b[i]then begin a[k]:=b[i];inc(i);end
else begin a[k]:=c[j];inc(j);end;
end;
二、 高精度算法——High_precision
const
maxcount=进制位
maxlen=记录高精度数组大小
type
bignum=array[0..maxlen]of longint;0为位数
1. 高精度比较
function compare(a,b:bignum):longint;
begin
while a[a[0]]=0 do dec(a[0]);{检查位数是否正确}
while b[b[0]]=0 do dec(b[0]);
while a[a[0]+1]>0 do inc(a[0]);
while b[b[0]+1]>0 do inc(b[0]);
if a[0]>b[0] then exit(1);
if a[0]for i:=a[0] downto 1 do
begin
if a[i]>b[i] then exit(1);
if a[i]end;
exit(0);
end;
2. 高精度加法
procedure add(a,b:bignum;var c:bignum);
var
i:longint;
begin
fillchar(c,sizeof(c),0);c[0]:=1;
if a[0]>b[0]
then c[0]:=a[0]
else c[0]:=b[0];
for i:=1 to a[0] do inc(c[i],a[i]);
for i:=1 to b[0] do inc(c[i],b[i]);
for i:=1 to c[0] do
begin
inc(c[i+1],c[i] div maxcount);
c[i]:=c[i] mod 10;
end;
while c[c[0]+1]>0 do
begin
inc(c[0]);
inc(c[c[0]+1],c[c[0]] div maxcount);
c[c[0]]:=c[c[0]] mod maxcount;
end;
end;
3. 高精度减法
procedure minus(a,b:bignum;var c:bignum);
var
i:longint;
begin
fillchar(c,sizeof(c),0);c[0]:=a[0];
for i:=1 to c[0] do c[i]:=a[i]-b[i];
for i:=1 to c[0] do
if c[i]<0 then
begin
dec(c[i+1]);
inc(c[i],maxcount);
end;
while (c[0]>1)and(c[c[0]]=0) do dec(c[0]);
end;
4. 单精度乘法
procedure mulnum(a:bignum;x:longint,var c:bignum);
var
i:longint;
begin
fillchar(c,sizeof(c),0);c[0]:=a[0];
for i:=1 to c[0] do c[i]:=a[i]*x;
for i:=1 to c[0] do
begin
inc(c[i+1],c[i] div maxcount);
c[i]:=c[i] mod 10;
end;
while c[c[0]+1]>0 do
begin
inc(c[0]);
inc(c[c[0]+1],c[c[0]] div maxcount);
c[c[0]]:=c[c[0]] mod maxcount;
end;
end;
5. 高精度乘法
procedure mul(a,b:bignum;var c:bignum);
var
i,j:longint;
begin
fillchar(c,sizeof(c),0);c[0]:=a[0]+b[0]-1;
for i:=1 to a[0] do
for j:=1 to b[0] do
inc(c[i+j-1],a[i]*b[j]);
for i:=1 to c[0] do
begin
inc(c[i+1],c[i] div maxcount);
c[i]:=c[i] mod 10;
end;
while c[c[0]+1]>0 do
begin
inc(c[0]);
inc(c[c[0]+1],c[c[0]] div maxcount);
c[c[0]]:=c[c[0]] mod maxcount;
end;
end;
6. 单精度除法
function divnum(a:bignum;x:longint;var c:bignum):longint;
var
i,temp:longint;
begin
fillchar(c,sizeof(c),0);c[0]:=a[0];
temp:=0;
for i:=a[0] downto 1 do
begin
temp:=temp*maxcount+a[i];
c[i]:=temp div x;
temp:=temp mod x;
end;
while (c[o]>1)and(c[c[0]]=0) do dec(c[0]);
exit(temp);
end;
7. 高精度除法
procedure div(a,b:bignum;var c,d:bignum);
var
i:longint;
begin
fillchar(c,sizeof(c),0);c[0]:=a[0]-b[0]+1;
fillchar(d,sizeof(d),0);d[0]:=1;
for i:=c[0] downto 1 do
begin
c[i]:=maxcount;
repeat
dec(c[i]);mul(c,b,temp);
until compare(a,temp)>=0;
end;
while (c[o]>1)and(c[c[0]]=0) do dec(c[0]);
minus(a,temp,d);
end;
三、 排列组合算法
1. 排列生成算法——m的n排列
var
a:array[0..maxn]of longint;——排列方案
b:array[0..maxm]of boolean;——每个数是否被用过
递归(recursion):
procedure make_permutation_recursion(t:longint)
var
i:longint;
begin
if t=n+1 then
begin
write(a[1]);for i:=2 to n do write(‘ ‘,a[i]);writeln;
exit;
end;
for i:=1 to m do
if not b[i] then
begin
b[i]:=true;a[t]:=i;
make(t+1);
b[i]:=false;
end;
end;
非递归(iterative):
procedure make_permutation_iterative(m,n:longint);
var
i,j:longint;
begin
i:=1;a[1]:=0;
repeat
j:=a[i]+1;
while (j<=m)and(b[j]) do inc(j);
if j<=m
then begin
a[i]:=j;b[j]:=true;
if i=n
then begin
write(a[1]);for j:=2 to n do write(‘ ‘,a[j]);writeln;
b[a[n]]:=false;
end
else begin
inc(i);a[i]:=0;
end;
end
else begin
dec(i);b[a[i]]:=false;
end;
until i=0;
end;
2. 组合生成算法——m的n组合
procedure make_combination(t:longint)
var
i:longint;
begin
if t=n+1 then
begin
write(a[1]);for i:=2 to n do write(‘ ‘,a[i]);writeln;
exit;
end;
for i:=a[t-1] to m do
if not b[i] then
begin
b[i]:=true;a[t]:=i;
make(t+1);
b[i]:=false;
end;
end;
3. 排列按序生成法
const
power:array[1..maxn]of longint=(…);power[i]为i的阶乘
type
permutationnode=array[1..maxn]of longint;——排列方案
求n的全排的字典序:
function get_number(n:longint;a:permutationnode):longint;
var
b:array[1..maxn]of longint;
i,j,s:longint;
begin
for i:=1 to n do b[i]:=i-1;
s:=0;
for i:=1 to n-1 do
begin
inc(s,b[a[i]]*power[n-i]);
for j:=a[i]+1 to n do dec(b[j]);
end;
exit(s+1);
end;
求字典序为m的n的全排:
function get_permutation(m,n:longint;):permutationnode;
var
use:array[1..maxn]of boolean;
a:array[0..maxn]of longint;
temp:permutationnode;
begin
dec(m);
for i:=1 to n-1 do
begin
a[i]:=m mod (i+1);
m:=m div (i+1);
end;a[0]:=0;
for i:=1 to n do
begin
j:=0;
for k:=1 to a[n-i]+1 do
begin
inc(j);
while use[j] do inc(j);
end;
temp[i]:=j;use[j]:=true;
end;
exit(temp);
end;

百度百科中的词条内容仅供参考,如果您需要解决具体问题
(尤其在法律、医学等领域),建议您咨询相关领域专业人士。本词条对我有帮助796