评估 Pascal 中带有负数的语句

问题描述 投票:0回答:2

以下代码旨在从输入的数字范围中查找最大数字。输入 0 后,输入结束(确定最大值时不考虑 0)。它似乎适用于正数,但对于一系列负数,它总是说最大值为 0。谁能告诉我错误在哪里?

program MaximumEndZero (input, output);
var
    Max,
    Value : integer;

begin
    writeln('Enter numbers');
    readln(Value);
    if (Value = 0) then
        writeln('No input')
    else
    begin
        Max := Value;
        while Value <> 0 do
        begin
            readln(Value);
            if Value > Max then
                Max := Value
        end;
        writeln('Max is: ', Max)
    end;
end.

谢谢虚拟机

pascal
2个回答
0
投票

您自己创建了这个问题,方法是使用

Value
的值来表示程序结束,然后在代码中不考虑这个特殊含义 (
Value = 0
) 来计算哪个值是最大值。

只需将您的代码更改为

      if (Value <> 0) and (Value > Max) then
          Max := Value

(Value <> 0) and
有效地表示“如果值碰巧为零,则忽略......”


0
投票

在确定new最大值之前,您需要退出循环。 如果您输入 5 个数字,则您将执行 5 次 value > max 测试。 这意味着您也认为

0
的输入也是样本的
部分
。 但是,您只想进行 N−1 次比较。 最快的解决方案是将代码颠倒过来,将头部控制循环重写为尾部控制循环。 这可以避免像

MartynA 建议

那样重复检查

0
的值。 最好的解决方案是完全放弃基于

sentinel

的终止方法,并使用内置函数 EOF 代替。 但一步一步来,先修复你原来的程序。


附:
不需要在 if 语句中将整个布尔表达式括起来。

© www.soinside.com 2019 - 2024. All rights reserved.