Обработка корректности ввода. Управляемый выход из программы

 

Обычно в программировании при обработке корректности ввода используют синтаксические конструкции, обеспечивающие так называемую обработку исключений (т.е. исключительных, их ряда вон выходящих ситуаций). Если вы не знаете, как это делается и возможно ли это в языке программирования Паскаль, то можно пойти другим путем. Все, что вводит пользователь, следует "воспринимать" как строку. Это позволит избежать аварийного завершения программы, когда данным численного типа присваиваются нечисловые символы (пользователь осуществляет некорректный ввод). Однако следует помнить, что при этом объем кода существенно возрастает.

Приведем несколько примеров.

Пусть все, что вводит пользователь, сначала присваивается строчной переменнойuserinput. Также будем использовать метки.

Проверка корректности ввода системы счисления:

    lab_notation:
    write('Notation: '); readln(userinput);
    if (length(userinput) = 1) and ((userinput[1] = '2') or
    (userinput[1] = '8')) then
        notation := ord(userinput[1]) - ord('0')
    else
        if (length(userinput) = 2) and (userinput[1] = '1') and
        (userinput[2] = '6') then
            notation := 16
        else
            if (length(userinput) = 2) and (userinput[1] = '1') and
            (userinput[2] = '0') then
                notation := 10
            else
                goto lab_notation;


Проверка корректности ввода чисел существенно сложнее, т.к. надо учитывать предел допустимых значений и используемые знаки. Опустим ее из-за сложности.

 

Проверка знака операции приводилась на третьем этапе. Остается лишь в последнюю ветку else добавить метку перехода на начало ввода операции при некорректном вводе.

Для управляемого выхода из программы можно организовать переход на ее начало при нажатии клавиши. Проще всего это сделать с помощью оператора goto. Следует иметь в виду, что от goto можно легко избавиться, например, с помощью цикла while.

 

    write('Continue (y)? ');
    readln(start);
    if start = 'y' then
        goto lab_notation;

 

 

Комментарии

Зачем goto? Неужели нельзя использовать процедуру? И зачем эти readln..... if start...? не проще ли

if readkey in ['y', 'Y'] then lab_notation(); ?

И можно обойтись без лишних переменных.