Pascal基本教程 第八章
pascal吧
全部回复
仅看楼主
level 1
第八章 其它数据类型8.1 用户自定义类型8.1.1 用户自定义类型Turbo Pascal语言提供了丰富的数据类型,充分利用语言本身提供的各种类型,可扩大计算机的数据处理范围和处理能力。到目前为止我们已经学习标准类型(实型、整型、字符型、字符串型)、数组型、文件型,数据类型的分类请参考1.2.6章节。用户自定义类型包括子界型和枚举型。8.1.2 枚举类型及其应用我们经常会遇到类似如:每周组成数据信息仅由星期一到星期日这些数据构成,即星期一至星期日这些特定值的集合构成了每周的数据类型。具有这种特点的类型又称为枚举型。枚举类型由允许的所有枚举值构成。定义格式如下:TYPE <枚举类型标识符>=(<标识符>,<标识符>,...,<标识符>);VAR <枚举类型变量表>:<枚举类型标识符>;注意:(1)枚举值只能由字母开头的字母数字组合,枚举值不区分字母大小写。枚举值在所有枚举数型的定义中只能出现一次。 (2)枚举类型属有序类型,即每一个枚举值都有其对应的序号,编号从0开始,因此枚举值也可比较大小,可用于for循环中作递增或递减值,即循环变量可以是枚举型变量。 (3) 枚举型变量或枚举值不能在read、readln、write、 writeln语句中使用。例如:定义一种关于星期的枚举类型如下:type day=(sunday,monday,tuesday,wednesday,thursday,friday,saturday);var payday,firstday,today,tomorrow:day;说明:(1)day为用户自定义的枚举类型标识符,其中sunday, monday, tuesday, wednesday, thursday, friday, saturday称为枚举值,不区分大小写字母,即sunday与Sunday代表同一个值。 (2)每一个枚举值都有其对应的序号,即sunday对应序号为0,monday序号为1,....,saturday对应序号为6。如:ord(sunday)=0, pred(monday)=sunday,succ(sunday)=monday等,其中函数ord求序号,pred函数和succ函数分别求前序值和后序值。枚举值可比较大小,如:monday>sunday,结果为true。 (3)read(today);write(today);write(sunday)都是不允许的,即枚举型变量、枚举值是不能直执用read读语句或write写语句进行读写。例如:下面枚举型定义有错type 错误原因 t1=('a','b','c','d'); 不能用字符串常量,即不能加引号。 t2=(1,2,3,4); 必须要以字母开头。 t3=(sun,mon,tue,wed,sun); t4=(wed,thu,fri,sat);由于不能直接读和打印枚举值,所以我们通过case,if等语句实现对应输出。例8.1 :输入今天是星期几,打印出明天是星期几。program rzy8_1;type day=(sunday,monday,tuesday,wednesday,thursday,friday,saturday);var today,tomorrow:day; number:integer;function nextday(n:integer):string; var week:string; begin case n of 0:today:=sunday; 1:today:=monday; 2:today:=tuesday; 3:today:=wednesday; 4:today:=thursday; 5:today:=friday; 6:today:=saturday; end; if today=saturday then tomorrow:=sunday else tomorrow:=succ(today); case tomorrow of sunday:week:='sunday'; monday:week:='monday'; tuesday:week:='tuesday'; wednesday:week:='wednesday'; thursday:week:='thursday'; friday:week:='friday'; saturday:week:='saturday'; end; nextday:=week; end;begin write('enter today',#39,'s number(0--6):'); repeat readln(number); until (number>=0) and (number<=6); writeln('tomorrow is ',nextday(number));
2008年01月27日 07点01分 1
level 1
end.例8.2 从输入源文件中去掉注释,并输出到新文件中。参考程序如下:program rzy8_2;var inf,ouf:text; stinf,stouf:string;procedure init; begin write('enter input file name=');readln(stinf); write('enter output file name=');readln(stouf); assign(inf,stinf);assign(ouf,stouf); {$I-} reset(inf);rewrite(ouf); {$I+} if ioresult<>0 then begin writeln('File not find!'); halt; end; end;procedure procefile; type statetype=(copy,comment); var ch:char; state:statetype; begin state:=copy; while not eof(inf) do begin read(inf,ch); case state of copy:if ch='{' then state:=comment else write(ouf,ch); comment:if ch='}' then state:=copy; end; end; close(inf);close(ouf); end;begin init; procefile;end.本程序使用了枚举型变量存放是否要复制的标记(复制copy和注释comment),这样做比以采用boolean型变量来标记好处是:使程序可读性更强,尤其是标记值超过两种的情况。8.1.3子界类型及其应用在有序的数据中,我们经常只用到它们其中某连续范围段,如:年龄取0到150岁。在程序运行时经常碰到某个变量超出了问题的实际允许值但仍有运行结果的不合理情况,因此为了发现程序中变量值是否超出了预期的范围,也为了解变量含义提供信息,增加程序的可读性,适当地定义子界类型是有必要的。子界类型的一般定义如下:type <子界类型标识符>=<常量1>..<常量2>; var <子界类型变量表>:<子界类型标识符>;说明:(1)子界类型决定了该类型的变量可以取值的范围(界于量常1和常量2之间)。(2)常量1和常量2必须属于同一个有序类型(整数、字符型、布尔型、枚举型)。且常量1的次序数必须小于常量2的次序数。(3)实数不是有序数型,因些不能作子界数型的子界值;若用到枚举值作子界值,必须在子界类型前定义好对应的枚举数型。例如: type day=(sunday,monday,tuesday,wednesday,thursday,friday,saturday); schoolday=monday..friday;说明:因为day为枚举类型,枚举值为sunday到saturday,是有序类型,所以可定义学校工作日类型为schoolday子界类型,它的子界值范围取monday到friday。例:8.3 用子界型修改例6.1,使程序可读性更强。program rzy8_3;type yeartype=1..10000; monthtype=1..12; daytype=28..31;var y:yeartype; m:monthtype;function ddays(year:yeartype;month:monthtype):daytype; var days:daytype; y:boolean; begin y:=(year mod 4=0)and(year mod 100<>0)or(year mod 400=0); case month of 1,3,5,7,8,10,12:days:=31; 4,6,9,11:days:=30; 2:if y then days:=29 else days:=28; end; ddays:=days; end;begin write('enter year and month:'); readln(y,m); writeln('year=',y,' month=',m,' days=',ddays(y,m) );end.在turbo Pascal集成环境设定值范围检查的方法(依次执行下面操作即可):Alt + O è[Compiler] è Tab èâè [X] Range checking 在Range checking前的[ ]内按空格即可填入[X],表示程序运行时要进行值范围检查。另外在程序中也可以用{$R+}设定开始进行值范围检查,再用{$R-}设定开始取消值范围检查。如果在肯定程序
正确的
前提下,把值范围检查取消,可提高程序运行速度。编程和调试程序时不要取消值范围检查,因为它可以提供我们有关程序的错误信息提示。请同学们用帮助文件进一步理解其它编译开关的设定及作用。当您在程序中加入了编译开关或在Turbo Pascal集成环境中重新设定了编译开关,记住要用Turbo Pascal的[Compile]的[Compile]命令重新编译运行程序一次,再运行程序,否则可能运行的程序仍然是旧程序。
2008年01月27日 07点01分 2
level 1
8.2 集合类型8.2.1 集合类型有些数据,如每年有12个月,分别定为jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec,而冬季的月份应为dec,jan,feb春季为mar,apr,may等,在计算机中如何用数据表达冬天和春天呢?在Pascal中用集合类型就能很容易表达。集合类型与数组类型一样,同属理简单构造类型,请参考1.2.6章节。集合类型的一般定义如下:type <集合类型标识符>=set of <基类型>;var <集合类型变量表>:<集合类型标识符>;说明:(1)Turbo Pascal中集合的基数型必须是有序类型。例如:整数的子界型、字符型,布尔型、枚举型等,而整型、实型、字符串型、数组等不能作为集合的基类型。但允许数组的基类型为集合类型。集合最多256个元素,如果元素的基类型为子界值为整数的子界型,数值只能取0至255,超出会出错。 (2)集合类型与枚举型一样,不能直接用read和write语句读写。例如:下面定义用集合定义春季和夏季的方法:8.2.2 集合类型的运算及应用集合运算有“并交差”运算、关系运算,运算对象必须是类型相容的两个集合,运算结果与集合中元素排列顺序无关。(一)、集合的“并交差”运算:(1)集合的并运算(运算符+)定义:两个集合元素的汇集。如:[1,3,4]+[1,2,4] 结果为:[1,2,3,4] ['a','h','c']+['k','a','c']结果为:['a','c','h','k'] (2)集合的交运算(运算符*)定义:两个集合所共有的元素集合。如:[1,3,4]*[1,2,4] 结果为:[1,4] ['a','h']*['b','c'] 结果为:[ ] 又称空集。 (3)集合的差运算(运算符-)定义:被减集合中不属于减集合的元素集合。 [1,3,4]-[1,2,4] 结果为[3] ['a','h']-['b','c'] 结果为['a','h']注意:集合的“并交差”运算结果与集合元素排列顺序无关。 (二)、集合的关系运算集合的关系运算的结果是布尔型。关系运算有:=、<>、<=、>=。但要注意不能用>和<两运算符。(1)=和<>运算:判别两个集合是否有相同元素。如:[1,3]=[3,1] 结果是true [1,3]<>[3,1] 结果是false [2,1]<>[1,3] 结果是true [1,3]=[3,4] 结果是false (2) <= 和>=运算:表示子集和包集的关系。即一个集合是否为另一集合的子集。如:[1,3]<=[1,2,3,4] 结果为true [1,3]>=[1,2,3,4] 结果为false [ ] <=[1,3] 结果为true(三)、检查一特定元素是否属于集合的in运算如:3 in [1,2,3] 结果为true 'a' in ['a','c','f'] 结果为 true利用in 运算,我们可以把(ch>='a') and(ch<='k') 写成 ch in [a..k]。又如c在1到6和10到100之间,可写成c in [1..6,10..100]。也说明了集合中可用“..”表示连续数列。例:8.4 从文章中分离出该文章的元音字母集和辅音字母集,不区分大小写。 program rzy8_4;type lettertype='A'..'z'; gathertype=set of lettertype;var vowel,consonant:gathertype; inf,ouf:text; stinf,stouf:string;procedure init; begin write('enter input file:');readln(stinf); write('enter output file:');readln(stouf); assign(inf,stinf);assign(ouf,stouf); {$I-} reset(inf);rewrite(ouf); {$I+} if ioresult<>0 then begin writeln('file not found!'); halt; end; end;procedure readarticle; var c:char; v,l:gathertype; begin v:=['a','e','i','o','u']; l:=['A'..'Z','a'..'z']; vowel:=[]; consonant:=[]; while not eof(inf) do begin read(inf,c); if c in l then begin c:=char(ord(upcase(c))
+3
2);
2008年01月27日 07点01分 3
level 1

2011年11月11日 12点11分 5
level 12
+1
2013年11月26日 04点11分 6
level 7
现在pascal的书很少了
2013年11月29日 13点11分 7
1