Попробуй поймать на Паскале - PullRequest
4 голосов
/ 20 мая 2011

Я использую Dev-Pas 1.9.2 и пытаюсь убедиться, что программа не падает при вводе символа или буквенного значения.

Я гуглил и гуглил и не могу найти способ добиться этого.

Любая помощь очень ценится. Спасибо!

Вот код, который я пытаюсь управлять вводом:

 Function GetMenuChoice : Integer;
  Var
    OptionChosen : Integer;
  Begin
    Write('Please enter your choice: ');
    Readln(OptionChosen);
    If (OptionChosen < 1) Or ((OptionChosen > 4) And (OptionChosen <> 9))
      Then
        Begin
          Writeln;
          Writeln('That was not one of the allowed options.  Please try again: ');
        End;
    GetMenuChoice := OptionChosen;
  End;

Ответы [ 3 ]

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

Измените свой код, чтобы вместо него принимать Char;если вам нужно целое число по какой-то причине, обработайте преобразование позже.

Это работает в Delphi;если вы не можете использовать наборы, такие как ['1'..'4','9'] и операторы множеств, все должно работать нормально.

Function GetMenuChoice : Char;
Var
  OptionChosen : Char;
Begin
  repeat
    Write('Please enter your choice: ');
    Readln(OptionChosen);

    If not (OptionChosen in ['1'..'4', '9'])
      Then
        Begin
          Writeln;
          Writeln('That was not one of the allowed options.  Please try again: ');
        End;
  until OptionChosen in ['1'..'4', '9'];
  GetMenuChoice := OptionChosen;
End;

Если вам абсолютно необходимо вернуть число, измените тип возвращаемого значения на целое (или байтовое)и затем измените последнюю строку на:

GetMenuChoice := Ord(OptionChosen) - 48;  

или

GetMenuChoice := Ord(OptionChosen) - Ord('0');
0 голосов
/ 21 мая 2011

Вы действительно хотите принять ровно четыре разных возможных ввода? (Цифры 1, 2, 3, 4 и 9) Это то, что вы просите в данный момент.

Примечание. Даже с учетом изменений, предложенных первым ответчиком, ваш код имеет проблема. Что произойдет, если дать 5 или Q ... вы жалуетесь, а затем выход РУТИНА.

В исходном коде, если я введу 100, вы напечатаете «Это было запрещено» ... и затем верните 100 звонящему.

Подсказка: петля.

Подсказка 2: убедитесь, что вы не зацикливаетесь вечно

Кстати, НИКОГДА делать: ord (some character) - 48 вместо этого всегда используйте: ord (some character) - ord ('0')

Почему? Две очевидные причины:

  1. читаемость. Что такое 48?

  2. корректность. Если вы скомпилированы в системе, отличной от ASCII, 48 может не быть код символа для 0.

Stan

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

(в дополнение к Кену Уайту)

  1. Я думаю, что можно использовать READ для переменной с типом char и сохранить пользователя для ввода enter.

  2. Но я бы пошел на строковую версию и использовал VAL.

    • Это нечто более независимое от кодирования, и
    • принцип выходит за пределы значения 9.
    • требует ввода, хотя, и тяжелый ввод испортит ваш экран.

Для последних существуют другие методы (например, использование единицы Crt или Video), но это, вероятно, выходит за рамки назначения

...