0

以下 Pascal 示例是在一本专门介绍编程基础知识的书中给出的。函数ReadLongint应该检查输入是否以 char 类型编码为 0-9。然后该函数根据检查结果返回真或假,以及用于计算的变量,通过运算符ord()呈现为整数。作为一个新手,我很难弄清楚这段代码是如何工作的。但对我来说,更大的谜团是第 9 行的必要性。

    'repeat
         read(c);
         position := position + 1;
     until (c <> #32) and (c <> #10);'

我可以看到这是一个循环,如果您输入 Space 或 Enter,它会自行重复。但是,我检查了没有这些行的程序,用简单的read(c);代替它。,并且该程序似乎运行良好。有人可以解释一下这条线在示例中的作用吗?

这是完整的程序:

function ReadLongint(var check: longint): boolean;
     var
         c: char;
         number: longint;
         position: integer;
     begin
         number := 0;
         position := 0;
         repeat
             read(c);
             position := position + 1;
         until (c <> #32) and (c <> #10);
         while (c <> #32) and (c <> #10) do
         begin
             if (c < '0') or (c > '9') then
             begin
                 writeln('Unexpected ''', c, ''' in position: ', position);
                 readln;
                 ReadLongint := false;
                 exit
             end;
             number := number * 10 + ord(c) - ord('0');
             read(c);
             position := position + 1
         end;
         check := number;
         ReadLongint := true
     end;
var
    x, y: longint;
    ok: boolean;
begin
    repeat
        write('Please type the first number: ');
        ok := ReadLongint(x)
    until ok = true;
    repeat
        write('Please type the second number: ');
        ok := ReadLongint(y)
    until ok = true;
    writeln(x, ' times ', y, ' is ', x * y)
end.
4

1 回答 1

0

您的readLongInt函数想要(部分)模仿read/的行为readLn。如果目标变量是(或)或值,则read/的行为会readLn略有不同。ISO 标准 7185是这样说的:integerrealchar

c) 如果v是具有-类型(或其子范围)的变量访问,应满足以下要求。s 的任何组件都不应等于end-of-liner的组成部分,如果有的话,每个组成部分,并且(s ~t ~u).first不应该等于-type值空间或行尾。[…]integerread(f, v)char

翻译成简单的英语:解释数字忽略前导空格和换行符(即,将[或] 变量作为目标)。这与 /与‑variable where是合法值完全不同,因此它不会“跳过”,你知道的。integerrealreadreadLnchar' '

until (c <> #32) and (c <> #10)循环试图模仿的行为,尽管read(check)实际使用的read(c)只是一个接一个地读取单个char值。

PS:看到总是让我畏缩ok = true。我希望,不像教科书的作者,知道这= true是多余的,只是一个身份。

于 2021-08-15T05:05:55.353 回答