一道Pascal小问题,急!!!!!!!!

下面是一道Pascal小程序programt2;constn=200;varsi,pr:setof2..n;x,j,m:integer;beginreadln(m);si... 下面是一道Pascal小程序
program t2;
const n=200;
var si,pr:set of 2..n;
x,j,m:integer;
begin
readln(m);
si:=[2..m];pr:=[];
x:=2;
repeat
while not(x in si) do x:=succ(x);
pr:=pr+[x];
j:=x;
while j <= m do
begin si:=si-[j];j:=j+x; end;
until si=[ ];
j:=0;
for x:=m downto 2 do
if x in pr then
begin
write(x:5);inc(j);
if j mod 10=0 then writeln;
end;
writeln;
end.
请问(1)程序开头的var si,pr:set of 2..n;什么意思,既不像枚举也不像子界(2)程序第7行中的pr:=[]什么意思?怎么数组下标什么也没有?(3)程序第10行中的while not(x in si)什么意思 什么叫x in si?
以上是一些小题目,希望解答,再过几天就要初赛了,跪求答案!!!!!!
O(∩_∩)O谢谢
展开
 我来答
匿名用户
2009-10-13
展开全部
(1)var si,pr:set of 2..n; 是集合
(2)表示集合为空,初始值
(3)while not(x in si) {当x这个值不在集合si中时}
x in si 就是 x这个元素在si这个集合中
一、集合类型
集合是由具有某些共同特征的元素构成的一个整体。在pascal中,一个集合是由具有同一有序类型的一组数据元素所组成,这一有序类型称为该集合的基类型。
(一)集合类型的定义和变量的说明
集合类型的一般形式为:
set of <基类型>;
说明:①基类型可以是任意顺序类型,而不能是实型或其它构造类型;同时,基类型的数据的序号不得超过255。例如下列说明是合法的
type letters=set of 'A'..'Z';
numbers=set of 0..9;
s1=set of char;
ss=(sun,mon,tue,wed,thu,fri,sat);
s2=set of ss;
②与其它自定义类型一样,可以将类型说明与变量说明合并在一起。如:
type numbers=set of 0..9;
var s:numbers;
与 var s:set of 0..9;等价。
(二)集合的值
集合的值是用"〔"和"〕"括起来,中间为用逗号隔开的若干个集合的元素。如:
[] 空集
[1,2,3]
['a','e','i','o','u']
都是集合。
说明:①集合的值放在一对方括号中,各元素之间用逗号隔开
②在集合中可以没有任何元素,这样的集合称为空集
③在集合中,如果元素的值是连续的,则可用子界型的表示方法表示。例如:
〔1,2,3,4,5,7,8,9,10,15〕
可以表示成:
〔1..5,7..10,15〕
④集合的值与方括号内元素出现的次序无关。例如,〔1,5,8 〕和〔5,1,8〕的值相等。
⑤在集合中同一元素的重复出现对集合的值没有影响。例如,〔1,8,5,1,8〕与〔1,5,8〕的值相等。
⑥每个元素可用基类型所允许的表达式来表示。如〔1,1+2,4〕、〔ch〕、〔succ(ch)〕。
(三)集合的运算
1、赋值运算:只能通过赋值语句给集合变量赋值,不能通过读语句赋值,也不能通过write(或writeln)语句直接输出集合变量的值
2、集合的并、交、差运算:可以对集合进行并、交、差三种运算,每种运算都只能有一个运算符、两个运算对象,所得结果仍为集合。三种运算符分别用"+"、"*"、"-"表示;注意它们与算术运算的区别
3、集合的关系运算:集合可以进行相等或不相等、包含或被包含的关系运算,还能测试一个元素是否在集合中。所用的运算符分别是:=、<>、>=、<=、in
它们都是二目运算,且前4个运算符的运算对象都是相容的集合类型,最后一个运算符的右边为集合,左边为与集合基类型相同的表达式。
【例4】设有如下说明:
type weekday=(sun,mon,tue,wed,thu,fri,sat);
week=set of weekday;
subnum=set of 1..50;
写出下列表达式的值:
⑴〔sun,sat〕+〔sun,tue,fri〕
⑵〔sun,fri〕*〔mon,tue〕
⑶〔sun,sat〕*〔sun..sat〕
⑷〔sun〕-〔mon,tue〕
⑸〔mon〕-〔mon,tue〕
⑹〔sun..sat〕-〔mon,sun,sat〕
⑺〔1,2,3,5〕=〔1,5,3,2〕
⑻〔1,2,3,4〕<>〔1..4〕
⑼〔1,2,3,5〕>=〔1..3〕
⑽〔1..5〕<=〔1..4〕
⑾〔1,2,3〕<=〔1..3〕
⑿ 2 in〔1..10〕
答:表达式的值分别是:
⑴ 〔sun,sat,tue,fri〕
⑵ 〔 〕
⑶ 〔sun,sat〕
⑷ 〔sun〕
⑸ 〔 〕
⑹ 〔tue..fri〕
⑺ TRUE
⑻ FALSE
⑼ TRUE
⑽ FALSE
⑾ TRUE
⑿ TRUE
【例5】输入一系列字符,对其中的数字字符、字母字符和其它字符分别计数,输入“?”后结束
源程序如下:
program ex10_2;
var id,il,io:integer;
ch:char;
letter:set of char;
digit:set of '0'..'9';
begin
letter=['a'..'z','A'..'Z'];
digit:=['0'..'9'];
id:=0;il:=0;io:=0;
repeat
read(ch);
if ch in letter
then il:=il+1
else if ch in digit
then id:=id+1
else io:=io+1;
until ch='?';
writeln('letter:',il,'digit:',id,'Other:',io);
end.

