Function 为什么Pascal中需要这些代码行?

Function 为什么Pascal中需要这些代码行?,function,repeat,pascal,ord,Function,Repeat,Pascal,Ord,下面的Pascal示例在一本专门介绍编程基础知识的书中给出。函数ReadLongint应该检查输入是否是0-9编码的字符类型。然后,该函数根据检查结果返回true或false,并返回一个用于计算的变量,该变量通过运算符ord()呈现为整数。 作为一个新手,我很难弄清楚这段代码到底是如何工作的。但对我来说,更大的谜团是第9行的必要性 'repeat read(c); position := position + 1; until (c <

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

    'repeat
         read(c);
         position := position + 1;
     until (c <> #32) and (c <> #10);'
”重复
读(c);
位置:=位置+1;
直到(c#32)和(c#10);'
我可以看到,如果你输入空格或输入,它是一个循环,它会重复自身。但是,我检查了没有这些行的程序,用一个简单的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.
函数ReadLongint(变量检查:longint):布尔值;
变量
c:半焦;
编号:longint;
位置:整数;
开始
编号:=0;
位置:=0;
重复
读(c);
位置:=位置+1;
直至(c#32)及(c#10);
而(c#32)和(c#10)是
开始
如果(c<0')或(c>9'),则
开始
writeln('Unexpected'',c','in position:',position);
readln;
ReadLongint:=假;
出口
结束;
编号:=编号*10+ord(c)-ord('0');
读(c);
位置:=位置+1
结束;
检查:=编号;
ReadLongint:=真
结束;
变量
x、 y:长型;
ok:布尔;
开始
重复
写('请键入第一个数字:');
正常:=ReadLongint(x)
直到ok=true;
重复
写('请键入第二个数字:');
正常:=ReadLongint(y)
直到ok=true;
写入(x,'次',y,'是',x*y)
结束。

“而且程序似乎运行得很好”尽管如此,它是否仍能完成预期的功能?如果输入123,在
x
中会得到什么结果?@Michael是的,结果是一样的。至少我没有看到任何错误啊,对,它只是丢弃了前导空格和换行符。所以原始代码允许您在第一个数字前面写多个空格。@Michael,哦,还没见过这个。非常感谢你!查看第二个循环的条件(实际读取数字的条件),并考虑如果用“<代码>读取< /代码>替换第一个循环”,可能包含< <代码> > >代码>。在调试器中单步执行代码(如果有帮助)。