Ввод чисел, пока сумма не превысит пороговое значение

      Комментарии к записи Ввод чисел, пока сумма не превысит пороговое значение отключены

Главная Форумы Программирование Помощь с решением задач на Prolog Общие вопросы Ввод чисел, пока сумма не превысит пороговое значение

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 2 года/лет, 2 мес. назад.

  • Автор
    Сообщения
  • #1811

    questioner
    Участник

    Организовать ввод целых положительных чисел и их суммирование до тех пор, пока сумма не превысит некоторого порогового значения. Введенные отрицательные целые числа суммироваться не должны.

    Было найдено изящное и рабочее решение:

    predicates
        sum(integer,integer,integer) 
        rd(integer)
    clauses              
        rd(Y):-
            readint(Y),
            Y>0,!.
        rd(Y):-
            rd(Y).
      
        sum(X,Sum,Lim):-
            Sum<Lim,
            rd(Y),
            S=Sum+Y,
            sum(X,S,Lim).
        sum(Sum,Sum,_).
    goal
        sum(X,0,5),
        write("Sum: "),
        write(X).

  • #1813

    Предикат rd:

    • считывает целое число с клавиатуры (readInt, в других диалектах пролога тут должна быть другая функция).
    • если Y > 0, выполняется отсечение. Отсечение запретит выполнение 4 и 5 строк, указывая на то, что нужное число (значение которого больше нуля), уже получено, и оно является единственным решением {остальные решения отсекаются}.
    • Если же в третьей строке, сравнение завершилось неудачей (Y оказался < = 0), мы должны попросить пользователя ввести другое число, и делаем это рекурсивно.

    Предикат sum принимает:

    1. результат (X);
    2. начальное значение суммы (Sum);
    3. предел Lim (до которого суммируем).

    Если предел суммы достигнут (проверка Sum < Lim не прошла) - инициализируется первый аргумент (результат), в него помещается значение накопленной суммы (второй аргумент). После этого выполнение правила завершается.Однако, если проверка (Sum < Lim) завершится удачей — программа:

    • выполняется rd и в переменную Y заносится значение, введенное пользователем;
    • в переменную S помещается значение суммы, увеличенное на Y (нам ведь надо увеличить сумму, а сделать это иным путем мы не можем, присваивание в прологе ведь неразрушающее);
    • рекурсивно вызывается предикат sum, от которого мы хотим получить результат (X), но передаем в него новое, увеличенное значение суммы. Заметьте, что переменная Lim не меняется при этом.

Для ответа в этой теме необходимо авторизоваться.