1个回答
展开全部
Pascal系统把具有共同特征的同一有序类型的对象汇集在一起,形成一个集合,可将集合类型的所有元素作为一个整体进行集合运算。
[例5.11]用随机函数产生20个互不相同的40到100的随机整数,然后按从小到大顺序打印。
解:按以下步骤处理:
①为使产生的随机整数互不相同。因此,每产生一个数,都要判断集合中已否包含,如果没有包含,就放到集合中,并统计个数,直到20个。
②将集合中的数移到数组中,此题利用下标序号从小到大的特征进行映射排序打印。
Pascal程序:
Program Exam511;
Uses Crt ;
Var a: Array[40..100] Of boolean;
dd: set Of 40..100; {定义集合dd}
n: Integer;
Procedure Init; {定义产生并处理随机数的过程}
Var i,m: Integer;
Begin
n:=0;dd:=[ ]; {集合dd初值为空}
repeat
begin
Randomize; {将随机发生器作初始化处理}
m:=Random(100); {产生随机整数m}
if not (m in dd) and (m > 40 ) then
begin
dd:=dd+[m]; inc(n) {把m放入集合dd中}
end;
end
until n=20;
End;
Procedure Print; {定义打印过程}
Var i,j,k:Integer;
Begin
fillchar(a,sizeof(a),false); {将数组a的各元素置false值}
For i:=40 To 100 Do
if i in dd then a[ i ]:=true; {以集合元素值为下标的数组元素赋真值}
For i:=40 To 100 Do {以下标号为序(从小到大)输出}
If a[ i ] Then Write(i:4); {输出a数组中元素值为真的下标号}
End;
Begin {主程序}
Clrscr;
init; {产生随机数,并存入集合中}
print; {打印}
Repeat Until KeyPressed;
End.
程序中定义了集合类型DD,集合的元素为子界类型。
Var 集合变量名:set of 元素的类型;
定义集合类型的一般格式是:
集合的值放在一对方括号中,各元素用逗号隔开,与排列的顺序无关,因此,[9,2,5]和[2,5,9]的值相等,没有任何元素的集合是空集合,用[ ]表示。如果集合的元素是连续的,可用子界表示,如[5,6,7,8,9]可表示为[5 .. 9] 。
集合变量名:= 集合表达式;
集合的赋值格式为:
集合有以下几种运算:
1.集合的交、并、差运算:(设两个集合 a:=[1,2,4,6] 和 b:=[4,6,7,8] )
①集合的并: a+b即组合成新的集合(为[1,2,4,6,7,8]);
②集合的交: a*b即将a,b集合中的公共元素组合成新的集合(为[4,6,]);
③集合的差: a-b即在a中的元素去掉在b中出现的之后,所剩下的集合(为[1,2])。
2.集合的比较:
①相等:a=b,若两个集合中的元素个数相等,每个元素相同,则两个集合相等,比较结果为真(ture),否则为假(false);
②不等:a < > b表示两个集合不相等;
③包含:a > = b表示a集合包含b集合中的所有元素;
a < = b表示a集合是b集合的子集。
3.集合的测试运算:检查某个数据在集合中,测试结果为ture;不在集合中,测试结果为false;例如:
6 in [8,6,9,4] 结果为ture; { 6在集合[8,6,9,4]中为真 }
2 in [8,6,9,4] 结果为false; { 2在集合[8,6,9,4]中为假 }
从程序Exam511的输出部分可看到,集合类型的值不能直接输出,要用测试方法进行输出或转换成数组元素的值。
[例5.12]用集合进行筛法求200以内的素数。
解:①将[2..200]放入集合S中;
②取S中的第一个元素值nxt,放入集合P中,同时将S中的凡是nxt的倍数的元素全部“划”去;
③重复步骤②,直至S集合为空;
④用测试运算打印P集合中全部元素值。
Pascal程序:
Program Exam512;
Uses crt;
const n=200;
var s,p: set of 2..n; { s,p为集合类型}
nxt,j,t: byte;
begin
clrscr;
s:=[2..n]; {将[2..n]赋给s}
p:=[ ];
nxt:=2; t:=0;
repeat
while not(nxt in s) do
nxt:=succ(nxt); {后继函数}
p:=p+[nxt]; j:=nxt; {将nxt放入P中}
while j<=n do
begin
s:=s-[j]; inc(j,nxt) {筛掉S中的处理过的元素}
end;
if nxt in p then {用测试运算进行输出}
begin
inc(t); write(nxt :6);
if t mod 6=0 then writeln
end;
until s = [ ];
readln
end.
集合内的元素个数不能超过255个,如果要用超过255个成员的集合类型求素数,必须用小集合的数组来表示大集合,即把大集合分成若干个小集合,每个小集合只是数组的元素,(数组元素为一个小集合)整个数组就是一个大集合。筛法运用在每个数组元素(小集合)中进行。
[例5.13]将自然数1--9这九个数分成三组,将每组的三个数字拼成为三位数,每个数字不能重复,且每个三位数都是完全平分数。请找出这样的三个三位数。
解:①自定义函数yes,用集合判定九个数字是否有重复,采用逆向思维,假设做邓了三个三位完全平方数:
将三个三位完全平方数分离成单个数字放入集合dd中,检查集合dd,如果自然数1~9每个数恰好都在集合dd中,函数yes赋真(ture) ;只要有一个不在集合中,九个数字没有占完集合中的九个位置,则必有重复,函数值为假(false),因为集合中对相同数字视为同一成员,如果有重复,则集合中不足9个成员(用测试运算)。
②程序用1131平方产生三位的完全平方数。用循环方式每次取三个数为一组,存入a数组。
③对a数组的三位数调用自定义函数yes处理;
④如果函数yes值为真,就打印a数组中的三个数。
Pascal程序:
Program exam513;
Uses Crt;
Var a: Array[1..3] Of Integer;
i, j, k, x: Integer;
Function yes: Boolean; {处理是否有重复数字}
Var i: Integer;
d: Set Of 0 .. 9; {集合元素为子界类型}
Begin
d:=[ ]; {集合的初值为空集合}
For i:=1 To 3 Do {将a数组中三个数分离成单个数并放入集合d}
d:=d+[a[ i ] Div 100, (a[ i ] Mod 100) Div 10, a[ i ] Mod 10];
yes:=true;
For i:=1 To 9 Do
If Not ( i In d ) Then yes:=false; {只要有一个不在集合中即为假}
End;
Begin
writeln;
or i:=11 to 29 do {在三位完全平方数范围内循环推出三个数}
Begin
a[1]:=i*i; {第一个三位的完全平方数}
for j:=i+1 to 30 do
begin
a[2]:=j*j; {第一个三位的完全平方数}
for k:=j+1 to 31 do
begin
a[3]:=k*k; {第一个三位的完全平方数}
If yes Then {调用自定义yes函数结果为真就输出}
For x:=1 To 3 Do Writeln( x:8, ':', a[x]:8 );
end
end
end;
Repeat Until KeyPressed;
End.
[例5.11]用随机函数产生20个互不相同的40到100的随机整数,然后按从小到大顺序打印。
解:按以下步骤处理:
①为使产生的随机整数互不相同。因此,每产生一个数,都要判断集合中已否包含,如果没有包含,就放到集合中,并统计个数,直到20个。
②将集合中的数移到数组中,此题利用下标序号从小到大的特征进行映射排序打印。
Pascal程序:
Program Exam511;
Uses Crt ;
Var a: Array[40..100] Of boolean;
dd: set Of 40..100; {定义集合dd}
n: Integer;
Procedure Init; {定义产生并处理随机数的过程}
Var i,m: Integer;
Begin
n:=0;dd:=[ ]; {集合dd初值为空}
repeat
begin
Randomize; {将随机发生器作初始化处理}
m:=Random(100); {产生随机整数m}
if not (m in dd) and (m > 40 ) then
begin
dd:=dd+[m]; inc(n) {把m放入集合dd中}
end;
end
until n=20;
End;
Procedure Print; {定义打印过程}
Var i,j,k:Integer;
Begin
fillchar(a,sizeof(a),false); {将数组a的各元素置false值}
For i:=40 To 100 Do
if i in dd then a[ i ]:=true; {以集合元素值为下标的数组元素赋真值}
For i:=40 To 100 Do {以下标号为序(从小到大)输出}
If a[ i ] Then Write(i:4); {输出a数组中元素值为真的下标号}
End;
Begin {主程序}
Clrscr;
init; {产生随机数,并存入集合中}
print; {打印}
Repeat Until KeyPressed;
End.
程序中定义了集合类型DD,集合的元素为子界类型。
Var 集合变量名:set of 元素的类型;
定义集合类型的一般格式是:
集合的值放在一对方括号中,各元素用逗号隔开,与排列的顺序无关,因此,[9,2,5]和[2,5,9]的值相等,没有任何元素的集合是空集合,用[ ]表示。如果集合的元素是连续的,可用子界表示,如[5,6,7,8,9]可表示为[5 .. 9] 。
集合变量名:= 集合表达式;
集合的赋值格式为:
集合有以下几种运算:
1.集合的交、并、差运算:(设两个集合 a:=[1,2,4,6] 和 b:=[4,6,7,8] )
①集合的并: a+b即组合成新的集合(为[1,2,4,6,7,8]);
②集合的交: a*b即将a,b集合中的公共元素组合成新的集合(为[4,6,]);
③集合的差: a-b即在a中的元素去掉在b中出现的之后,所剩下的集合(为[1,2])。
2.集合的比较:
①相等:a=b,若两个集合中的元素个数相等,每个元素相同,则两个集合相等,比较结果为真(ture),否则为假(false);
②不等:a < > b表示两个集合不相等;
③包含:a > = b表示a集合包含b集合中的所有元素;
a < = b表示a集合是b集合的子集。
3.集合的测试运算:检查某个数据在集合中,测试结果为ture;不在集合中,测试结果为false;例如:
6 in [8,6,9,4] 结果为ture; { 6在集合[8,6,9,4]中为真 }
2 in [8,6,9,4] 结果为false; { 2在集合[8,6,9,4]中为假 }
从程序Exam511的输出部分可看到,集合类型的值不能直接输出,要用测试方法进行输出或转换成数组元素的值。
[例5.12]用集合进行筛法求200以内的素数。
解:①将[2..200]放入集合S中;
②取S中的第一个元素值nxt,放入集合P中,同时将S中的凡是nxt的倍数的元素全部“划”去;
③重复步骤②,直至S集合为空;
④用测试运算打印P集合中全部元素值。
Pascal程序:
Program Exam512;
Uses crt;
const n=200;
var s,p: set of 2..n; { s,p为集合类型}
nxt,j,t: byte;
begin
clrscr;
s:=[2..n]; {将[2..n]赋给s}
p:=[ ];
nxt:=2; t:=0;
repeat
while not(nxt in s) do
nxt:=succ(nxt); {后继函数}
p:=p+[nxt]; j:=nxt; {将nxt放入P中}
while j<=n do
begin
s:=s-[j]; inc(j,nxt) {筛掉S中的处理过的元素}
end;
if nxt in p then {用测试运算进行输出}
begin
inc(t); write(nxt :6);
if t mod 6=0 then writeln
end;
until s = [ ];
readln
end.
集合内的元素个数不能超过255个,如果要用超过255个成员的集合类型求素数,必须用小集合的数组来表示大集合,即把大集合分成若干个小集合,每个小集合只是数组的元素,(数组元素为一个小集合)整个数组就是一个大集合。筛法运用在每个数组元素(小集合)中进行。
[例5.13]将自然数1--9这九个数分成三组,将每组的三个数字拼成为三位数,每个数字不能重复,且每个三位数都是完全平分数。请找出这样的三个三位数。
解:①自定义函数yes,用集合判定九个数字是否有重复,采用逆向思维,假设做邓了三个三位完全平方数:
将三个三位完全平方数分离成单个数字放入集合dd中,检查集合dd,如果自然数1~9每个数恰好都在集合dd中,函数yes赋真(ture) ;只要有一个不在集合中,九个数字没有占完集合中的九个位置,则必有重复,函数值为假(false),因为集合中对相同数字视为同一成员,如果有重复,则集合中不足9个成员(用测试运算)。
②程序用1131平方产生三位的完全平方数。用循环方式每次取三个数为一组,存入a数组。
③对a数组的三位数调用自定义函数yes处理;
④如果函数yes值为真,就打印a数组中的三个数。
Pascal程序:
Program exam513;
Uses Crt;
Var a: Array[1..3] Of Integer;
i, j, k, x: Integer;
Function yes: Boolean; {处理是否有重复数字}
Var i: Integer;
d: Set Of 0 .. 9; {集合元素为子界类型}
Begin
d:=[ ]; {集合的初值为空集合}
For i:=1 To 3 Do {将a数组中三个数分离成单个数并放入集合d}
d:=d+[a[ i ] Div 100, (a[ i ] Mod 100) Div 10, a[ i ] Mod 10];
yes:=true;
For i:=1 To 9 Do
If Not ( i In d ) Then yes:=false; {只要有一个不在集合中即为假}
End;
Begin
writeln;
or i:=11 to 29 do {在三位完全平方数范围内循环推出三个数}
Begin
a[1]:=i*i; {第一个三位的完全平方数}
for j:=i+1 to 30 do
begin
a[2]:=j*j; {第一个三位的完全平方数}
for k:=j+1 to 31 do
begin
a[3]:=k*k; {第一个三位的完全平方数}
If yes Then {调用自定义yes函数结果为真就输出}
For x:=1 To 3 Do Writeln( x:8, ':', a[x]:8 );
end
end
end;
Repeat Until KeyPressed;
End.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询