Данные, защищенные паролем - Lisp

Узнай цену своей работы

Формулировка задачи:

Недавно начала изучать лисп и столкнулась с такой проблемой: Есть процедура make-account которая создает счета, защищенные паролем. Непосредственно, что делать с самой процедурой я понимаю, а вот как защитить ее паролем - не совсем. Объясните, пожалуйста)) Вот код, но он не работает((
Листинг программы
  1. #lang racket
  2. (define (make-account balance password)
  3. (define (withdraw amount)
  4. (if (>= balance amount)
  5. (begin (set! balance (- balance amount))
  6. balance)
  7. "Недостаточно денег на счете"))
  8. (define (deposit amount)
  9. (set! balance (+ balance amount))
  10. balance)
  11. (define (secret-password sp)
  12. (cond ((= password sp)
  13. secret-password)
  14. (else (error "Неверный пароль"))))
  15. (define (dispatch m)
  16. (cond ((eq? m 'withdraw) withdraw)
  17. ((eq? m 'deposit) deposit)
  18. ((eq? m 'secret-password) secret-password)
  19. (else (error "Неизвестный вызов -- MAKE-ACCOUNT"
  20. m))))
  21. dispatch)
  22. (define acc (make-account 100 'secret-password))

Решение задачи: «Данные, защищенные паролем»

textual
Листинг программы
  1. (define (make-account balance password)
  2.   (define (wrong-passwd arg) "Incorrect password")
  3.   (define (withdraw amount)
  4.     (if (>= balance amount)
  5.            (begin (set! balance (- balance amount))
  6.                   balance)
  7.        "Insufficient funds"))
  8.     (define (deposit amount)
  9.     (set! balance (+ balance amount))
  10.     balance)
  11.   (define (dispatch passwrd m)
  12.     (if (eq? passwrd password)
  13.       (cond ((eq? m 'withdraw) withdraw)
  14.               ((eq? m 'deposit) deposit)
  15.               (else (error "Unknown request -- MAKE-ACCOUNT"
  16.                 m)))
  17.        wrong-passwd))
  18.   dispatch)
  19.  
  20. (define acc (make-account 100 'secret-password))
  21.  
  22. (display ((acc 'secret-password 'withdraw) 40)) (newline)
  23. (display ((acc 'secret-password 'withdraw) 40)) (newline)
  24. (display ((acc 'secret-password 'withdraw) 40)) (newline)
  25. (display ((acc 'some-other-password 'deposit) 50)) (newline)

Объяснение кода листинга программы

В коде определена функция make-account, которая принимает два аргумента: balance (баланс счёта) и password (пароль). Внутри функции определены три вспомогательные функции:

  1. wrong-passwd (ошибочный пароль) — возвращает строку Incorrect password.
  2. withdraw (снятие средств) — принимает аргумент amount (сумма снятия). Если на счёте достаточно средств, то функция уменьшает баланс на снятую сумму и возвращает новую величину баланса. В противном случае возвращается строка Insufficient funds.
  3. deposit (внесение средств) — принимает аргумент amount (сумма внесения). Функция увеличивает баланс на внесённую сумму и возвращает новую величину баланса. Также в коде определена функция dispatch (диспетчер), которая принимает два аргумента: passwrd (пароль) и m (код операции). Если пароль верный, то функция в зависимости от кода операции вызывает соответствующую функцию: withdraw или deposit. В противном случае возвращается строка Incorrect password. В основной части кода создаётся экземпляр счёта с балансом 100 и паролем 'secret-password'. Затем с помощью функции display выводятся результаты выполнения функций withdraw и deposit для данного экземпляра счёта и пароля 'secret-password'. Также выводится результат выполнения функции dispatch для пароля 'some-other-password' и кода операции deposit.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы