我该如何解决这个错误?帕斯卡尔

时间:2014-11-16 15:25:23

标签: loops compiler-errors pascal goto

PROGRAM RandomNumber;
Var rand,count,guess : integer;
LABEL correct, loop, wrong, end1;
begin
{Initialization, so that random numbers are drawn}
 Randomize;
  count :=0;
  repeat
      loop:
      count := count+1;
{Random(i) Creates random numbers between 0 and i.}
      rand := Random(10);
      guess := Random(10);
      if rand=guess
      then
          goto correct
      else
          goto wrong;
  until count > 10;
  goto end1;
  correct :
      WriteLn('Correct');
      goto end1;
  wrong :
      WriteLn('False Guess');
      goto loop;
  end1 :
      WriteLn;
end.

该计划的目标是在10次尝试中找到一个随机数。我设法使用Free Pascal IDE编译它,然后问题是程序在找到数字之前不会停止。但是,当我尝试使用在线编译进行编译时,会出现此错误:

prog.pas:在主程序中:

prog.pas:26:错误:`goto'到无效目标

是因为标签/ goto不能立即在循环中跳转吗?

2 个答案:

答案 0 :(得分:2)

近似的"为什么它起作用?!"答案是exactly as lamas shaikh says:缺少分号。

不要感觉不好。这是一件很容易错过的事。 Pascal在条件或循环结构之后允许单行代码,或者begin / end序列作为虚拟语句。该选择与Pascal使用分号作为语句分隔符而不是终结符(与解析器设计者的精细区别,但多年来已被证明是微妙的和容易出错,特别是那些刚接触语言的人。要注意丢失和分号!

有两件事可以提供帮助:始终,始终始终使用强大,一致,规范的缩进来帮助向您展示代码的逻辑结构。并且您可能会发现在语句或多语句块可能适合的任何上下文中始终使用begin / end块更容易(即使块包含单行)。一开始看起来似乎很傻,但是当你开始向程序添加语句(包括临时调试打印语句)时,使用在所有情况下都有效的单个结构确实有帮助。

程序失败的直接原因不是分号。您正在使用完全非结构化方法来控制程序中的流程。即使你不需要,你也会GOTO到处都是PROGRAM RandomNumber; Var rand, count, guess, MaxGuesses : integer; begin {Initialization, so that random numbers are drawn} Randomize; MaxGuesses := 10; count := 0; repeat count := count + 1; {Random(i) Creates random numbers between 0 and i.} rand := Random(10); guess := Random(10); if rand = guess then begin WriteLn('Correct'); break end else WriteLn('False Guess'); until count >= MaxGuesses; WriteLn; if (rand = guess) then WriteLn('We had a winner (', guess, ') in ', count, ' tries.') else WriteLn('Sorry! No winner in ', MaxGuesses, ' tries.'); WriteLn; end. ,即使有更简单,更清洁,结构更好的选择。例如,考虑:

$ ./guess
False Guess
Correct

We had a winner (1) in 2 tries.

$ ./guess
False Guess
False Guess
False Guess
False Guess
False Guess
False Guess
False Guess
False Guess
False Guess
False Guess

Sorry! No winner in 10 tries.

$ ./guess
False Guess
Correct

We had a winner (8) in 2 tries.

编译并运行几次,看起来像:

goto
Pascal是20世纪60年代和70年代编程革命的重要组成部分,带来了#34;结构化编程"广泛使用。当更好的结构如此急切可用时,请不要使用较低级别的{{1}} - 负载代码。

答案 1 :(得分:1)

在以下给出的goto语句后,您缺少分号:

    goto correct
else
    goto wrong