二、记录类型
在程序中对于组织和处理大批量的数据来说,数组是一种十分方便而又灵活的工具,但是数组在使用中有一个基本限制,这就是:一个数组中的所有元素都必须具有相同的类型。但在实际问题中可能会遇到另一类数据,它是由性质各不相同的成份组成的,即它的各个成份可能具有不同的类型。例如,有关一个学生的数据包含下列项目:
学号 字符串类型
姓名 字符串类型
年龄 整型
性别 字符型
成绩 实型数组
Pascal给我们提供了一种叫做记录的结构类型;在一个记录中,可以包含不同类型的并且互相相关的一些数据。
(一)记录类型的定义
在pascal中,记录由一组称为“域”的分量组成,每个域可以具有不同的类型,记录类型定义的一般形式:
record
<域名1>:<类型1>;
<域名2>:<类型2>;
: :
: :
<域名n>:<类型n>;
end;
说明:①域名也称域变量标识符, 应符合标识符的语法规则;在同一个记录中类型中,各个域不能取相同的名,但在不同的记录类型中,两个类型中的域名可以相同
②记录类型的定义和记录变量可以合并为一个定义,如:
type date=record
year:1900..1999;
month:1..12;
day:1..31
end;
var x:date;
可以合并成:
var x: record
year:1900..1999;
month:1..12;
day:1..31
end;
③对记录的操作,除了可以进行整体赋值, 只能对记录的分量——域变量进行。
④域变量的表示方法如下:
记录变量名.域名
如前面定义的记录X,其3个分量分别为:x.year;x.month;x.day
⑤域变量的使用和一般的变量一样, 即域变量是属于什么数据类型,便可以进行那种数据类型所允许的操作。
(二)记录的嵌套
当一个记录类型的某一个域类型也是记录类型的时候,我们说发生了记录的嵌套,看下面的例子:
【例6】某人事登记表可用一个记录表示,其中各项数据具有不同的类型,分别命名一个标识符。而其中的“出生年月日”又包括三项数据,还可以用一个嵌套在内层的记录表示。
具体定义如下:
type sexs=(male,female);
date=record
year:1900..1999;
month:1..12;
day:1..31;
end;
personal=record
name:string[15];
sex:sexs;
birthdate:date;
home:string[40];
end;
【例7】设计一个函数比较两个dates日期类型记录变量的迟早。
设函数名、形参及函数类型定义为:
AearlyB(A,B:dates):boolean;
函数的形参为两个dates类型的值参数。当函数值为true 时表示日期A早于日期B,否则日期A迟于日期B或等于日期B。显然不能对A、B两个记录变量直接进行比较,而要依具体的意义逐域处理。
源程序如下:
program ex6_7;
type dates=record
year:1900.1999;
month:1..12;
day:1..31
end;
var x,y:dates;
function AearlyB(A,B:dates):boolean;
var earln:boolean;
begin
early:=false;
if (A.year<B.year) then early:=true;
if (A.year=B.year)and(A.month<B.month)
then early:=true;
if (A.year=B.year)and(A.month=B.month)and(A.day<B.day)
then early:=true;
AearlyB:=early;
end;{of AearlyB}
begin
write('Input DATE X(mm-dd-yy):')readln(X.month,X.day,X.year);
write('Input DATE Y(mm-dd-yy):')readln(Y.month,Y.day,Y.year);
if AearlyB(X,Y) then writeln(Date X early!') else writeln('Date X not early!');
end.
(三)开域语句
在程序中对记录进行处理时,经常要引用同一记录中不同的域,每次都按6.4.1节所述的格式引用,非常乏味。为此Pascal提供了一个with语句,可以提供引用域的简单形式。开域语句一般形式:
with <记录变量名表> do
<语句>
功能:在do后的语句中使用with后的记录的域时, 只要直接写出域名即可,即可以省略图10.2.2中的记录变量名和"."。
说明:①一般在with后只使用一个记录变量名。如:
write('Input year:');
readln(x.year);
write('Input month:');
readln(x.month);
write('Input day:');
readln(x.day);
可以改写成:
with x do
begin
write('Input year:');readln(year);
write('Input month:');readln(month);
write('Input day:');readln(day);
end;
②设x,y是相同类型的记录变量,下列语句是非法的:
with x,y do...;
③with后接若干个记录名时,应是嵌套的关系。如有记录说明:
var x:record
i:integer;
y:record
j:0..5;
k:real;
end;
m:real
end;
可以使用:
with x do
begin
read(i);
with y do
read(j,k);
readln(m);
end;
或简写为:
with x,y do
readln(i,j,k,m);
【例8】读入10个日期,再对每个日期输出第二天的日期。输入日期的格式是月、日、年,如9□30□1993,输出的格式为10/1/1993
分析:可用一个记录变量today表示日期。 知道一个日期后要更新为第二天的日期,应判断输入的日期是否为当月的最后一天,或当年的最后一天。
源程序如下:
program ex6_8;
type date=record
month:1..12;
day:1..31;
year:1900..1999;
end;
var today:array[1..10]of date;
i:integer;
maxdays:28..31;

begin
for i:=1 to 10 do {输入10个日期}
with today[i] do
readln(month,day,year);
for i:=1 to 10 do
with today[i] do{求第i个日期中月份最后一天maxdays}
begin
case month of
1,3,5,7,8,10,12:maxdays:=31;
4,6,9,11 :maxdays:=30;
2 :if(year mod 400=0) or( year mod 4=0)
and(year mod 100<>0)
then maxdays:=29
else maxdays:=28;
end;
if day=maxdays
then begin
day:=1;
if month=12
then begin
month:=1;year:=year+1;
end
else month:=month+1;
end
else day:=day+1;
writeln(month,'/',day,'/',year);
end;
end.

五、应用实例
【例9】编制用筛法求1-n(n≤200)以内素数的程序
分析:由希腊著名数学家埃拉托色尼提出的所谓“筛法”,步骤如下:
①将所有候选数放入筛中;
②找筛中最小数(必为素数)next,放入集合primes中;
③将next的所有倍数从筛中筛去;
④重复②~④直到筛空。
编程时,用集合变量sieve表示筛子,用集合primes存放所有素数。
源程序如下:
program ex10_3;
const n=200;
var sieve,primes:set of 2..n;
next,j:integer;
begin
sieve:=[2..n];{将所有候选数放入筛中}
primes:=[];{素数集合置空}
next:=2;
repeat
{找筛sieve中最小一个数}
while not(next in sieve) and(next<=n)do
next:=succ(next);
primes:=primes+[next];{将最小数放入素数集合中}
{将这个素数的倍数从筛中删去}
j:=next;
while j<=n do
begin
sieve:=sieve-[j];
j:=j+next;
end
until sieve=[];
j:=0;
for next:=2 to n do{打印出所有素数}
if next in primes then
begin
write(next:5);
j:=j+1;
if j mod 10=0 then writeln;
end;
writeln;
end.
搁浅白蟒河
2009-10-13 · TA获得超过3666个赞
知道小有建树答主
回答量:1086
采纳率:85%
帮助的人:472万
展开全部
1)程序开头的var si,pr:set of 2..n;是定义集合,集合中的元素是从2 到n的整数;
(2)程序第7行中的pr:=[],是先赋值pr为空集合;
(3)x in si是指整数x在集合si中。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dengkehao
2009-10-13 · TA获得超过913个赞
知道小有建树答主
回答量:302
采纳率:0%
帮助的人:265万
展开全部
(1):这是一个集合类型。
(2):pr赋值为空集,即pr这个集合里什么也没有。
(3):x in si 指x在si这个集合。
至于什么叫集合,那就得自己去看书了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
怪物猎人GX
2009-10-13
知道答主
回答量:37
采纳率:0%
帮助的人:29.9万
展开全部
这个set是集合的意思,意为2到n的一个数的集合
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式