1

我刚开始使用 Object Pascal 进行计算机研究,所以这对你们中的许多人来说可能是一个简单的问题。我正在尝试为总和和平均值计算器构建一个验证系统,以便不能接受不是整数的答案,但也不会使软件崩溃。我已经尝试了几个小时来解决这个问题,当它处于当前状态时,如果我输入一个整数,它会将它解释为一个非整数,而如果我输入一个非整数,程序就会崩溃。有没有办法解决?

目前的编码如下所示:

Program SumAverageCalculator;

{$APPTYPE CONSOLE}

uses
  SysUtils;

Const
  NumberOfIntegers = 3;

Var
  NumberOne, NumberTwo, NumberThree: integer;
  Sum: integer;
  Average: real;

Begin
  Writeln ('=======================================');
  Write ('What is your first number? '); readln(NumberOne);
  If NumberOne-sqr(0) <> 1 then
    Begin
      Write ('Please write an integer only.  What is your first number? '); readln(NumberOne);
    End
  Else
    Begin
      Write ('Great, that is an Integer! ');
    End;
  Write ('And the second number? '); readln(NumberTwo);
  If NumberTwo-sqr(0) <> 1 then
    Begin
      Write ('Please write an integer only.  What is your second number? '); readln(NumberOne);
    End
  Else
    Begin
      Write ('Great, that is an Integer! ');
    End;
  Write ('And the third number? '); readln(NumberThree);
  If NumberThree-sqr(0) <> 1 then
  Begin
      Write ('Please write an integer only.  What is your third number? '); readln(NumberOne);
  End
  Else
    Begin
      Write ('Great, that is an Integer! ');
    End;
  Sum := NumberOne + NumberTwo + NumberThree;
  Average := Sum/NumberOfIntegers;
  Writeln;
  Writeln ('=======================================');
  Writeln ('The number of given integers was ', NumberOfIntegers);
  Writeln ('Your first number was ', NumberOne);
  Writeln ('Your second number was ', NumberTwo);
  Writeln ('Your third number was ', NumberThree);
  Writeln ('=======================================');
  Writeln ('The Sum of your numbers is ', Sum);
  Writeln ('The Average of your numbers is ', Average: 1:2);
  Writeln ('=======================================');
  Readln;
End.

感谢您提供的任何帮助。:)

4

1 回答 1

2

这实际上是因为您向readln调用传递了一个整数变量,并且它确实想在其中放置一个整数。如果不能(输入不是整数),它将崩溃。一种解决方案是首先以可能的最通用形式(即字符串)读取输入,检查它是否为整数,然后将其转换为整数。

当然,您不必自己做所有这些。该sysutils单元有一些有用的功能,其中有一个TryStrToInt功能,它按照它所说的做:它将尝试将字符串输入转换为整数,并让您(开发人员)知道它是否失败而不是崩溃和烧毁。

uses
  SysUtils;

Var
  Input: String;
  IsInteger: Boolean;
  Value: Integer;
begin
  Write('Enter an integer: ');
  ReadLn(Input); // will work, user input can always be represented by a string

  IsInteger := TryStrToInt(Input, Value);

  if IsInteger then
  begin
    // Do stuff with "Value" which contains the input integer
  end
  else
  begin
    WriteLn('Sorry, that''s not an integer.');
  end;
end.

当然,如果您要经常这样做,那么实现一个辅助函数可能是有意义的,该函数的行为类似于readln但会自行检查并打印出错误而不会崩溃(也许程序可以一直要求整数,直到用户遵守,或者它应该优雅地终止)。例如,上面的一些代码可以封装在一个实用函数readint中。

一旦遇到异常,您将找到一种更通用的方法来处理程序中的故障并正确响应它们以避免您的程序因最轻微的用户错误而崩溃,但是此时这可能是您正在寻找的。


如果您想知道这个out东西在TryStrToInt函数中的含义,它类似于var,但它基本上意味着“我将填写这个值,但我不会尝试读取它”(一个只写参数)不像varwhich意思是“我要填写这个值,但我可能会尝试在之前读取它”(一个读写参数)。所以out参数在使用之前不需要初始化(所以在某种程度上,out参数是“第二个返回值”,在这种情况下这是有道理的,因为TryStrToInt函数需要返回两件事:输入是否为整数,以及该整数是,但函数只能有一个“标准”返回值)。

于 2013-09-17T09:52:50.050 回答