《Pascal程序设计(第9课)-集合、类型(精品).ppt》由会员分享,可在线阅读,更多相关《Pascal程序设计(第9课)-集合、类型(精品).ppt(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第9 9课课目目前前为为止止,我我们们已已经经学学习习了了4 4个个标标准准类类型型(实实型型、整整型型、字字符符型型、布布尔尔型型)和和2 2个个用用户户定定义义简简单单类类型型(枚枚举举型型、子子界界型型),1 1个个用用户户定定义义结结构构类类型型(数数组组)。本本节节将将研研究究另另一一个个用用户户定定义义结构类型结构类型集合。集合。PascalPascal是是包包括括集集合合数数据据类类型型的的第第一一个个通通用用程程序序设设计计语语言言,在在PascalPascal中中允允许许执执行行通通常常的的集集合合运运算算并并、交交、差差。此此外外,使使用用集集合合成成员员检检查查可可以以
2、方方便便的的知知道道一一个个特特定定的的数数据据项项是是否否是是某集合中的项。某集合中的项。在在数数学学中中,集集合合由由一一对对包包含含集集合合元元素素的的花花括括号号(如如11,3 3,5 5,7 7,99)表表示示,由由于于花花括括号号在在PascalPascal中中用用于于注注释释,所所以以我我们们用用方括号方括号代替花括号代替花括号表示集合表示集合。【集合类型】集合类型】集合类型的一般定义形式如下:集合类型的一般定义形式如下:TypeType =set of set of ;VarVar :;可以合并成如下形式:可以合并成如下形式:VarVar :set of set of ;例如:
3、例如:typetype num=set of char;num=set of char;var var n:num;n:num;或或 varvar n:set of char;n:set of char;【集合类型说明】集合类型说明】集合类型的一般定义形式如下:集合类型的一般定义形式如下:TypeType =set of set of ;VarVar :;注注意意1 1:基基类类型型必必须须是是有有序序类类型型,如如整整型型子子界界、字字符符型型、布布尔尔型型、枚枚举举类类型型等等,而而整整型型、实实型型、数数组组等等不不能能作作为为集集合合的的基基类型。但是允许数组的基类型是集合类型。类型。
4、但是允许数组的基类型是集合类型。注注意意2 2:为为了了程程序序效效率率,PascalPascal编编译译程程序序都都限限制制了了集集合合类类型型值值的的数数目目,所所以以整整型型不不能能作作为为集集合合的的基基类类型型,而而整整型型的的子子界界可可以作为集合的基类型。以作为集合的基类型。【集合类型说明】集合类型说明】1 1、赋值空集和全集:、赋值空集和全集:处理集合之前,一般都要给集合变量赋以初值。例如:处理集合之前,一般都要给集合变量赋以初值。例如:TypeType month=(month=(janjan,febfeb,mar,mar,aprapr,may,may,junjun,julj
5、ul,augaug,sep,sep,octoct,novnov,decdec);monthset monthset=set of month=set of month;Var Var winter,summer:winter,summer:monthsetmonthset;Begin Begin winter:=winter:=decdec,janjan,febfeb;summer:=summer:=junjun.augaug;说说明明:定定义义完完枚枚举举类类型型monthmonth之之后后,用用它它作作为为基基类类型型定定义义了了集集合合类类型型monthsetmonthset,然然后后用
6、用集集合合类类型型标标识识符符monthsetmonthset定定义义了了两两个集合类型变量个集合类型变量winterwinter和和summersummer。【集合运算】集合运算】集合的赋值语句形式为:集合的赋值语句形式为:=;比如上面的两个赋值语句:比如上面的两个赋值语句:winter:=winter:=decdec,janjan,febfeb;第第1 1句句 summer:=summer:=junjun.augaug;第第2 2句句注意:注意:a a、集集合合表表达达式式可可以以是是集集合合值值,集集合合值值由由一一对对方方括括号号和和已已定定义义的的集集合合基基类类型型的的值值表表组组
7、成成(比比如如第第1 1句句),连连续续的的值值可可以以写写成成子子界界的的形形式式(比如第(比如第2 2句)。句)。b b、集集合合表表达达式式也也可可以以是是另另一一个个集集合合变变量量或或使使用用PascalPascal集集合合运运算算的的两个或多个集合的运算式,但必须赋值相容。两个或多个集合的运算式,但必须赋值相容。c c、集合表达式的所有元素必须包括在左端集合变量的基类型中。集合表达式的所有元素必须包括在左端集合变量的基类型中。d d、任何集合在参加运算之前总是应该初始化的:任何集合在参加运算之前总是应该初始化的:【集合运算】集合运算】我我们们有有时时希希望望使使一一个个集集合合为为
8、空空,不不包包含含任任何何元元素素。在在PascalPascal中,空集合由一对方括号中,空集合由一对方括号 表示,如:表示,如:summer:=summer:=。如果要将集合初始化为全集,需要包括基类型的所有值。如果要将集合初始化为全集,需要包括基类型的所有值。例:例:TypeType Letterset=set of a.z Letterset=set of a.z;VarVar Vowel,letter:letterset Vowel,letter:letterset;BeginBegin Vowel:=a,e,i,o,uVowel:=a,e,i,o,u;初初始始化化为为元音集合元音集合
9、 Letter:=a,z Letter:=a,z;初始化为全集初始化为全集【集合运算】集合运算】2 2、集集合合的的并并交交差差 :集集合合的的并并交交差差要要求求类类型型相相容容的的两两个个集集合作为运算对象。合作为运算对象。两个集合的并(两个集合的并(+):):定义为在任意集合中或两个集合中元素的汇集。定义为在任意集合中或两个集合中元素的汇集。如:如:11,2 2,4+24+2,3 3 是是 1 1,2 2,3 3,4 4 1 1,3+23+2,4 4 是是 1 1,2 2,3 3,44 a,d+c,d,f a,d+c,d,f 是是 a,c,d,fa,c,d,f两个集合的交(两个集合的交(
10、*):):定义为两个集合所共有的所有元素的汇集。定义为两个集合所共有的所有元素的汇集。如:如:11,2 2,4*24*2,3 3 是是 2 2 1 1,3*23*2,4 4 是是 a,d*c,d,f a,d*c,d,f 是是 dd两个集合的差(两个集合的差(-):):定义为在集合定义为在集合A A中,而不在集合中,而不在集合B B中元素的汇集。中元素的汇集。如:如:11,2 2,4-24-2,3 3 是是 1 1,44 1 1,3-23-2,4 4 是是 1 1,33 a,d-c,d,f a,d-c,d,f 是是 aa 1,2,3,4-4,1,3,2 1,2,3,4-4,1,3,2 是是 【集
11、合运算】集合运算】2 2、集合的并交差、集合的并交差 :注意:注意:a a、在在集集合合中中的的次次序序是是无无关关紧紧要要的的,集集合合1,2,3,41,2,3,4和和4,1,3,24,1,3,2被被认认为为是是相相 同的,所以上式中它们的差为空集。同的,所以上式中它们的差为空集。b b、当当运运算算符符“+“+、*、-”-”两两边边的的运运算算对对象象是是集集合合时时,便便执执行行相相应应的的集集合合运算。如:运算。如:并并 set1+set2set1+set2 交交 set1*set2set1*set2 差差 set1-set2set1-set2 其中其中set1set1和和set2se
12、t2是集合变量或集合值(括在方括号中的元素表)。是集合变量或集合值(括在方括号中的元素表)。c c、集集合合运运算算的的优优先先规规则则:先先*后后+、-,统统计计从从左左到到右右计计算算,为为了了避避免免混混淆淆,最好使用括号。最好使用括号。d d、当当我我们们希希望望在在一一个个已已有有的的集集合合中中加加入入一一个个新新的的元元素素时时,要要通通过过将将已已有有的集合与由新元素组成的单个元素集合相加得到。的集合与由新元素组成的单个元素集合相加得到。例例如如:要要在在集集合合11,3 3,4 4,55中中加加入入新新元元素素2 2应应写写成成:11,3 3,4 4,5+25+2,得到的集合
13、为,得到的集合为11,2 2,3 3,4 4,55。【集合运算】集合运算】3 3、集合的关系运算:、集合的关系运算:在在集集合合中中可可以以进进行行的的关关系系运运算算有有:=(相相等等)、(不不等等)、=(包集)。(包集)。运算运算=和和用于检查两个运算是否包含同样的元素。用于检查两个运算是否包含同样的元素。例如:例如:11,3=33=3,1 1 结果为结果为 truetrue;1 1,31,3 31,3 结果为结果为 falsefalse;1 1,2 2,4=34=3,4 4 结果为结果为 falsefalse;运运算算=决决定定子子集集关关系系,如如果果集集合合a a的的每每个个元元素素
14、也也是是集集合合b b的的元元素素,则则称称集集合合a a是集合是集合b b的子集(的子集(a=ba=b)。)。空集是任何集合的子集。空集是任何集合的子集。1 1,3=13=1,3 3 结果为结果为 truetrue;1 1,3=13=1,2 2,3 3,4 4 结果为结果为 truetrue;1 1,3 3,5=15=决决定定包包集集关关系系,如如果果集集合合b b的的每每个个元元素素也也是是集集合合a a的的元元素素,则则称称集集合合a a是集合是集合b b的包集(的包集(a=ba=b)。)。任何集合都是空集的包集。任何集合都是空集的包集。1 1,3=13=1,3 3 结果为结果为 tru
15、etrue;1 1,3=13=1,2 2,3 3,4 4 结果为结果为 falsefalse;1 1,3 3,5=15=1,5 5 结果为结果为truetrue;【集合运算】集合运算】4 4、集合元素的输入和输出:、集合元素的输入和输出:集集合合变变量量不不能能直直接接输输入入和和输输出出,我我们们通通常常这这样样进进行行:首首先先将将集集合合变变量量值值为为空空集集,然然后后逐逐个个读读入入集集合合的的每每个个元元素素值值,并并构成单值集合与集合变量相加。构成单值集合与集合变量相加。为为了了输输出出一一个个集集合合变变量量的的值值,可可以以采采用用这这样样的的办办法法:用用ININ运运算算逐
16、逐个个测测试试集集合合基基类类型型所所允允许许的的每每个个元元素素,看看它它是是否否包包含含于这个集合变量中,若是则输出这个元素。于这个集合变量中,若是则输出这个元素。【集合运算】集合运算】分分析析:定定义义两两个个集集合合s1s1和和s2s2,分分别别表表示示元元音音字字母母集集合合和和辅辅 音音 字字 母母 集集 合合,它它 们们 的的 基基 类类 型型 是是 字字 符符 的的 子子 界界a.za.z。再再定定义义两两个个整整型型变变量量n1n1和和n2n2存存放放个个数数,定义字符变量定义字符变量chch存放读入的字符。存放读入的字符。例例1 1:输入一串字符,以:输入一串字符,以?结束
17、,组成元音字母集合,辅结束,组成元音字母集合,辅音字母集合,然后输出两个集合元素及其元素个数。音字母集合,然后输出两个集合元素及其元素个数。例例1 1:输入一串字符,以:输入一串字符,以?结束,组成元音字母集合,辅结束,组成元音字母集合,辅音字母集合,然后输出两个集合元素及其元素个数。音字母集合,然后输出两个集合元素及其元素个数。Program example1Program example1(input,outputinput,output););Var Var s1,s2:set of a.z s1,s2:set of a.z;n1,n2:integer n1,n2:integer;ch
18、ch:char:char;Begin Begin s1:=s1:=;s2:=s2:=;n1:=0 n1:=0;n2:=0 n2:=0;read(read(chch);读入第一个字符读入第一个字符 while while chch?do?do Begin Begin If If chch in a.z in a.z Then Then If If chch in in a,e,i,o,ua,e,i,o,u Then s1:=s1+Then s1:=s1+chch Else s2:=s2+Else s2:=s2+chch;read(read(chch);End End;WritelnWriteln
19、;For For chch:=a to z do:=a to z do If If chch in s1 in s1 Then begin Then begin write(write(chch);n1:=n1+1 n1:=n1+1 End End;Writeln Writeln;Writeln Writeln(n1=,n1)(n1=,n1);ForFor ch ch:=a to z do:=a to z do If If chch in s2 in s2 Then begin Then begin Write(Write(chch);n2:=n2+1 n2:=n2+1 End End;Wri
20、teln Writeln;Writeln Writeln(n2=,n2)(n2=,n2);End.End.分分析析:素素数数是是大大于于1 1,且且除除了了1 1和和它它本本身身外外不不能能被被其其它它任任何何整数所整除的整数。整数所整除的整数。用用筛筛选选法法求求素素数数的的基基本本思思想想是是:首首先先将将整整数数存存放放于于某某集集合合中中,然然后后从从集集合合中中选选出出当当前前最最小小的的元元素素,将将它它作作为为素素数数输输出出,再再从从集集合合中中去去掉掉其其所所有有倍倍数数;再再找找集集合合中中最最小小的的元元素素,将将它它作作为为素素数数输输出出,从从集集合合中中去去掉掉其其
21、所所有有的的倍倍数数如如此此继续,直到集合为空。继续,直到集合为空。用筛选法求用筛选法求2-1002-100中的所有素数的算法如下:中的所有素数的算法如下:1 1、建立集合、建立集合2.1002.100 2 2、RepeatRepeat 3 3、找出当前集合中最小的数(即素数)找出当前集合中最小的数(即素数)4 4、打印该最小数打印该最小数 5 5、从集合中去掉该素数的所有倍数从集合中去掉该素数的所有倍数 6 6、Until Until 集合为空集合为空例例2 2:用筛选法求素数。:用筛选法求素数。Program example2Program example2(input,outputinp
22、ut,output););Const Const n=100 n=100;Var Var s:set of 1.n s:set of 1.n;i,j:integer i,j:integer;Begin Begin s:=2.n s:=2.n;i:=2 i:=2;Repeat Repeat While not(i in s)do While not(i in s)do 找到当前最小的数找到当前最小的数 i:=i+1 i:=i+1;Writeln Writeln(i)(i);j:=i j:=i;While j=n do While j=n do Begin Begin s:=s-j s:=s-j;
23、j:=j+i j:=j+i;End End;Until s=Until s=;End.End.例例2 2:用筛选法求素数。:用筛选法求素数。记记录录类类型型是是PascalPascal允允许许用用户户定定义义的的又又一一新新的的结结构构数数据据类类型型。象象数数组组一一样样,一一个个记记录录是是两两个个或或多多个个有有关关数数据据项项的的汇汇集集,但但它与数组不同,一个记录的每个分量可以具有不同的类型。它与数组不同,一个记录的每个分量可以具有不同的类型。【记录类型】记录类型】1 1、记录说明:在使用一个记录之前,必须说明它的类型。、记录说明:在使用一个记录之前,必须说明它的类型。记录类型的一般
24、定义形式为:记录类型的一般定义形式为:TypeType =RecordRecord :类型;:类型;:类型;:类型;:类型:类型 End End;其其中中RecordRecord和和EndEnd是是两两个个保保留留字字,必必不不可可少少。域域标标识识符符可可以以是是一一个个标标识识符符或或多多个个标标识识符符。类类型型可可以以是是任任何何标标准准的的或或用用户户定定义义的数据类型,包括结构类型,比如数组或记录类型。的数据类型,包括结构类型,比如数组或记录类型。【记录类型】记录类型】记录类型的一般定义形式为:记录类型的一般定义形式为:TypeType =RecordRecord :类型;:类型;
25、:类型;:类型;:类型:类型 End End;例如:例如:Type Type mont mont=(=(janjan,febfeb,mar,mar,aprapr,may,may,junjun,juljul,augaug,sep,sep,octoct,novnov,decdec);date=record date=record month:month:montmont;day:1.31 day:1.31;year:integer year:integer;end end;Var Var day1,day2:date day1,day2:date;【记录类型】记录类型】记录类型记录类型dateda
26、te包括三个域:包括三个域:monthmonth,dayday和和yearyear。它们分别是枚举类型、子界类型它们分别是枚举类型、子界类型和整型。和整型。day1day1和和day2day2是记录类型变量。是记录类型变量。1 1、记录类型的赋值:、记录类型的赋值:(1 1)同类型的记录变量可以整体拷贝。)同类型的记录变量可以整体拷贝。如:如:day2day2:=day1=day1;(2 2)给给每每个个分分量量(域域)可可以以分分别别赋赋值值,此此时时应应写写出出完完整整的的域名,它由记录变量名后域名,它由记录变量名后+圆点圆点+域名组成。域名组成。如:如:day1.month:=day1.
27、month:=octoct;day1.day:=26 day1.day:=26;day1.year:=2005 day1.year:=2005;【记录类型】记录类型】练习练习1 1:计算:计算X Xn n。X X,n n由键盘输入由键盘输入 练习练习2 2:顺序读入字符,以:顺序读入字符,以“?”结束,然后以和输入结束,然后以和输入相反的次序输出读入的字符,用递归做。相反的次序输出读入的字符,用递归做。练习练习参考参考参考参考返回返回program lianxi1(input,output);program lianxi1(input,output);varvar a:string;a:str
28、ing;i,j:integer;i,j:integer;begin begin read(a);read(a);for i:=97 to 122 do for i:=97 to 122 do for j:=1 to 20 do for j:=1 to 20 do if if ordord(aj)=i(aj)=i then write(aj);then write(aj);end.end.练习练习1 1:从键盘上随意输入:从键盘上随意输入2020个字母,个字母,按照字母表的顺序将它们输出。按照字母表的顺序将它们输出。参考程序:参考程序:返回返回练习练习2 2:读入:读入1010个单词,按照字典次
29、序排列单词个单词,按照字典次序排列单词。program lianxi2(input,output);program lianxi2(input,output);type type word=packed array1.15 of char;word=packed array1.15 of char;varvar a:array1.10 of word;a:array1.10 of word;t:word;t:word;i,j:integer;i,j:integer;begin begin for i:=1 to 10 do for i:=1 to 10 do readlnreadln(ai);(ai);for i:=1 to 9 do for i:=1 to 9 do for j:=i+1 to 10 do for j:=i+1 to 10 do if ai aj if ai aj then begin then begin t:=ai;t:=ai;ai:=aj;ai:=aj;aj:=t aj:=t end;end;for i:=1 to 10 do for i:=1 to 10 do writelnwriteln(ai);(ai);end.end.参考程序:参考程序: