Недопустимое выражение в Паскале

#loops #if-statement #pascal

#циклы #if-оператор #паскаль

Вопрос:

Компиляция прекращается в строках 54 и 58 с ошибками «Ошибка: недопустимое выражение» и «Синтаксическая ошибка; ожидалось, но ЕЩЕ найдено» соответственно. Мое расположение строк неверно?

 Procedure PlayDiceGame(PlayerOneName, PlayerTwoName : String;
                           VirtualDiceGame : Boolean; Var TopScores : TTopScores);
      Var
        PlayerOut : Boolean;
        CurrentPlayerScore : Integer;
        AppealDieResult : Integer;
        PlayerNo : Integer;
        PlayerOneScore : Integer;
        PlayerTwoScore : Integer;
        BowlDieResult : Integer;
        RunsScored : Integer;
        NumberOfBalls : Integer;
      Begin
        For PlayerNo := 1 To 2
          Do
            Begin
            NumberOfBalls := 0;
              CurrentPlayerScore := 0;
              PlayerOut := False;
              If PlayerNo = 1
                Then Writeln(PlayerOneName, ' is batting')
                Else Writeln(PlayerTwoName, ' is batting');
              Writeln;
              Writeln('Press the Enter key to continue');
              Readln;
              Repeat
                BowlDieResult := RollBowlDie(VirtualDiceGame);
                If BowlDieResult In [1..4]
                  Then
                    Begin
                      RunsScored := CalculateRunsScored(BowlDieResult);
                      DisplayRunsScored(RunsScored);
                      CurrentPlayerScore := CurrentPlayerScore   RunsScored;
                      Writeln('Your new score is: ', CurrentPlayerScore);
                    End;
                If BowlDieResult = 5
                  Then Writeln('No runs scored this time.  Your score is still: ',
                              CurrentPlayerScore);
                If BowlDieResult = 6
                  Then
                    Begin
                      Writeln('This could be out... press the Enter key to find out.');
                      Readln;
                      AppealDieResult := RollAppealDie(VirtualDiceGame);
                      DisplayAppealDieResult(AppealDieResult);
                      If AppealDieResult >= 2
                        Then PlayerOut := True
                        Else PlayerOut := False;
                    End;
                Writeln;
                Writeln('Press the Enter key to continue');
                Readln;
                NumberOfBalls = NumberOfBalls   1
              Until PlayerOut or (NumberOfBalls = 6);
              If (NumberOfBalls = 6) Then
              Writeln('You have faced 6 balls and compeletd your innings');
              Writeln('Your final scoare was: ', CurrentPlayerScore);
              Else
              Writeln('You are out.  Your final score was: ', CurrentPlayerScore);
              Writeln;
              Writeln('Press the Enter key to continue');
              Readln;
              If PlayerNo = 1
                Then PlayerOneScore := CurrentPlayerScore
                Else PlayerTwoScore := CurrentPlayerScore;
            End;
        DisplayResult(PlayerOneName, PlayerOneScore, PlayerTwoName, PlayerTwoScore);
        If (PlayerOneScore >= PlayerTwoScore)
          Then
            Begin
              UpdateTopScores(TopScores, PlayerOneName, PlayerOneScore);
              UpdateTopScores(TopScores, PlayerTwoName, PlayerTwoScore);
            End
          Else
            Begin
              UpdateTopScores(TopScores, PlayerTwoName, PlayerTwoScore);
              UpdateTopScores(TopScores, PlayerOneName, PlayerOneScore);
            End;
        Writeln;
        Writeln('Press the Enter key to continue');
        Readln;
      End;
  

Комментарии:

1. Обычно вы пишете for i := 0 to 5 do (пример), то есть do находится в той же строке, что и for . Аналогично, обычно выполняется запись if 1 1=2 then с помощью then в той же строке, что и if .

2. Мы не знаем наверняка без остальной части файла. Но приведенные ниже ответы указывают на то, что в показанном здесь коде действительно есть 2 ошибки.

3. @Andreas Rejbrand: Проблема здесь не в форматировании кода, и в некоторых местах используются другие правила. Код Джеффа (в основном) синтаксически корректен.

4. @Turbo J: Да, конечно, это так. Форматирование кода в Delphi — это всегда дело вкуса. Но поскольку очень редко do и then помещается в отдельную строку, и поскольку это затрудняет получение «тонких» деталей, например, когда вам нужно создать блок кода с помощью begin и end , я сделал комментарий по этому поводу. Конечно, я не думаю, что проблемы вызваны необычным использованием пробелов, и, более того, если бы я так считал, я бы написал ответ вместо комментария.

5. JFI: Вот «официальные» рекомендации по форматированию в Паскале (как в Delphi): econos.de/delphi/cs.html

Ответ №1:

У вас многострочный then блок

 If (NumberOfBalls = 6) Then
    Writeln('You have faced 6 balls and compeletd your innings');
    Writeln('Your final scoare was: ', CurrentPlayerScore);
Else
  

Оберните это в begin / end, и это должно сработать.

Комментарии:

1. Завернул его, но я получаю ожидаемую, но все еще обнаруженную ошибку.

2. @Jeff Howard процитировал старый (ваш) код вместо правильного. Правильным является if ... then begin statement1; statement2; end else begin statement3; statement4; end;

3. @Eugene Спасибо. Также спасибо @Andreas за объяснение конечных операторов с точкой с запятой.

Ответ №2:

Изменить

 NumberOfBalls = NumberOfBalls   1
  

Для

 NumberOfBalls := NumberOfBalls   1
  

и поместите операторы writeln в блок begin-end.

Комментарии:

1. Придирка: добавьте недостающую точку с запятой, чтобы правильно завершить инструкцию.

2. @Turbo J: В Delphi вам не нужно заканчивать инструкции точкой с запятой. Вам нужно только использовать точку с запятой, чтобы отделить два оператора друг от друга. То есть begin a := 5 end допустимо, но вам нужна точка с запятой в begin a := 5; b := 10 end

Ответ №3:

Вы не пишете; перед else в предложении if. Оно завершает все предложение, пропуская остальное, и это наверняка выдаст вам ошибку.