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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一道Pascal小问题,急!!!!!!!!相关的知识,希望对你有一定的参考价值。

下面是一道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谢谢

(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.
参考技术A 1)程序开头的var si,pr:set of 2..n;是定义集合,集合中的元素是从2 到n的整数;
(2)程序第7行中的pr:=[],是先赋值pr为空集合;
(3)x in si是指整数x在集合si中。
参考技术B (1):这是一个集合类型。
(2):pr赋值为空集,即pr这个集合里什么也没有。
(3):x in si 指x在si这个集合。
至于什么叫集合,那就得自己去看书了。
参考技术C 这个set是集合的意思,意为2到n的一个数的集合

C语言的一道题,急求解。

输入一个字符串,内有数字和非数字字符,如:

a23xia56 17960? 302tab5876

将其中连续的数字作为一个整数,一次存放到一数组a中。例如 123 存在a【0】,456 存在a【1】中,统计共有多少个整数,并输出这些数。

下面是我的程序,最好能告诉我哪里有问题、谢谢
1 #include <stdio.h>
2 #include <string.h>
3
4 int main(void)
5
6 int k=0,i, j;
7 char a[100],b[100][100];
8
9 for(k=0;a[k]!= '\n';k++)
10 scanf("%c",&a[k]);
11
12 while(a[k] != '\n')
13
14 if(a[k]<='9' && a[k]>= '0')
15
16
17 j=0;
18 b[i][j] = a[k];
19 while(a[++k] <= '9' &&a[++k]>='0')
20 b[i][++j]=a[k];
21 i++;
22
23
24 printf("The number of continious integer is %i",i);
25
26 i=0;
27 j=0;
28 printf("The integers are like follows: \n");
29 /*
30 while(b[i][j] != '\0')
31
32 char *ptr;
33 ptr= b[i];
34 n[i]=atoi(ptr);
35 printf("%i ", n[i]);
36 i++;
37
38 */
39 return 0;
40

万分感谢
对了,问题要求用指针来做。

你的程序问题多多
需要修改的地方也很多,可能思路也很难用你程序里的
我做了一个,你可以参考一下我的,或许你也能改动些变成你的

我在程序如下:
#include "stdio.h"
#include <string.h>
int main()

int k=0,i, j;
char a[100];

int flag = 1;//用来设置输入回车符号的标志
for(k=0;flag!= 0;k++)//flag为0时停止循环

scanf("%c",&a[k]);
if (a[k] == 10)//如果有回车符号输入,flag的值变为0

flag =0;



k = 0;//k值要再次赋0值
long arr[100];//用来保存整数的数组
long sum = 0;//计算中间的整数
int num =0;//计算整数个数
j = 0;//数组下标
while(a[k] != 10)//判断是否为回车符号,

if (a[k]<='9' && a[k]>= '0')//如果是数字进入该循环体

num++;
sum = 0;
int i = 0;
while(a[k]<='9' && a[k]>= '0')//如果是数字进入该循环体

if (i == 0)//第一个数字

sum = (int)(a[k]-48);//将字符转换为数字

else//非第一个数字

sum =10*sum + (int)(a[k]-48);//将字符转换为数字

i++;
k++;

arr[j++] = sum;//将计算的数字存到数组中
k--;

k++;

printf("The number of continious integer is %i\n",num);

printf("The integers are like follows: \n");
i = 0;
while (--j >=0)

printf("%ld\n",arr[i++]);

return 0;


运行效果如下:

54sdf ?02395 sdfk pp 888
The number of continious integer is 3
The integers are like follows:
54
2395
888
请按任意键继续. . .
参考技术A 用atoi函数可能简单点 参考技术B 12 while(a[k] != '\n') //这里k 没初始化。。
13
14 if(a[k]<='9' && a[k]>= '0')
15
16
17 j=0;
18 b[i][j] = a[k]; //i 没有初值 ,k也没有 。。
19 while(a[++k] <= '9' &&a[++k]>='0')
20 b[i][++j]=a[k];
21 i++;
22
23

24 printf("The number of continious integer is %i",i); //%i 什么格式? 改%d 或%ld
参考技术C #include <stdio.h>
#define MAX 20
void main()
int k=-1,i=-1,j,t;
char a[MAX],b[MAX][MAX];
do
k++;
scanf("%c",&a[k]);
while(a[k]!='\n');
k=0;
while(a[k]!='\n')
if((a[k]<='9')&&(a[k]>='0'))
i++;j=0;
b[i][j] = a[k];
k++;
while((a[k]<='9')&&(a[k]>='0'))
j++;
b[i][j]=a[k];
k++;

j++;b[i][j]='\n';
if(a[k]=='\n') k--;

k++;

printf("The number of continious integer is %d\n",i+1);
printf("The integers are like follows: \n");
t=i;
for(i=0;i<=t;i++)
j=0;
while(b[i][j]!='\n')
printf("%c",b[i][j]);
j++;

printf("\n");



运行效果如下:

12df 7da798 7~@#5t
The number of continious integer is 3
The integers are like follows:
12
7
98
7
5
参考技术D 换个思路把,看我的:
#include <stdio.h>
#include <ctype.h>
int main(void)

    int ch, num = 0, flag = 0, count = 0;
    
    while(ch = getchar())
    
              if(!isdigit(ch) && flag)
              
                      printf("%d ", num);
                      count++;
                      num = flag = 0;
              
              if(isdigit(ch))
              
                    num  = 10 * num + ch - '0';
                    flag = 1;
                    continue;
              
              if(ch == '\n')break;
                 
                
    printf("\ncount = %d\n", count);
   
    return 0;   

以上是关于一道Pascal小问题,急!!!!!!!!的主要内容,如果未能解决你的问题,请参考以下文章

悬赏!急!pascal竞赛普及组模拟试题

急!!!! pascal 数字 (不是英文字母)字典序大小怎么比较 要详细点!!

急!急!微信小程序报错:TypeError: fetch is not a function

急!!visualstadio 2010 wpf,用C#开发一个小程序,背景音乐问题

小a和uim之大逃离

小a和uim之大逃离(洛谷 1373)