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

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

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

Пусть все, что вводит пользователь, сначала присваивается строчной переменной 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? Неужели нельзя

Зачем goto? Неужели нельзя использовать процедуру?
И зачем эти readln..... if start...?
не проще ли
if readkey in ['y', 'Y'] then lab_notation();
?
И можно обойтись без лишних переменных

сортировка суммы

у меня вопрос, как сделать программу , что бы задать сумму цифрой например 150 и она будет сортировать все варианты по 6 цифр от 1 до 50 имеющие эту сумму

благодарю если это получитса

Имеется в виду найти

Имеется в виду найти "комплекты" по шесть чисел от 1 до 50, которые в сумме дадут 150? Это кажется шесть вложенных друг в друга циклов. Многовато.

сумма 150

спасибо за ответ , у меня била такая мисль сделат это при помощи генератора если
сделать 6 рядов от 1 до 50 как тахометр и щетчик который будет щитать сумму и если будет
искомая сумма которую мы задаем на поиск (например 150 ) то прогамма вибирает эти 6 цифр
и записывает столбиком
Найти Сумму 150

от 1 до 50
Сумма
1 2 3 47 48 49 150

Цифры которые имеют эту Сумму
1 2 3 47 48 49
… …. … … … …
… …. … … … …

Наверно типа того:...for

Наверно типа того:

var
    i,j,k,l,m,n, sum: word;
 
begin
    for i:=1 to 50 do 
        for j:=1 to 50 do
            for k:=1 to 50 do
                for l:=1 to 50 do
                    for m:=1 to 50 do
                        for n:=1 to 50 do begin
                            sum := i + j + k + l + m + n;
                            if sum = 150 then
                                writeln(i,' ',j,' ',k,' ',l,' ',m,' ',n);
                        end;
end.

Но проблема в том, что комбинаций из 6 чисел, дающих в сумме 150, огромное количество. Программа будет очень долго выполняться. Это не рациональная задача.