secondxie
secondxie
关注数: 0
粉丝数: 19
发帖数: 47
关注贴吧数: 1
【基础】高精度减法 什么是高精度算法:高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称谓是高精度数。高精度算法就是能处理高精度数各种运算的算法。此处我们主要讲解高精度减法。如何从读入的算式中提取减数和被减数:先介绍一下高精度减法的实现过程:先读入一个算式,提取出里面的被减数和减数,我们可以通过Copy函数来实现。具体代码如下:Readln(Suanshi); Len:=Length(Suanshi); For i:=1 to length(Suanshi) Do Begin IF Suanshi[i]='-' Then Begin x:=Copy(Suanshi,Tmp,i-tmp); Tmp:=i+1; y:=Copy(Suanshi,Tmp,len-tmp+1);Break; End;这里很简单,不需要多说。如何将字符串转换为整数数组?要想将字符串转换为整数数组,只需要一个For循环就可以解决了,先获得String的长度,然后循环就OK了。(注意:因为我们的减法运算是从右到左的,所以要把转换过程稍微改一下)具体代码如下:For i:=1 to Length(x) do a[i]:=ord(x[length(x)-i+1])-ord('0');怎么样?很短吧!如何判断两个数的大小?由于该问题比较简单,不做详细介绍,只要用补零法,然后判断即可。给个补零的函数:Function BuLing(a,b:String):String; Var i:Longint; Begin While length(a)<>Length(b) Do Insert('0',a,1); Buling:=a End;在运算时,如何处理借位问题?只需要判断a[i]是否小于b[i]如果小于的话,Dec(a[i+1]),a[i]+10,然后再减b[i]即可。代码比较简单,请大家自己发挥。至于那些比较简单的,如输入输出,就不再讲了,注意:输出时要注意判断最高位是不是0,然后在输出。下面给出所有的代码,如有不足之处,请指出:Program Jianfa; Type ArryType=Array[1..10000] of Integer; Var x,y,Suanshi:String; Var Flag:Char; Var a,b:array[1..10000] of Integer; Var i,j,len,k,tmp:Longint; Function BuLing(a,b:String):String; Var i:Longint; Begin While length(a)<>Length(b) Do Insert('0',a,1); Buling:=a End; Begin Fillchar(a,sizeof(a),0); Fillchar(b,sizeof(b),0); Flag:='+'; Tmp:=1; Readln(Suanshi); Len:=Length(Suanshi); For i:=1 to length(Suanshi) Do Begin IF Suanshi[i]='-' Then Begin x:=Copy(Suanshi,Tmp,i-tmp); Tmp:=i+1; y:=Copy(Suanshi,Tmp,len-tmp+1); End; End; IF Length(x)<Length(y) Then x:=BuLing(x,y) Else y:=Buling(y,x); For i:=1 to Len do IF x[i]<y[i] Then Begin Flag:='-'; Break; End Else Break; IF Flag='+' Then Begin For i:=1 to Length(x) do a[i]:=ord(x[length(x)-i+1])-ord('0'); For i:=1 to Length(y) do b[i]:=ord(y[length(y)-i+1])-ord('0'); End Else Begin For i:=1 to Length(y) do a[i]:=ord(y[length(y)-i+1])-ord('0'); For i:=1 to Length(x) do b[i]:=ord(x[length(x)-i+1])-ord('0'); End; IF Length(x)<Length(y) Then Len:=Length(y) Else Len:=Length(x); For i:=1 to len do Begin IF a[i]<b[i] Then Begin Dec(a[i+1]); a[i]:=a[i]+10; End; a[i]:=a[i]-b[i]; End; While a[len]=0 Do Dec(Len); Write(Flag); For i:=len downto 1 do Write(a[i]); Readln; End.
【教程】第二章 线性表Ⅰ 2.1 线性表的逻辑结构及基本运算1.线性表简单的定义n个数据元素的的有限序列其特点是除了表头和表尾外,表中的每一个元素有且仅有唯一的前驱和唯一的后继,表头有且只有一个后继,表尾有且只有一个前驱。2.线性表的基本运算length(L) 返回表L的长度,即元素个数。 IsEmpty(L) 如果表L为空表(长度为0)则返回true,否则返回false。 next(L,p) 这是一个函数,函数值为表L中位置p的后继位置。如果p是L中结束元素的位置,则L.Next(p)=L.end。当L中没有位置p或p=L.end时,该运算无定义。 prev(L,p) 这是一个函数,函数值为表L中位置p的前驱位置。当L中没有位置p或p是L中开始元素的位置时,该运算无定义。 get(L,p) 这是一个函数,函数值为L中位置p处的元素。当p=L.end或L中没有位置p时,该运算无定义。 insert(L,x,p) 在表L的位置p处插入元素x,并将原来占据位置p的元素及其后面的元素都向后推移一个位置。例如,设L为a1,a2,…,an,那么在执行insert(L,x,p)后,表L变为a1,a2,…ap-1,x,ap,…,an 。若p为L.end,那么表L变为a1,a2,…,an,x 。若表L中没有位置p,则该运算无定义。 delete(L,p) 从表L中删除位置p处的元素。例如,当L为a1,a2,…,an时,执行delete(L,p)后,L变为a1,a2,…,ap-1,ap+1,…,an 。当L中没有位置p或p=L.end时,该运算无定义。 locate(L,x) 这是一个函数,函数值为元素x在L中的位置。若x在L中重复出现多次,则函数值为x第一次出现的位置。当x不在L中时,函数值为0 MakeEmpty(L) 这是一个将L变为空表的方法。 例1 假设两个线性表LA,LB分别代表两个集合A和B:求A=A U Bproc union(var la:linear_list;lb:linear_list); begin n:=length(la); for i:=1 to length(lb) do x:=get(lb,i); k:=locate(la,x); if k=0 then begin insert(la,n+1,x);n:=n+1 end;end例2 已知线性表la,lb中的数据元素按值非递减有序排列,现要求将la,lb归并为一个新的线性表lc且lc按值非递减。proc merge(la,lb:linear_list;var lc:linear_list);begin i:=1;j:=1;k:=0; while (i<=length(la)) and (j<=length(lb)) do if get(la,i)<=get(lb,j) then begin insert(lc,k+1,get(la,i));k:=k+1;i:=i+1 end else begin insert(lc,k+1,get(lb,j));k:=k+1;j:=j+1 end while i<=length(la) do begin insert(lc,k+1,get(la,i));k:=k+1;i:=i+1; endwhile j<=length(lb) do begin insert(lc,k+1,get(lb,j));k:=k+1;j:=j+1 endend; 2.2 线性表的顺序存储结构线性表的顺序存储即用一组地址连续的存储单元依次存储线性表中的元素。设线性表中每个元素需占用r个存储单元则 loc(ai+1 )=loc(ai)+r loc(ai)=loc(a1)+(i-1)*r这时可以这样定义线性表类型type sqlist=record data:array[1..maxlen] of datatype; last:0..maxlenend在这种存储方式下,容易实现对表的遍历。要在表的尾部插入一个新元素,也很容易。但是要在表的中间位置插入一个新元素,就必须先将其后面的所有元素都后移一个单元,才能腾出新元素所需的位置。执行删除运算的情形类似。如果被删除的元素不是表中最后一个元素,则必须将它后面的所有元素前移一个位置,以填补由于删除所造成的空缺。这两种运算的时间复杂度均为O(n)n为表的长度。
【教程】第二章 线性表 2.3 线性表的链式存储结构1.单链表定义:实现表的另一种方法是用指针将存储表元素的那些单元依次串联在一起。这种方法避免了在数组中用连续的单元存储元素的缺点,因而在执行插入或删除运算时,不再需要移动元素来腾出空间或填补空缺。然而我们为此付出的代价是,需要在每个单元中设置指针来表示表中元素之间的逻辑关系,因而增加了额外的存储空间的开销。为了将存储表元素的所有单元用指针串联起来,我们让每个单元包含一个元素域和一个指针域,其中的指针指向表中下一个元素所在的单元。例如,如果表是a1,a2,…,an ,那么含有元素ai的那个单元中的指针应指向含有元素ai+1的单元(i=1,2,…,n-1)。含有an的那个单元中的指针是空指针nil。此外,通常我们还为每一个表设置一个表头单元header,其中的指针指向开始元素中所在的单元,但表头单元header中不含任何元素。设置表头单元的目的是为了使表运算中的一些边界条件更容易处理。这一点我们在后面可以看到。如果我们愿意单独地处理诸如在表的第一个位置上进行插人与删除操作等边界情况,也可以简单地用一个指向表的第一个单元的指针来代替表头单元。上述这种用指针来表示表的结构通常称为单链接表,或简称为单链表或链表。单链表的逻辑结构如图1所示。表示空表的单链表只有一个单元,即表头单元header,其中的指针是空指针nil。为了便于实现表的各种运算,在单链表中位置变量的意义与用数组实现的表不同。在单链表中位置i是一个指针,它所指向的单元是元素ai-1所在的单元,而不是元素ai所在的单元(i=2,3,…,n)。位置1是指向表头单元header的指针。位置End(L)是指向单链表L中最后一个单元的指针。这样做的目的是为了避免在修改单链表指针时需要找一个元素的前驱元素的麻烦,因为在单链表中只设置指向后继元素的指针,而没有设置指向前驱元素的指针。单链表结构的主要类型可形式地定义为:type pointer=^nodetype nodetype=record data:datatype; next:pointer; end;linklist=pointer;基本运算的实现:过程 Insert(x,p) 功能在表L的位置p处插入元素x,并将原来占据位置p的元素及其后面的元素都向后推移一个位置。例如,设L为a1,a2,…,an,那么在执行Insert(x,p)后,表L变为a1,a2,…ap-1,x,ap,…,an 。若p为End(L),那么表L变为a1,a2,…,an,x 。若表L中没有位置p,则该运算无定义。实现Procedure Insert(x:datatype;p:pointer);var temp:integer;begin new(temp); temp^.data:=x; temp^.next:= p^.next p^.next:=temp;end;上述算法中,链表指针的修改情况见图2
想成为本吧会员请看公告. 贴吧即将对贴吧会员系统进行全面升级,升级后的会员在本吧将拥有更多权限。吧主在7月7日0:00前进行的最后一次设置将在7月8日生效,不满足条件的会员将被取消本吧会员的资格。想成为会员的同志,就加紧发贴(10篇),加入pascal圈。条件看到了吧,10篇哦。努力吧,不符合条件的,7.8就会自动取消本吧会员.
【招聘小吧主】 为了更好管理本吧,准备再招聘3名小吧主。①在本吧停留时间比较长②具有一定的pascal基础③严格执行本吧规定④具有良好的耐心如有符合条件的、有意向的,请跟贴报名并说明理由。
发主题注意事项 为了方便广大网友共同学习,为了营造一个良好的学习环境,为了更好管理我们的pascal吧.特制订一些规则:①如果发表新的主题请在前面加上【提问】、【代码】、【教程】、【NOIP】、【灌水】、【其他】②如果发表垃圾贴,删;重复发广告,封。...未完...
第十三届全国青少年信息学奥林匹克联赛初赛试题(提高组) 第十三届全国青少年信息学奥林匹克联赛初赛试题 ( 提高组 Pascal 语言 二小时完成 ) ● ● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效 ●● 一、 单项选择题 (共10题,每题1.5分,共计15分。每题有且仅有一个正确答案)。 1. 在以下各项中,( )不是CPU的组成部分。 A. 控制器 B. 运算器 C. 寄存器 D. 主板 E. 算术逻辑单元(ALU) 2.在关系数据库中,存放在数据库中的数据的逻辑结构以( )为主。 A. 二叉树 B. 多叉树 C.哈希表 D. B+树 E.二维表 3.在下列各项中,只有( )不是计算机存储容量的常用单位。 A. Byte B. KB C.MB D.UB E.TB 4.ASCII码的含义是( )。 A. 二—十进制转换码 B. 美国信息交换标准代码 C. 数字的二进制编码 D. 计算机可处理字符的唯一编码 E. 常用字符的二进制编码 5.在Pascal语言中,表达式(23 or 2 xor 5)的值是( ) A. 18 B. 1 C.23 D.32 E.24 6.在pascal语言中,判断整数a等于0或b等于0或c等于0的正确的条件表达式是( ) A. not((a<>0)or(b<>0)or(c<>0)) B. not((a<>0)and(b<>0)and(c<>0)) C. not((a=0)and(b=0))or(c<>0) D. (a=0)and(b=0)and(c=0) E. not((a=0)or(b=0)or(c=0)) 7.地面上有标号为A、B、C的3根细柱,在A柱上放有10个直径相同中间有孔的圆盘,从上到下依次编号为1,2,3,……,将A柱上的部分盘子经过B柱移入C柱,也可以在B柱上暂存。如果B柱上的操作记录为:“进,进,出,进,进,出,出,进,进,出,进,出,出”。那么,在C柱上,从下到上的盘子的编号为( )。 A. 2 4 3 6 5 7 B. 2 4 1 2 5 7 C. 2 4 3 1 7 6 D. 2 4 3 6 7 5 E. 2 1 4 3 7 5 8. 与十进制数17.5625 对应的8进制数是( )。 A. 21.5625 B. 21.44 C. 21.73 D. 21.731 E. 前4个答案都不对 9.欧拉图G是指可以构成一个闭回路的图,且图G 的每一条边恰好在这个闭回路上出现一次(即一笔画成)。在以下各个描述中,不一定是欧拉图的是( )。 A. 图G中没有度为奇数的顶点 B. 包含欧拉环游的图(欧拉环游是指通过图中每边恰好一次的闭路径) C. 包含欧拉闭迹的图(欧拉迹是指通过图中每边恰好一次的路径) D. 存在一条回路,通过每个顶点恰好一次 E. 本身为闭迹的图 10. 一个无法靠自身的控制终止的循环称为“死循环”,例如,在 C 语言程序中,语句“while(1) printf(“*”);”就是一个死循环,运行时它将无休止地打印*号。下面关于死循环的说法中,只有( )是正确的。 A. 不存在一种算法,对任何一个程序及相应的输入数据,都可以判断是否会出现死循环,因而,任何编译系统都不做死循环检验 B.有些编译系统可以检测出死循环 C. 死循环属于语法错误,既然编译系统能检查各种语法错误,当然也应该能检查出死循环 D. 死循环与多进程中出现的“死锁”差不多,而死锁是可以检测的,因而,死循环也是可以检测的 E. 对于死循环,只能等到发生时做现场处理,没有什么更积极的手段 二、 不定项选择题 (共10 题,每题1.5 分,共计15 分。每题正确答案的个数大于或等于1。多选或少选均不得分)。 11. 设A=B=true,C=D=false,以下逻辑运算表达式值为真的有( )。 A. (-|A∧B)∨(C∧D∨A) B. -|(((A∧B)∨C)∧D) C. A∧(B∨C∨D)∨D D. (A∧(D∨C)) ∧B 12. 命题“P→Q”可读做P蕴涵Q,其中P、Q 是两个独立的命题。只有当命题P成立而命题Q不成立时,
第十三届全国青少年信息学奥林匹克联赛初赛试题 第十三届全国青少年信息学奥林匹克联赛初赛试题 ( 普及组 Pascal 语言 二小时完成 ) ● ● 全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效 ●● 一、 单项选择题 (共20题,每题1.5分,共计30分。每题有且仅有一个正确答案.)。 1. 在以下各项中,( )不是CPU的组成部分。 A. 控制器 B. 运算器 C. 寄存器 D. 主板 2.在关系数据库中,存放在数据库中的数据的逻辑结构以( )为主。 A. 二叉树 B. 多叉树 C.哈希表 D.二维表 3.在下列各项中,只有( )不是计算机存储容量的常用单位。 A. Byte B. KB C.UB D.TB 4.ASCII码的含义是( )。 A. 二—十进制转换码 B. 美国信息交换标准代码 C. 数字的二进制编码 D. 计算机可处理字符的唯一编码 5.一个完整的计算机系统应包括( )。 A.系统硬件和系统软件 B. 硬件系统和软件系统 C. 主机和外部设备 D. 主机、键盘、显示器和辅助存储器 6. IT的含义是( )。 A. 通信技术 B. 信息技术 C.网络技术 D.信息学 7.LAN的含义是( )。 A. 因特网 B. 局域网 C.广域网 D.城域网 8. 冗余数据是指可以由其他数据导出的数据,例如,数据库中已存放了学生的数学、语文和英语的三科成绩,如果还存放三科成绩的总分,则总分就可以看作冗余数据。冗余数据往往会造成数据的不一致,例如,上面4个数据如果都是输入的,由于操作错误使总分不等于三科成绩之和,就会产生矛盾。下面关于冗余数据的说法中,正确的是( )。 A. 应该在数据库中消除一切冗余数据 B. 用高级语言编写的数据处理系统,通常比用关系数据库编写的系统更容易消除冗余数据 C. 为了提高查询效率,在数据库中可以适当保留一些冗余数据,但更新时要做相容性检验 D. 做相容性检验会降低效率,可以不理睬数据库中的冗余数据 9.在下列各软件中,不属于NOIP竞赛(复赛)推荐使用的语言环境有( )。 A. gcc B. g++ C. Turbo C D. free pascal 10. 以下断电之后仍能保存数据的有( )。 A. 硬盘 B. 高速缓存 C. 显存 D. RAM 11. 在下列关于计算机语言的说法中,正确的有( )。 A. 高级语言比汇编语言更高级,是因为它的程序的运行效率更高 B. 随着Pascal、C等高级语言的出现,机器语言和汇编语言已经退出了历史舞台 C. 高级语言程序比汇编语言程序更容易从一种计算机移植到另一种计算机上 D. C是一种面向对象的高级计算机语言 12. 近20年来,许多计算机专家都大力推崇递归算法,认为它是解决较复杂问题的强有力的工具。在下列关于递归算法的说法中,正确的是( )。 A. 在1977年前后形成标准的计算机高级语言“FORTRAN77”禁止在程序使用递归,原因之一是该方法可能会占用更多的内存空间 B. 和非递归算法相比,解决同一个问题,递归算法一般运行得更快一些 C. 对于较复杂的问题,用递归方式编程一般比非递归方式更难一些 D. 对于已经定义好的标准数学函数sin(x),应用程序中的语句“y=sin(sin(x));”就是一种递归调用 13. 一个无法靠自身的控制终止的循环称为“死循环”,例如,在 C 语言程序中,语句“while(1) printf(“*”);”就是一个死循环,运行时它将无休止地打印*号。下面关于死循环的说法中,只有( )是正确的。 A. 不存在一种算法,对任何一个程序及相应的输入数据,都可以判断是否会出现死循环,因而,任何编译系统都不做死循环检验
Pascal基本教程 第一章 Pascal基本教程 第一章第一章 Pascal语言概述与预备知识1 关于Turbo Pascal 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 Visual Pascal Turbo Pascal语言是编译型程序语言,它提供了一个集成环境的工作系统,集编辑、编译、运行、调试等多功能于一体。1.2 Turbo Pascal 或 Borland Pascal 的启动(1) Turbo Pascal的启动a.DOS下的启动(适用于MS-DOS6.22之前的版本或Win 9X & Win2000 的Command Mode) DOS下,在装有Turbo Pascal的文件目录下,键入turbo即可进入Turbo Pascal集成环境。b.Win9X或Win2000模式下的启动(适用于Turbo Pascal 3.0以后的版本) 如果在Win9X或Win2000的“资源管理器”装有Turbo Pascal的目录中,双击turbo.exe或在“开始--程序”菜单中通过MS-DOS方式来运行turbo.exe,它会提示你“该程序设置为MS-DOS方式下运行,并且其它程序运行时,无法运行它。如果选择继续所有其它程序将关闭”,所以在Win9X或Win2000下无法直接运行它,这时你可以在你希望的地方(比如说桌面上)单击鼠标右键“新建--快捷方式”,单击“浏览”,找到turbo.exed选中,然后单击“打开”,再单击“下一步”,再单击完成;这还没完,选中前面新建的快捷方式(应该叫Turbo Pascal吧),单击右键,单击“属性”,选择“程序”,然后再单击“高级”,把“MS-DOS方式”前面的那个勾去掉,也就是不要选“MS-DOS方式”,然后单击“确定”,在单击“确定”就大功告成了,以后你运行Turbo Pascal的时候,只要双击那个你建立起的快捷方式就可以直接在Win9X或Win2000下运行Turbo Pascal。(2)Borland Pascal的启动 Borland Pascal的启动没有像Turbo Pascal那样复杂,一般来说在任何情况下双击bp.exe或是在MS-DOS下运行都不会出现什么问题。
Pascal基本教程 第五章 Pascal基本教程 第五章循环结构程序设计 5.1 while语句 while语句用于“当满足某一条件时进行循环”的情况。while语句的语法格式: while 布尔表达式 do 语句; 循环结束条件在进入循环体之前测试,若最初的测试值为false,则根本不进入循环体,也就是说while循环是是属于当型循环。为了能使while重复能终止,循环体中一定要有影响布尔表达式的操作,否则该循就是一个死循环。例:计算从0到某个数之间所有奇数的和。 program jishu; var odds,limit,sum:integer; begin readln(limit); sum:=0; odds:=1; while odds<=limit do begin sum:=sum+odds; odds:=odds+2 end; writeln(sum:1) end. 5.2 repeat语句 repeat 语句用于“重复执行循环体,一直到指定的条件为真时为止”。语法格式为: repeat 语句1; …… 语句n; until 布尔表达式; repeat重复基本上有和while重复一样的描述循环计算的能力,但有一些不同:在repeat语句的结构中,布尔表达式求值在计算操作之后,而while语句中,布尔表达式求值在计算操作之前,也就是说repeat至少执行一次循环体。while语句的成分语句只能是一个语句。因此,当重复动作包含多个语句时,要用begin和end ,使它变成一个复合语句。而repeat语句的保留字repeat和until已经起语句括号作用,可以包含多个语句而无须begin和end。repeat语句中,当布尔表达式为true时结束循环,而while语句中,是当表达式为false时才结束循环。当描述由计算操作后的情况确定重复是否继续进行的计算时,通常用repeat语句描述。 5.3 for 语句 for 语句用来描述已知重复次数的循环结构。for 语句有两种形式: (1) for 控制变量:=初值 to 终值 do 语句; (2) for 控制变量:=初值 downto 终值 do 语句; 第一种形式的for 语句是递增循环。首先将初值赋给控制变量,接着判断控制变量的值是否小于或等于终值,若是,则执行循环体,在执行了循环体之后,自动将控制变量的值该为它的后继值,并重新判断是否小于或等于终值。当控制变量的值大于终值时,退出for循环,执行for语句之后的语句。第一种形式的for 语句是递减循环。首先将初值赋给控制变量,接着判断控制变量的值是否大于或等于终值,若是,则执行循环体,在执行了循环体之后,自动将控制变量的值该为它的前趋值,并重新判断是否大于或等于终值。当控制变量的值小于终值时,退出for循环,执行for语句之后的语句。for 语句中的初值、终值、控制变量的数据都必须是顺序类型。当初值和终值确定后,重复的次数就确定不变了,并且控制变量在重复语句内不能施加任何赋值操作。 例:计算1+2+3+……+99+100 program jia; var n,sum:integer; begin sum:=0; for i:=1 to 100 do sum:=sum+i; writeln(sum); end. 5.4 goto语句 goto语句是一种无条件转向语句,它可以控制直接从程序的一条语句转向另一条语句。goto语句的语法形式为: goto 标号; 其中标号必须是不超过4位整数的正整数或标识符组成,但标号必须在说明语句中先予以说明。 goto语句会使程序出现一种称为“乱面条”的结构,因此你最好还是不要去用。
Pascal基本教程 第八章 Pascal基本教程 第八章函数和过程 8.1 函数 如果一个子程序执行后能够返回其结果制,那么它就可以用于表达式中,称这种子程序为函数,这种语句序列的定义称为函数说明。函数说明形式如下: function 函数名(形式参数表):函数类型; 说明部分; begin 语句1; 语句2; …… 语句n end 函数返回一个函数值,过程则能完成一系列各种操作。函数的调用方式出现在表达式中,而过程调用是一句独立的语句。例:计算|X|的函数 function zhoufei(x:real):real; var z:integer; begin if x>=0 then z:=x else z:=-x zhoufei:=z; end; 函数说明第一行为函数首部。它指明函数名、函数形参信息和函数值的数据类型。如上面求x绝对值的函数说明,函数名是zhoufei;它有一个值参数X为实型;函数值的数据类型为实型。Turbo Pascal规定一个函数只能求出一个简单值,所以函数值类型只能是任何非结构类型。 除函数首部和过程首部的句法略有差别外,函数体和过程体完全相同。函数体中至少要有一条语句对函数名赋值。如函数zhoufei 中有语句“power:=z”。函数的每次求值至少要执行这样的一条语句,为次计算求得一个值。返回时就把这个值带调用的地方。 8.2 过程给某个语句序列组成的子程序赋于一个适当的名字。程序中凡是需要出现这个语句序列的地方,可以简单的写上子程序的名字。这种完成一个操作的子程序称为过程;子程序的定义称为过程说明。 过程说明由过程首部和过程体组成,其形式如下:procedure 过程名(形式参数表);-------过程首部说明部分;begin执行语句;……end;例 输出两个数中最大值的过程procedure largest(a,b:integer);beginif a>b then writeln(a)else writeln(b);end. 上面largest过程由两个类型为整型的形式参数:a,b,你向过程传入的两个需要比较大小的数。8.3 形参和实参 子程序调用(过程调用或函数调用)的执行顺序分为以下几步: 实参和形参结合——〉执行子程序——〉返回调用处继续执行 子程序说明的形式参数表对子程序体直接引用的变量进行说明,详细指明这些参数的类别、数据类型要求和参数的个数。子程序被调用时必须为它的每个形参提供一个实参,按参数的位置顺序一一对应,每个实参必须满足对应形参的要求 Turbo Pascal子程序形参有四类:1.值参数 形式参数表中前面没有var,后有类型的参数。它类似过程和函数的局部变量,仅为过程和函数的执行提供初值而不影响调用时实际参数的值。在调用过程或应用函数时,值参数所对应的实际参数必须是表达式,而且它的值不能使文件类型或包括文件类型的值。实参必须和形参赋值相容。2.变量参数 形式参数表中前面有var后由类型的参数。如果需要子程序向调用程序返回值时,应采用变量参数。变量参数要求它的实参是和它同一类型的变量。因为在子程序执行时,遇到对相应形参的引用式定值,就是对相应实参的引用式定值,即对形参的任何操作就是对实参本身的操作。3.无类型变量参数 形式参数表中前面有var而后面没有类型的参数。形参是无类型变量,对应的实参允许为任意类型的变量,但要在子程序中设置的强制类型转换(类型名(无类型变量参数名)),将无类型变量参数改变为相应类型。4.子程序参数 用过程首部或函数首部作为形式参数。 8.4 标识符的作用域1.全局变量和它的作用域 全局变量是指在程序开头的说明部分定义和说明的量。它的作用域分为两种情况:(1)在全局变量和局部变量不同名时,其作用域是整个程序。(2)在全局变量和局部变量同名时,全局变量的作用域不包含同名局部变量的作用域。 2.局部变量和它的作用域 凡是在子程序内部使用的变量,必须在子程序中加入说明。这种在子程序内部说明的变量称为局部变量。局部变量的作用域是其所在的子程序。形式参数也只能在子程序中有效。因此也属于局部变量。局部变量的作用域分为两种情况:(1)当外层过程序的局部变量名和嵌套过程中的局部变量不同名时,外层过程的局部变量作用域包含嵌套过琛。(2)当外层过程的局部变量名和嵌套过程内的局部变量名同名时,外层局部变量名的作用域不包含此过程。
Pascal基本教程 第十章 Pascal基本教程 第十章指针 By 联合空间网络工作室10.1 指针的动态变量1.定义指针类型 在Turbo Pascal中,指针变量中存放的某个存储单元的地址,即指针变量指向某个存储单元。一个指针变量仅能指向某一种类型的存储单元,这种数据类型是在指针类型的定义中确定的,称为指针类型的基类型。指针类型定义如下: 类型名=^基类型名;例如:type q=^integer; var a,b,c:q; 说明q是一指向整型存储单元的指针类型,其中"^"为指针符。a,b,c均定义为指针变量,分别可以指向一个整型存储单元。 上例也可定义为: var a,b,c:^integer; 指针也可以指向有结构的存储单元。例如:type person=record name:string[10]; sex:(male,female); age:20..70 end; var pt:^person; pt为指向记录类型person的指针变量。2.动态变量 应用一个指针指向的动态存储单元即动态变量的形式如下: 指针变量名^例如:p^、q^、r^ 指针变量p和它所指向的动态变量^p之间有如下关系:P->P'以下语句把整数5存放到p所指向的动态变量p^ 中去:p^:=5;以下语句把p所指向的p^中的值赋给整型变量i:i:=p^;如果指针变量p并未指向任何存储单元,则可用下列赋值语句:p:=nil;其中nil是Turbo Pascal保留字,表示“空”,相当于C里面的null 10.2 对动态变量的操作 在Turob Pascal程序中,动态变量不能由var直接定义而是通过调用标准过程new建立的。过程形式为: new(指针变量名); 如果有下列变量定义语句: var p:^integer; 仅仅说明了p是一个指向整型变量单元的指针变量,但这个整型单元并不存在,在指针变量p中还没有具体的地址值。在程序中必须通过过程调用语句:new(p);才在内存中分配了一个整型变量单元,并把这个单元的地址放在变量p中,一个指针变量只能存放一个地址。在同一时间内一个指针只能指向一个变量单元。当程序再次执行new(p)时,又在内存中新建立了一个整型变量单元,并把新单元的地址存放在p中,从而丢失了旧的变量单元的地址。 为了节省内存空间,对于一些已经不使用的现有动态变量,应该使用标准过程dispose予以释放。过程形式为:dispose(指针变量名);为new(指针变量名)的逆过程,其作用是释放由指针变量所指向的动态变量的存储单元。例如在用了new(p)后在调用dispose(p),则指针p所指向的动态变量被撤销,内存空间还给系统,这时 p的值为 nil。 例:输入两个数,要求先打印大数后打印小数的方式输出,用动态变量做。 program dongtai; type intepter=^integer; var p1,p2:intepter; procedure swap(var,q1,q2:intepter); var p:integer; begin p:=q1;q1:=q2;q2:=p; end; begin new(p1);new(p2); writeln('input 2 data: ');readln(p1^,p2^); if p1^ writeln('output 2 data: ',p1^:4,p2^:$); end.
所有的PASCAL过程与函数都在这。并按字母排序 所有的PASCAL过程与函数都在这。并按字母排序。-------------------------------------------------------------------------------- Abs, Addr, Append, Arc, ArcTan, Assign, AssignCrt Bar, Bar3D, Blockread, BlockWrite ChDir, Chr, Circle, ClearDevice, ClearViewPort, Close, CloseGraph, ClrEol, Concat, Copy, Cos, CSeg Dec, Delay, Delete, DelLine, DetectGraph, DiskFree, DiskSize, DisPose, DosExitCode, DosVersion Ellipse, EnvCount, EnvStr, Eof, Eoln, Erase, Exec, Exit, Exp Fexpand, FilePos, FileSize, FillChar, FillEllipse, FillPoly, FindFirst, FindNext, FloodFill, Fluch, Frac, FreeMem, FSearch, FSplit GetArcCoords, GetAspectRatio, GetBkColor, GetCBreak, GetColor, GetDate, GetDefaultPalette, GetDir, GetDriverName, GetEnv, GetFAttr, GetFillPattern, GetFillSettings, GetFTime, GetGraphMode, GetImage, GetIntVec, GetLineSettings, GetMaxColor, GetMaxMode GetMaxX, GetMaxY, GetMem, GetModeName GetModeRange, GetPalette, GetPaletteSize, GetPixel, GetTextSettings, GetTime, GetVerify, GetViewSettings, GetX, GetY, GotoXY, GraphDefaults, GraphErrorMsg, GraphResult Halt, Hi, HighVideo ImageSize, Inc, InitGraph, Insert, InsLine, InstallUserDriver, InstallUserFont, Int, Intr Keep, KeyPressed Length, Line, LineRel, LineTo, Ln, Lo, LowVideo Mark, MaxAvail, MemAvail, MkDir, Move, MoveRel, MoveTo, MsDos New, NormVideo, NoSound Odd, Ofs, Ord, OutText, OutTextXY, OvrClearBuf, OvrGetBuf, OvrInit, OvrInitEms, OvrSetBuf PackTime, ParamCount, ParamStr, Pi, PieSlice, Pos, Pred, Ptr, PutImage, PutPixel Random, Randomize, Read, ReadKey, ReadLn, Rectangle, RegisterBGIdriver, RegisterBGIfont, Release, Rename, Reset, RestoreCrtMode, Rewrite, RmDir, Round, RunError Sector, Seek, SeekEoln, Seg, SetActivePage, SetAllPalette, SetAspectRatio, SetBkColor, SetCBreak, SetColor, SetDate, SetFAttr, SetFillPattern, SetFillStyle, SetFTime, SetGraphBufSize, SetGraphMode, SetIntVec, SetLineStyle SetPalette, SetRGBPalette, SetTextBuf, SetTextjustify, SetTextStyle, SetTime, SetUserCharSize, SetVerify, SetViewPort, SetVisualPage, SetWriteMode, Sin, SizeOf, Sound, SPtr, Sqr, Sqrt, SSeg, Str, Succ, Swap, SwapVectors TextBackGround, TextColor, TextHeight, TextMode, TextWidth, Trunc, Truncate UnpackTime, UpCase Val WhereX, WhereY, Window, Write, WriteLn
1
下一页