资源描述:
《pascal程序设计基础知识资料(》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
PASCAL程序设计基础知识资料Pascal语言基础知识——(程序设计第一课时、第二课时内容) 一、Pascal程序基本组成 二、Pascal的字符与符号 三、Pascal数据类型 四、常量与变量 五、标准函数 六、运算符和表达式一、Pascal程序基本组成 例1.1计算半径为R的圆面积SprogramArea;{程序首部}{已知半径求圆的面积}constpi=3.14159; {说明部分——数据描述}vars,r:real;begin {执行部分}readln(r);s:=pi*sqr(r);writeln('s=',s);end. 上述程序第一行称为程序首部。其中用花括号(注释可以用{}或(**)来表示)括起来的内容是注释,程序第二行就是一个注释,注释除了给人看,增加程序的可读性外,对程序编译和运行不起作用。一个程序可以包含多个出现在不同处注释,亦可无注释。程序第三行是常量说明,程序第四行是变量说明。程序从begin到end都是执行(语句)部分(1)程序首部 例1.1的第一行称为程序首部。program是保留字,接着是程序名(由你依据“标示符”规则自行定义),最后以分号表示程序首部结束,下面是程序主体的开始。程序首部在一个TurboPascal(仅在TurboPascal中有效)程序中并非必须出现,它是可选的。写上它仅起了文档作用。因此,在时间有限的情况下,如果用TurboPascal编程完全可以省略程序首部。(2)程序体a.说明部分说明部分用于定义和说明程序中用到的数据,由单元说明、标号说明、常量说明、类型说明、变量说明、函数或过程说明组成,并且这些数据的说明次序必须按照以上次序。但是一个简单的TurboPascal程序也可以不包含说明部分,也就是说说明部分是可选的。b.执行部分执行部分描述了程序要执行的操作。它必须以一个TurboPascal保留字begin开始,以保留字end后跟句点结束,其间是一些执行具体操作的语句,并且以分号作为语句之间的分隔符。begin和end必须成对出现,这是一个TurboPascal程序所必须有的。紧跟end之后的句号表示执行部分的结束,也表示整个程序的结束。此后的任何语句都无效。TurboPascal规定紧随end之前出现的分号允许省略34 课内注意点:A、程序首部,program后面的程序名必须以英文字母开头,后面可以跟字母、数字以及下划线。 B、语句后用“分号”分割。 C、注意冒号、逗号、分号以及EDN后面的句号的使用。 D、运行程序 [Ctrl]+[F9]或者RUN菜单中的“Run”。 E、运行程序后,查看结果,用[Alt]+[F5]。课内作业:输入两个数a、b,输出他们的和、差、积。参考程序:Programxumin0001;Vara,b,he,cha,ji:integer;begina:=10;b:=12;he:=a+b;cha:=a-b;ji:=a*b;write(he,cha,ji);end.补充练习:1、输入矩形的边长,分别输出周长、面积值。2、输入两个整数,输出它们的平方和它们的平方根。3、输入两个整数,输出它们相除的整数商(整除值)以及余数。4、输入一个时间秒数,分别将其换算为下述时间单位输出:小时,天,星期。二、Pascal字符与符号 1.保留字(关键字) 所谓保留字是指在Pascal语言中具有特定的含义,你必须了解它的含义,以便于正确的使用,否则会造成错误。标准Pascal语言中的保留字一共有35个,TurboPascal语言一共有51个。下面是Pascal语言的保留字(斜体是TurboPascal特有的保留字):AND,ARRAY,BEGIN,CASE,CONST,DIV,DO,DOWNTO,ELSE,END,FILE,FOR,FUNTION,GOTO,IF,IN,LABEL,MOD,NIL,NOT,OF,OR,PACKED,PROCEDURE,PROGRAM,RECORD,REPEAT,SET,THEN,TO,TYPE,UNTIL,VAR,WHILE,WITH,EXPORTS,SHR,STRING,ASM,OBJECT,UNIT,CONSTRUCTOR,IMPLEMENTATION,DESTRUCTORUSES,INHERITED,INLINE,INTERFACE,LIBRARY,XOR,SHL 2.标识符 (1)标识符的定义:标识符就是以字母开头的字母数字序列,有效长度为63个字符,并且大小写等效。可以用来标示常量、变量、程序、函数等。例如例1.1中的Area(程序名),pi(符号常量),s、r(变量名)都是标识符。 (2)标识符的分类: a.标准标识符:指Pascal语言预先定义的表识符,具有特殊含义。 以下列举了TurboPascal语言部分常用的标准表识符: 标准常量FalseMaxintTrue 标准类型BooleanCharRealInteger 标准函数AbsArctanChrCosEofEolnExpLnOddOrdPredRoundSinSqrSqrtSuccTrunc 标准过程DisposeGetNewPackPagePutReadReadlnResetRewriteUnpackWriteWriteln 标准文件InputOutput b.用户自定义表识符:由你来根据需要定义。(1)选用的表识符不能和保留字相同。34 (2)语法上允许预定义的标准标识符作为你定义的的表识符使用,但最好还是不要用。以下列举了你在定义表识符时可以用的字符: A——Z;a——z;0——9;+,-,*,/,=,<>,<=,>=,<,>,(,),[,],{,},:=,,,;,.,:,..,',^三、Pascal数据类型 数据是程序设计的一个重要内容,其重要特征----数据类型,确定了该数据的形、取值范围以及所能参与的运算。 TurboPascal提供了丰富的数据类型,这些数据类型可以分为三大类:简单类型、构造类型和指针类型,其中简单类型可以分为标准类型(整型、实型、字符型和布尔型)和自定义类型(枚举型和子界型),构造类型可以分为数组类型、集合类型、记录类型和文件类型。这些数据类型中除了指针类型是动态数据类型外,其他的都是静态数据类型。在这些数据类型中简单类型都是有序类型,除了实型以外的简单类型都是顺序类型,所谓顺序类型就是他们的值不仅是有序的而且是有顺序号。 在这里主要介绍整型、实型、字符型和布尔型四种常用的数据类型。1.整型 一个整型数据用来存放整数。TurboPascal支持五种预定义整型,它们是shortint(短整型)、integer(整型)、longint(长整型)、byte(字节型)和word(字类型),TurboPascal分别用相同的名字作为他们的表识符。每一种类型规定了相应的整数取值范围以及所占用的内存字节数。类型 数值范围 占字节数 格式shortint -128..128 1 带符号8位integer -32768..32767 2 带符号16位longint -2147483648..2147483647 4 带符号32位byte 0..255 1 带符号8位word 0..65535 2 带符号16位TurboPascal规定了两个预定义整型常量表识符maxint和maxlonint,他们各表示确定的常数值,maxint为32767,longint为2147483647,他们的类型分别是integer和longint。2.实型 一个实型数据用类存放实数。TurboPascal支持五种预定义实型,它们是real(基本实型)、single(单精度实型)、double(双精度实型)、extended(扩展实型)、comp(装配实型),TurboPascal分别用相同的名字作为他们的表识符。每一种类型规定了相应的实数取值范围、所占用的内存字节数以及它们所能达到的精度。类型数值范围占字节数有效位数类型 数值范围 占字节数 有效位数real 2.9e-39..1.7e38 6 11..12single 1.5e-45..3.4e38 4 7..8double 5.0e-324..1.7e308 8 15..16extended 3.4e-4932..1.1e4932 10 19..20comp -2**63+1..2**63-1 8 19..203.布尔型 一个布尔型数据用来存放逻辑值(布尔值)。布尔型的值只有两个:false和true,并且false的序号是0,true的序号是1。false和true都是预定义常数表识符,分别表示逻辑假和逻辑真。并且true=<常量>; ... <常量标识符>=<常量>; 常量表识符的类型由定义它的常量的类型决定。例如:consta=12隐含说明a是整型;constr=3.21隐含说明r是实型...... (3)常量定义部分必须以保留字const开头,可以包含一个或几个常量定义,而且每个常量均以分号结束。 (4)TurboPascal类型常量 类型常量,又称变量常数,它是TurboPascal的一个扩充特性。类型常量的定义与标准Pascal规定的常数定义和变量说明有所区别。2.变量 (1)变量:在某个程序中的运行过程中其值可以发生改变的量 (2)变量说明:变脸说明出现在说明部分。它的语法格式是: var <变量标识符列表>:<类型>; ... <变量标识符列表>:<类型>; 其中,保留字var表示开始一个变量说明部分。变量标识符列表是一个用逗号隔开的标识符序列,冒号后面的类型是类型标识符。每个变量说明均以分号结束。例如: var a,b,c:integer; m,n:real;五、PASCAL标准函数1.绝对值:ABS(X)求X是绝对值函数值是INTEGER或REAL2.平方值:SQR(X)求X的平方值函数值是INTEGER或REAL3.平方根:SQRT(X)求X的平方根函数值是非负实数4.正弦:SIN(X)求X的正弦值函数值是REAL5.余弦:COS(X)求X的余弦值函数值是REAL6.反正切:ARCTAN(X)求X的反正切函数值是REAL7.指数:EXP(X)等于e的x次方函数值是REAL8.自然对数:LN(X)求X的自然对数函数值是REALPASCAL转换函数:1.截尾TRUNC(X)去掉实数X的小数部分函数值是INTEGER2.舍入ROUND(X)将实数X四舍五入函数值是INTEGER3.序号ORD(X)求X的ASCII码序号函数值是INTEGER4.字符CHR(X)求以ASCII码序号为X字符函数值是CHARPASCAL顺序函数:1.前趋函数PRED(X)取自变量X的前一个数据,若X是第一项,则函数无意义2.后继函数SUCC(X)取自变量X的后一个数据,若X是最后项,则函数无意义34 例:abs(-4)=4 abs(-7.49)=7.49 arctan(0)=0.0 sin(pi)=0.0 cos(pi)=-1.0 frac(-3.71)=-0.71 int(-3.71)=-3.0 sqr(4)=16 sqrt(4)=2 odd(1000)=false odd(3)true pred(2000)=1999 succ(2000)=2001 pred('x')='w' succ('x')='y'2.标量函数:函数标识符自变量类型意义结果类型odd整型判断奇数布尔型pred离散类型求前趋同自变量succ离散类型求后继同自变量例:odd(1000)=false、odd(3)true、pred(2000)=1999、succ(2000)=2001、pred('x')='w'、succ('x')='y'3.转换函数:函数标识符自变量类型意义结果类型chrbyte型自量对应的字符字符型ord离散类型自量对应的序号longintround实型四舍五入longinttrunc实型截断取整longint4.杂类函数:函数标识符自变量类型意义结果类型random无自变量[0,1)之间的随机实数realrandomword[0,自变量)之间的随机整数wirdrandomize无自变量用一随机值初始化内部随机数产生器longintupcase字符型使小写英文字母变为大写字符型六、运算符和表达式1.运算符和优先级PASCAL运算符:+(加)-(减)*(乘)/(除)DIV(整除、INTEGER)MOD(求余数、INTEGER)逻辑运算符not and or xor关系运算符=(等于) <>(不等于) <(小于) >(大于) <=(小于等于) >=(大于等于)(2)优先级not1(高):*,/,div,mod,and2:xor,+,-,or3:in,=,<>,>=,<=,<>4(低)2.表达式(1)算术表达式:算术表达式是由算术运算符连接常量、变量、函数的式子。算术表达式中各个运算符的次序为:()-->函数-->*,/,div,mod-->+,1(2)布尔表达式:TurboPascal提供给布尔表达式以下基本操作:逻辑运算和关系运算。顺序结构程序设计——(程序设计第三、第四课时内容) 一、赋值语句 二、输入语句 三、输出语句 四、复合语句34 附录一:第三课时课内题目1、输入矩形的边长,分别输出周长、面积值。2、输入两个整数,输出它们的平方和它们的平方根。3、输入两个整数,输出它们相除的整数商(整除值)以及余数。4、输入一个时间秒数,分别将其换算为下述时间单位输出:小时,天,星期。附录二:第四课时课内题目5、键入一个四位整数,将其各位数字倒序输出。 提示:如何把一个四位数各个数字拆开,然后重新组成一个新的四位数? 例:5378=5×1000+3×100+7×10+86、X,Y,Z分别等于1,23,456,写一程序,将它们按下述方式打印输出 ①靠右边排列对齐②靠左边排列对齐。7、键入A,B两个变量的值,输出"A+B"的横式与竖式。 提示:本题是测试write(writeln)语句的格式使用, 输出形如 23+789=812(横式) 23 +789 -------- 812 (竖式) programwwwwww;vara,b,c:integer;beginreadln(a,b);c:=a+b;writeln; '理解这个语句有什么作用,不要结果会有什么变化?writeln(a,'+',b,'=',c);writeln; '理解这个语句有什么作用,不要结果会有什么变化?writeln(a:6);writeln('+',b:5);writeln('--------');writeln(c:6);readln;end.8、输入一个字符,输出该字符以及其ASCII码序号值。 提示:把字符转换成ASCII序号的函数是ord(x) 字符型变量说明—— varx:char;9、输入两个字符,分别输出它们的前导值、后续值和字符码。一、赋值语句 赋值语句是最简单的语句,其一般形式为: <变量>:=<表达式> 赋值语句的作用是计算表达式的值,并赋给变量。对于任何一个变量必须首先赋值,然后才能引用,否则,未赋初值的变量将以一个随机值参与运算。另外,赋值号两边的类型必须相同,但表达式值为整数时,它可自动化为实型后赋给该实型变量,即符合赋值相容。例:关于赋值的例子 program34 example; vara,b:integer; begin a:=3;b:=2; writeln(a); writeln(b); a:=a+b; writeln(a); writeln(b); b:=a-b; writeln(a); writeln(b); a:=a-b; writeln(a); writeln(b); readln end.二、输入语句 通过计算机的外设把数据送到计算机内存的过程称为输入。TurboPascal语言的输入语句有如下两种形式: read(变量名表); readln(变量名表); 输入项表是一个或几个由逗号隔开的变量标识符,他们必须在程序说明部分预先说明,他们可以是整型、实型或字符型,布尔型不可以直接读入。 例如a,b,c为整型变量,read(a,b,c)之后 键盘输入:203040CR(CR表示回车) 结果: a=20,b=30,c=40 readln语句和read语句不同之处在于输入数据到各变量之后,readln自动换行,从下一行开始再输入数据。一个read语句执行完后,数据行中多余的未读数据可以被下一个输入语句读入;而一个readln于执行完后,数据行中多余未读数据就没有用了。readln语句中可以不包含变量名表。即有以下等价情况:read(a,b);readln;等价于readln(a,b); 输入语句输入的数据类型必须和变量一一对应。如果输入的是一串整数或实数,数据间用空格或回车分隔;若输入的是一串字符,则不用分隔?br>例:输入语句示例 programshuru; var x:real; c:char; begin write('pleaseinputthenumber:($XXX.XX)'); readln(c,x); writeln('Thepriceis',c,x) end.三、输出语句 输出是将内存中的数据送到外设的过程。Turbo34 Pascal的输出语句有两种形式: write(<输出项表>) writeln(<输出项表>) 其中<输出项表>是一串用逗号分隔的常量、变量、函数名、表达式或字符串。如果是变量、函数名、表达式,则将其计算结果输出;如果是常量或字符串,则直接输出其值。 write和writeln的区别在于:write语句是输出项输出后,不换行,光标停留在最后一项后,writeln语句按项输出后,自动换行,光标则停留在下一行的开始位置。 writeln语句允许不含有输出项,即仅writeln;表示换行。 TurboPascal语言把输出项的数据显示占用的宽度称为域宽,你可以根据输出格式的要求在输出语句中自动定义每个输出项的宽度。定义宽度时分为单域宽和双域宽。(1)单域宽输出格式: writeln(a:m) 在m个字符宽的输出域上按右对齐方式输出I的值,若m大于a的实际位数,则在a值前面补(m-a的实际位数)个空格。若a的实际位数大于m,则自动突破限制。m必须是整数。(2)双域宽输出格式: writeln(a:m:n) 双域宽主要用于实型数据的输出。m的用法同上。在m个字符宽的输出域上按右队齐方式用小数点形式输出a的数值,n是小数点后的位数。原来的数据按该该格式指定的小数位数四舍五入。若n=0,则不输出小数部分和小数点,原数据四舍五入取整。m,n必须是整数。例:输出语句的例子 programshuchu; const s='pascal'; var i:integer; r:real; c:char; b:boolean; begin i:=12345; r:=123.45 c:='a'; b:=true; writeln('i='); writeln(i:6); writeln('r=',r,r:6:1); writeln('c=',c,c:10); writeln('b=',b,b:10) end.四、复合语句 复合语句是由若干语句组成的序列,语句之间用分号“;”隔开,并且以begin和end括起来,作为一条语句。复合语句的一般形式:34 begin 语句1; 语句2; …… 语句n; end例:变量值的交换 programjiaohuan; var a,b,t:integer; begin a:=10;b:=20; begin t:=a; a:=b; b:=t; end; writeln('a=',a,'b=',b) end.选择结构程序设计——(程序设计第五课时、第六课时、第七课时、第八课时内容) 一、IF语句 二、CASE语句附录一:第五课时课内题目1、输入两个数,从大到小输出。(参考程序)2、不用ABS函数,编程计算某数的绝对值。(参考程序)3、输入三个数,找出并输出其中的最大数。(参考程序)→→ 拓展训练:三个数如何排序?附录二:第六课时课内题目1、火车托运行李问题,行李重量在50kg以下的,每公斤收费是0.35元,总重量超过50公斤的,超过部分以每公斤0.50元收费。编程:输入行李重量,自动输出收费总额。(注意实数场宽输出格式)(参考程序)2、读入两个数,将大数存在max变量中,小的数存在min变量中。(注意复合语句的使用格式)(参考程序)附录三:第七课时课内题目1、读入两个数,将大数存在max变量中,小的数存在min变量中。(用交换两个变量内容方法做)(参考程序)2、输入学生成绩,若在85分以上,输出verygood,若成绩在60分到85分,输出good,成绩在30分到60分,输出nogood,成绩小于30分,则输出verybad.(用并列条件和条件嵌套两种方法做,注意复合条件的使用)方法一:方法二:附录四:第八课时课内题目1、输入年月,输出本月有几天?(分别用if语句和case语句编程计算)(参考程序) 分析:不管是哪一年,1,3,5,7,8,10,12月都是31天,4,6,9,11都是30天,只有2月份,才考虑是否闰年。 闰年年份能够被4整除,但不能被100整除,或者能够被400整除。一、if语句 IF语句是由一个布尔表达式和两个供选择的操作序列组成。运行时根据布尔表达式求值结果,选取其中之一的操作序列执行。有两种形式的IF语句: if <布尔表达式> then34 <语句>; if <布尔表达式> then<语句1> else<语句2>; 当布尔表达式的值为真,则执行then后面的语句,值为假时有两种情况:要么什么也不做,要么执行else后面的语句。注意else前面没有分号,因为分号是两个语句之间的分隔符,而else并非语句。如果在该处添了分号,则在编译的时候就会认为if语句到此结束,而把else当作另一句的开头,输出出错信息。例:求y=f(x),当x>0时,y=1,当x=0时,y=0,当x<0时,y=-1 programlianxi; varx,y:real; begin ifx>0theny:=1; ifx=0theny:=0; ifx<0theny:=-1; writeln('y=',y); end. 在TurboPascal语言if语句中被构造的语句只能是一条语句,当条件选择某个分支的计算要用多个语句描述时,就必须把该分支用begin和end括来,写成复合语句。在用if语句连续嵌套时,如果你插入适量的复合语句,有利于程序的阅读和理解。例:当x>0时候,计算x*x,并且输出x和x*xprogramlianxie3; varx,x1:real; begin readln('x=',x); ifx>=then begin x1:=x*x; writeln('x*x=',x1); writeln('x=',x); end; end.当if语句嵌套时,TurboPascal约定else总是和最近的一个if配对。二、case语句 case语句是由一个表达式和众多可选择的操作序列组成。运行时,根据表达式的求值结果,在众多的分支中选取一个分支执行。其形式为: case 表达式 of 常量1:语句1; 常量2:语句2; …… 常量n:语句n; else 语句n+1{可选项} 34 end; 表达式只能是顺序类型(除了实型以外的简单类型),其值必须是唯一确定并且和表达式类型相同。case语句执行和表达式值相匹配的case常数所指向的那条语句,如果没有相匹配的值,则执行else部分(如果有的话)或者什么也不做。在else前面的语句末尾有分号,这是和if语句不同的。例:根据学生的成绩给予相应的等低,对应关系如下: 90——100 A 80——89 B 60——79 C 60以下 D programchengji; vars:real;ch:char; begin write('inputthescore:'); readln(s); if(s>=0)and(s<=100)then casesdiv10of 10,9:ch:='B'; 8:ch:='B'; 7,6:='C'; elsech:='D'; end; writeln(s,'--',ch); end.循环结构程序设计——(程序设计第九、第十、第十一、第十二、第十三、第十四课时内容) 一、FOR语句 二、WHILE语句 三、REPEAT语句 四、GOTO语句附录一:第九课时课内题目17.编程计算从1到20每个数的平方值。18、编程计算S1=1+2+3+……+99+100,S2=1+2+3+……n19、计算(阶乘)n!,其中n由键盘输入。(n!=1*2*3*……*n)20、按正序和反序输出26个英文字母。附录二:第十课时课内题目21、输出1到1000之间的能够被3整除的数。22、统计1到1000之间能够同时被3和7整除的数的个数,并计算他们的和。23、编程求100到300之间有多少个其各位数字之和为5的倍数,并逐个输出。(例如,172,1+7+2=10)附录三:第十一课时课内题目24、求100-999中的水仙花数。三数abc,满足a*a*a+b*b*b+c*c*c=abc,则称abc为水仙花数例样:153,因为13+53+33=1+125+27=15325、求2-1000中的守形数(若某数的平方,其低位与该数本身相同,则称该数为守形数。例如25,25*25=625,625的低位25与原数相同,则称25为守形数636525附录四:第十二课时课内题目26、判断某数是否质数(素数)。分析:质数(素数)是只能被1和它本身整除,也即某数m是质数,则,2到m-1中的任何数都不能整除m。27、求质数表:输入一个自然数n,输出1到之间的所有质数。(当n比较大时,就应该采用快速法)34 附录五:第十三课时课内题目28、找3-1000中的亲密数对,注意不要重复显示。(如果A的因子和等于B,B的因子和等于A,且A<>B,则称A,B为亲密数对。例如284和220,220的因子有1,2,4,5,11,20,22,44,55,110,他们和为284,284的因子有1,2,4,71112,他们和为220。31、输入n,输出1到n中的所有完全数(完全数指所有的因数之和等于它本身的数,如6=1+2+3,6是完全数)附录六:第十四课时课内题目29、已知Faibonacai(费波那契)数列的前几项0、1、1、2、3、5、8132134……,编程输出求出前20项。30、数列A1,A2,A3,A4,……,A20。已知A1=0,A2=1,A3=1,A4=A1+2*A2+A3,A5=A2+2*A3+A4…输出求出前20项。附录七:第十五课时课内题目——(补充题目:循环的嵌套)编程输出以下形状的字符组合:题1题2题3**************************************** * ** *** *********题4题5 * *** ***** ************************* ******* ***** *** *37、输出九九乘法表。附录八:第十六课时课内题目附录九:第十七课时课内题目附录十:第十八课时课内题目附录十一:第十九课时课内题目附录二:第二十课时课内题目附录七:第十五课时课内题目2、验证哥德巴赫猜想(这是一个古老而著名的数学难题,至今还没有得到最后的证明):每一个大于2的偶数都可以表示成两个质数之和。如4=2+2;8=3+5;98=19+79。34 分析:x=p+q,验证p和q同时为质数即可,利用穷举法,p从2到x-2开始验证,同时验证q=x-p是不是质数。1、计算S=1+1/2+1/3+1/4+1/5+……+1/n(n=1000) (分别用for语句和while编写这个程序)。方法一:方法二:2、密码检测程序:输入密码,如果正确,输出"Youarewelcome!",密码错误则输出"Youarewrong,Tryagain!",如果连续三次输入密码错误,则输出"Youarelost!"。1、键入一个四位整数,必须是四位数,如果不是,要求重新输入,直到输入的数是4位数为止,然后将其各位数字倒序输出。2、编程计算猴子吃桃问题:有一天小猴摘了很多桃子,当即吃了一半,还觉得不过瘾,又多吃了一只;第二天接着吃了剩下的桃子中的一半,仍不过瘾,又多吃了一只;以后每天都吃尚存桃子的一半零一只。到第5天早上就只剩下一只了,问小猴那天共摘了多少只桃子。3、编程求求一元二次方程ax2+bx+c=0(a≠0)解(a,b,c由键盘赋值)一、for语句 for语句用来描述已知重复次数的循环结构。for语句有两种形式: (1)for控制变量:=初值 to 终值 do 语句; (2)for控制变量:=初值 downto 终值 do 语句; 第一种形式的for语句是递增循环。首先将初值赋给控制变量,接着判断控制变量的值是否小于或等于终值,若是,则执行循环体,在执行了循环体之后,自动将控制变量的值该为它的后继值,并重新判断是否小于或等于终值。当控制变量的值大于终值时,退出for循环,执行for语句之后的语句。第一种形式的for语句是递减循环。首先将初值赋给控制变量,接着判断控制变量的值是否大于或等于终值,若是,则执行循环体,在执行了循环体之后,自动将控制变量的值该为它的前趋值,并重新判断是否大于或等于终值。当控制变量的值小于终值时,退出for循环,执行for语句之后的语句。for语句中的初值、终值、控制变量的数据都必须是顺序类型。当初值和终值确定后,重复的次数就确定不变了,并且控制变量在重复语句内不能施加任何赋值操作。例:计算1+2+3+……+99+100 programjia; varn,sum:integer; begin sum:=0; fori:=1to100do sum:=sum+i; writeln(sum); end.二、while语句 while语句用于“当满足某一条件时进行循环”的情况。while语句的语法格式: while布尔表达式 do 语句; 循环结束条件在进入循环体之前测试,若最初的测试值为false,则根本不进入循环体,也就是说while循环是是属于当型循环。为了能使while重复能终止,循环体中一定要有影响布尔表达式的操作,否则该循就是一个死循环。例:计算从0到某个数之间所有奇数的和。 programjishu; var34 odds,limit,sum:integer; begin readln(limit); sum:=0; odds:=1; whileodds<=limitdo begin sum:=sum+odds; odds:=odds+2 end; writeln(sum:1) end.三、repeat语句 repeat语句用于“重复执行循环体,一直到指定的条件为真时为止”。 语法格式为:repeat 语句1; …… 语句n; until 布尔表达式; repeat重复基本上有和while重复一样的描述循环计算的能力,但有一些不同:在repeat语句的结构中,布尔表达式求值在计算操作之后,而while语句中,布尔表达式求值在计算操作之前,也就是说repeat至少执行一次循环体。while语句的成分语句只能是一个语句。因此,当重复动作包含多个语句时,要用begin和end,使它变成一个复合语句。而repeat语句的保留字repeat和until已经起语句括号作用,可以包含多个语句而无须begin和end。repeat语句中,当布尔表达式为true时结束循环,而while语句中,是当表达式为false时才结束循环。当描述由计算操作后的情况确定重复是否继续进行的计算时,通常用repeat语句描述。四、goto语句 goto语句是无条件转向语句,它可以控制直接从程序的一条语句转向另一条语句。 goto语句的语法形式为: goto 标号; 其中标号必须是不超过4位整数的正整数或标识符组成,但标号必须在说明语句中先予以说明。goto语句会使程序出现一种称为“乱面条”的结构,因此你最好还是不要去用。枚举型和子界型—— 一、类型定义 二、枚举型 三、子界型 四、类型相容和赋值相容一、类型定义 类型定义的语法格式: type <标识符1>=<类型1>; <标识符1>=<类型1>; …… <标识符n>=<类型n>;二、枚举类型 通过预定义列出所有值的标识符来定义一个有序集合,这些值的次序和枚举类型说明中的标识符的次序识一致的。枚举类型的形式:(标识符1,……,标识符n) 例如:type34 daystype=(sunday,monday,tuesday,wednesday,thursday,friday,saturday) 枚举元素只能是标识符,而不能是数值常量或字符常量。例如以下的定义是错误的: typedaystype=('sun','mon','tue','wed','thu','fri','sat') 枚举元素是标识符,不要把作为枚举元素的标识符视作变量名,它不能被赋值。同一个枚举元素不能出现在两个或两个以上的枚举类型定义中。例如以下的定义是错误的: typedaytype1=(monday,tuesday); daytype2=(monday,wednesday); 可以将枚举类型的定义和变量的定义结合在一起。例如:vara:(monday,tuesday,sunday) 枚举类型属于顺序类型。根据定义类型时各枚举元素的排列顺序确定它们的序列,序列号从0开始 例如:已经定义daystype ord(sunday)=0,succ(sunday)=monday,pred(friday)=thursday 但是枚举类型中的第一个元素没有前趋,最后一个元素没有后继。TurboPascal不允许直接读写枚举值,所以枚举值的输出常用case语句间接的输出。枚举值的输入,则要一一判断读入字符是否是枚举类型的标识符。若是才能赋给枚举变量,否则就会出错。 例如:枚举值的输出 casedayof sunday:write('sunday'); monday:write('monday'); tuesday:write('tuesday'); wednesday:write('wednesday'); thursday:write('thursday'); friday:write('friday'); saturday:write('saturday'); end;三、子界类型 子界类型是由整型、字符型、枚举型、布尔型的两个常量指定该类型的值域区间。子界类型的形式: 常量..常量两个常量必须是同一种顺序类型。例如:a..b,要求a<=b 例如: typea=1..3; b='a'..'d'; 一个子界类型继承它的常量类型的运算符和标准函数,常量类型相容的不同子界类型可以混合运算,可以赋值。可以将子界类型的定义和变量的定义结合在一起。例如:vara:1..9 例 按月、日、年顺序读入一日期,输出该日期是这一年中的第几天。 programdate; varyear:0..2010; month,i:1..12; day:1..31; dayth:integer; begin read(month,day,year); dyath:=0; fori:=1tomonth-1do caseiof 1,3,5,7,8,10,12:dayth:=dayth+31; 2:if((yearmod4=0)and(yearmod100<>0)or(yearmod400=0) then34 dayth:=dayth+29 elsedayth=:=dayth+28; 4,6,9,11:dayth:=dayth+30; end; dayth:=dayth+day; writeln(dayth) end.四、类型相容和赋值相容 1.类型相容性 类型相容是对参加同一运算的两个对象的类型要求。设有两个变量,如果满足下列条件之一,就说这两个变量的类型相容。 (1)两个变量的类型相同 a.两个变量被同一类型说明。 例如:vara,b:1..30; b.两个变量的类型是同一类型标识符。 例如:vara:1..30;b:1..30; c.两个变量的类型是不同的类型标识符,但在类型定义中已经说明两个标识符相同。 例如:typedate=1..100;range=date; varm:data;n:range; (2)一个变量的类型是另一个变量的子界。 (3)两个变量的类型都是同一基类型的子界。 (4)两个变量的类型是基类型相容的集合类型。 (5)两个变量的类型是成分相同的串类型。 2.赋值相容性 赋值相容是对赋值操作的两个对象的类型要求。设赋值语句“:=”左边的变量类型为T,右边表达式的类型为E,若类型T和类型E满足下列条件之一,则称他们是赋值相容的。 (1)T和E是相同的类型,而且类型不是文件类型,也不是具有文件类成分的构造类型。 (2)T是实型,而E是整型或整型的子界。 (3)T和E是类型相容的顺序类型,并且E的值不超出T所定义的值的范围 (4)T和E是类型相容的集合类型,并且E的值不超出T所定义的值的范围 (5)T和E是类型相容的串类型。 当T和E是顺序类型或都是集合类型时,不仅要求这两个类型是相容的,而且要求E的值不超出T所定义的值的范围;否则将产生类型溢出,而这种错误只能在你运行程序时进行检查,因此你必须要避免不发生这种错误。数组—— 一、数组 二、字符串一、数组 1.数组的定义 数组是程序中最常用的结构数据类型,用来描述由固定数目的同一类型的元素组成的数据结构。数组的每个元素和下标相关联,根据下标指示数组的元素。数组的存储方式为按行存储,在编译阶段,计算机根据数组的类型说明,确定其存储空间的大小。数组可以是任何顺序类型。 数组的定义形式: array[<下标类型1>,……<下标类型n>]of<元素类型>34 其中n称为数组的维数,每维的下标类型必须是一个顺序类型,通常为子界类型或枚举类型,其作用是指定数组下标的编制方式和下标取值范围。例如:type color=(red,yellow,blue); sample1=array[1..10]ofinteger;{有10个元素的一维数组} sample2=arrayp[1..5,1..5]ofreal;{有25个元素的二维数组,依次按[1,1]……,[1,5],[2,1]……,[2,5],……[5,1],……[5,5]} 2.数组的操作 当数组的元素类型为简单类型时,其下标变量和简单类型变量一样使用。例如: a[50]:=50; a[20]:=a[5]; 一个数组,下标的起始值和终止值是在类型定义中给定的,不能在程序执行中再通过其他途径来改变,所以数组元素的个数在程序运行期间是固定不变的。数组变量作为整体仅允许同类型数组之间的赋值运算。 例如:varx,y:array[1..10]ofinteger; x::=y 例:读入5个学生的学号和成绩,计算他们的平均分,若比平均分高10分的等第为A,若比平均分高小于10分的等地为B,若低于平均分,则等第为C,输出他们的成绩和等第。 programsample7d1(input,output); constn=5; type no=array[1..n]ofinteger; s=array[1..n]ofreal; var i:integer; k:real; num:no; score:s; begin k:=0; fori:=1tondo begin readln(num[i],score[i]); k:=k+score[i]; end; k:=k/n; fori:=1tondo begin write(num[i],score[i]); if(score[i]-k)>=10thenwriteln('A') elseif((score[i]-k)<10)and((score[i]-k)>0)thenwriteln('B') elsewriteln('C'); end; end.一维数组34 1、定义:var a:array[1..10]ofinteger; 其中:a是这一批数据的名称,称为数组名;array、of是定义数组的保留字;中括号中的数字是数据编号的下限和上限,财时也说明了数据的个数(上限-下限);最后一个是数据的基类型,如integer,char,real,boolean。2、数组元素的输入:数组名代表的并不是一个变量,而是一批变量,因而,不能直接整个数组读入,而是要逐个数组元素读入,通常用循环结构来完成这一功能。下面是几个常用输入数组元素的例子:fori:=1to10doread(a[i]); {————从键盘读入数组元素的值;最常用的方法}fori:=1to10doa[i]:=i; {————数组元素a[1]到a[10]的值分别为1到10;数据赋初值}fori:=1to10doa[i]:=0; {————数组元素清0;最常用的数据初始化的方法}fori:=1to10doa[i]:=random(100); {————随机产生10个100以内的数,赋给各数组元素}3、数组元素的输出: 和数组元素的输入相同,数组元素的输出也不能由一个write语句直接完成。同样要逐个数组元素输出。通常也用循环结构来完成这一功能:fori:=1to10dowrite(a[i],'');{————数组元素之间用空格分隔}writeln; 4、数组的应用: 例1:从键盘输入10个数,将这10个数逆序输入,并求这10个数的和,输出这个和。programp1;var a:array[1..10]ofinteger; i,s:integer;begin fori:=1to10doread(a[i]); fori:=10downto1dowrite(a[i],''); writeln; s:=0; fori:=1to10dos:=s+a[i]; writeln('s=',s);end. 例2:用筛法求100以内的素数(质数)。分析:素数是除了1和它本身以外没有其它约数的数。用筛法求素数的方法是:用质数筛去合数:从第一个素数2开始,把它的倍数去掉;这样2以后的第一个非0数就一定也是素数,把它的倍数也删了……重复这个删数过程,直到在所找到的素数后再也找不到一个非0数。把所有非0数输出。programp2;var a:array[1..100]of34 integer; i,j,k:integer;begin fori:=1to100doa[i]:=i; a[1]:=0;i:=2; whilei<=100do begin k:=i; whilek<=100do begin k:=k+i; a[k]:=0; end; {————上面将所有a[i]的倍数清0} i:=i+1; whilea[i]=0doi:=i+1; {————查找接下来的第一个非0数} end; fori:=1to100doifa[i]<>0thenwrite(a[i],'');end.2、二维数组一维数组在编程中多用于描述线性的关系:如一组数;一组成绩;一组解答等。数组元素只有一个下标,表明该元素在数组中的位置。二维数组在编程中多数用于描述二维的关系:如地图、棋盘、城市街道、迷宫等等。而二维数组元素有两个下标:第一个下标表示该元素在第几行,第二个下标表示在第几列。1.二维数组的定义:var a:array[1..10,1..5]ofinteger; 其中:a是数组名,由程序员自定;array和of是定义数组的保留字;(这两点和一维数组定义的格式一样)中括号中的两个范围表示二维数组共有多少行、多少列(第一个范围表示行数,第二个范围表示列数);最后一个表示数组元素的类型,规定和一维数组一样。如上例,定义了一个二维数组a,共有10行5列。2.使用二维数组: 1、数组元素的指称:数组名[行号,列号]。如第三行第四个元素:a[3,4]。 对某一行进行处理。如累加第4行的数据。则固定行号为4。如:fori:=1to5dos:=s+a[4,i]; 对某一列进行处理。如累加第4列的数据。则固定列号为4。如:fori:=1to10dos:=s+a[i,4]; 2、二维数组的输入输出要用双重循环来控制:fori:=1to10do{————控制行数}begin forj:=1to5doread(a[i,j]){————第一行读入5个元素} readln;{————读入一个换行符}end;{————最常用的方法:从键盘读入数据初始化二维数组}fori:=1to10do forj:=1to5do34 a[i,j]:=0;{————最常用的方法:将二维数组清0}fori:=1to10dobegin forj:=1to5dowrite(a[i,j]:4); writeln;end;{————最常用的输出方法:按矩阵形式输出二维数组的值}例1:竞赛小组共有20位同学,这学期每位同学共参与了三项比赛,请统计每位同学的平均分。分析:定义一个20行3列的二维数组来存放这些成绩。定义一个20个元素的一维数组来存放平均分。programp1;var a:array[1..20,1..3]ofinteger; b:array[1..20]ofreal; i,j:integer;begin fori:=1to20do begin forj:=1to3doread(a[i,j]); readln; end;{————从键盘上读入20个同学的三次竞赛成绩} fori:=1to20dob[i]:=0;{————先将平均分数组清0} fori:=1to20do begin forj:=1to3dob[i]:=b[i]+a[i,j];{————计算总分} b[i]:=b[i]/3;{————计算平均分} end; fori:=1to20dowrite(b[i]:5:1);{————输出平均分}writeln;end.二、字符串 为了使程序能够处理文字信息,TurboPascal特别引入了字符串类型,其值表示一个具有可变长度的字符序列。字符串类型定义形式为: strign[n]或者string 其中正整数n(1<=n<=255)表示构成字符串的字符最多个数,即通常所说的字符串最大长度。而字符串的实际长度决定程序运行时的实际字符个数,可以由函数length返回。若字符串说明中没有指定长度,缺省值为255。 字符串类型定义字符串连接操作‘+’,是将两个字符串连接成新字符串。连接操作允许字符串类型和字符串类型混合运用。 字符串常量可以通过常量说明语句 const34 字符串常量名:string[n]='字符串'; 规定其常量的串长n,并赋初值。例如:consthead:string[7]='zhoufei'; TurboPascal还提供了不少预定义函数和过程: (1)字符串函数函数名 自变量及类型 意义 结果类型concat s1[,s2……,sN]:string 连接字符串序列 stringcopy s:string,index,count:integer 返回串s的一个子串 stringlength s:string 返回串s的动态长度 integerpos substr,s:string 返回子串substr在串s中的起始位置 byte 过程名 自变量及类型 意义delete vars,source:string;index,count:integer 从串S中删除一个子串insert vars:string;index:integer; 在串S中插入一个指定子串str varx[:width[:Decimals]];s:string 把一数值转换成相应的字符串表示val vars:string;code:integer 把一字符串转换成相应的数值有关字符串的操作:操作类型作用返回值例子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,code)过程将字符串s转为数值,存在k中;code是错误代码 vars:string;k,code:integer;begins:='1234';val(s,k,code);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:='HonestAbeLincoln';Delete(s,8,4);Writeln(s);{'HonestLincoln'}Insert(s1,S,w)过程将s1插到s中第w位 S:='HonestLincoln';Insert('Abe',S,8);{'HonestAbeLincoln'}Pos(c,S)函数求字符c在s中的位置整型S:='123.5';i:=Pos('',S);{i的值为1}+运算符将两个字符串连接起来 s1:='1234';s2:='5678';s:=s1+s2;{'12345678'} 例:字符串函数调用示例program34 samplefun; const tur='turbo'; pas='pascal'; var st:string[60]; p:byte; begin st:=concat(tur,pas,'isbetterthan','stand',pas,'.'); writeln(st); writeln(length(st)); st:=copy(st,29,15); writeln(st); p:=pos(pas,st); writeln(p); p:=pos(tur,st); writeln(p); end.例:字符串过程调用示例 programguocheng; const typedstring:string='turbopascalisbetterthanstandardpascal.'; total:real=388.4; var totalstring:string[60]; integervalue:integer; realvalue:real; status:integer; begin delete(typedstring,13,40); writeln(typedstring); insert('using',typedstring,1); writeln(typedstring); str(total:8:2,totalstring); writeln(totalstring); str(total,totalstring); writeln(totalstring); val('-33',integervalue,status); writeln(integervalue,'':2,status); val('-33.99',realvalue,status); writeln(realvalue:6:2,'':2,status); end.34 函数和过程—— 一、函数 二、过程 三、形参和实参 四、标识符的作用域一、函数 如果一个子程序执行后能够返回其结果制,那么它就可以用于表达式中,称这种子程序为函数,这种语句序列的定义称为函数说明。函数说明形式如下: function 函数名(形式参数表):函数类型; 说明部分; begin 语句1; 语句2; …… 语句n end 函数返回一个函数值,过程则能完成一系列各种操作。函数的调用方式出现在表达式中,而过程调用是一句独立的语句。 例:计算|X|的函数 functionzhoufei(x:real):real; varz:integer; begin ifx>=0thenz:=x elsez:=-x zhoufei:=z; end; 函数说明第一行为函数首部。它指明函数名、函数形参信息和函数值的数据类型。如上面求x绝对值的函数说明,函数名是zhoufei;它有一个值参数X为实型;函数值的数据类型为实型。TurboPascal规定一个函数只能求出一个简单值,所以函数值类型只能是任何非结构类型。 除函数首部和过程首部的句法略有差别外,函数体和过程体完全相同。函数体中至少要有一条语句对函数名赋值。如函数zhoufei中有语句“power:=z”。函数的每次求值至少要执行这样的一条语句,为次计算求得一个值。返回时就把这个值带调用的地方。二、过程 给某个语句序列组成的子程序赋于一个适当的名字。程序中凡是需要出现这个语句序列的地方,可以简单的写上子程序的名字。这种完成一个操作的子程序称为过程;子程序的定义称为过程说明。 过程说明由过程首部和过程体组成,其形式如下: procedure过程名(形式参数表);-------过程首部 说明部分; begin 执行语句; …… end; 例:输出两个数中最大值的过程procedurelargest(a,b:integer);beginifa>bthenwriteln(a)else34 writeln(b);end. 上面largest过程由两个类型为整型的形式参数:a,b,你向过程传入的两个需要比较大小的数。三、形参和实参 子程序调用(过程调用或函数调用)的执行顺序分为以下几步: 实参和形参结合——〉执行子程序——〉返回调用处继续执行 子程序说明的形式参数表对子程序体直接引用的变量进行说明,详细指明这些参数的类别、数据类型要求和参数的个数。子程序被调用时必须为它的每个形参提供一个实参,按参数的位置顺序一一对应,每个实参必须满足对应形参的要求 TurboPascal子程序形参有四类: 1.值参数 形式参数表中前面没有var,后有类型的参数。它类似过程和函数的局部变量,仅为过程和函数的执行提供初值而不影响调用时实际参数的值。在调用过程或应用函数时,值参数所对应的实际参数必须是表达式,而且它的值不能使文件类型或包括文件类型的值。实参必须和形参赋值相容。 2.变量参数 形式参数表中前面有var后由类型的参数。如果需要子程序向调用程序返回值时,应采用变量参数。变量参数要求它的实参是和它同一类型的变量。因为在子程序执行时,遇到对相应形参的引用式定值,就是对相应实参的引用式定值,即对形参的任何操作就是对实参本身的操作。 3.无类型变量参数 形式参数表中前面有var而后面没有类型的参数。形参是无类型变量,对应的实参允许为任意类型的变量,但要在子程序中设置的强制类型转换(类型名(无类型变量参数名)),将无类型变量参数改变为相应类型。 4.子程序参数 用过程首部或函数首部作为形式参数。四、标识符的作用域 1.全局变量和它的作用域 全局变量是指在程序开头的说明部分定义和说明的量。它的作用域分为两种情况: (1)在全局变量和局部变量不同名时,其作用域是整个程序。 (2)在全局变量和局部变量同名时,全局变量的作用域不包含同名局部变量的作用域。 2.局部变量和它的作用域 凡是在子程序内部使用的变量,必须在子程序中加入说明。这种在子程序内部说明的变量称为局部变量。局部变量的作用域是其所在的子程序。形式参数也只能在子程序中有效。因此也属于局部变量。局部变量的作用域分为两种情况: (1)当外层过程序的局部变量名和嵌套过程中的局部变量不同名时,外层过程的局部变量作用域包含嵌套过琛。 (2)当外层过程的局部变量名和嵌套过程内的局部变量名同名时,外层局部变量名的作用域不包含此过程。集合与记录—— 一、集合 二、记录一、集合 以已知序数类型值的集合为值,所构成的类型是集合类型,称已知序数类型为基类型。 集合类型的定义形式为: 集合类型名=setof 基类型34 限定基类型为枚举类型、字符型、布尔型以及它们的子界和整型子界。由于基类型中不能超过256个可能值,且它们的序数值应在0..255之间,因此基类型不能是短整型、整型、长整型。 表示一个集合值的最通用的方法是逐个枚举集合的元素。下面是集合值标记的例子: [3,9,15,20]{由3,9,15,20组成的集合} [ ]{空集} ['l'..'p','z' ]{由字符l,m,n,o,p,z组成的集合} 两个相连的集合对象之间,可以通过下列运算符进行运算: + 产生一个包含两个集合元素的集合 * 产生一个只包含两个集合元素公共元素的集合 - 产生一个包含所有属于第一个集合、但不属于第二个机和的元素的集合 例如:[A,B,C]+[D]等于[A,B,C,D] [A,B,C]*[A]等于[A] [A,B,C]-[A]等于[B,C] 关系运算符: = 检查两个集合所包含的元素相同 <> 检查两个集合不相等 <= 检查第一个集合中的元素都在第二个集合中出现 >= 检查第一个集合中的元素包含第二个集合中的所有元素 in 检查集合基类型的一个元素属于集合例如:[A,B,C]=[A,B,C] 等于true [A,B,C]<>[C,B,A] 等于FALSE二、记录 记录是描述同一对象的一组类型可能不同的数据的集合。使用记录类型实现了数据逻辑关系和存放形式上的一致。定义记录类型的一般形式 记录类型名=record 域名1:类型1; 域名2:类型2; …… 域名m:类型m; end;例如:表示学生信息的记录定义type stype=record name:string[20]; number:integer; sex:(male,female); class:1..20 address:string end; 域为记录类型的元素。记录的每个域都有名称,不同域的数据类型可以各不相同,这一点是数组所不能做到的。引用记录变量的元素采用以下标记法: (1)直接引用,其形式为 记录变量名.域名 例如:varstr1,str2:stype; 则str1.name表示学生str1的姓名,str2.sex表示学生str2的性别。 (2)使用with开域语句,其形式为 with记录变量名do34 语句 在with语句中,引用记录变量名不再冠以记录变量名,以简化对记录中域的引用写法。例如描述100个学生的数据信息,引入元素类型为stype的数组students。 var students:array[1..100]ofstype; number_of_boy,number_of_girl,k:integer: 例如下面是一段统计一个班级中男生人数和女生人数的程序。 begin number_of_boy:=0;number_of_girl:=0; fork:=1to100do withstudent[k]do ifsex=malethennumber_of_boy:=number_of_boy+1 elsenumber_of_girl:=number_of_girl+1 end; with语句的嵌套结构的一般形式: with<记录变量名1> do with<记录变量名2> do …… with<记录变量名n> do <语句>; 使用with嵌套结构时,with的嵌套顺序必须和所打开的记录的嵌套顺序一致,以就是说外层with打开外层记录,内层with打开内层记录。上面的嵌套格式也可以简写为: with<记录变量名1,记录变量名2,……,记录变量名n> do <语句>; 若记录是由一部分固定不变和另一部分变化部分是随固定部分中的某个数据项的具体取值而定的数据项所组成的称为记录变体。带记录变体的记录类型定义有以下形式: type <类型标识符>=record <域名1>:<类型1>; <域名2>:<类型2>; …… <域名n-1>:<类型n-1>; case<标志域>:<类型n>of <常量表1>:<域表1>; <常量表2>:<域表2>; …… <常量表m>:<域表m>; end;例:重新定义描述学生信息的记录类型stype,对于大专生,不需要增加其他信息,对于本科生,增加专业信息type stype=record name:string[20]; number:integer; sex:(male,female); class:1..20 address:string casestudtype:(s,u)34 of s:(); u:(major:string); end;指针—— 一、指针的动态变量 二、对动态变量的操作一、指针的动态变量 1.定义指针类型 在TurboPascal中,指针变量中存放的某个存储单元的地址,即指针变量指向某个存储单元。一个指针变量仅能指向某一种类型的存储单元,这种数据类型是在指针类型的定义中确定的,称为指针类型的基类型。指针类型定义如下: 类型名=^基类型名; 例如:typeq=^integer; vara,b,c:q; 说明q是一指向整型存储单元的指针类型,其中"^"为指针符。a,b,c均定义为指针变量,分别可以指向一个整型存储单元。 上例也可定义为: vara,b,c:^integer; 指针也可以指向有结构的存储单元。 例如:typeperson=record name:string[10]; sex:(male,female); age:20..70 end; varpt:^person; pt为指向记录类型person的指针变量。 2.动态变量 应用一个指针指向的动态存储单元即动态变量的形式如下: 指针变量名^ 例如:p^、q^、r^ 指针变量p和它所指向的动态变量^p之间有如下关系: 以下语句把整数5存放到p所指向的动态变量p^中去:p^:=5; 以下语句把p所指向的p^中的值赋给整型变量i:i:=p^; 如果指针变量p并未指向任何存储单元,则可用下列赋值语句:p:=nil; 其中nil是TurboPascal保留字,表示“空”,相当于C里面的null二、对动态变量的操作 在TurobPascal程序中,动态变量不能由var直接定义而是通过调用标准过程new建立的。过程形式为: new(指针变量名); 如果有下列变量定义语句: varp:^integer;34 仅仅说明了p是一个指向整型变量单元的指针变量,但这个整型单元并不存在,在指针变量p中还没有具体的地址值。在程序中必须通过过程调用语句:new(p);才在内存中分配了一个整型变量单元,并把这个单元的地址放在变量p中,一个指针变量只能存放一个地址。在同一时间内一个指针只能指向一个变量单元。当程序再次执行new(p)时,又在内存中新建立了一个整型变量单元,并把新单元的地址存放在p中,从而丢失了旧的变量单元的地址。 为了节省内存空间,对于一些已经不使用的现有动态变量,应该使用标准过程dispose予以释放。过程形式为:dispose(指针变量名);为new(指针变量名)的逆过程,其作用是释放由指针变量所指向的动态变量的存储单元。例如在用了new(p)后在调用dispose(p),则指针p所指向的动态变量被撤销,内存空间还给系统,这时p的值为nil。 例:输入两个数,要求先打印大数后打印小数的方式输出,用动态变量做。 programdongtai; typeintepter=^integer; varp1,p2:intepter; procedureswap(var,q1,q2:intepter); varp:integer; begin p:=q1;q1:=q2;q2:=p; end; begin new(p1);new(p2); writeln('input2data:');readln(p1^,p2^); ifp1^