Подтверждение ввода в Паскале (предварительная версия материала) - PullRequest
0 голосов
/ 21 мая 2011

Я играю с материалом предварительного релиза Comp 1, но я не могу ответить на этот вопрос должным образом при компиляции Паскаля в Delphi ...

  • Этот вопрос относится к функции RollBowlDie,
  • Эта функция не проверяет введенное значение.

  • Что вам нужно сделать .... Сделайте копию скелетной программы.Добавьте дополнительные операторы к функции RollBowlDie, чтобы убедиться, что вход BowlDieResult находится в диапазоне от 1 до 6, прежде чем разрешить продолжить игру, и выдает сообщение об ошибке, если нет.

  • Добавить далееоператоры функции RollBowlDie, чтобы он также проверял, что вход BowlDieResult не вызывает сбой программы, если это неправильный тип данных, и вместо этого выводит сообщение об ошибке при обнаружении.

  • Проверьте исправленную функцию, чтобы показать, что она не допускает входные данные, выходящие за пределы диапазона.

  • Проверьте исправленную функцию, чтобы показать, что она не падает, если добавлен неверный тип данных.

Это функция RollBowlDie.

Function RollBowlDie(VirtualDiceGame : Boolean) : Integer;
  Var
    BowlDieResult : Integer;
  Begin
    If VirtualDiceGame
      Then BowlDieResult := Random(6) + 1
      Else
        Begin
          Writeln('Please roll the bowling die and then enter your result.');
          Writeln;
          Writeln('Enter 1 if the result is a 1');
          Writeln('Enter 2 if the result is a 2');
          Writeln('Enter 3 if the result is a 4');
          Writeln('Enter 4 if the result is a 6');
          Writeln('Enter 5 if the result is a 0');
          Writeln('Enter 6 if the result is OUT');
          Writeln;
          Write('Result: ');
          Readln(BowlDieResult);
          Writeln;
        End;
    RollBowlDie := BowlDieResult;
  End;

Я пытался вставить это, но сообщение об ошибке не появилось, и программа вылетала при попытке письма.

Function RollBowlDie(VirtualDiceGame : Boolean) : Integer;
  Var
    BowlDieResult : Integer;
  Begin
    If VirtualDiceGame
      Then BowlDieResult := Random(6) + 1
      Else
        Begin
          Repeat
            Writeln('Please roll the bowling die and then enter your result.');
            Writeln;
            Writeln('Enter 1 if the result is a 1');
            Writeln('Enter 2 if the result is a 2');
            Writeln('Enter 3 if the result is a 4');
            Writeln('Enter 4 if the result is a 6');
            Writeln('Enter 5 if the result is a 0');
            Writeln('Enter 6 if the result is OUT');
            Writeln;
            Write('Result: ');
            Try
              Readln(BowlDieResult)
            Except
              Writeln('Not a valid number')
            End;
            Writeln;
          Until (BowlDieResult >= 1) and (BowlDieResult <= 6);
        End;
    RollBowlDie := BowlDieResult;
  End;

Я не уверен, как решить вопрос, любая помощь будет принята с благодарностью!

Ответы [ 2 ]

2 голосов
/ 21 мая 2011

Возможно, вам нужно прочитать строку или переменную с типом символа вместо целочисленной, а затем преобразовать строку / символ в целое число управляемым образом.

1 голос
/ 21 мая 2011

Конечно, происходит сбой, если вы набираете письмо ... вы специально просите прочитать целое число, а письмо не является целым числом.

Прежде чем комментировать этот вопрос, почему бы и нетпросто скажите:

writeln ('Please enter the number rolled, or 0 if it is an OUT: ');

вместо 6 писем?Кроме того, что, если выпало 3 или 5 (вы только указываете (несколько странно) указания для значений 1, 2, 4, 6 и 0 ... опуская 3 и 5. Имейте в виду, что вы можете 't получить 0 от "BowlDieResult: = Random (6) + 1".

Как вы хотите, чтобы пользователь указал "стоп", если вы выполняете цикл, пока не получите значение от 1 до 6?

Возвращаясь к вопросу «как читать письмо» ...

Используйте переменную типа «char» (или «упакованный массив символов») для чтения произвольного текста ...затем сравните прочитанный символ с «1», «2», ..., «6» или (скажем) «Q» (для «Выйти»).

Например:

var 
   answer : char;
   attempts : integer;      {prevent infinite loop}
   done : boolean;

attempts := 0;      
saw_quit := false;

done := false;          {loop until we get a good number or a QUIT command}
                        {Or until 9 attempts have been made to enter a #. }

while not done do
   begin
   writeln ('Please enter a number (1..6) or Q to quit: ');
   readln (answer);

   if answer in ['1'..'6'] then
      begin          {we got a number in range 1..6...}
      BowlDieResult := ord (answer) - ord ('0');     {convert char to int}
      done := true;
      end

   else if answer in ['Q', 'q'] then         {upper or lower case :) }
      begin
      saw_quit := true;
      done := true;
      end

   else
      begin
      writeln ('Sorry, that is not a number from 1 to 6 or a "Q"!');

      attempts := attempts + 1;
      if attempts > 9 then
         begin
         writeln ('Sorry, too many mistakes ... assuming QUIT');
         saw_quit := true;
         done := true;
         end;
      end;
   end;        {while not done}

Примечание: вышеупомянутое не проверено на компиляцию ... Я НИКОГДА не использую встроенный ввод / вывод Паскаля из соображений производительности и надежности, поэтому я не справился с этим.

Примечание: см. http://www.allegro.com/papers/htpp.html для некоторой философии программирования на Паскале.

Stan

...