#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. Оно завершает все предложение, пропуская остальное, и это наверняка выдаст вам ошибку.