切换到宽版
  • 13707阅读
  • 10回复

pascal 筛法求素数问题 [复制链接]

上一主题 下一主题
离线zzsun
 
只看楼主 倒序阅读 0 发表于: 2006-11-14
  1. program sushu;
  2. var a:array [1..10] of integer;
  3. i,k,j:integer;
  4. begin
  5. for i:=1 to 10 do a[i]:=i;
  6. a[1]:=0;
  7. i:=2;
  8. while i<=10 do
  9. begin
  10. j:=i;
  11. while j<=10 do
  12. begin
  13. j:=j+i;
  14. a[j]:=0;
  15. end;
  16. i:=i+1;
  17. while a[i]=0 do i:=i+1;
  18. end;
  19. for i:=1 to 10 do
  20. if a[i]<>0 then write(a[i],' ');
  21. writeln;
  22. end.

这是可以正确运行的程序。
程序中并没有用到变量k,可是当定义时不定义变量k,就不能运行出结果。如果把k换成别的字符,也可以正确运行。
变量k为什么必须定义呢?
[ 此贴被sammy312在2006-11-15 15:20重新编辑 ]
离线archimedes

只看该作者 1 发表于: 2006-11-15
经过反复思考,得出结论
这是内存的问题
你把a定义成array[1..20]就没问题,应为在运行程序时读入了a[12],导致数组溢出,把j的值修改了,导致程序错误。k是完全不需要的。你不信,把i,k,j改成i,j,k都不通过~
离线stevenjl

只看该作者 2 发表于: 2006-11-15
我记得pascal不是有数组范围检查吗?
C语言里面倒是没有的……
Dream Walker...
离线zzsun
只看该作者 3 发表于: 2006-11-15
数组溢出,为什么i和j中中间加一个变量就可以,而加多个变量就不可以。
能说一下原理吗?
谢谢!
离线stevenjl

只看该作者 4 发表于: 2006-11-15
我实在不知道怎么帮助楼主,因为我的FP好像会检测数组溢出,楼主给的程序报错……


exited with
exitcode = 201
Dream Walker...
离线stevenjl

只看该作者 5 发表于: 2006-11-15
提醒楼主,这种依赖于编译器的代码最好少写
Dream Walker...
离线zzsun
只看该作者 6 发表于: 2006-11-15
谢谢管理员。
我用的是freepascal for noi。
因为数组溢出而导致问题我已经明白了。不明白的是,数组溢出和多定义的那个变量有什么关系?
离线stevenjl

只看该作者 7 发表于: 2006-11-15
一般来说,变量是线性分配的~
a:array [1..10] of integer;
i,k,j:integer;
如果把内存看成一个个格子,那个a数组占了1~10号格子
i占了11号,k占了12号,j占了13号
你多了一个k,等于是一个缓冲,在那些不检查数组范围的语言内,如果你不使用i和k函数
那么这个定义和a:array[1..12]是没有什么区别的~

但是逗号是一种不要求顺序的运算,就是说编译器在运行程序的时候可以从逗号左边算到逗号右边,也可以先算右边……
所以……具体你的问题我无法调试,也没有办法作定论。

你可以试着监视i,j,k三个变量,使用单步运行(F7),看看读到a[11],a[12]时i,j,k的变化情况~
Dream Walker...
离线zzsun
只看该作者 8 发表于: 2006-11-15
管理员真是太好了,我试试看。
离线archimedes

只看该作者 9 发表于: 2006-11-16
用TP{$R-}通过
我试了,到12时j=0,k永远是0
快速回复
限100 字节
 
上一个 下一个