【问题标题】:Problems with eof in PascalPascal 中的 eof 问题
【发布时间】:2022-07-08 02:20:48
【问题描述】:

我刚开始学习帕斯卡。我编写了一个程序,要求用户插入任何整数,并确定这些数字中的最小值。

我当前的代码:

program Minimum (input, output);
    var
    Eingabe,
    KleinsteZahl: Integer;
begin
    writeln(\'Please enter a number.\');
    if eof then
        writeln(\'No number was entered.\')
    else
    begin
        readln(Eingabe);
        KleinsteZahl := Eingabe;
        while not eof do
        begin
            writeln(\'Please enter a number.\');
            readln(Eingabe);
            if Eingabe < KleinsteZahl then
                KleinsteZahl := Eingabe
        end;
        writeln(\'The smallest number entered is: \', KleinsteZahl);
    end;
end.

当我运行程序时,这就是可能的输入/输出的样子。

Please enter a number.
1
2
Please enter a number.
3
Please enter a number.
The smallest number entered is: 1

我只是不明白,为什么 1 和 2 之间没有文本输出。程序确实接受所有数据,但它只是跳过了一个 writeln() 语句。

如果有人可以帮助我理解为什么会发生这种情况,我将非常感激!

  • 您的 if eof then 块没用,您可以删除这些行。
  • 您已经拥有 Object Pascal 手册的副本了吗?您可以从 Delphi 文件夹中的github.com/coderserdar/Documents 获取它
  • 您可以在调试器中运行您的程序并单步执行它,看看会发生什么。这样你就不必猜测了。
  • 当然:对于调试器,您主要需要一个 IDE,而不是直接/仅编译和运行您的程序。如果您使用FPC 考虑Lazarus 作为IDE。
  • @AmigoJack docwiki.embarcadero.com/RADStudio/en/…:\"在标准 Pascal 中,程序标题可以在程序名称之后包含参数:program Calc(input, output); Embarcadero\'s Delphi 忽略这些参数。\"

标签: delphi pascal


【解决方案1】:

在第一个和第二个数字之间看不到提示,因为 EOF等待为数据。 在您输入第二行的时间点,您实际上只是在(向)插入/编辑数据终端的input 缓冲区和执行在EOF 处停止。 你还没有“到达”(循环的)readLn

为了用更专业的语言来解释这一点,请查看 ISO 标准 7185,标准“未扩展”帕斯卡,第 6.6.5.2 节“文件处理程序”:

笔记: 为了便于交互终端输入和输出,[…] 输入程序 […] 应在最晚的机会执行,[…] 输出程序 […] 应在第一时间执行。 这种技术被称为“惰性 I/O”。

只有当输入缓冲区刷新到input 时,过程EOF 才能对其文件结束状态做出合理的陈述。 否则EOF(input) 将始终是true,这不是很有帮助(对于交互式输入/输出)。 因此EOF 等到input 已经“解决”。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-08-11
  • 2012-12-28
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多