功能,小变化

时间:2014-10-24 18:37:51

标签: delphi

这是Delphi中的代码:

function Perfect(x: Integer): Integer;
var
  i, a: Integer;
begin
  i := 1;
  a := 0;

  while i <= x div 2 do
  begin
    if (x mod i = 0) then
      a := a + i;
    i := i + 1;
  end;

  if x = a then
    Result := x;
end;

基本上,它是一个从给定间隔显示perfect numbers的函数。我创建了一个循环来显示这些数字,但我有一个问题,因为当它不是一个完美的数字时它也会显示一些随机数。所以,假设我有[1; 7]然后控制台显示:

1969410929
1969410929
1969410929
1969410929
1969410929
6
1969410929

我该怎么做才能显示正确的数字?

2 个答案:

答案 0 :(得分:4)

如果数字不完美,您的代码无法设置返回值。在那种情况下,返回的值定义不正确。您必须始终设置返回值。来自documentation

  

如果函数退出而没有为Result或函数名赋值,则函数的返回值是未定义的。

由于函数必须返回一个值,因此您的函数处于绑定状态。如果值不完美,该返回什么?我认为没有好的选择。您不需要返回该号码,因为您已经知道它。毕竟你把它传递给了这个函数。

因此,您应该更改函数的设计以返回一个布尔值,指示数字是否完美:

function IsPerfect(x: Integer): Boolean;
var
  i, sum: Integer;
begin
  sum := 0;
  for i := 1 to x div 2 do
    if x mod i = 0 then
      inc(sum, i);

  Result := x = sum;
end;

调用函数的代码运行如下:

for i := 1 to 1000 do
  if IsPerfect(i) then
    Writeln(i);

<强>输出

6
28
496

答案 1 :(得分:2)

...&#34;当它不是一个完美的数字时,它也显示一些随机数字&#34;。

原因是您没有设置Result&#34;变量&#34;当它不是一个完美的数字。如果您创建的函数未在所有情况下设置Result变量,则在这些情况下调用它的结果将是未定义的。随机描述它,虽然它可能是某种系统,即使系统只是&#34;内存中放置了Result变量的任何内容&#34;。

如果它不是一个完美的数字,您需要确定要返回的内容,并进行以下任一代码更改:

Result := <what to return if not?>;
if x = a then
    Result := x;

或者这个:

if x = a then
    Result := x
else
    Result := <what to return if not?>;