Не удается заставить Pascal работать должным образом

#pascal

#pascal

Вопрос:

Что не так со следующим кодом? Он вылетает, когда я ввожу число.

Я потратил более 2 часов, пытаясь разобраться, и все еще не могу, я изучаю pascal, поэтому, пожалуйста, потерпите меня.

 Program Game;

var
  PlayerOneScore: Integer;
  PlayerTwoScore: Integer;
  BallsNo: Integer;
  CurrentScore: Integer;
  Ptr: Integer;
  Result: Integer;

Begin
  CurrentScore := 0;
  PlayerOneScore:= 0;
  PlayerTwoScore:= 0;
  Writeln('How many balls do you wish to face?');
  Readln(BallsNo);
  Ptr:=BallsNo;
  While Ptr < 1 Do
  Begin
    Repeat
      Ptr:=Ptr 1;
      CurrentScore:=0;
      Writeln ('Player turn');
      Writeln ('Please roll the bowling die');
      Writeln ('Enter 1 if result is a 1');
      Writeln ('Enter 2 if result is a 2');
      Writeln ('Enter 3 if result is a 4');
      Writeln ('Enter 4 if result is a 6');
      Writeln ('Enter 5 if result is a 0');
      While BallsNo >0 Do
      Begin
        Repeat
          Writeln('This is',BallsNo);
          Readln(Result);
          BallsNo:=BallsNo-1;
        Until BallsNo = 0;
        If Result = 1 Then
          CurrentScore:= CurrentScore 1
        Else If Result = 2 THEN
          CurrentScore:= CurrentScore 2
        Else If Result = 3 THEN
          CurrentScore:= CurrentScore 4
        Else If Result = 4 THEN
          CurrentScore := CurrentScore 6
      End;
    Until Ptr=2;
  End;

  If Ptr = 1 Then
    PlayerOneScore := CurrentScore
  Else
    PlayerTwoScore := CurrentScore;
  If PlayerOneScore > PlayerTwoScore Then
    Writeln('Player One Wins');
  If PlayerTwoScore > PlayerOneScore Then
    Writeln('Player Two Wins');
  If PlayerOneScore = PlayerTwoScore Then
    Writeln('Tie');
End.
  

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

1. Он просто вылетает, и exe закрывается после того, как я ввожу число.

2. Вы неправильно поняли ответ JLF, вам следует заменить ‘1’ в операторе while.

3. Райс: Я взял на себя смелость переформатировать ваш исходный код. Не хотел навязывать вам свой стиль форматирования, просто подумал, что так будет удобнее для чтения.

4. Вы включили проверки во время выполнения? Это сильная сторона Pascal при поиске ошибок

Ответ №1:

Ptr: =1; В то время как Ptr < 1 Делает

Это ваша проблема. Я полагаю, вам нужно заменить 1 на BallsNo.

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

1. У меня все работает нормально. Возможно, у вас проблемы с компилятором, попробуйте скомпилировать его на ideone.com . Кроме того, readln может возвращать как целое число, так и строку, так что проблема не в этом. Если ваша программа просто вылетает и не выдает никакого сообщения, то это определенно проблема компилятора

2. Он компилируется нормально, но когда я запускаю exe и он спрашивает меня, сколько шаров, и я ввожу число, он вылетает.

3. @Freddie Rice: Как вы думаете, почему он вылетает? Из-за этого условия, Ptr < 1 очень вероятно, что ваша программа просто завершит работу, так и не войдя во внешний while цикл.

Ответ №2:

Изменить

Пока Ptr < 1

Для

Пока Ptr > 1

Далее по алгоритму у вас цикл с ошибками.

-Приветствия!

Ответ №3:

currentScore не всегда инициализируется. Попробуйте вставить «currentScore:= 0;» после первого «Begin».

Кроме того, откуда вы знаете, что происходит сбой? Возможно, он просто ничего не печатает. Что произойдет, если вы добавите «If PlayerOneScore = PlayerTwoScore Then Writeln(‘Tie’)», непосредственно перед «End.»?

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

1. Вот exe-файл с предложенными вами изменениями. Попробуйте ввести число, а затем он выводит tie, и он выходит из строя и закрывается. cl.ly/1a1K1K0c3X3M2d043R2N

2. Почему вы так уверены, что это сбой. Вы заявляете, что у вас нет сообщения об ошибке; ваша поправка в ответ на этот ответ указывает, что программа достигает конца после принятия числа; а также указывает, что программа завершается. Завершение. Программа не просто завершается?

Ответ №4:

Пожалуйста, не говорите «это сбой». Это выдает вам какое-то сообщение об ошибке, что это?

У вас также есть проблема в том, что независимо от того, у какого игрока счет равен нулю. Однако это не приведет к сбою.