以下代码旨在从输入的数字范围中查找最大数字。输入 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.
谢谢虚拟机
您自己创建了这个问题,方法是使用
Value
的值来表示程序结束,然后在代码中不考虑这个特殊含义 (Value = 0
) 来计算哪个值是最大值。
只需将您的代码更改为
if (Value <> 0) and (Value > Max) then
Max := Value
(Value <> 0) and
有效地表示“如果值碰巧为零,则忽略......”
在确定new最大值之前,您需要退出循环。
如果您输入 5 个数字,则您将执行 5 次 value > max
测试。
这意味着您也认为
0
的输入也是样本的部分。 但是,您只想进行 N−1 次比较。 最快的解决方案是将代码颠倒过来,将头部控制循环重写为尾部控制循环。 这可以避免像 MartynA 建议
那样重复检查
0
的值。
最好的解决方案是完全放弃基于 sentinel 的终止方法,并使用内置函数 EOF
代替。
但一步一步来,先修复你原来的程序。